Skip to content
This repository was archived by the owner on Jan 1, 2023. It is now read-only.

Commit c37fd16

Browse files
committed
[WebAssembly] Add version to object file metadata
Summary: See WebAssembly/tool-conventions#54 Subscribers: jfb, dschuff, jgravelle-google, aheejin, sunfish, llvm-commits Differential Revision: https://reviews.llvm.org/D46069 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@330969 91177308-0d34-0410-b5e6-96231b3b80d8
1 parent 0866a2f commit c37fd16

31 files changed

+57
-22
lines changed

include/llvm/BinaryFormat/Wasm.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,8 @@ namespace wasm {
2424
const char WasmMagic[] = {'\0', 'a', 's', 'm'};
2525
// Wasm binary format version
2626
const uint32_t WasmVersion = 0x1;
27+
// Wasm linking metadata version
28+
const uint32_t WasmMetadataVersion = 0x1;
2729
// Wasm uses a 64k page size
2830
const uint32_t WasmPageSize = 65536;
2931

@@ -161,6 +163,7 @@ struct WasmFunctionName {
161163
};
162164

163165
struct WasmLinkingData {
166+
uint32_t Version;
164167
std::vector<WasmInitFunc> InitFunctions;
165168
std::vector<StringRef> Comdats;
166169
std::vector<WasmSymbolInfo> SymbolTable;

include/llvm/ObjectYAML/WasmYAML.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -195,6 +195,7 @@ struct LinkingSection : CustomSection {
195195
return C && C->Name == "linking";
196196
}
197197

198+
uint32_t Version;
198199
std::vector<SymbolInfo> SymbolTable;
199200
std::vector<SegmentInfo> SegmentInfos;
200201
std::vector<InitFunction> InitFunctions;

lib/MC/WasmObjectWriter.cpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -857,8 +857,9 @@ void WasmObjectWriter::writeLinkingMetaDataSection(
857857
const std::map<StringRef, std::vector<WasmComdatEntry>> &Comdats) {
858858
SectionBookkeeping Section;
859859
startCustomSection(Section, "linking");
860-
SectionBookkeeping SubSection;
860+
encodeULEB128(wasm::WasmMetadataVersion, getStream());
861861

862+
SectionBookkeeping SubSection;
862863
if (SymbolInfos.size() != 0) {
863864
startSection(SubSection, wasm::WASM_SYMBOL_TABLE);
864865
encodeULEB128(SymbolInfos.size(), getStream());

lib/Object/WasmObjectFile.cpp

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -313,6 +313,14 @@ Error WasmObjectFile::parseLinkingSection(const uint8_t *Ptr,
313313
"Linking data must come after code section", object_error::parse_failed);
314314
}
315315

316+
LinkingData.Version = readVaruint32(Ptr);
317+
if (LinkingData.Version != wasm::WasmMetadataVersion) {
318+
return make_error<GenericBinaryError>(
319+
"Unexpected metadata version: " + Twine(LinkingData.Version) +
320+
" (Expected: " + Twine(wasm::WasmMetadataVersion) + ")",
321+
object_error::parse_failed);
322+
}
323+
316324
while (Ptr < End) {
317325
uint8_t Type = readUint8(Ptr);
318326
uint32_t Size = readVaruint32(Ptr);

lib/ObjectYAML/WasmYAML.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,7 @@ static void sectionMapping(IO &IO, WasmYAML::NameSection &Section) {
5757
static void sectionMapping(IO &IO, WasmYAML::LinkingSection &Section) {
5858
commonSectionMapping(IO, Section);
5959
IO.mapRequired("Name", Section.Name);
60+
IO.mapRequired("Version", Section.Version);
6061
IO.mapOptional("SymbolTable", Section.SymbolTable);
6162
IO.mapOptional("SegmentInfo", Section.SegmentInfos);
6263
IO.mapOptional("InitFunctions", Section.InitFunctions);

test/MC/WebAssembly/array-fill.ll

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -12,9 +12,7 @@ target triple = "wasm32-unknown-unknown-wasm"
1212
; CHECK: - Type: DATA
1313
; CHECK: Content: '0102'
1414

15-
; CHECK: - Type: CUSTOM
16-
; CHECK-NEXT: Name: linking
17-
; CHECK-NEXT: SymbolTable:
15+
; CHECK: SymbolTable:
1816
; CHECK-NEXT: - Index: 0
1917
; CHECK-NEXT: Kind: DATA
2018
; CHECK-NEXT: Name: gBd

test/MC/WebAssembly/bss.ll

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -35,9 +35,8 @@ target triple = "wasm32-unknown-unknown-wasm"
3535
; CHECK-NEXT: Opcode: I32_CONST
3636
; CHECK-NEXT: Value: 8
3737
; CHECK-NEXT: Content: ''
38-
; CHECK-NEXT: - Type: CUSTOM
39-
; CHECK-NEXT: Name: linking
40-
; CHECK-NEXT: SymbolTable:
38+
39+
; CHECK: SymbolTable:
4140
; CHECK-NEXT: - Index: 0
4241
; CHECK-NEXT: Kind: DATA
4342
; CHECK-NEXT: Name: g0

test/MC/WebAssembly/comdat.ll

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -75,6 +75,7 @@ define linkonce_odr i32 @sharedFn() #1 comdat($sharedComdat) {
7575
; CHECK-NEXT: Content: '616263'
7676
; CHECK-NEXT: - Type: CUSTOM
7777
; CHECK-NEXT: Name: linking
78+
; CHECK-NEXT: Version: 1
7879
; CHECK-NEXT: SymbolTable:
7980
; CHECK-NEXT: - Index: 0
8081
; CHECK-NEXT: Kind: FUNCTION

test/MC/WebAssembly/explicit-sections.ll

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -30,9 +30,8 @@ target triple = "wasm32-unknown-unknown-wasm"
3030
; CHECK-NEXT: Opcode: I32_CONST
3131
; CHECK-NEXT: Value: 24
3232
; CHECK-NEXT: Content: '08000000'
33-
; CHECK-NEXT: - Type: CUSTOM
34-
; CHECK-NEXT: Name: linking
35-
; CHECK-NEXT: SymbolTable:
33+
34+
; CHECK: SymbolTable:
3635
; CHECK-NEXT: - Index: 0
3736
; CHECK-NEXT: Kind: DATA
3837
; CHECK-NEXT: Name: global0

test/MC/WebAssembly/global-ctor-dtor.ll

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -110,6 +110,7 @@ declare void @func3()
110110
; CHECK-NEXT: Content: '01040000'
111111
; CHECK-NEXT: - Type: CUSTOM
112112
; CHECK-NEXT: Name: linking
113+
; CHECK-NEXT: Version: 1
113114
; CHECK-NEXT: SymbolTable:
114115
; CHECK-NEXT: - Index: 0
115116
; CHECK-NEXT: Kind: FUNCTION

test/MC/WebAssembly/unnamed-data.ll

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,7 @@ target triple = "wasm32-unknown-unknown-wasm"
4444
; CHECK-NEXT: Content: '06000000'
4545
; CHECK-NEXT: - Type: CUSTOM
4646
; CHECK-NEXT: Name: linking
47+
; CHECK-NEXT: Version: 1
4748
; CHECK-NEXT: SymbolTable:
4849
; CHECK-NEXT: - Index: 0
4950
; CHECK-NEXT: Kind: DATA

test/MC/WebAssembly/visibility.ll

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -14,9 +14,7 @@ entry:
1414
ret void
1515
}
1616

17-
; CHECK: - Type: CUSTOM
18-
; CHECK-NEXT: Name: linking
19-
; CHECK-NEXT: SymbolTable:
17+
; CHECK: SymbolTable:
2018
; CHECK-NEXT: - Index: 0
2119
; CHECK-NEXT: Kind: FUNCTION
2220
; CHECK-NEXT: Name: defaultVis

test/MC/WebAssembly/weak-alias.ll

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -138,6 +138,7 @@ entry:
138138
; CHECK-NEXT: Content: '01000000'
139139
; CHECK-NEXT: - Type: CUSTOM
140140
; CHECK-NEXT: Name: linking
141+
; CHECK-NEXT: Version: 1
141142
; CHECK-NEXT: SymbolTable:
142143
; CHECK-NEXT: - Index: 0
143144
; CHECK-NEXT: Kind: FUNCTION

test/MC/WebAssembly/weak.ll

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -20,9 +20,7 @@ entry:
2020
; CHECK-NEXT: Field: __indirect_function_table
2121

2222

23-
; CHECK: - Type: CUSTOM
24-
; CHECK-NEXT: Name: linking
25-
; CHECK-NEXT: SymbolTable:
23+
; CHECK: SymbolTable:
2624
; CHECK-NEXT: - Index: 0
2725
; CHECK-NEXT: Kind: FUNCTION
2826
; CHECK-NEXT: Name: weak_function
4 Bytes
Binary file not shown.

test/Object/obj2yaml.test

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -651,6 +651,7 @@ WASM-NEXT: FileHeader:
651651
WASM-NEXT: Version: 0x00000001
652652
WASM: - Type: CUSTOM
653653
WASM-NEXT: Name: linking
654+
WASM-NEXT: Version: 1
654655
WASM-NEXT: SymbolTable:
655656
WASM-NEXT: - Index: 0
656657
WASM-NEXT: Kind: FUNCTION
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
# RUN: yaml2obj %s | not llvm-objdump -h - 2>&1 | FileCheck %s
2+
3+
!WASM
4+
FileHeader:
5+
Version: 0x00000001
6+
Sections:
7+
- Type: CUSTOM
8+
Name: linking
9+
Version: 0
10+
11+
# CHECK: {{.*}}: Unexpected metadata version: 0 (Expected: 1)

test/ObjectYAML/wasm/code_section.yaml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,7 @@ Sections:
3939
Body: 108180808000210020000F0B
4040
- Type: CUSTOM
4141
Name: linking
42+
Version: 1
4243
SymbolTable:
4344
- Index: 0
4445
Kind: FUNCTION

test/ObjectYAML/wasm/data_section.yaml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ Sections:
2424
Addend: -6
2525
- Type: CUSTOM
2626
Name: linking
27+
Version: 1
2728
SymbolTable:
2829
- Index: 0
2930
Kind: DATA

test/ObjectYAML/wasm/invalid_global_weak.yaml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ Sections:
1313
GlobalMutable: false
1414
- Type: CUSTOM
1515
Name: linking
16+
Version: 1
1617
SymbolTable:
1718
- Index: 0
1819
Kind: GLOBAL

test/ObjectYAML/wasm/linking_section.yaml

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@ Sections:
2929
Content: '11110000'
3030
- Type: CUSTOM
3131
Name: linking
32+
Version: 1
3233
SymbolTable:
3334
- Index: 0
3435
Kind: FUNCTION
@@ -48,9 +49,7 @@ Sections:
4849
- Priority: 1
4950
Symbol: 0
5051
...
51-
# CHECK: - Type: CUSTOM
52-
# CHECK-NEXT: Name: linking
53-
# CHECK-NEXT: SymbolTable:
52+
# CHECK: SymbolTable:
5453
# CHECK-NEXT: - Index: 0
5554
# CHECK-NEXT: Kind: FUNCTION
5655
# CHECK-NEXT: Name: bar

test/ObjectYAML/wasm/weak_symbols.yaml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@ Sections:
3636
Body: 00
3737
- Type: CUSTOM
3838
Name: linking
39+
Version: 1
3940
SymbolTable:
4041
- Index: 0
4142
Kind: FUNCTION

test/tools/llvm-nm/wasm/exports.yaml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@ Sections:
3737
Content: '616263'
3838
- Type: CUSTOM
3939
Name: linking
40+
Version: 1
4041
SymbolTable:
4142
- Index: 0
4243
Kind: FUNCTION

test/tools/llvm-nm/wasm/imports.yaml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ Sections:
2525
GlobalMutable: false
2626
- Type: CUSTOM
2727
Name: linking
28+
Version: 1
2829
SymbolTable:
2930
- Index: 0
3031
Kind: FUNCTION

test/tools/llvm-nm/wasm/weak-symbols.yaml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,7 @@ Sections:
4343
Content: '616263'
4444
- Type: CUSTOM
4545
Name: linking
46+
Version: 1
4647
SymbolTable:
4748
- Index: 0
4849
Kind: DATA
4 Bytes
Binary file not shown.

test/tools/llvm-objdump/wasm.txt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
# CHECK-NEXT: 2 FUNCTION 00000002 0000000000000000
88
# CHECK-NEXT: 3 CODE 00000019 0000000000000000 TEXT
99
# CHECK-NEXT: 4 DATA 0000001c 0000000000000000 DATA
10-
# CHECK-NEXT: 5 linking 0000004d 0000000000000000
10+
# CHECK-NEXT: 5 linking 00000051 0000000000000000
1111
# CHECK-NEXT: 6 reloc.CODE 0000000c 0000000000000000
1212

1313
# RUN: llvm-objdump -p %p/Inputs/trivial.obj.wasm | FileCheck %s -check-prefix CHECK-HEADER
4 Bytes
Binary file not shown.

test/tools/llvm-readobj/sections.test

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -528,14 +528,14 @@ WASM-NEXT: ]
528528
WASM-NEXT: }
529529
WASM-NEXT: Section {
530530
WASM-NEXT: Type: CUSTOM (0x0)
531-
WASM-NEXT: Size: 57
531+
WASM-NEXT: Size: 61
532532
WASM-NEXT: Offset: 191
533533
WASM-NEXT: Name: linking
534534
WASM-NEXT: }
535535
WASM-NEXT: Section {
536536
WASM-NEXT: Type: CUSTOM (0x0)
537537
WASM-NEXT: Size: 12
538-
WASM-NEXT: Offset: 262
538+
WASM-NEXT: Offset: 266
539539
WASM-NEXT: Name: reloc.CODE
540540
WASM-NEXT: }
541541
WASM-NEXT: ]

tools/obj2yaml/wasm2yaml.cpp

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,8 @@ std::unique_ptr<WasmYAML::CustomSection> WasmDumper::dumpCustomSection(const Was
6262
CustomSec = std::move(NameSec);
6363
} else if (WasmSec.Name == "linking") {
6464
std::unique_ptr<WasmYAML::LinkingSection> LinkingSec = make_unique<WasmYAML::LinkingSection>();
65+
LinkingSec->Version = Obj.linkingData().Version;
66+
6567
ArrayRef<StringRef> Comdats = Obj.linkingData().Comdats;
6668
for (StringRef ComdatName : Comdats)
6769
LinkingSec->Comdats.emplace_back(WasmYAML::Comdat{ComdatName, {}});
@@ -71,6 +73,7 @@ std::unique_ptr<WasmYAML::CustomSection> WasmDumper::dumpCustomSection(const Was
7173
WasmYAML::ComdatEntry{wasm::WASM_COMDAT_FUNCTION, Func.Index});
7274
}
7375
}
76+
7477
uint32_t SegmentIndex = 0;
7578
for (const object::WasmSegment &Segment : Obj.dataSegments()) {
7679
if (!Segment.Data.Name.empty()) {
@@ -87,6 +90,7 @@ std::unique_ptr<WasmYAML::CustomSection> WasmDumper::dumpCustomSection(const Was
8790
}
8891
SegmentIndex++;
8992
}
93+
9094
uint32_t SymbolIndex = 0;
9195
for (const wasm::WasmSymbolInfo &Symbol : Obj.linkingData().SymbolTable) {
9296
WasmYAML::SymbolInfo Info;
@@ -105,10 +109,12 @@ std::unique_ptr<WasmYAML::CustomSection> WasmDumper::dumpCustomSection(const Was
105109
}
106110
LinkingSec->SymbolTable.emplace_back(Info);
107111
}
112+
108113
for (const wasm::WasmInitFunc &Func : Obj.linkingData().InitFunctions) {
109114
WasmYAML::InitFunction F{Func.Priority, Func.Symbol};
110115
LinkingSec->InitFunctions.emplace_back(F);
111116
}
117+
112118
CustomSec = std::move(LinkingSec);
113119
} else {
114120
CustomSec = make_unique<WasmYAML::CustomSection>(WasmSec.Name);

tools/yaml2obj/yaml2wasm.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -134,6 +134,7 @@ class SubSectionWriter {
134134

135135
int WasmWriter::writeSectionContent(raw_ostream &OS, WasmYAML::LinkingSection &Section) {
136136
writeStringRef(Section.Name, OS);
137+
encodeULEB128(Section.Version, OS);
137138

138139
SubSectionWriter SubSection(OS);
139140

0 commit comments

Comments
 (0)