From ef1f999e13bd58394bc1099c87a470d91682153d Mon Sep 17 00:00:00 2001 From: Derek Schuff Date: Fri, 2 Feb 2024 10:44:52 -0800 Subject: [Object][Wasm] Move WasmSymbolInfo directly into WasmSymbol (NFC) (#80219) Move the WasmSymbolInfos from their own vector on the WasmLinkingData directly into the WasmSymbol object. Removing the const-ref to an external object allows the vector of WasmSymbols to be safely expanded/reallocated; generating symbol info from the name section will require this, as the numbers of function and data segment names are stored separately. This is a step toward generating symbol information from name sections for #76107 --- lld/wasm/InputFiles.cpp | 20 ++++++++++---------- llvm/include/llvm/BinaryFormat/Wasm.h | 6 +++++- llvm/include/llvm/Object/Wasm.h | 4 +++- llvm/lib/Object/WasmObjectFile.cpp | 11 ++--------- llvm/tools/obj2yaml/wasm2yaml.cpp | 3 ++- 5 files changed, 22 insertions(+), 22 deletions(-) diff --git a/lld/wasm/InputFiles.cpp b/lld/wasm/InputFiles.cpp index f43c39b..473208a 100644 --- a/lld/wasm/InputFiles.cpp +++ b/lld/wasm/InputFiles.cpp @@ -15,6 +15,7 @@ #include "lld/Common/Args.h" #include "lld/Common/CommonLinkerContext.h" #include "lld/Common/Reproduce.h" +#include "llvm/BinaryFormat/Wasm.h" #include "llvm/Object/Binary.h" #include "llvm/Object/Wasm.h" #include "llvm/Support/Path.h" @@ -322,20 +323,19 @@ void ObjFile::addLegacyIndirectFunctionTableIfNeeded( return; } - auto *info = make(); - info->Name = tableImport->Field; - info->Kind = WASM_SYMBOL_TYPE_TABLE; - info->ImportModule = tableImport->Module; - info->ImportName = tableImport->Field; - info->Flags = WASM_SYMBOL_UNDEFINED; - info->Flags |= WASM_SYMBOL_NO_STRIP; - info->ElementIndex = 0; - LLVM_DEBUG(dbgs() << "Synthesizing symbol for table import: " << info->Name + WasmSymbolInfo info; + info.Name = tableImport->Field; + info.Kind = WASM_SYMBOL_TYPE_TABLE; + info.ImportModule = tableImport->Module; + info.ImportName = tableImport->Field; + info.Flags = WASM_SYMBOL_UNDEFINED | WASM_SYMBOL_NO_STRIP; + info.ElementIndex = 0; + LLVM_DEBUG(dbgs() << "Synthesizing symbol for table import: " << info.Name << "\n"); const WasmGlobalType *globalType = nullptr; const WasmSignature *signature = nullptr; auto *wasmSym = - make(*info, globalType, &tableImport->Table, signature); + make(info, globalType, &tableImport->Table, signature); Symbol *sym = createUndefined(*wasmSym, false); // We're only sure it's a TableSymbol if the createUndefined succeeded. if (errorCount()) diff --git a/llvm/include/llvm/BinaryFormat/Wasm.h b/llvm/include/llvm/BinaryFormat/Wasm.h index cd13b70..aec6ea0 100644 --- a/llvm/include/llvm/BinaryFormat/Wasm.h +++ b/llvm/include/llvm/BinaryFormat/Wasm.h @@ -467,11 +467,15 @@ struct WasmDebugName { StringRef Name; }; +// Info from the linking metadata section of a wasm object file. struct WasmLinkingData { uint32_t Version; std::vector InitFunctions; std::vector Comdats; - std::vector SymbolTable; + // The linking section also contains a symbol table. This info (represented + // in a WasmSymbolInfo struct) is stored inside the WasmSymbol object instead + // of in this structure; this allows vectors of WasmSymbols and + // WasmLinkingDatas to be reallocated. }; struct WasmSignature { diff --git a/llvm/include/llvm/Object/Wasm.h b/llvm/include/llvm/Object/Wasm.h index 927dce8..13d9a17e 100644 --- a/llvm/include/llvm/Object/Wasm.h +++ b/llvm/include/llvm/Object/Wasm.h @@ -43,7 +43,9 @@ public: assert(!Signature || Signature->Kind != wasm::WasmSignature::Placeholder); } - const wasm::WasmSymbolInfo &Info; + // Symbol info as represented in the symbol's 'syminfo' entry of an object + // file's symbol table. + wasm::WasmSymbolInfo Info; const wasm::WasmGlobalType *GlobalType; const wasm::WasmTableType *TableType; const wasm::WasmSignature *Signature; diff --git a/llvm/lib/Object/WasmObjectFile.cpp b/llvm/lib/Object/WasmObjectFile.cpp index 953e7c7..4778562 100644 --- a/llvm/lib/Object/WasmObjectFile.cpp +++ b/llvm/lib/Object/WasmObjectFile.cpp @@ -642,9 +642,7 @@ Error WasmObjectFile::parseLinkingSectionSymtab(ReadContext &Ctx) { uint32_t Count = readVaruint32(Ctx); // Clear out any symbol information that was derived from the exports // section. - LinkingData.SymbolTable.clear(); Symbols.clear(); - LinkingData.SymbolTable.reserve(Count); Symbols.reserve(Count); StringSet<> SymbolNames; @@ -844,9 +842,7 @@ Error WasmObjectFile::parseLinkingSectionSymtab(ReadContext &Ctx) { return make_error("duplicate symbol name " + Twine(Info.Name), object_error::parse_failed); - LinkingData.SymbolTable.emplace_back(Info); - Symbols.emplace_back(LinkingData.SymbolTable.back(), GlobalType, TableType, - Signature); + Symbols.emplace_back(Info, GlobalType, TableType, Signature); LLVM_DEBUG(dbgs() << "Adding symbol: " << Symbols.back() << "\n"); } @@ -1390,7 +1386,6 @@ Error WasmObjectFile::parseGlobalSection(ReadContext &Ctx) { Error WasmObjectFile::parseExportSection(ReadContext &Ctx) { uint32_t Count = readVaruint32(Ctx); Exports.reserve(Count); - LinkingData.SymbolTable.reserve(Count); Symbols.reserve(Count); for (uint32_t I = 0; I < Count; I++) { wasm::WasmExport Ex; @@ -1455,9 +1450,7 @@ Error WasmObjectFile::parseExportSection(ReadContext &Ctx) { } Exports.push_back(Ex); if (Ex.Kind != wasm::WASM_EXTERNAL_MEMORY) { - LinkingData.SymbolTable.emplace_back(Info); - Symbols.emplace_back(LinkingData.SymbolTable.back(), GlobalType, - TableType, Signature); + Symbols.emplace_back(Info, GlobalType, TableType, Signature); LLVM_DEBUG(dbgs() << "Adding symbol: " << Symbols.back() << "\n"); } } diff --git a/llvm/tools/obj2yaml/wasm2yaml.cpp b/llvm/tools/obj2yaml/wasm2yaml.cpp index c15d64c..9aa7f5a 100644 --- a/llvm/tools/obj2yaml/wasm2yaml.cpp +++ b/llvm/tools/obj2yaml/wasm2yaml.cpp @@ -124,7 +124,8 @@ WasmDumper::dumpCustomSection(const WasmSection &WasmSec) { } uint32_t SymbolIndex = 0; - for (const wasm::WasmSymbolInfo &Symbol : Obj.linkingData().SymbolTable) { + for (const object::SymbolRef &Sym : Obj.symbols()) { + const wasm::WasmSymbolInfo &Symbol = Obj.getWasmSymbol(Sym).Info; WasmYAML::SymbolInfo Info; Info.Index = SymbolIndex++; Info.Kind = static_cast(Symbol.Kind); -- cgit v1.1