From 6bb5a41f99445a9c067a699028d0d62a89953d12 Mon Sep 17 00:00:00 2001 From: Sam Clegg Date: Thu, 26 Apr 2018 18:15:32 +0000 Subject: [PATCH] [WebAssembly] Add version to object file metadata Summary: See https://github.com/WebAssembly/tool-conventions/issues/54 Subscribers: jfb, dschuff, jgravelle-google, aheejin, sunfish, llvm-commits Differential Revision: https://reviews.llvm.org/D46069 llvm-svn: 330969 --- llvm/include/llvm/BinaryFormat/Wasm.h | 3 +++ llvm/include/llvm/ObjectYAML/WasmYAML.h | 1 + llvm/lib/MC/WasmObjectWriter.cpp | 3 ++- llvm/lib/Object/WasmObjectFile.cpp | 8 ++++++++ llvm/lib/ObjectYAML/WasmYAML.cpp | 1 + llvm/test/MC/WebAssembly/array-fill.ll | 4 +--- llvm/test/MC/WebAssembly/bss.ll | 5 ++--- llvm/test/MC/WebAssembly/comdat.ll | 1 + llvm/test/MC/WebAssembly/explicit-sections.ll | 5 ++--- llvm/test/MC/WebAssembly/global-ctor-dtor.ll | 1 + llvm/test/MC/WebAssembly/unnamed-data.ll | 1 + llvm/test/MC/WebAssembly/visibility.ll | 4 +--- llvm/test/MC/WebAssembly/weak-alias.ll | 1 + llvm/test/MC/WebAssembly/weak.ll | 4 +--- llvm/test/Object/Inputs/trivial-object-test.wasm | Bin 320 -> 324 bytes llvm/test/Object/obj2yaml.test | 1 + llvm/test/Object/wasm-bad-metadata-version.yaml | 11 +++++++++++ llvm/test/ObjectYAML/wasm/code_section.yaml | 1 + llvm/test/ObjectYAML/wasm/data_section.yaml | 1 + llvm/test/ObjectYAML/wasm/invalid_global_weak.yaml | 1 + llvm/test/ObjectYAML/wasm/linking_section.yaml | 5 ++--- llvm/test/ObjectYAML/wasm/weak_symbols.yaml | 1 + llvm/test/tools/llvm-nm/wasm/exports.yaml | 1 + llvm/test/tools/llvm-nm/wasm/imports.yaml | 1 + llvm/test/tools/llvm-nm/wasm/weak-symbols.yaml | 1 + llvm/test/tools/llvm-objdump/Inputs/trivial.obj.wasm | Bin 320 -> 324 bytes llvm/test/tools/llvm-objdump/wasm.txt | 2 +- llvm/test/tools/llvm-readobj/Inputs/trivial.obj.wasm | Bin 291 -> 295 bytes llvm/test/tools/llvm-readobj/sections.test | 4 ++-- llvm/tools/obj2yaml/wasm2yaml.cpp | 6 ++++++ llvm/tools/yaml2obj/yaml2wasm.cpp | 1 + 31 files changed, 57 insertions(+), 22 deletions(-) create mode 100644 llvm/test/Object/wasm-bad-metadata-version.yaml diff --git a/llvm/include/llvm/BinaryFormat/Wasm.h b/llvm/include/llvm/BinaryFormat/Wasm.h index dc28a3c..47657ca 100644 --- a/llvm/include/llvm/BinaryFormat/Wasm.h +++ b/llvm/include/llvm/BinaryFormat/Wasm.h @@ -24,6 +24,8 @@ namespace wasm { const char WasmMagic[] = {'\0', 'a', 's', 'm'}; // Wasm binary format version const uint32_t WasmVersion = 0x1; +// Wasm linking metadata version +const uint32_t WasmMetadataVersion = 0x1; // Wasm uses a 64k page size const uint32_t WasmPageSize = 65536; @@ -161,6 +163,7 @@ struct WasmFunctionName { }; struct WasmLinkingData { + uint32_t Version; std::vector InitFunctions; std::vector Comdats; std::vector SymbolTable; diff --git a/llvm/include/llvm/ObjectYAML/WasmYAML.h b/llvm/include/llvm/ObjectYAML/WasmYAML.h index 1c5e77e..d794e1d 100644 --- a/llvm/include/llvm/ObjectYAML/WasmYAML.h +++ b/llvm/include/llvm/ObjectYAML/WasmYAML.h @@ -195,6 +195,7 @@ struct LinkingSection : CustomSection { return C && C->Name == "linking"; } + uint32_t Version; std::vector SymbolTable; std::vector SegmentInfos; std::vector InitFunctions; diff --git a/llvm/lib/MC/WasmObjectWriter.cpp b/llvm/lib/MC/WasmObjectWriter.cpp index 0f8a42a..0e12270 100644 --- a/llvm/lib/MC/WasmObjectWriter.cpp +++ b/llvm/lib/MC/WasmObjectWriter.cpp @@ -857,8 +857,9 @@ void WasmObjectWriter::writeLinkingMetaDataSection( const std::map> &Comdats) { SectionBookkeeping Section; startCustomSection(Section, "linking"); - SectionBookkeeping SubSection; + encodeULEB128(wasm::WasmMetadataVersion, getStream()); + SectionBookkeeping SubSection; if (SymbolInfos.size() != 0) { startSection(SubSection, wasm::WASM_SYMBOL_TABLE); encodeULEB128(SymbolInfos.size(), getStream()); diff --git a/llvm/lib/Object/WasmObjectFile.cpp b/llvm/lib/Object/WasmObjectFile.cpp index e6b7dde..61db5d2 100644 --- a/llvm/lib/Object/WasmObjectFile.cpp +++ b/llvm/lib/Object/WasmObjectFile.cpp @@ -313,6 +313,14 @@ Error WasmObjectFile::parseLinkingSection(const uint8_t *Ptr, "Linking data must come after code section", object_error::parse_failed); } + LinkingData.Version = readVaruint32(Ptr); + if (LinkingData.Version != wasm::WasmMetadataVersion) { + return make_error( + "Unexpected metadata version: " + Twine(LinkingData.Version) + + " (Expected: " + Twine(wasm::WasmMetadataVersion) + ")", + object_error::parse_failed); + } + while (Ptr < End) { uint8_t Type = readUint8(Ptr); uint32_t Size = readVaruint32(Ptr); diff --git a/llvm/lib/ObjectYAML/WasmYAML.cpp b/llvm/lib/ObjectYAML/WasmYAML.cpp index 72df93b..ff75bfc 100644 --- a/llvm/lib/ObjectYAML/WasmYAML.cpp +++ b/llvm/lib/ObjectYAML/WasmYAML.cpp @@ -57,6 +57,7 @@ static void sectionMapping(IO &IO, WasmYAML::NameSection &Section) { static void sectionMapping(IO &IO, WasmYAML::LinkingSection &Section) { commonSectionMapping(IO, Section); IO.mapRequired("Name", Section.Name); + IO.mapRequired("Version", Section.Version); IO.mapOptional("SymbolTable", Section.SymbolTable); IO.mapOptional("SegmentInfo", Section.SegmentInfos); IO.mapOptional("InitFunctions", Section.InitFunctions); diff --git a/llvm/test/MC/WebAssembly/array-fill.ll b/llvm/test/MC/WebAssembly/array-fill.ll index 928db06..4430327 100644 --- a/llvm/test/MC/WebAssembly/array-fill.ll +++ b/llvm/test/MC/WebAssembly/array-fill.ll @@ -12,9 +12,7 @@ target triple = "wasm32-unknown-unknown-wasm" ; CHECK: - Type: DATA ; CHECK: Content: '0102' -; CHECK: - Type: CUSTOM -; CHECK-NEXT: Name: linking -; CHECK-NEXT: SymbolTable: +; CHECK: SymbolTable: ; CHECK-NEXT: - Index: 0 ; CHECK-NEXT: Kind: DATA ; CHECK-NEXT: Name: gBd diff --git a/llvm/test/MC/WebAssembly/bss.ll b/llvm/test/MC/WebAssembly/bss.ll index 3147aa5..9ffeacc 100644 --- a/llvm/test/MC/WebAssembly/bss.ll +++ b/llvm/test/MC/WebAssembly/bss.ll @@ -35,9 +35,8 @@ target triple = "wasm32-unknown-unknown-wasm" ; CHECK-NEXT: Opcode: I32_CONST ; CHECK-NEXT: Value: 8 ; CHECK-NEXT: Content: '' -; CHECK-NEXT: - Type: CUSTOM -; CHECK-NEXT: Name: linking -; CHECK-NEXT: SymbolTable: + +; CHECK: SymbolTable: ; CHECK-NEXT: - Index: 0 ; CHECK-NEXT: Kind: DATA ; CHECK-NEXT: Name: g0 diff --git a/llvm/test/MC/WebAssembly/comdat.ll b/llvm/test/MC/WebAssembly/comdat.ll index 7812e28..03c5d75 100644 --- a/llvm/test/MC/WebAssembly/comdat.ll +++ b/llvm/test/MC/WebAssembly/comdat.ll @@ -75,6 +75,7 @@ define linkonce_odr i32 @sharedFn() #1 comdat($sharedComdat) { ; CHECK-NEXT: Content: '616263' ; CHECK-NEXT: - Type: CUSTOM ; CHECK-NEXT: Name: linking +; CHECK-NEXT: Version: 1 ; CHECK-NEXT: SymbolTable: ; CHECK-NEXT: - Index: 0 ; CHECK-NEXT: Kind: FUNCTION diff --git a/llvm/test/MC/WebAssembly/explicit-sections.ll b/llvm/test/MC/WebAssembly/explicit-sections.ll index 9b76927..067f3b3 100644 --- a/llvm/test/MC/WebAssembly/explicit-sections.ll +++ b/llvm/test/MC/WebAssembly/explicit-sections.ll @@ -30,9 +30,8 @@ target triple = "wasm32-unknown-unknown-wasm" ; CHECK-NEXT: Opcode: I32_CONST ; CHECK-NEXT: Value: 24 ; CHECK-NEXT: Content: '08000000' -; CHECK-NEXT: - Type: CUSTOM -; CHECK-NEXT: Name: linking -; CHECK-NEXT: SymbolTable: + +; CHECK: SymbolTable: ; CHECK-NEXT: - Index: 0 ; CHECK-NEXT: Kind: DATA ; CHECK-NEXT: Name: global0 diff --git a/llvm/test/MC/WebAssembly/global-ctor-dtor.ll b/llvm/test/MC/WebAssembly/global-ctor-dtor.ll index c81e9ad..1f1358f 100644 --- a/llvm/test/MC/WebAssembly/global-ctor-dtor.ll +++ b/llvm/test/MC/WebAssembly/global-ctor-dtor.ll @@ -110,6 +110,7 @@ declare void @func3() ; CHECK-NEXT: Content: '01040000' ; CHECK-NEXT: - Type: CUSTOM ; CHECK-NEXT: Name: linking +; CHECK-NEXT: Version: 1 ; CHECK-NEXT: SymbolTable: ; CHECK-NEXT: - Index: 0 ; CHECK-NEXT: Kind: FUNCTION diff --git a/llvm/test/MC/WebAssembly/unnamed-data.ll b/llvm/test/MC/WebAssembly/unnamed-data.ll index 424209e..ee5abed 100644 --- a/llvm/test/MC/WebAssembly/unnamed-data.ll +++ b/llvm/test/MC/WebAssembly/unnamed-data.ll @@ -44,6 +44,7 @@ target triple = "wasm32-unknown-unknown-wasm" ; CHECK-NEXT: Content: '06000000' ; CHECK-NEXT: - Type: CUSTOM ; CHECK-NEXT: Name: linking +; CHECK-NEXT: Version: 1 ; CHECK-NEXT: SymbolTable: ; CHECK-NEXT: - Index: 0 ; CHECK-NEXT: Kind: DATA diff --git a/llvm/test/MC/WebAssembly/visibility.ll b/llvm/test/MC/WebAssembly/visibility.ll index 8bdaa1e..49a922d 100644 --- a/llvm/test/MC/WebAssembly/visibility.ll +++ b/llvm/test/MC/WebAssembly/visibility.ll @@ -14,9 +14,7 @@ entry: ret void } -; CHECK: - Type: CUSTOM -; CHECK-NEXT: Name: linking -; CHECK-NEXT: SymbolTable: +; CHECK: SymbolTable: ; CHECK-NEXT: - Index: 0 ; CHECK-NEXT: Kind: FUNCTION ; CHECK-NEXT: Name: defaultVis diff --git a/llvm/test/MC/WebAssembly/weak-alias.ll b/llvm/test/MC/WebAssembly/weak-alias.ll index b9d855c..fee055f 100644 --- a/llvm/test/MC/WebAssembly/weak-alias.ll +++ b/llvm/test/MC/WebAssembly/weak-alias.ll @@ -138,6 +138,7 @@ entry: ; CHECK-NEXT: Content: '01000000' ; CHECK-NEXT: - Type: CUSTOM ; CHECK-NEXT: Name: linking +; CHECK-NEXT: Version: 1 ; CHECK-NEXT: SymbolTable: ; CHECK-NEXT: - Index: 0 ; CHECK-NEXT: Kind: FUNCTION diff --git a/llvm/test/MC/WebAssembly/weak.ll b/llvm/test/MC/WebAssembly/weak.ll index f040225..1ba48fa 100644 --- a/llvm/test/MC/WebAssembly/weak.ll +++ b/llvm/test/MC/WebAssembly/weak.ll @@ -20,9 +20,7 @@ entry: ; CHECK-NEXT: Field: __indirect_function_table -; CHECK: - Type: CUSTOM -; CHECK-NEXT: Name: linking -; CHECK-NEXT: SymbolTable: +; CHECK: SymbolTable: ; CHECK-NEXT: - Index: 0 ; CHECK-NEXT: Kind: FUNCTION ; CHECK-NEXT: Name: weak_function diff --git a/llvm/test/Object/Inputs/trivial-object-test.wasm b/llvm/test/Object/Inputs/trivial-object-test.wasm index f992b12d161adcb465c916b70eb2730ecd256938..2aa042d54dc5bf56ae1abfd89144ab15ef5b832e 100644 GIT binary patch delta 27 jcmX@WbcAWbNx_>94Gj$JIhlFcnR)4qjEoEuuVn!Mm*ff) delta 23 fcmX@Ybbx8XN#3gs4Gj$JIhlFcnR)3GZ)E`hc47() diff --git a/llvm/test/Object/obj2yaml.test b/llvm/test/Object/obj2yaml.test index 235b461..d9540d4 100644 --- a/llvm/test/Object/obj2yaml.test +++ b/llvm/test/Object/obj2yaml.test @@ -651,6 +651,7 @@ WASM-NEXT: FileHeader: WASM-NEXT: Version: 0x00000001 WASM: - Type: CUSTOM WASM-NEXT: Name: linking +WASM-NEXT: Version: 1 WASM-NEXT: SymbolTable: WASM-NEXT: - Index: 0 WASM-NEXT: Kind: FUNCTION diff --git a/llvm/test/Object/wasm-bad-metadata-version.yaml b/llvm/test/Object/wasm-bad-metadata-version.yaml new file mode 100644 index 0000000..b2970bb --- /dev/null +++ b/llvm/test/Object/wasm-bad-metadata-version.yaml @@ -0,0 +1,11 @@ +# RUN: yaml2obj %s | not llvm-objdump -h - 2>&1 | FileCheck %s + +!WASM +FileHeader: + Version: 0x00000001 +Sections: + - Type: CUSTOM + Name: linking + Version: 0 + +# CHECK: {{.*}}: Unexpected metadata version: 0 (Expected: 1) diff --git a/llvm/test/ObjectYAML/wasm/code_section.yaml b/llvm/test/ObjectYAML/wasm/code_section.yaml index 62f60d6..0d7cf61 100644 --- a/llvm/test/ObjectYAML/wasm/code_section.yaml +++ b/llvm/test/ObjectYAML/wasm/code_section.yaml @@ -39,6 +39,7 @@ Sections: Body: 108180808000210020000F0B - Type: CUSTOM Name: linking + Version: 1 SymbolTable: - Index: 0 Kind: FUNCTION diff --git a/llvm/test/ObjectYAML/wasm/data_section.yaml b/llvm/test/ObjectYAML/wasm/data_section.yaml index 5c9b688..ef5945d 100644 --- a/llvm/test/ObjectYAML/wasm/data_section.yaml +++ b/llvm/test/ObjectYAML/wasm/data_section.yaml @@ -24,6 +24,7 @@ Sections: Addend: -6 - Type: CUSTOM Name: linking + Version: 1 SymbolTable: - Index: 0 Kind: DATA diff --git a/llvm/test/ObjectYAML/wasm/invalid_global_weak.yaml b/llvm/test/ObjectYAML/wasm/invalid_global_weak.yaml index 557882d..c364075 100644 --- a/llvm/test/ObjectYAML/wasm/invalid_global_weak.yaml +++ b/llvm/test/ObjectYAML/wasm/invalid_global_weak.yaml @@ -13,6 +13,7 @@ Sections: GlobalMutable: false - Type: CUSTOM Name: linking + Version: 1 SymbolTable: - Index: 0 Kind: GLOBAL diff --git a/llvm/test/ObjectYAML/wasm/linking_section.yaml b/llvm/test/ObjectYAML/wasm/linking_section.yaml index 0c2c864..d1f0243 100644 --- a/llvm/test/ObjectYAML/wasm/linking_section.yaml +++ b/llvm/test/ObjectYAML/wasm/linking_section.yaml @@ -29,6 +29,7 @@ Sections: Content: '11110000' - Type: CUSTOM Name: linking + Version: 1 SymbolTable: - Index: 0 Kind: FUNCTION @@ -48,9 +49,7 @@ Sections: - Priority: 1 Symbol: 0 ... -# CHECK: - Type: CUSTOM -# CHECK-NEXT: Name: linking -# CHECK-NEXT: SymbolTable: +# CHECK: SymbolTable: # CHECK-NEXT: - Index: 0 # CHECK-NEXT: Kind: FUNCTION # CHECK-NEXT: Name: bar diff --git a/llvm/test/ObjectYAML/wasm/weak_symbols.yaml b/llvm/test/ObjectYAML/wasm/weak_symbols.yaml index 3957caa..3e9ca34 100644 --- a/llvm/test/ObjectYAML/wasm/weak_symbols.yaml +++ b/llvm/test/ObjectYAML/wasm/weak_symbols.yaml @@ -36,6 +36,7 @@ Sections: Body: 00 - Type: CUSTOM Name: linking + Version: 1 SymbolTable: - Index: 0 Kind: FUNCTION diff --git a/llvm/test/tools/llvm-nm/wasm/exports.yaml b/llvm/test/tools/llvm-nm/wasm/exports.yaml index de87978..55d2b76 100644 --- a/llvm/test/tools/llvm-nm/wasm/exports.yaml +++ b/llvm/test/tools/llvm-nm/wasm/exports.yaml @@ -37,6 +37,7 @@ Sections: Content: '616263' - Type: CUSTOM Name: linking + Version: 1 SymbolTable: - Index: 0 Kind: FUNCTION diff --git a/llvm/test/tools/llvm-nm/wasm/imports.yaml b/llvm/test/tools/llvm-nm/wasm/imports.yaml index 23f7218..9696972 100644 --- a/llvm/test/tools/llvm-nm/wasm/imports.yaml +++ b/llvm/test/tools/llvm-nm/wasm/imports.yaml @@ -25,6 +25,7 @@ Sections: GlobalMutable: false - Type: CUSTOM Name: linking + Version: 1 SymbolTable: - Index: 0 Kind: FUNCTION diff --git a/llvm/test/tools/llvm-nm/wasm/weak-symbols.yaml b/llvm/test/tools/llvm-nm/wasm/weak-symbols.yaml index e758194..caa981d 100644 --- a/llvm/test/tools/llvm-nm/wasm/weak-symbols.yaml +++ b/llvm/test/tools/llvm-nm/wasm/weak-symbols.yaml @@ -43,6 +43,7 @@ Sections: Content: '616263' - Type: CUSTOM Name: linking + Version: 1 SymbolTable: - Index: 0 Kind: DATA diff --git a/llvm/test/tools/llvm-objdump/Inputs/trivial.obj.wasm b/llvm/test/tools/llvm-objdump/Inputs/trivial.obj.wasm index f992b12d161adcb465c916b70eb2730ecd256938..2aa042d54dc5bf56ae1abfd89144ab15ef5b832e 100644 GIT binary patch delta 27 jcmX@WbcAWbNx_>94Gj$JIhlFcnR)4qjEoEuuVn!Mm*ff) delta 23 fcmX@Ybbx8XN#3gs4Gj$JIhlFcnR)3GZ)E`hc47() diff --git a/llvm/test/tools/llvm-objdump/wasm.txt b/llvm/test/tools/llvm-objdump/wasm.txt index 622df7b..d24db89 100644 --- a/llvm/test/tools/llvm-objdump/wasm.txt +++ b/llvm/test/tools/llvm-objdump/wasm.txt @@ -7,7 +7,7 @@ # CHECK-NEXT: 2 FUNCTION 00000002 0000000000000000 # CHECK-NEXT: 3 CODE 00000019 0000000000000000 TEXT # CHECK-NEXT: 4 DATA 0000001c 0000000000000000 DATA -# CHECK-NEXT: 5 linking 0000004d 0000000000000000 +# CHECK-NEXT: 5 linking 00000051 0000000000000000 # CHECK-NEXT: 6 reloc.CODE 0000000c 0000000000000000 # RUN: llvm-objdump -p %p/Inputs/trivial.obj.wasm | FileCheck %s -check-prefix CHECK-HEADER diff --git a/llvm/test/tools/llvm-readobj/Inputs/trivial.obj.wasm b/llvm/test/tools/llvm-readobj/Inputs/trivial.obj.wasm index 15700e9197329a2a0f31c0e504f957b7bed60dfb..0e3efb66a7feecfc91fb60c605285947ae0f7244 100644 GIT binary patch delta 27 jcmZ3?w47 WasmDumper::dumpCustomSection(const Was CustomSec = std::move(NameSec); } else if (WasmSec.Name == "linking") { std::unique_ptr LinkingSec = make_unique(); + LinkingSec->Version = Obj.linkingData().Version; + ArrayRef Comdats = Obj.linkingData().Comdats; for (StringRef ComdatName : Comdats) LinkingSec->Comdats.emplace_back(WasmYAML::Comdat{ComdatName, {}}); @@ -71,6 +73,7 @@ std::unique_ptr WasmDumper::dumpCustomSection(const Was WasmYAML::ComdatEntry{wasm::WASM_COMDAT_FUNCTION, Func.Index}); } } + uint32_t SegmentIndex = 0; for (const object::WasmSegment &Segment : Obj.dataSegments()) { if (!Segment.Data.Name.empty()) { @@ -87,6 +90,7 @@ std::unique_ptr WasmDumper::dumpCustomSection(const Was } SegmentIndex++; } + uint32_t SymbolIndex = 0; for (const wasm::WasmSymbolInfo &Symbol : Obj.linkingData().SymbolTable) { WasmYAML::SymbolInfo Info; @@ -105,10 +109,12 @@ std::unique_ptr WasmDumper::dumpCustomSection(const Was } LinkingSec->SymbolTable.emplace_back(Info); } + for (const wasm::WasmInitFunc &Func : Obj.linkingData().InitFunctions) { WasmYAML::InitFunction F{Func.Priority, Func.Symbol}; LinkingSec->InitFunctions.emplace_back(F); } + CustomSec = std::move(LinkingSec); } else { CustomSec = make_unique(WasmSec.Name); diff --git a/llvm/tools/yaml2obj/yaml2wasm.cpp b/llvm/tools/yaml2obj/yaml2wasm.cpp index 9b2a98d..9be2f09 100644 --- a/llvm/tools/yaml2obj/yaml2wasm.cpp +++ b/llvm/tools/yaml2obj/yaml2wasm.cpp @@ -134,6 +134,7 @@ public: int WasmWriter::writeSectionContent(raw_ostream &OS, WasmYAML::LinkingSection &Section) { writeStringRef(Section.Name, OS); + encodeULEB128(Section.Version, OS); SubSectionWriter SubSection(OS); -- 2.7.4