diff options
| author | Sam Clegg <sbc@chromium.org> | 2018-05-10 18:10:34 +0000 |
|---|---|---|
| committer | Sam Clegg <sbc@chromium.org> | 2018-05-10 18:10:34 +0000 |
| commit | d6beb320b4573a7841e5bfda4aa83219356312ff (patch) | |
| tree | 0dc8dd78424dd06106ca4f565ff3e8e224c928f0 | |
| parent | a428eba85eb23b4b614dbf9555169592cd8c2511 (diff) | |
| download | bcm5719-llvm-d6beb320b4573a7841e5bfda4aa83219356312ff.tar.gz bcm5719-llvm-d6beb320b4573a7841e5bfda4aa83219356312ff.zip | |
[WebAssembly] Simplify writing of exports section. NFC.
Differential Revision: https://reviews.llvm.org/D43963
llvm-svn: 332011
| -rw-r--r-- | lld/wasm/Writer.cpp | 59 |
1 files changed, 25 insertions, 34 deletions
diff --git a/lld/wasm/Writer.cpp b/lld/wasm/Writer.cpp index 0ac7b065b08..0b515be745b 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); } } |

