From d6beb320b4573a7841e5bfda4aa83219356312ff Mon Sep 17 00:00:00 2001 From: Sam Clegg <sbc@chromium.org> Date: Thu, 10 May 2018 18:10:34 +0000 Subject: [PATCH] [WebAssembly] Simplify writing of exports section. NFC. Differential Revision: https://reviews.llvm.org/D43963 llvm-svn: 332011 --- lld/wasm/Writer.cpp | 59 +++++++++++++++++++-------------------------- 1 file changed, 25 insertions(+), 34 deletions(-) diff --git a/lld/wasm/Writer.cpp b/lld/wasm/Writer.cpp index 0ac7b065b08d..0b515be745b6 100644 --- a/lld/wasm/Writer.cpp +++ b/lld/wasm/Writer.cpp @@ -106,7 +106,7 @@ private: std::vector<const Symbol *> ImportedSymbols; unsigned NumImportedFunctions = 0; unsigned NumImportedGlobals = 0; - std::vector<Symbol *> ExportedSymbols; + std::vector<WasmExport> Exports; std::vector<const DefinedData *> DefinedFakeGlobals; std::vector<InputGlobal *> InputGlobals; std::vector<InputFunction *> InputFunctions; @@ -264,41 +264,15 @@ void Writer::createTableSection() { } void Writer::createExportSection() { - bool ExportMemory = !Config->Relocatable && !Config->ImportMemory; - bool ExportTable = !Config->Relocatable && Config->ExportTable; - - uint32_t NumExports = - (ExportMemory ? 1 : 0) + (ExportTable ? 1 : 0) + ExportedSymbols.size(); - if (!NumExports) + if (!Exports.size()) return; SyntheticSection *Section = createSyntheticSection(WASM_SEC_EXPORT); raw_ostream &OS = Section->getStream(); - writeUleb128(OS, NumExports, "export count"); - - if (ExportMemory) - writeExport(OS, {"memory", WASM_EXTERNAL_MEMORY, 0}); - if (ExportTable) - writeExport(OS, {kFunctionTableName, WASM_EXTERNAL_TABLE, 0}); - - unsigned FakeGlobalIndex = NumImportedGlobals + InputGlobals.size(); - - for (const Symbol *Sym : ExportedSymbols) { - StringRef Name = Sym->getName(); - WasmExport Export; - DEBUG(dbgs() << "Export: " << Name << "\n"); - - if (auto *F = dyn_cast<DefinedFunction>(Sym)) - Export = {Name, WASM_EXTERNAL_FUNCTION, F->getFunctionIndex()}; - else if (auto *G = dyn_cast<DefinedGlobal>(Sym)) - Export = {Name, WASM_EXTERNAL_GLOBAL, G->getGlobalIndex()}; - else if (isa<DefinedData>(Sym)) - Export = {Name, WASM_EXTERNAL_GLOBAL, FakeGlobalIndex++}; - else - llvm_unreachable("unexpected symbol type"); + writeUleb128(OS, Exports.size(), "export count"); + for (const WasmExport &Export : Exports) writeExport(OS, Export); - } } void Writer::calculateCustomSections() { @@ -755,6 +729,14 @@ void Writer::calculateExports() { if (Config->Relocatable) return; + if (!Config->Relocatable && !Config->ImportMemory) + Exports.push_back(WasmExport{"memory", WASM_EXTERNAL_MEMORY, 0}); + + if (!Config->Relocatable && Config->ExportTable) + Exports.push_back(WasmExport{kFunctionTableName, WASM_EXTERNAL_TABLE, 0}); + + unsigned FakeGlobalIndex = NumImportedGlobals + InputGlobals.size(); + for (Symbol *Sym : Symtab->getSymbols()) { if (!Sym->isDefined()) continue; @@ -763,11 +745,20 @@ void Writer::calculateExports() { if (!Sym->isLive()) continue; - DEBUG(dbgs() << "exporting sym: " << Sym->getName() << "\n"); - - if (auto *D = dyn_cast<DefinedData>(Sym)) + StringRef Name = Sym->getName(); + WasmExport Export; + if (auto *F = dyn_cast<DefinedFunction>(Sym)) { + Export = {Name, WASM_EXTERNAL_FUNCTION, F->getFunctionIndex()}; + } else if (auto *G = dyn_cast<DefinedGlobal>(Sym)) { + Export = {Name, WASM_EXTERNAL_GLOBAL, G->getGlobalIndex()}; + } else { + auto *D = cast<DefinedData>(Sym); DefinedFakeGlobals.emplace_back(D); - ExportedSymbols.emplace_back(Sym); + Export = {Name, WASM_EXTERNAL_GLOBAL, FakeGlobalIndex++}; + } + + DEBUG(dbgs() << "Export: " << Name << "\n"); + Exports.push_back(Export); } }