Skip to content

Commit fef8de6

Browse files
committed
[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 llvm-svn: 358315
1 parent bdb5e4e commit fef8de6

File tree

21 files changed

+114
-38
lines changed

21 files changed

+114
-38
lines changed

llvm/include/llvm/Object/Wasm.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -247,6 +247,7 @@ class WasmObjectFile : public ObjectFile {
247247
Error parseElemSection(ReadContext &Ctx);
248248
Error parseCodeSection(ReadContext &Ctx);
249249
Error parseDataSection(ReadContext &Ctx);
250+
Error parseDataCountSection(ReadContext &Ctx);
250251

251252
// Custom section types
252253
Error parseDylinkSection(ReadContext &Ctx);
@@ -273,6 +274,7 @@ class WasmObjectFile : public ObjectFile {
273274
std::vector<wasm::WasmExport> Exports;
274275
std::vector<wasm::WasmElemSegment> ElemSegments;
275276
std::vector<WasmSegment> DataSegments;
277+
llvm::Optional<size_t> DataCount;
276278
std::vector<wasm::WasmFunction> Functions;
277279
std::vector<WasmSymbol> Symbols;
278280
std::vector<wasm::WasmFunctionName> DebugNames;

llvm/include/llvm/ObjectYAML/WasmYAML.h

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -379,6 +379,16 @@ struct DataSection : Section {
379379
std::vector<DataSegment> Segments;
380380
};
381381

382+
struct DataCountSection : Section {
383+
DataCountSection() : Section(wasm::WASM_SEC_DATACOUNT) {}
384+
385+
static bool classof(const Section *S) {
386+
return S->Type == wasm::WASM_SEC_DATACOUNT;
387+
}
388+
389+
uint32_t Count;
390+
};
391+
382392
struct Object {
383393
FileHeader Header;
384394
std::vector<std::unique_ptr<Section>> Sections;

llvm/lib/MC/WasmObjectWriter.cpp

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -326,6 +326,7 @@ class WasmObjectWriter : public MCObjectWriter {
326326
void writeFunctionSection(ArrayRef<WasmFunction> Functions);
327327
void writeExportSection(ArrayRef<wasm::WasmExport> Exports);
328328
void writeElemSection(ArrayRef<uint32_t> TableElems);
329+
void writeDataCountSection();
329330
void writeCodeSection(const MCAssembler &Asm, const MCAsmLayout &Layout,
330331
ArrayRef<WasmFunction> Functions);
331332
void writeDataSection();
@@ -849,6 +850,16 @@ void WasmObjectWriter::writeElemSection(ArrayRef<uint32_t> TableElems) {
849850
endSection(Section);
850851
}
851852

853+
void WasmObjectWriter::writeDataCountSection() {
854+
if (DataSegments.empty())
855+
return;
856+
857+
SectionBookkeeping Section;
858+
startSection(Section, wasm::WASM_SEC_DATACOUNT);
859+
encodeULEB128(DataSegments.size(), W.OS);
860+
endSection(Section);
861+
}
862+
852863
void WasmObjectWriter::writeCodeSection(const MCAssembler &Asm,
853864
const MCAsmLayout &Layout,
854865
ArrayRef<WasmFunction> Functions) {
@@ -1600,6 +1611,7 @@ uint64_t WasmObjectWriter::writeObject(MCAssembler &Asm,
16001611
writeEventSection(Events);
16011612
writeExportSection(Exports);
16021613
writeElemSection(TableElems);
1614+
writeDataCountSection();
16031615
writeCodeSection(Asm, Layout, Functions);
16041616
writeDataSection();
16051617
for (auto &CustomSection : CustomSections)

llvm/lib/Object/WasmObjectFile.cpp

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -316,6 +316,8 @@ Error WasmObjectFile::parseSection(WasmSection &Sec) {
316316
return parseCodeSection(Ctx);
317317
case wasm::WASM_SEC_DATA:
318318
return parseDataSection(Ctx);
319+
case wasm::WASM_SEC_DATACOUNT:
320+
return parseDataCountSection(Ctx);
319321
default:
320322
return make_error<GenericBinaryError>("Bad section type",
321323
object_error::parse_failed);
@@ -1201,6 +1203,9 @@ Error WasmObjectFile::parseElemSection(ReadContext &Ctx) {
12011203
Error WasmObjectFile::parseDataSection(ReadContext &Ctx) {
12021204
DataSection = Sections.size();
12031205
uint32_t Count = readVaruint32(Ctx);
1206+
if (DataCount && Count != DataCount.getValue())
1207+
return make_error<GenericBinaryError>(
1208+
"Number of data segments does not match DataCount section");
12041209
DataSegments.reserve(Count);
12051210
while (Count--) {
12061211
WasmSegment Segment;
@@ -1234,6 +1239,11 @@ Error WasmObjectFile::parseDataSection(ReadContext &Ctx) {
12341239
return Error::success();
12351240
}
12361241

1242+
Error WasmObjectFile::parseDataCountSection(ReadContext &Ctx) {
1243+
DataCount = readVaruint32(Ctx);
1244+
return Error::success();
1245+
}
1246+
12371247
const wasm::WasmObjectHeader &WasmObjectFile::getHeader() const {
12381248
return Header;
12391249
}
@@ -1399,6 +1409,7 @@ std::error_code WasmObjectFile::getSectionName(DataRefImpl Sec,
13991409
ECase(ELEM);
14001410
ECase(CODE);
14011411
ECase(DATA);
1412+
ECase(DATACOUNT);
14021413
case wasm::WASM_SEC_CUSTOM:
14031414
Res = S.Name;
14041415
break;

llvm/lib/ObjectYAML/WasmYAML.cpp

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -153,6 +153,11 @@ static void sectionMapping(IO &IO, WasmYAML::DataSection &Section) {
153153
IO.mapRequired("Segments", Section.Segments);
154154
}
155155

156+
static void sectionMapping(IO &IO, WasmYAML::DataCountSection &Section) {
157+
commonSectionMapping(IO, Section);
158+
IO.mapRequired("Count", Section.Count);
159+
}
160+
156161
void MappingTraits<std::unique_ptr<WasmYAML::Section>>::mapping(
157162
IO &IO, std::unique_ptr<WasmYAML::Section> &Section) {
158163
WasmYAML::SectionType SectionType;
@@ -257,6 +262,11 @@ void MappingTraits<std::unique_ptr<WasmYAML::Section>>::mapping(
257262
Section.reset(new WasmYAML::DataSection());
258263
sectionMapping(IO, *cast<WasmYAML::DataSection>(Section.get()));
259264
break;
265+
case wasm::WASM_SEC_DATACOUNT:
266+
if (!IO.outputting())
267+
Section.reset(new WasmYAML::DataCountSection());
268+
sectionMapping(IO, *cast<WasmYAML::DataCountSection>(Section.get()));
269+
break;
260270
default:
261271
llvm_unreachable("Unknown section type");
262272
}
@@ -278,6 +288,7 @@ void ScalarEnumerationTraits<WasmYAML::SectionType>::enumeration(
278288
ECase(ELEM);
279289
ECase(CODE);
280290
ECase(DATA);
291+
ECase(DATACOUNT);
281292
#undef ECase
282293
}
283294

llvm/test/MC/WebAssembly/bss.ll

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ target triple = "wasm32-unknown-unknown"
99
@foo = global %union.u1 zeroinitializer, align 1
1010
@bar = global %union.u1 zeroinitializer, align 1
1111

12-
; CHECK: - Type: DATA
12+
; CHECK: - Type: DATA{{$}}
1313
; CHECK-NEXT: Segments:
1414
; CHECK-NEXT: - SectionOffset: 6
1515
; CHECK-NEXT: InitFlags: 0

llvm/test/MC/WebAssembly/comdat.ll

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,8 @@ define linkonce_odr i32 @sharedFn() #1 comdat($sharedComdat) {
5050
; CHECK-NEXT: SigIndex: 0
5151
; CHECK-NEXT: - Type: FUNCTION
5252
; CHECK-NEXT: FunctionTypes: [ 0, 0, 0 ]
53+
; CHECK-NEXT: - Type: DATACOUNT
54+
; CHECK-NEXT: Count: 1
5355
; CHECK-NEXT: - Type: CODE
5456
; CHECK-NEXT: Relocations:
5557
; CHECK-NEXT: - Type: R_WASM_FUNCTION_INDEX_LEB

llvm/test/MC/WebAssembly/data-section.s

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,8 @@ test0:
5353
# BIN-NEXT: Initial: 0x00000000
5454
# BIN-NEXT: - Type: FUNCTION
5555
# BIN-NEXT: FunctionTypes: [ 0 ]
56+
# BIN-NEXT: - Type: DATACOUNT
57+
# BIN-NEXT: Count: 1
5658
# BIN-NEXT: - Type: CODE
5759
# BIN-NEXT: Relocations:
5860
# BIN-NEXT: - Type: R_WASM_MEMORY_ADDR_SLEB
@@ -91,4 +93,3 @@ test0:
9193
# BIN-NEXT: Alignment: 0
9294
# BIN-NEXT: Flags: [ ]
9395
# BIN-NEXT: ...
94-

llvm/test/MC/WebAssembly/debug-info.ll

Lines changed: 30 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -25,14 +25,19 @@
2525
; CHECK-NEXT: Offset: 90
2626
; CHECK-NEXT: }
2727
; CHECK-NEXT: Section {
28+
; CHECK-NEXT: Type: DATACOUNT (0xC)
29+
; CHECK-NEXT: Size: 1
30+
; CHECK-NEXT: Offset: 103
31+
; CHECK-NEXT: }
32+
; CHECK-NEXT: Section {
2833
; CHECK-NEXT: Type: CODE (0xA)
2934
; CHECK-NEXT: Size: 4
30-
; CHECK-NEXT: Offset: 103
35+
; CHECK-NEXT: Offset: 110
3136
; CHECK-NEXT: }
3237
; CHECK-NEXT: Section {
3338
; CHECK-NEXT: Type: DATA (0xB)
3439
; CHECK-NEXT: Size: 19
35-
; CHECK-NEXT: Offset: 113
40+
; CHECK-NEXT: Offset: 120
3641
; CHECK-NEXT: Segments [
3742
; CHECK-NEXT: Segment {
3843
; CHECK-NEXT: Name: .data.foo
@@ -49,94 +54,94 @@
4954
; CHECK-NEXT: Section {
5055
; CHECK-NEXT: Type: CUSTOM (0x0)
5156
; CHECK-NEXT: Size: 121
52-
; CHECK-NEXT: Offset: 138
57+
; CHECK-NEXT: Offset: 145
5358
; CHECK-NEXT: Name: .debug_str
5459
; CHECK-NEXT: }
5560
; CHECK-NEXT: Section {
5661
; CHECK-NEXT: Type: CUSTOM (0x0)
5762
; CHECK-NEXT: Size: 84
58-
; CHECK-NEXT: Offset: 276
63+
; CHECK-NEXT: Offset: 283
5964
; CHECK-NEXT: Name: .debug_abbrev
6065
; CHECK-NEXT: }
6166
; CHECK-NEXT: Section {
6267
; CHECK-NEXT: Type: CUSTOM (0x0)
6368
; CHECK-NEXT: Size: 106
64-
; CHECK-NEXT: Offset: 380
69+
; CHECK-NEXT: Offset: 387
6570
; CHECK-NEXT: Name: .debug_info
6671
; CHECK-NEXT: }
6772
; CHECK-NEXT: Section {
6873
; CHECK-NEXT: Type: CUSTOM (0x0)
6974
; CHECK-NEXT: Size: 1
70-
; CHECK-NEXT: Offset: 504
75+
; CHECK-NEXT: Offset: 511
7176
; CHECK-NEXT: Name: .debug_macinfo
7277
; CHECK-NEXT: }
7378
; CHECK-NEXT: Section {
7479
; CHECK-NEXT: Type: CUSTOM (0x0)
7580
; CHECK-NEXT: Size: 42
76-
; CHECK-NEXT: Offset: 526
81+
; CHECK-NEXT: Offset: 533
7782
; CHECK-NEXT: Name: .debug_pubnames
7883
; CHECK-NEXT: }
7984
; CHECK-NEXT: Section {
8085
; CHECK-NEXT: Type: CUSTOM (0x0)
8186
; CHECK-NEXT: Size: 26
82-
; CHECK-NEXT: Offset: 590
87+
; CHECK-NEXT: Offset: 597
8388
; CHECK-NEXT: Name: .debug_pubtypes
8489
; CHECK-NEXT: }
8590
; CHECK-NEXT: Section {
8691
; CHECK-NEXT: Type: CUSTOM (0x0)
8792
; CHECK-NEXT: Size: 57
88-
; CHECK-NEXT: Offset: 638
93+
; CHECK-NEXT: Offset: 645
8994
; CHECK-NEXT: Name: .debug_line
9095
; CHECK-NEXT: }
9196
; CHECK-NEXT: Section {
9297
; CHECK-NEXT: Type: CUSTOM (0x0)
9398
; CHECK-NEXT: Size: 88
94-
; CHECK-NEXT: Offset: 713
99+
; CHECK-NEXT: Offset: 720
95100
; CHECK-NEXT: Name: linking
96101
; CHECK-NEXT: }
97102
; CHECK-NEXT: Section {
98103
; CHECK-NEXT: Type: CUSTOM (0x0)
99104
; CHECK-NEXT: Size: 9
100-
; CHECK-NEXT: Offset: 815
105+
; CHECK-NEXT: Offset: 822
101106
; CHECK-NEXT: Name: reloc.DATA
102107
; CHECK-NEXT: }
103108
; CHECK-NEXT: Section {
104109
; CHECK-NEXT: Type: CUSTOM (0x0)
105110
; CHECK-NEXT: Size: 58
106-
; CHECK-NEXT: Offset: 841
111+
; CHECK-NEXT: Offset: 848
107112
; CHECK-NEXT: Name: reloc..debug_info
108113
; CHECK-NEXT: }
109114
; CHECK-NEXT: Section {
110115
; CHECK-NEXT: Type: CUSTOM (0x0)
111116
; CHECK-NEXT: Size: 6
112-
; CHECK-NEXT: Offset: 923
117+
; CHECK-NEXT: Offset: 930
113118
; CHECK-NEXT: Name: reloc..debug_pubnames
114119
; CHECK-NEXT: }
115120
; CHECK-NEXT: Section {
116121
; CHECK-NEXT: Type: CUSTOM (0x0)
117122
; CHECK-NEXT: Size: 6
118-
; CHECK-NEXT: Offset: 957
123+
; CHECK-NEXT: Offset: 964
119124
; CHECK-NEXT: Name: reloc..debug_pubtypes
120125
; CHECK-NEXT: }
121126
; CHECK-NEXT: Section {
122127
; CHECK-NEXT: Type: CUSTOM (0x0)
123128
; CHECK-NEXT: Size: 6
124-
; CHECK-NEXT: Offset: 991
129+
; CHECK-NEXT: Offset: 998
125130
; CHECK-NEXT: Name: reloc..debug_line
126131
; CHECK-NEXT: }
127132
; CHECK-NEXT: Section {
128133
; CHECK-NEXT: Type: CUSTOM (0x0)
129134
; CHECK-NEXT: Size: 77
130-
; CHECK-NEXT: Offset: 1021
135+
; CHECK-NEXT: Offset: 1028
131136
; CHECK-NEXT: Name: producers
132137
; CHECK-NEXT: }
133138
; CHECK-NEXT:]
134139
; CHECK-NEXT:Relocations [
135-
; CHECK-NEXT: Section (6) DATA {
140+
; CHECK-NEXT: Section (7) DATA {
136141
; CHECK-NEXT: 0x6 R_WASM_MEMORY_ADDR_I32 myextern 0
137142
; CHECK-NEXT: 0xF R_WASM_TABLE_INDEX_I32 f2
138143
; CHECK-NEXT: }
139-
; CHECK-NEXT: Section (9) .debug_info {
144+
; CHECK-NEXT: Section (10) .debug_info {
140145
; CHECK-NEXT: 0x6 R_WASM_SECTION_OFFSET_I32 .debug_abbrev 0
141146
; CHECK-NEXT: 0xC R_WASM_SECTION_OFFSET_I32 .debug_str 0
142147
; CHECK-NEXT: 0x12 R_WASM_SECTION_OFFSET_I32 .debug_str 55
@@ -151,13 +156,13 @@
151156
; CHECK-NEXT: 0x5B R_WASM_FUNCTION_OFFSET_I32 f2 0
152157
; CHECK-NEXT: 0x63 R_WASM_SECTION_OFFSET_I32 .debug_str 118
153158
; CHECK-NEXT: }
154-
; CHECK-NEXT: Section (11) .debug_pubnames {
159+
; CHECK-NEXT: Section (12) .debug_pubnames {
155160
; CHECK-NEXT: 0x6 R_WASM_SECTION_OFFSET_I32 .debug_info 0
156161
; CHECK-NEXT: }
157-
; CHECK-NEXT: Section (12) .debug_pubtypes {
162+
; CHECK-NEXT: Section (13) .debug_pubtypes {
158163
; CHECK-NEXT: 0x6 R_WASM_SECTION_OFFSET_I32 .debug_info 0
159164
; CHECK-NEXT: }
160-
; CHECK-NEXT: Section (13) .debug_line {
165+
; CHECK-NEXT: Section (14) .debug_line {
161166
; CHECK-NEXT: 0x2B R_WASM_FUNCTION_OFFSET_I32 f2 0
162167
; CHECK-NEXT: }
163168
; CHECK-NEXT:]
@@ -205,31 +210,31 @@
205210
; CHECK-NEXT: Flags [ (0x2)
206211
; CHECK-NEXT: BINDING_LOCAL (0x2)
207212
; CHECK-NEXT: ]
208-
; CHECK-NEXT: ElementIndex: 0x6
213+
; CHECK-NEXT: ElementIndex: 0x7
209214
; CHECK-NEXT: }
210215
; CHECK-NEXT: Symbol {
211216
; CHECK-NEXT: Name: .debug_abbrev
212217
; CHECK-NEXT: Type: SECTION (0x3)
213218
; CHECK-NEXT: Flags [ (0x2)
214219
; CHECK-NEXT: BINDING_LOCAL (0x2)
215220
; CHECK-NEXT: ]
216-
; CHECK-NEXT: ElementIndex: 0x7
221+
; CHECK-NEXT: ElementIndex: 0x8
217222
; CHECK-NEXT: }
218223
; CHECK-NEXT: Symbol {
219224
; CHECK-NEXT: Name: .debug_info
220225
; CHECK-NEXT: Type: SECTION (0x3)
221226
; CHECK-NEXT: Flags [ (0x2)
222227
; CHECK-NEXT: BINDING_LOCAL (0x2)
223228
; CHECK-NEXT: ]
224-
; CHECK-NEXT: ElementIndex: 0x8
229+
; CHECK-NEXT: ElementIndex: 0x9
225230
; CHECK-NEXT: }
226231
; CHECK-NEXT: Symbol {
227232
; CHECK-NEXT: Name: .debug_line
228233
; CHECK-NEXT: Type: SECTION (0x3)
229234
; CHECK-NEXT: Flags [ (0x2)
230235
; CHECK-NEXT: BINDING_LOCAL (0x2)
231236
; CHECK-NEXT: ]
232-
; CHECK-NEXT: ElementIndex: 0xC
237+
; CHECK-NEXT: ElementIndex: 0xD
233238
; CHECK-NEXT: }
234239
; CHECK-NEXT:]
235240

llvm/test/MC/WebAssembly/explicit-sections.ll

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ target triple = "wasm32-unknown-unknown"
1010
@global3 = global i32 8, align 8, section ".sec2"
1111

1212

13-
; CHECK: - Type: DATA
13+
; CHECK: - Type: DATA{{$}}
1414
; CHECK-NEXT: Segments:
1515
; CHECK-NEXT: - SectionOffset: 6
1616
; CHECK-NEXT: InitFlags: 0

0 commit comments

Comments
 (0)