[WebAssembly] Simplify writing of exports section. NFC.

Differential Revision: https://reviews.llvm.org/D43963

llvm-svn: 332011
This commit is contained in:
Sam Clegg 2018-05-10 18:10:34 +00:00
parent a428eba85e
commit d6beb320b4

View File

@ -106,7 +106,7 @@ private:
std::vector<const Symbol *> ImportedSymbols; std::vector<const Symbol *> ImportedSymbols;
unsigned NumImportedFunctions = 0; unsigned NumImportedFunctions = 0;
unsigned NumImportedGlobals = 0; unsigned NumImportedGlobals = 0;
std::vector<Symbol *> ExportedSymbols; std::vector<WasmExport> Exports;
std::vector<const DefinedData *> DefinedFakeGlobals; std::vector<const DefinedData *> DefinedFakeGlobals;
std::vector<InputGlobal *> InputGlobals; std::vector<InputGlobal *> InputGlobals;
std::vector<InputFunction *> InputFunctions; std::vector<InputFunction *> InputFunctions;
@ -264,41 +264,15 @@ void Writer::createTableSection() {
} }
void Writer::createExportSection() { void Writer::createExportSection() {
bool ExportMemory = !Config->Relocatable && !Config->ImportMemory; if (!Exports.size())
bool ExportTable = !Config->Relocatable && Config->ExportTable;
uint32_t NumExports =
(ExportMemory ? 1 : 0) + (ExportTable ? 1 : 0) + ExportedSymbols.size();
if (!NumExports)
return; return;
SyntheticSection *Section = createSyntheticSection(WASM_SEC_EXPORT); SyntheticSection *Section = createSyntheticSection(WASM_SEC_EXPORT);
raw_ostream &OS = Section->getStream(); raw_ostream &OS = Section->getStream();
writeUleb128(OS, NumExports, "export count"); writeUleb128(OS, Exports.size(), "export count");
for (const WasmExport &Export : Exports)
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");
writeExport(OS, Export); writeExport(OS, Export);
}
} }
void Writer::calculateCustomSections() { void Writer::calculateCustomSections() {
@ -755,6 +729,14 @@ void Writer::calculateExports() {
if (Config->Relocatable) if (Config->Relocatable)
return; 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()) { for (Symbol *Sym : Symtab->getSymbols()) {
if (!Sym->isDefined()) if (!Sym->isDefined())
continue; continue;
@ -763,11 +745,20 @@ void Writer::calculateExports() {
if (!Sym->isLive()) if (!Sym->isLive())
continue; continue;
DEBUG(dbgs() << "exporting sym: " << Sym->getName() << "\n"); StringRef Name = Sym->getName();
WasmExport Export;
if (auto *D = dyn_cast<DefinedData>(Sym)) 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); DefinedFakeGlobals.emplace_back(D);
ExportedSymbols.emplace_back(Sym); Export = {Name, WASM_EXTERNAL_GLOBAL, FakeGlobalIndex++};
}
DEBUG(dbgs() << "Export: " << Name << "\n");
Exports.push_back(Export);
} }
} }