From: Thomas Lively Date: Fri, 12 Apr 2019 22:27:48 +0000 (+0000) Subject: [WebAssembly] Add DataCount section to object files X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=9dcce983ad776b43a12173c341ab1f688ff15874;p=llvm [WebAssembly] Add DataCount section to object files Summary: This ensures that object files will continue to validate as WebAssembly modules in the presence of bulk memory operations. Engines that don't support bulk memory operations will not recognize the DataCount section and will report validation errors, but that's ok because object files aren't supposed to be run directly anyway. Reviewers: aheejin, dschuff, sbc100 Subscribers: jgravelle-google, hiraditya, sunfish, rupprecht, llvm-commits Tags: #llvm Differential Revision: https://reviews.llvm.org/D60623 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@358315 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/include/llvm/Object/Wasm.h b/include/llvm/Object/Wasm.h index 02220dbcf0f..db1bef38892 100644 --- a/include/llvm/Object/Wasm.h +++ b/include/llvm/Object/Wasm.h @@ -247,6 +247,7 @@ private: Error parseElemSection(ReadContext &Ctx); Error parseCodeSection(ReadContext &Ctx); Error parseDataSection(ReadContext &Ctx); + Error parseDataCountSection(ReadContext &Ctx); // Custom section types Error parseDylinkSection(ReadContext &Ctx); @@ -273,6 +274,7 @@ private: std::vector Exports; std::vector ElemSegments; std::vector DataSegments; + llvm::Optional DataCount; std::vector Functions; std::vector Symbols; std::vector DebugNames; diff --git a/include/llvm/ObjectYAML/WasmYAML.h b/include/llvm/ObjectYAML/WasmYAML.h index 60ed1aae1bd..2411dc7ac17 100644 --- a/include/llvm/ObjectYAML/WasmYAML.h +++ b/include/llvm/ObjectYAML/WasmYAML.h @@ -379,6 +379,16 @@ struct DataSection : Section { std::vector Segments; }; +struct DataCountSection : Section { + DataCountSection() : Section(wasm::WASM_SEC_DATACOUNT) {} + + static bool classof(const Section *S) { + return S->Type == wasm::WASM_SEC_DATACOUNT; + } + + uint32_t Count; +}; + struct Object { FileHeader Header; std::vector> Sections; diff --git a/lib/MC/WasmObjectWriter.cpp b/lib/MC/WasmObjectWriter.cpp index 63677095918..2994772c519 100644 --- a/lib/MC/WasmObjectWriter.cpp +++ b/lib/MC/WasmObjectWriter.cpp @@ -326,6 +326,7 @@ private: void writeFunctionSection(ArrayRef Functions); void writeExportSection(ArrayRef Exports); void writeElemSection(ArrayRef TableElems); + void writeDataCountSection(); void writeCodeSection(const MCAssembler &Asm, const MCAsmLayout &Layout, ArrayRef Functions); void writeDataSection(); @@ -849,6 +850,16 @@ void WasmObjectWriter::writeElemSection(ArrayRef TableElems) { endSection(Section); } +void WasmObjectWriter::writeDataCountSection() { + if (DataSegments.empty()) + return; + + SectionBookkeeping Section; + startSection(Section, wasm::WASM_SEC_DATACOUNT); + encodeULEB128(DataSegments.size(), W.OS); + endSection(Section); +} + void WasmObjectWriter::writeCodeSection(const MCAssembler &Asm, const MCAsmLayout &Layout, ArrayRef Functions) { @@ -1600,6 +1611,7 @@ uint64_t WasmObjectWriter::writeObject(MCAssembler &Asm, writeEventSection(Events); writeExportSection(Exports); writeElemSection(TableElems); + writeDataCountSection(); writeCodeSection(Asm, Layout, Functions); writeDataSection(); for (auto &CustomSection : CustomSections) diff --git a/lib/Object/WasmObjectFile.cpp b/lib/Object/WasmObjectFile.cpp index 16645002a6d..167b8c25c2b 100644 --- a/lib/Object/WasmObjectFile.cpp +++ b/lib/Object/WasmObjectFile.cpp @@ -316,6 +316,8 @@ Error WasmObjectFile::parseSection(WasmSection &Sec) { return parseCodeSection(Ctx); case wasm::WASM_SEC_DATA: return parseDataSection(Ctx); + case wasm::WASM_SEC_DATACOUNT: + return parseDataCountSection(Ctx); default: return make_error("Bad section type", object_error::parse_failed); @@ -1201,6 +1203,9 @@ Error WasmObjectFile::parseElemSection(ReadContext &Ctx) { Error WasmObjectFile::parseDataSection(ReadContext &Ctx) { DataSection = Sections.size(); uint32_t Count = readVaruint32(Ctx); + if (DataCount && Count != DataCount.getValue()) + return make_error( + "Number of data segments does not match DataCount section"); DataSegments.reserve(Count); while (Count--) { WasmSegment Segment; @@ -1234,6 +1239,11 @@ Error WasmObjectFile::parseDataSection(ReadContext &Ctx) { return Error::success(); } +Error WasmObjectFile::parseDataCountSection(ReadContext &Ctx) { + DataCount = readVaruint32(Ctx); + return Error::success(); +} + const wasm::WasmObjectHeader &WasmObjectFile::getHeader() const { return Header; } @@ -1399,6 +1409,7 @@ std::error_code WasmObjectFile::getSectionName(DataRefImpl Sec, ECase(ELEM); ECase(CODE); ECase(DATA); + ECase(DATACOUNT); case wasm::WASM_SEC_CUSTOM: Res = S.Name; break; diff --git a/lib/ObjectYAML/WasmYAML.cpp b/lib/ObjectYAML/WasmYAML.cpp index 3841c5b7712..19c7f54aed9 100644 --- a/lib/ObjectYAML/WasmYAML.cpp +++ b/lib/ObjectYAML/WasmYAML.cpp @@ -153,6 +153,11 @@ static void sectionMapping(IO &IO, WasmYAML::DataSection &Section) { IO.mapRequired("Segments", Section.Segments); } +static void sectionMapping(IO &IO, WasmYAML::DataCountSection &Section) { + commonSectionMapping(IO, Section); + IO.mapRequired("Count", Section.Count); +} + void MappingTraits>::mapping( IO &IO, std::unique_ptr &Section) { WasmYAML::SectionType SectionType; @@ -257,6 +262,11 @@ void MappingTraits>::mapping( Section.reset(new WasmYAML::DataSection()); sectionMapping(IO, *cast(Section.get())); break; + case wasm::WASM_SEC_DATACOUNT: + if (!IO.outputting()) + Section.reset(new WasmYAML::DataCountSection()); + sectionMapping(IO, *cast(Section.get())); + break; default: llvm_unreachable("Unknown section type"); } @@ -278,6 +288,7 @@ void ScalarEnumerationTraits::enumeration( ECase(ELEM); ECase(CODE); ECase(DATA); + ECase(DATACOUNT); #undef ECase } diff --git a/test/MC/WebAssembly/bss.ll b/test/MC/WebAssembly/bss.ll index b3d95a161d1..05b6a6986e1 100644 --- a/test/MC/WebAssembly/bss.ll +++ b/test/MC/WebAssembly/bss.ll @@ -9,7 +9,7 @@ target triple = "wasm32-unknown-unknown" @foo = global %union.u1 zeroinitializer, align 1 @bar = global %union.u1 zeroinitializer, align 1 -; CHECK: - Type: DATA +; CHECK: - Type: DATA{{$}} ; CHECK-NEXT: Segments: ; CHECK-NEXT: - SectionOffset: 6 ; CHECK-NEXT: InitFlags: 0 diff --git a/test/MC/WebAssembly/comdat.ll b/test/MC/WebAssembly/comdat.ll index 18905890776..ecc5e5be27a 100644 --- a/test/MC/WebAssembly/comdat.ll +++ b/test/MC/WebAssembly/comdat.ll @@ -50,6 +50,8 @@ define linkonce_odr i32 @sharedFn() #1 comdat($sharedComdat) { ; CHECK-NEXT: SigIndex: 0 ; CHECK-NEXT: - Type: FUNCTION ; CHECK-NEXT: FunctionTypes: [ 0, 0, 0 ] +; CHECK-NEXT: - Type: DATACOUNT +; CHECK-NEXT: Count: 1 ; CHECK-NEXT: - Type: CODE ; CHECK-NEXT: Relocations: ; CHECK-NEXT: - Type: R_WASM_FUNCTION_INDEX_LEB diff --git a/test/MC/WebAssembly/data-section.s b/test/MC/WebAssembly/data-section.s index d4ddd3d496e..70d9de2bb93 100644 --- a/test/MC/WebAssembly/data-section.s +++ b/test/MC/WebAssembly/data-section.s @@ -53,6 +53,8 @@ test0: # BIN-NEXT: Initial: 0x00000000 # BIN-NEXT: - Type: FUNCTION # BIN-NEXT: FunctionTypes: [ 0 ] +# BIN-NEXT: - Type: DATACOUNT +# BIN-NEXT: Count: 1 # BIN-NEXT: - Type: CODE # BIN-NEXT: Relocations: # BIN-NEXT: - Type: R_WASM_MEMORY_ADDR_SLEB @@ -91,4 +93,3 @@ test0: # BIN-NEXT: Alignment: 0 # BIN-NEXT: Flags: [ ] # BIN-NEXT: ... - diff --git a/test/MC/WebAssembly/debug-info.ll b/test/MC/WebAssembly/debug-info.ll index fe4a4cf6983..d0c49b7c836 100644 --- a/test/MC/WebAssembly/debug-info.ll +++ b/test/MC/WebAssembly/debug-info.ll @@ -25,14 +25,19 @@ ; CHECK-NEXT: Offset: 90 ; CHECK-NEXT: } ; CHECK-NEXT: Section { +; CHECK-NEXT: Type: DATACOUNT (0xC) +; CHECK-NEXT: Size: 1 +; CHECK-NEXT: Offset: 103 +; CHECK-NEXT: } +; CHECK-NEXT: Section { ; CHECK-NEXT: Type: CODE (0xA) ; CHECK-NEXT: Size: 4 -; CHECK-NEXT: Offset: 103 +; CHECK-NEXT: Offset: 110 ; CHECK-NEXT: } ; CHECK-NEXT: Section { ; CHECK-NEXT: Type: DATA (0xB) ; CHECK-NEXT: Size: 19 -; CHECK-NEXT: Offset: 113 +; CHECK-NEXT: Offset: 120 ; CHECK-NEXT: Segments [ ; CHECK-NEXT: Segment { ; CHECK-NEXT: Name: .data.foo @@ -49,94 +54,94 @@ ; CHECK-NEXT: Section { ; CHECK-NEXT: Type: CUSTOM (0x0) ; CHECK-NEXT: Size: 121 -; CHECK-NEXT: Offset: 138 +; CHECK-NEXT: Offset: 145 ; CHECK-NEXT: Name: .debug_str ; CHECK-NEXT: } ; CHECK-NEXT: Section { ; CHECK-NEXT: Type: CUSTOM (0x0) ; CHECK-NEXT: Size: 84 -; CHECK-NEXT: Offset: 276 +; CHECK-NEXT: Offset: 283 ; CHECK-NEXT: Name: .debug_abbrev ; CHECK-NEXT: } ; CHECK-NEXT: Section { ; CHECK-NEXT: Type: CUSTOM (0x0) ; CHECK-NEXT: Size: 106 -; CHECK-NEXT: Offset: 380 +; CHECK-NEXT: Offset: 387 ; CHECK-NEXT: Name: .debug_info ; CHECK-NEXT: } ; CHECK-NEXT: Section { ; CHECK-NEXT: Type: CUSTOM (0x0) ; CHECK-NEXT: Size: 1 -; CHECK-NEXT: Offset: 504 +; CHECK-NEXT: Offset: 511 ; CHECK-NEXT: Name: .debug_macinfo ; CHECK-NEXT: } ; CHECK-NEXT: Section { ; CHECK-NEXT: Type: CUSTOM (0x0) ; CHECK-NEXT: Size: 42 -; CHECK-NEXT: Offset: 526 +; CHECK-NEXT: Offset: 533 ; CHECK-NEXT: Name: .debug_pubnames ; CHECK-NEXT: } ; CHECK-NEXT: Section { ; CHECK-NEXT: Type: CUSTOM (0x0) ; CHECK-NEXT: Size: 26 -; CHECK-NEXT: Offset: 590 +; CHECK-NEXT: Offset: 597 ; CHECK-NEXT: Name: .debug_pubtypes ; CHECK-NEXT: } ; CHECK-NEXT: Section { ; CHECK-NEXT: Type: CUSTOM (0x0) ; CHECK-NEXT: Size: 57 -; CHECK-NEXT: Offset: 638 +; CHECK-NEXT: Offset: 645 ; CHECK-NEXT: Name: .debug_line ; CHECK-NEXT: } ; CHECK-NEXT: Section { ; CHECK-NEXT: Type: CUSTOM (0x0) ; CHECK-NEXT: Size: 88 -; CHECK-NEXT: Offset: 713 +; CHECK-NEXT: Offset: 720 ; CHECK-NEXT: Name: linking ; CHECK-NEXT: } ; CHECK-NEXT: Section { ; CHECK-NEXT: Type: CUSTOM (0x0) ; CHECK-NEXT: Size: 9 -; CHECK-NEXT: Offset: 815 +; CHECK-NEXT: Offset: 822 ; CHECK-NEXT: Name: reloc.DATA ; CHECK-NEXT: } ; CHECK-NEXT: Section { ; CHECK-NEXT: Type: CUSTOM (0x0) ; CHECK-NEXT: Size: 58 -; CHECK-NEXT: Offset: 841 +; CHECK-NEXT: Offset: 848 ; CHECK-NEXT: Name: reloc..debug_info ; CHECK-NEXT: } ; CHECK-NEXT: Section { ; CHECK-NEXT: Type: CUSTOM (0x0) ; CHECK-NEXT: Size: 6 -; CHECK-NEXT: Offset: 923 +; CHECK-NEXT: Offset: 930 ; CHECK-NEXT: Name: reloc..debug_pubnames ; CHECK-NEXT: } ; CHECK-NEXT: Section { ; CHECK-NEXT: Type: CUSTOM (0x0) ; CHECK-NEXT: Size: 6 -; CHECK-NEXT: Offset: 957 +; CHECK-NEXT: Offset: 964 ; CHECK-NEXT: Name: reloc..debug_pubtypes ; CHECK-NEXT: } ; CHECK-NEXT: Section { ; CHECK-NEXT: Type: CUSTOM (0x0) ; CHECK-NEXT: Size: 6 -; CHECK-NEXT: Offset: 991 +; CHECK-NEXT: Offset: 998 ; CHECK-NEXT: Name: reloc..debug_line ; CHECK-NEXT: } ; CHECK-NEXT: Section { ; CHECK-NEXT: Type: CUSTOM (0x0) ; CHECK-NEXT: Size: 77 -; CHECK-NEXT: Offset: 1021 +; CHECK-NEXT: Offset: 1028 ; CHECK-NEXT: Name: producers ; CHECK-NEXT: } ; CHECK-NEXT:] ; CHECK-NEXT:Relocations [ -; CHECK-NEXT: Section (6) DATA { +; CHECK-NEXT: Section (7) DATA { ; CHECK-NEXT: 0x6 R_WASM_MEMORY_ADDR_I32 myextern 0 ; CHECK-NEXT: 0xF R_WASM_TABLE_INDEX_I32 f2 ; CHECK-NEXT: } -; CHECK-NEXT: Section (9) .debug_info { +; CHECK-NEXT: Section (10) .debug_info { ; CHECK-NEXT: 0x6 R_WASM_SECTION_OFFSET_I32 .debug_abbrev 0 ; CHECK-NEXT: 0xC R_WASM_SECTION_OFFSET_I32 .debug_str 0 ; CHECK-NEXT: 0x12 R_WASM_SECTION_OFFSET_I32 .debug_str 55 @@ -151,13 +156,13 @@ ; CHECK-NEXT: 0x5B R_WASM_FUNCTION_OFFSET_I32 f2 0 ; CHECK-NEXT: 0x63 R_WASM_SECTION_OFFSET_I32 .debug_str 118 ; CHECK-NEXT: } -; CHECK-NEXT: Section (11) .debug_pubnames { +; CHECK-NEXT: Section (12) .debug_pubnames { ; CHECK-NEXT: 0x6 R_WASM_SECTION_OFFSET_I32 .debug_info 0 ; CHECK-NEXT: } -; CHECK-NEXT: Section (12) .debug_pubtypes { +; CHECK-NEXT: Section (13) .debug_pubtypes { ; CHECK-NEXT: 0x6 R_WASM_SECTION_OFFSET_I32 .debug_info 0 ; CHECK-NEXT: } -; CHECK-NEXT: Section (13) .debug_line { +; CHECK-NEXT: Section (14) .debug_line { ; CHECK-NEXT: 0x2B R_WASM_FUNCTION_OFFSET_I32 f2 0 ; CHECK-NEXT: } ; CHECK-NEXT:] @@ -205,7 +210,7 @@ ; CHECK-NEXT: Flags [ (0x2) ; CHECK-NEXT: BINDING_LOCAL (0x2) ; CHECK-NEXT: ] -; CHECK-NEXT: ElementIndex: 0x6 +; CHECK-NEXT: ElementIndex: 0x7 ; CHECK-NEXT: } ; CHECK-NEXT: Symbol { ; CHECK-NEXT: Name: .debug_abbrev @@ -213,7 +218,7 @@ ; CHECK-NEXT: Flags [ (0x2) ; CHECK-NEXT: BINDING_LOCAL (0x2) ; CHECK-NEXT: ] -; CHECK-NEXT: ElementIndex: 0x7 +; CHECK-NEXT: ElementIndex: 0x8 ; CHECK-NEXT: } ; CHECK-NEXT: Symbol { ; CHECK-NEXT: Name: .debug_info @@ -221,7 +226,7 @@ ; CHECK-NEXT: Flags [ (0x2) ; CHECK-NEXT: BINDING_LOCAL (0x2) ; CHECK-NEXT: ] -; CHECK-NEXT: ElementIndex: 0x8 +; CHECK-NEXT: ElementIndex: 0x9 ; CHECK-NEXT: } ; CHECK-NEXT: Symbol { ; CHECK-NEXT: Name: .debug_line @@ -229,7 +234,7 @@ ; CHECK-NEXT: Flags [ (0x2) ; CHECK-NEXT: BINDING_LOCAL (0x2) ; CHECK-NEXT: ] -; CHECK-NEXT: ElementIndex: 0xC +; CHECK-NEXT: ElementIndex: 0xD ; CHECK-NEXT: } ; CHECK-NEXT:] diff --git a/test/MC/WebAssembly/explicit-sections.ll b/test/MC/WebAssembly/explicit-sections.ll index b94190f8143..ae04051f458 100644 --- a/test/MC/WebAssembly/explicit-sections.ll +++ b/test/MC/WebAssembly/explicit-sections.ll @@ -10,7 +10,7 @@ target triple = "wasm32-unknown-unknown" @global3 = global i32 8, align 8, section ".sec2" -; CHECK: - Type: DATA +; CHECK: - Type: DATA{{$}} ; CHECK-NEXT: Segments: ; CHECK-NEXT: - SectionOffset: 6 ; CHECK-NEXT: InitFlags: 0 diff --git a/test/MC/WebAssembly/external-data.ll b/test/MC/WebAssembly/external-data.ll index c1ebca69c37..3f2129b86ea 100644 --- a/test/MC/WebAssembly/external-data.ll +++ b/test/MC/WebAssembly/external-data.ll @@ -10,7 +10,7 @@ target triple = "wasm32-unknown-unknown" @foo = global i64 7, align 4 @bar = hidden global i32* @myimport, align 4 -; CHECK: - Type: DATA +; CHECK: - Type: DATA{{$}} ; CHECK-NEXT: Relocations: ; CHECK-NEXT: - Type: R_WASM_MEMORY_ADDR_I32 ; CHECK-NEXT: Index: 2 diff --git a/test/MC/WebAssembly/external-func-address.ll b/test/MC/WebAssembly/external-func-address.ll index 3a9f03bf9e3..9d3b33592e0 100644 --- a/test/MC/WebAssembly/external-func-address.ll +++ b/test/MC/WebAssembly/external-func-address.ll @@ -58,7 +58,7 @@ define void @call(i32) { ; CHECK-NEXT: Opcode: I32_CONST ; CHECK-NEXT: Value: 1 ; CHECK-NEXT: Functions: [ 1, 2 ] -; CHECK: - Type: DATA +; CHECK: - Type: DATA{{$}} ; CHECK-NEXT: Relocations: ; CHECK-NEXT: - Type: R_WASM_TABLE_INDEX_I32 ; CHECK-NEXT: Index: 3 diff --git a/test/MC/WebAssembly/global-ctor-dtor.ll b/test/MC/WebAssembly/global-ctor-dtor.ll index df7ff92acff..f506794467c 100644 --- a/test/MC/WebAssembly/global-ctor-dtor.ll +++ b/test/MC/WebAssembly/global-ctor-dtor.ll @@ -61,6 +61,8 @@ declare void @func3() ; CHECK-NEXT: Opcode: I32_CONST ; CHECK-NEXT: Value: 1 ; CHECK-NEXT: Functions: [ 5, 7 ] +; CHECK-NEXT: - Type: DATACOUNT +; CHECK-NEXT: Count: 1 ; CHECK-NEXT: - Type: CODE ; CHECK-NEXT: Relocations: ; CHECK-NEXT: - Type: R_WASM_FUNCTION_INDEX_LEB diff --git a/test/MC/WebAssembly/reloc-code.ll b/test/MC/WebAssembly/reloc-code.ll index 4180d5f5a73..c16de2ec2a6 100644 --- a/test/MC/WebAssembly/reloc-code.ll +++ b/test/MC/WebAssembly/reloc-code.ll @@ -24,7 +24,7 @@ entry: ; CHECK: Format: WASM ; CHECK: Relocations [ -; CHECK-NEXT: Section (4) CODE { +; CHECK-NEXT: Section (5) CODE { ; CHECK-NEXT: Relocation { ; CHECK-NEXT: Type: R_WASM_MEMORY_ADDR_LEB (3) ; CHECK-NEXT: Offset: 0x9 diff --git a/test/MC/WebAssembly/reloc-data.ll b/test/MC/WebAssembly/reloc-data.ll index 2c4b206fe9f..aedaa4e58ff 100644 --- a/test/MC/WebAssembly/reloc-data.ll +++ b/test/MC/WebAssembly/reloc-data.ll @@ -13,7 +13,7 @@ target triple = "wasm32-unknown-unknown" ; CHECK: Format: WASM ; CHECK: Relocations [ -; CHECK-NEXT: Section (2) DATA { +; CHECK-NEXT: Section (3) DATA { ; CHECK-NEXT: Relocation { ; CHECK-NEXT: Type: R_WASM_MEMORY_ADDR_I32 (5) ; CHECK-NEXT: Offset: 0x13 diff --git a/test/MC/WebAssembly/reloc-pic.s b/test/MC/WebAssembly/reloc-pic.s index 249cd1fb89a..5a185541673 100644 --- a/test/MC/WebAssembly/reloc-pic.s +++ b/test/MC/WebAssembly/reloc-pic.s @@ -84,6 +84,8 @@ hidden_func: # CHECK-NEXT: GlobalMutable: true # CHECK-NEXT: - Type: FUNCTION # CHECK-NEXT: FunctionTypes: [ 0, 0, 0, 0, 0 ] +# CHECK-NEXT: - Type: DATACOUNT +# CHECK-NEXT: Count: 1 # CHECK-NEXT: - Type: CODE # CHECK-NEXT: Relocations: # CHECK-NEXT: - Type: R_WASM_GLOBAL_INDEX_LEB diff --git a/test/MC/WebAssembly/unnamed-data.ll b/test/MC/WebAssembly/unnamed-data.ll index e645572fdaf..836e3e7b5c1 100644 --- a/test/MC/WebAssembly/unnamed-data.ll +++ b/test/MC/WebAssembly/unnamed-data.ll @@ -9,7 +9,7 @@ target triple = "wasm32-unknown-unknown" @b = global i8* getelementptr inbounds ([6 x i8], [6 x i8]* @.str2, i32 0, i32 0), align 8 -; CHECK: - Type: DATA +; CHECK: - Type: DATA{{$}} ; CHECK-NEXT: Relocations: ; CHECK-NEXT: - Type: R_WASM_MEMORY_ADDR_I32 ; CHECK-NEXT: Index: 0 diff --git a/test/MC/WebAssembly/weak-alias.ll b/test/MC/WebAssembly/weak-alias.ll index 7abdc79b569..20a27edd343 100644 --- a/test/MC/WebAssembly/weak-alias.ll +++ b/test/MC/WebAssembly/weak-alias.ll @@ -73,6 +73,8 @@ entry: ; CHECK-NEXT: Opcode: I32_CONST ; CHECK-NEXT: Value: 1 ; CHECK-NEXT: Functions: [ 0 ] +; CHECK-NEXT: - Type: DATACOUNT +; CHECK-NEXT: Count: 3 ; CHECK-NEXT: - Type: CODE ; CHECK-NEXT: Relocations: ; CHECK-NEXT: - Type: R_WASM_FUNCTION_INDEX_LEB diff --git a/tools/llvm-readobj/WasmDumper.cpp b/tools/llvm-readobj/WasmDumper.cpp index edcd0731553..e232d1124dd 100644 --- a/tools/llvm-readobj/WasmDumper.cpp +++ b/tools/llvm-readobj/WasmDumper.cpp @@ -32,11 +32,11 @@ static const EnumEntry WasmSymbolTypes[] = { static const EnumEntry WasmSectionTypes[] = { #define ENUM_ENTRY(X) \ { #X, wasm::WASM_SEC_##X } - ENUM_ENTRY(CUSTOM), ENUM_ENTRY(TYPE), ENUM_ENTRY(IMPORT), - ENUM_ENTRY(FUNCTION), ENUM_ENTRY(TABLE), ENUM_ENTRY(MEMORY), - ENUM_ENTRY(GLOBAL), ENUM_ENTRY(EVENT), ENUM_ENTRY(EXPORT), - ENUM_ENTRY(START), ENUM_ENTRY(ELEM), ENUM_ENTRY(CODE), - ENUM_ENTRY(DATA), + ENUM_ENTRY(CUSTOM), ENUM_ENTRY(TYPE), ENUM_ENTRY(IMPORT), + ENUM_ENTRY(FUNCTION), ENUM_ENTRY(TABLE), ENUM_ENTRY(MEMORY), + ENUM_ENTRY(GLOBAL), ENUM_ENTRY(EVENT), ENUM_ENTRY(EXPORT), + ENUM_ENTRY(START), ENUM_ENTRY(ELEM), ENUM_ENTRY(CODE), + ENUM_ENTRY(DATA), ENUM_ENTRY(DATACOUNT), #undef ENUM_ENTRY }; diff --git a/tools/obj2yaml/wasm2yaml.cpp b/tools/obj2yaml/wasm2yaml.cpp index eacbe621e0e..47d984b53fb 100644 --- a/tools/obj2yaml/wasm2yaml.cpp +++ b/tools/obj2yaml/wasm2yaml.cpp @@ -353,6 +353,12 @@ ErrorOr WasmDumper::dump() { S = std::move(DataSec); break; } + case wasm::WASM_SEC_DATACOUNT: { + auto DataCountSec = make_unique(); + DataCountSec->Count = Obj.dataSegments().size(); + S = std::move(DataCountSec); + break; + } default: llvm_unreachable("Unknown section type"); break; diff --git a/tools/yaml2obj/yaml2wasm.cpp b/tools/yaml2obj/yaml2wasm.cpp index 322ac0117ba..cd07a30b748 100644 --- a/tools/yaml2obj/yaml2wasm.cpp +++ b/tools/yaml2obj/yaml2wasm.cpp @@ -43,6 +43,7 @@ private: int writeSectionContent(raw_ostream &OS, WasmYAML::ElemSection &Section); int writeSectionContent(raw_ostream &OS, WasmYAML::CodeSection &Section); int writeSectionContent(raw_ostream &OS, WasmYAML::DataSection &Section); + int writeSectionContent(raw_ostream &OS, WasmYAML::DataCountSection &Section); // Custom section types int writeSectionContent(raw_ostream &OS, WasmYAML::DylinkSection &Section); @@ -514,6 +515,12 @@ int WasmWriter::writeSectionContent(raw_ostream &OS, return 0; } +int WasmWriter::writeSectionContent(raw_ostream &OS, + WasmYAML::DataCountSection &Section) { + encodeULEB128(Section.Count, OS); + return 0; +} + int WasmWriter::writeRelocSection(raw_ostream &OS, WasmYAML::Section &Sec, uint32_t SectionIndex) { switch (Sec.Type) { @@ -614,6 +621,9 @@ int WasmWriter::writeWasm(raw_ostream &OS) { } else if (auto S = dyn_cast(Sec.get())) { if (auto Err = writeSectionContent(StringStream, *S)) return Err; + } else if (auto S = dyn_cast(Sec.get())) { + if (auto Err = writeSectionContent(StringStream, *S)) + return Err; } else { errs() << "Unknown section type: " << Sec->Type << "\n"; return 1;