[WebAssembly] Emit the DataCount section when bulk memory is enabled

Summary:
The DataCount section is necessary for the bulk memory operations
memory.init and data.drop to validate, but it is not recognized by
engines that do not support bulk memory, so emit the section only if
bulk-memory is enabled.

Reviewers: aheejin, dschuff, sbc100

Subscribers: jgravelle-google, sunfish, llvm-commits

Tags: #llvm

Differential Revision: https://reviews.llvm.org/D60637

llvm-svn: 358798
This commit is contained in:
Thomas Lively 2019-04-19 23:40:36 +00:00
parent 85e0ff752c
commit 84771e2d21
3 changed files with 30 additions and 0 deletions

View File

@ -12,6 +12,8 @@ target triple = "wasm32-unknown-unknown"
; RUN: wasm-ld -no-gc-sections --no-entry -o %t.merged.wasm %t.data-segment-merging.o
; RUN: obj2yaml %t.merged.wasm | FileCheck %s --check-prefix=MERGE
; MERGE-NOT: DATACOUNT
; MERGE: - Type: DATA
; MERGE: Segments:
; MERGE: Content: 68656C6C6F00676F6F6462796500776861746576657200002A000000
@ -20,6 +22,8 @@ target triple = "wasm32-unknown-unknown"
; RUN: wasm-ld -no-gc-sections --no-entry --no-merge-data-segments -o %t.separate.wasm %t.data-segment-merging.o
; RUN: obj2yaml %t.separate.wasm | FileCheck %s --check-prefix=SEPARATE
; SEPARATE-NOT: DATACOUNT
; SEPARATE: - Type: DATA
; SEPARATE: Segments:
; SEPARATE: Content: 68656C6C6F00
@ -29,3 +33,15 @@ target triple = "wasm32-unknown-unknown"
; SEPARATE: Content: 636F6E7374616E7400
; SEPARATE: Content: 2B
; SEPARATE-NOT: Content:
; RUN: llc -filetype=obj %s -mattr=+bulk-memory -o %t.data-segment-merging.bulk-memory.o
; RUN: wasm-ld -no-gc-sections --no-entry -o %t.merged.bulk-memory.wasm %t.data-segment-merging.bulk-memory.o
; RUN: obj2yaml %t.merged.bulk-memory.wasm | FileCheck %s --check-prefix=BULK-MEMORY
; BULK-MEMORY: - Type: DATACOUNT
; BULK-MEMORY: Count: 2
; BULK-MEMORY: - Type: DATA
; BULK-MEMORY: Segments:
; BULK-MEMORY: Content: 68656C6C6F00676F6F6462796500776861746576657200002A000000
; BULK-MEMORY: Content: 636F6E7374616E74000000002B
; BULK-MEMORY-NOT: Content:

View File

@ -51,6 +51,8 @@ static StringRef sectionTypeToString(uint32_t SectionType) {
return "CODE";
case WASM_SEC_DATA:
return "DATA";
case WASM_SEC_DATACOUNT:
return "DATACOUNT";
default:
fatal("invalid section type");
}

View File

@ -93,6 +93,7 @@ private:
void createImportSection();
void createMemorySection();
void createElemSection();
void createDataCountSection();
void createCodeSection();
void createDataSection();
void createCustomSections();
@ -414,6 +415,16 @@ void Writer::createElemSection() {
}
}
void Writer::createDataCountSection() {
if (!Segments.size() || !TargetFeatures.count("bulk-memory"))
return;
log("createDataCountSection");
SyntheticSection *Section = createSyntheticSection(WASM_SEC_DATACOUNT);
raw_ostream &OS = Section->getStream();
writeUleb128(OS, Segments.size(), "data count");
}
void Writer::createCodeSection() {
if (InputFunctions.empty())
return;
@ -865,6 +876,7 @@ void Writer::createSections() {
createEventSection();
createExportSection();
createElemSection();
createDataCountSection();
createCodeSection();
createDataSection();
createCustomSections();