aboutsummaryrefslogtreecommitdiff
path: root/wasm/Writer.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'wasm/Writer.cpp')
-rw-r--r--wasm/Writer.cpp43
1 files changed, 32 insertions, 11 deletions
diff --git a/wasm/Writer.cpp b/wasm/Writer.cpp
index 61ac54a3e4b3..e7dd49d52213 100644
--- a/wasm/Writer.cpp
+++ b/wasm/Writer.cpp
@@ -174,7 +174,7 @@ void Writer::createImportSection() {
Import.Field = Sym->getName();
Import.Kind = WASM_EXTERNAL_GLOBAL;
Import.Global.Mutable = false;
- Import.Global.Type = WASM_TYPE_I32; // Sym->getGlobalType();
+ Import.Global.Type = WASM_TYPE_I32;
writeImport(OS, Import);
}
}
@@ -183,9 +183,8 @@ void Writer::createTypeSection() {
SyntheticSection *Section = createSyntheticSection(WASM_SEC_TYPE);
raw_ostream &OS = Section->getStream();
writeUleb128(OS, Types.size(), "type count");
- for (const WasmSignature *Sig : Types) {
+ for (const WasmSignature *Sig : Types)
writeSig(OS, *Sig);
- }
}
void Writer::createFunctionSection() {
@@ -196,11 +195,9 @@ void Writer::createFunctionSection() {
raw_ostream &OS = Section->getStream();
writeUleb128(OS, NumFunctions, "function count");
- for (ObjFile *File : Symtab->ObjectFiles) {
- for (uint32_t Sig : File->getWasmObj()->functionTypes()) {
+ for (ObjFile *File : Symtab->ObjectFiles)
+ for (uint32_t Sig : File->getWasmObj()->functionTypes())
writeUleb128(OS, File->relocateTypeIndex(Sig), "sig index");
- }
- }
}
void Writer::createMemorySection() {
@@ -358,7 +355,7 @@ void Writer::createDataSection() {
OutputSections.push_back(Section);
}
-// Create reloctions sections in the final output.
+// Create relocations sections in the final output.
// These are only created when relocatable output is requested.
void Writer::createRelocSections() {
log("createRelocSections");
@@ -376,7 +373,7 @@ void Writer::createRelocSections() {
else if (S->Type == WASM_SEC_CODE)
name = "reloc.CODE";
else
- llvm_unreachable("relocations only support for code and data");
+ llvm_unreachable("relocations only supported for code and data");
SyntheticSection *Section = createSyntheticSection(WASM_SEC_CUSTOM, name);
raw_ostream &OS = Section->getStream();
@@ -398,7 +395,10 @@ void Writer::createLinkingSection() {
DataSizeSubSection.finalizeContents();
DataSizeSubSection.writeToStream(OS);
- if (Segments.size() && Config->Relocatable) {
+ if (!Config->Relocatable)
+ return;
+
+ if (Segments.size()) {
SubSection SubSection(WASM_SEGMENT_INFO);
writeUleb128(SubSection.getStream(), Segments.size(), "num data segments");
for (const OutputSegment *S : Segments) {
@@ -409,6 +409,27 @@ void Writer::createLinkingSection() {
SubSection.finalizeContents();
SubSection.writeToStream(OS);
}
+
+ std::vector<WasmInitFunc> InitFunctions;
+ for (ObjFile *File : Symtab->ObjectFiles) {
+ const WasmLinkingData &L = File->getWasmObj()->linkingData();
+ InitFunctions.reserve(InitFunctions.size() + L.InitFunctions.size());
+ for (const WasmInitFunc &F : L.InitFunctions)
+ InitFunctions.emplace_back(WasmInitFunc{
+ F.Priority, File->relocateFunctionIndex(F.FunctionIndex)});
+ }
+
+ if (!InitFunctions.empty()) {
+ SubSection SubSection(WASM_INIT_FUNCS);
+ writeUleb128(SubSection.getStream(), InitFunctions.size(),
+ "num init functionsw");
+ for (const WasmInitFunc &F : InitFunctions) {
+ writeUleb128(SubSection.getStream(), F.Priority, "priority");
+ writeUleb128(SubSection.getStream(), F.FunctionIndex, "function index");
+ }
+ SubSection.finalizeContents();
+ SubSection.writeToStream(OS);
+ }
}
// Create the custom "name" section containing debug symbol names.
@@ -501,7 +522,7 @@ void Writer::layoutMemory() {
SyntheticSection *Writer::createSyntheticSection(uint32_t Type,
std::string Name) {
auto Sec = make<SyntheticSection>(Type, Name);
- log("createSection: " + toString(Sec));
+ log("createSection: " + toString(*Sec));
OutputSections.push_back(Sec);
return Sec;
}