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