// Create relocations sections in the final output. // These are only created when relocatable output is requested. void Writer::createRelocSections() { log("createRelocSections"); // Don't use iterator here since we are adding to OutputSection size_t OrigSize = OutputSections.size(); for (size_t I = 0; I < OrigSize; I++) { OutputSection *OSec = OutputSections[I]; uint32_t Count = OSec->numRelocations(); if (!Count) continue; StringRef Name; if (OSec->Type == WASM_SEC_DATA) Name = "reloc.DATA"; else if (OSec->Type == WASM_SEC_CODE) Name = "reloc.CODE"; else if (OSec->Type == WASM_SEC_CUSTOM) Name = Saver.save("reloc." + OSec->Name); else llvm_unreachable( "relocations only supported for code, data, or custom sections"); SyntheticSection *Section = createSyntheticSection(WASM_SEC_CUSTOM, Name); raw_ostream &OS = Section->getStream(); writeUleb128(OS, I, "reloc section"); writeUleb128(OS, Count, "reloc count"); OSec->writeRelocations(OS); } }