Skip to content

Commit 820e67c

Browse files
committed
Support new dylink.0 custom section format
See also: llvm change: https://reviews.llvm.org/D109595 wabt change: WebAssembly/wabt#1707
1 parent 23e452a commit 820e67c

File tree

5 files changed

+59
-28
lines changed

5 files changed

+59
-28
lines changed

src/wasm-binary.h

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -403,6 +403,7 @@ namespace UserSections {
403403
extern const char* Name;
404404
extern const char* SourceMapUrl;
405405
extern const char* Dylink;
406+
extern const char* Dylink0;
406407
extern const char* Linking;
407408
extern const char* Producers;
408409
extern const char* TargetFeatures;
@@ -435,7 +436,10 @@ enum Subsection {
435436
NameElem = 8,
436437
NameData = 9,
437438
// see: https://github.com/WebAssembly/gc/issues/193
438-
NameField = 10
439+
NameField = 10,
440+
441+
DylinkMemInfo = 1,
442+
DylinkNeeded = 2,
439443
};
440444

441445
} // namespace UserSections
@@ -1556,6 +1560,7 @@ class WasmBinaryBuilder {
15561560
void readNames(size_t);
15571561
void readFeatures(size_t);
15581562
void readDylink(size_t);
1563+
void readDylink0(size_t);
15591564

15601565
// Debug information reading helpers
15611566
void setDebugLocations(std::istream* sourceMap_) { sourceMap = sourceMap_; }

src/wasm/wasm-binary.cpp

Lines changed: 52 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1073,17 +1073,23 @@ void WasmBinaryWriter::writeDylinkSection() {
10731073
}
10741074

10751075
auto start = startSection(BinaryConsts::User);
1076-
writeInlineString(BinaryConsts::UserSections::Dylink);
1076+
writeInlineString(BinaryConsts::UserSections::Dylink0);
1077+
1078+
auto substart = startSubsection(BinaryConsts::UserSections::Subsection::DylinkMemInfo);
10771079
o << U32LEB(wasm->dylinkSection->memorySize);
10781080
o << U32LEB(wasm->dylinkSection->memoryAlignment);
10791081
o << U32LEB(wasm->dylinkSection->tableSize);
10801082
o << U32LEB(wasm->dylinkSection->tableAlignment);
1081-
o << U32LEB(wasm->dylinkSection->neededDynlibs.size());
1082-
for (auto& neededDynlib : wasm->dylinkSection->neededDynlibs) {
1083-
writeInlineString(neededDynlib.c_str());
1084-
}
1083+
finishSubsection(substart);
10851084

1086-
writeData(wasm->dylinkSection->tail.data(), wasm->dylinkSection->tail.size());
1085+
if (wasm->dylinkSection->neededDynlibs.size()) {
1086+
substart = startSubsection(BinaryConsts::UserSections::Subsection::DylinkNeeded);
1087+
o << U32LEB(wasm->dylinkSection->neededDynlibs.size());
1088+
for (auto& neededDynlib : wasm->dylinkSection->neededDynlibs) {
1089+
writeInlineString(neededDynlib.c_str());
1090+
}
1091+
finishSubsection(substart);
1092+
}
10871093

10881094
finishSection(start);
10891095
}
@@ -1435,6 +1441,7 @@ void WasmBinaryBuilder::read() {
14351441
}
14361442

