@@ -1067,7 +1067,7 @@ void WasmBinaryWriter::writeFeaturesSection() {
10671067 finishSection (start);
10681068}
10691069
1070- void WasmBinaryWriter::writeDylinkSection () {
1070+ void WasmBinaryWriter::writeLegacyDylinkSection () {
10711071 if (!wasm->dylinkSection ) {
10721072 return ;
10731073 }
@@ -1088,6 +1088,38 @@ void WasmBinaryWriter::writeDylinkSection() {
10881088 finishSection (start);
10891089}
10901090
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+
10911123void WasmBinaryWriter::writeDebugLocation (const Function::DebugLocation& loc) {
10921124 if (loc == lastDebugLocation) {
10931125 return ;
@@ -1435,6 +1467,7 @@ void WasmBinaryBuilder::read() {
14351467}
14361468
14371469void WasmBinaryBuilder::readUserSection (size_t payloadLen) {
1470+ BYN_TRACE (" == readUserSection\n " );
14381471 auto oldPos = pos;
14391472 Name sectionName = getInlineString ();
14401473 size_t read = pos - oldPos;
@@ -1452,6 +1485,8 @@ void WasmBinaryBuilder::readUserSection(size_t payloadLen) {
14521485 readFeatures (payloadLen);
14531486 } else if (sectionName.equals (BinaryConsts::UserSections::Dylink)) {
14541487 readDylink (payloadLen);
1488+ } else if (sectionName.equals (BinaryConsts::UserSections::Dylink0)) {
1489+ readDylink0 (payloadLen);
14551490 } else {
14561491 // an unfamiliar custom section
14571492 if (sectionName.equals (BinaryConsts::UserSections::Linking)) {
@@ -3252,6 +3287,7 @@ void WasmBinaryBuilder::readDylink(size_t payloadLen) {
32523287
32533288 auto sectionPos = pos;
32543289
3290+ wasm.dylinkSection ->isLegacy = true ;
32553291 wasm.dylinkSection ->memorySize = getU32LEB ();
32563292 wasm.dylinkSection ->memoryAlignment = getU32LEB ();
32573293 wasm.dylinkSection ->tableSize = getU32LEB ();
@@ -3267,7 +3303,49 @@ void WasmBinaryBuilder::readDylink(size_t payloadLen) {
32673303 wasm.dylinkSection ->tail = {tail.first , tail.second };
32683304
32693305 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" );
32713349 }
32723350}
32733351
0 commit comments