mirror of
https://github.com/capstone-engine/llvm-capstone.git
synced 2024-11-28 08:02:08 +00:00
[WebAssembly] Simplify writing of exports section. NFC.
Differential Revision: https://reviews.llvm.org/D43963 llvm-svn: 332011
This commit is contained in:
parent
a428eba85e
commit
d6beb320b4
@ -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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user