14371443
void WasmBinaryBuilder::readUserSection(size_t payloadLen) {
1444+
BYN_TRACE("== readUserSection\n");
14381445
auto oldPos = pos;
14391446
Name sectionName = getInlineString();
14401447
size_t read = pos - oldPos;
@@ -1452,6 +1459,8 @@ void WasmBinaryBuilder::readUserSection(size_t payloadLen) {
14521459
readFeatures(payloadLen);
14531460
} else if (sectionName.equals(BinaryConsts::UserSections::Dylink)) {
14541461
readDylink(payloadLen);
1462+
} else if (sectionName.equals(BinaryConsts::UserSections::Dylink0)) {
1463+
readDylink0(payloadLen);
14551464
} else {
14561465
// an unfamiliar custom section
14571466
if (sectionName.equals(BinaryConsts::UserSections::Linking)) {
@@ -3250,8 +3259,6 @@ void WasmBinaryBuilder::readFeatures(size_t payloadLen) {
32503259
void WasmBinaryBuilder::readDylink(size_t payloadLen) {
32513260
wasm.dylinkSection = make_unique<DylinkSection>();
32523261

3253-
auto sectionPos = pos;
3254-
32553262
wasm.dylinkSection->memorySize = getU32LEB();
32563263
wasm.dylinkSection->memoryAlignment = getU32LEB();
32573264
wasm.dylinkSection->tableSize = getU32LEB();
@@ -3261,13 +3268,46 @@ void WasmBinaryBuilder::readDylink(size_t payloadLen) {
32613268
for (size_t i = 0; i < numNeededDynlibs; ++i) {
32623269
wasm.dylinkSection->neededDynlibs.push_back(getInlineString());
32633270
}
3271+
}
3272+
3273+
void WasmBinaryBuilder::readDylink0(size_t payloadLen) {
3274+
BYN_TRACE("== readDylink0\n");
3275+
auto sectionPos = pos;
3276+
uint32_t lastType = 0;
32643277

3265-
size_t remaining = (sectionPos + payloadLen) - pos;
3266-
auto tail = getByteView(remaining);
3267-
wasm.dylinkSection->tail = {tail.first, tail.second};
3278+
wasm.dylinkSection = make_unique<DylinkSection>();
3279+
while (pos < sectionPos + payloadLen) {
3280+
auto dylinkType = getU32LEB();
3281+
if (lastType && dylinkType <= lastType) {
3282+
std::cerr << "warning: out-of-order dylink.0 subsection: " << dylinkType
3283+
<< std::endl;
3284+
}
3285+
lastType = dylinkType;
3286+
auto subsectionSize = getU32LEB();
3287+
auto subsectionPos = pos;
3288+
if (dylinkType == BinaryConsts::UserSections::Subsection::DylinkMemInfo) {
3289+
wasm.dylinkSection->memorySize = getU32LEB();
3290+
wasm.dylinkSection->memoryAlignment = getU32LEB();
3291+
wasm.dylinkSection->tableSize = getU32LEB();
3292+
wasm.dylinkSection->tableAlignment = getU32LEB();
3293+
} else if (dylinkType ==
3294+
BinaryConsts::UserSections::Subsection::DylinkNeeded) {
3295+
size_t numNeededDynlibs = getU32LEB();
3296+
for (size_t i = 0; i < numNeededDynlibs; ++i) {
3297+
wasm.dylinkSection->neededDynlibs.push_back(getInlineString());
3298+
}
3299+
} else {
3300+
std::cerr << "warning: unknown name subsection with id "
3301+
<< std::to_string(dylinkType) << " at " << pos << std::endl;
3302+
pos = subsectionPos + subsectionSize;
3303+
}
3304+
if (pos != subsectionPos + subsectionSize) {
3305+
throwError("bad dylink.0 subsection position change");
3306+
}
3307+
}
32683308

32693309
if (pos != sectionPos + payloadLen) {
3270-
throwError("bad features section size");
3310+
throwError("bad dylink.0 section size");
32713311
}
32723312
}
32733313

src/wasm/wasm.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@ namespace UserSections {
3131
const char* Name = "name";
3232
const char* SourceMapUrl = "sourceMappingURL";
3333
const char* Dylink = "dylink";
34+
const char* Dylink0 = "dylink.0";
3435
const char* Linking = "linking";
3536
const char* Producers = "producers";
3637
const char* TargetFeatures = "target_features";

test/lit/binary/dylink.test

Lines changed: 0 additions & 15 deletions
This file was deleted.

test/lit/binary/dylink.test.wasm

-37 Bytes
Binary file not shown.

0 commit comments

Comments
 (0)