@@ -1067,7 +1067,7 @@ void WasmBinaryWriter::writeFeaturesSection() {
1067
1067
finishSection (start);
1068
1068
}
1069
1069
1070
- void WasmBinaryWriter::writeDylinkSection () {
1070
+ void WasmBinaryWriter::writeLegacyDylinkSection () {
1071
1071
if (!wasm->dylinkSection ) {
1072
1072
return ;
1073
1073
}
@@ -1088,6 +1088,38 @@ void WasmBinaryWriter::writeDylinkSection() {
1088
1088
finishSection (start);
1089
1089
}
1090
1090
1091
+ void WasmBinaryWriter::writeDylinkSection () {
1092
+ if (!wasm->dylinkSection ) {
1093
+ return ;
1094
+ }
1095
+
1096
+ if (wasm->dylinkSection ->isLegacy ) {
1097
+ writeLegacyDylinkSection ();
1098
+ return ;
1099
+ }
1100
+
1101
+ auto start = startSection (BinaryConsts::User);
1102
+ writeInlineString (BinaryConsts::UserSections::Dylink0);
1103
+
1104
+ auto substart = startSubsection (BinaryConsts::UserSections::Subsection::DylinkMemInfo);
1105
+ o << U32LEB (wasm->dylinkSection ->memorySize );
1106
+ o << U32LEB (wasm->dylinkSection ->memoryAlignment );
1107
+ o << U32LEB (wasm->dylinkSection ->tableSize );
1108
+ o << U32LEB (wasm->dylinkSection ->tableAlignment );
1109
+ finishSubsection (substart);
1110
+
1111
+ if (wasm->dylinkSection ->neededDynlibs .size ()) {
1112
+ substart = startSubsection (BinaryConsts::UserSections::Subsection::DylinkNeeded);
1113
+ o << U32LEB (wasm->dylinkSection ->neededDynlibs .size ());
1114
+ for (auto & neededDynlib : wasm->dylinkSection ->neededDynlibs ) {
1115
+ writeInlineString (neededDynlib.c_str ());
1116
+ }
1117
+ finishSubsection (substart);
1118
+ }
1119
+
1120
+ finishSection (start);
1121
+ }
1122
+
1091
1123
void WasmBinaryWriter::writeDebugLocation (const Function::DebugLocation& loc) {
1092
1124
if (loc == lastDebugLocation) {
1093
1125
return ;
@@ -1435,6 +1467,7 @@ void WasmBinaryBuilder::read() {
1435
1467
}
1436
1468
1437
1469
void WasmBinaryBuilder::readUserSection (size_t payloadLen) {
1470
+ BYN_TRACE (" == readUserSection\n " );
1438
1471
auto oldPos = pos;
1439
1472
Name sectionName = getInlineString ();
1440
1473
size_t read = pos - oldPos;
@@ -1452,6 +1485,8 @@ void WasmBinaryBuilder::readUserSection(size_t payloadLen) {
1452
1485
readFeatures (payloadLen);
1453
1486
} else if (sectionName.equals (BinaryConsts::UserSections::Dylink)) {
1454
1487
readDylink (payloadLen);
1488
+ } else if (sectionName.equals (BinaryConsts::UserSections::Dylink0)) {
1489
+ readDylink0 (payloadLen);
1455
1490
} else {
1456
1491
// an unfamiliar custom section
1457
1492
if (sectionName.equals (BinaryConsts::UserSections::Linking)) {
@@ -3252,6 +3287,7 @@ void WasmBinaryBuilder::readDylink(size_t payloadLen) {
3252
3287
3253
3288
auto sectionPos = pos;
3254
3289
3290
+ wasm.dylinkSection ->isLegacy = true ;
3255
3291
wasm.dylinkSection ->memorySize = getU32LEB ();
3256
3292
wasm.dylinkSection ->memoryAlignment = getU32LEB ();
3257
3293
wasm.dylinkSection ->tableSize = getU32LEB ();
@@ -3267,7 +3303,49 @@ void WasmBinaryBuilder::readDylink(size_t payloadLen) {
3267
3303
wasm.dylinkSection ->tail = {tail.first , tail.second };
3268
3304
3269
3305
if (pos != sectionPos + payloadLen) {
3270
- throwError (" bad features section size" );
3306
+ throwError (" bad dylink section size" );
3307
+ }
3308
+
3309
+ }
3310
+
3311
+ void WasmBinaryBuilder::readDylink0 (size_t payloadLen) {
3312
+ BYN_TRACE (" == readDylink0\n " );
3313
+ auto sectionPos = pos;
3314
+ uint32_t lastType = 0 ;
3315
+
3316
+ wasm.dylinkSection = make_unique<DylinkSection>();
3317
+ while (pos < sectionPos + payloadLen) {
3318
+ auto dylinkType = getU32LEB ();
3319
+ if (lastType && dylinkType <= lastType) {
3320
+ std::cerr << " warning: out-of-order dylink.0 subsection: " << dylinkType
3321
+ << std::endl;
3322
+ }
3323
+ lastType = dylinkType;
3324
+ auto subsectionSize = getU32LEB ();
3325
+ auto subsectionPos = pos;
3326
+ if (dylinkType == BinaryConsts::UserSections::Subsection::DylinkMemInfo) {
3327
+ wasm.dylinkSection ->memorySize = getU32LEB ();
3328
+ wasm.dylinkSection ->memoryAlignment = getU32LEB ();
3329
+ wasm.dylinkSection ->tableSize = getU32LEB ();
3330
+ wasm.dylinkSection ->tableAlignment = getU32LEB ();
3331
+ } else if (dylinkType ==
3332
+ BinaryConsts::UserSections::Subsection::DylinkNeeded) {
3333
+ size_t numNeededDynlibs = getU32LEB ();
3334
+ for (size_t i = 0 ; i < numNeededDynlibs; ++i) {
3335
+ wasm.dylinkSection ->neededDynlibs .push_back (getInlineString ());
3336
+ }
3337
+ } else {
3338
+ std::cerr << " warning: unknown name subsection with id "
3339
+ << std::to_string (dylinkType) << " at " << pos << std::endl;
3340
+ pos = subsectionPos + subsectionSize;
3341
+ }
3342
+ if (pos != subsectionPos + subsectionSize) {
3343
+ throwError (" bad dylink.0 subsection position change" );
3344
+ }
3345
+ }
3346
+
3347
+ if (pos != sectionPos + payloadLen) {
3348
+ throwError (" bad dylink.0 section size" );
3271
3349
}
3272
3350
}
3273
3351
0 commit comments