diff --git a/lld/wasm/SyntheticSections.cpp b/lld/wasm/SyntheticSections.cpp --- a/lld/wasm/SyntheticSections.cpp +++ b/lld/wasm/SyntheticSections.cpp @@ -223,7 +223,7 @@ limits = {0, tableSize, 0}; else limits = {WASM_LIMITS_FLAG_HAS_MAX, tableSize, tableSize}; - writeTableType(os, WasmTable{0, WASM_TYPE_FUNCREF, limits}); + writeTableType(os, WasmTableType{WASM_TYPE_FUNCREF, limits}); } void MemorySection::writeBody() { diff --git a/lld/wasm/WriterUtils.h b/lld/wasm/WriterUtils.h --- a/lld/wasm/WriterUtils.h +++ b/lld/wasm/WriterUtils.h @@ -54,7 +54,7 @@ void writeEvent(raw_ostream &os, const llvm::wasm::WasmEvent &event); -void writeTableType(raw_ostream &os, const llvm::wasm::WasmTable &type); +void writeTableType(raw_ostream &os, const llvm::wasm::WasmTableType &type); void writeImport(raw_ostream &os, const llvm::wasm::WasmImport &import); diff --git a/lld/wasm/WriterUtils.cpp b/lld/wasm/WriterUtils.cpp --- a/lld/wasm/WriterUtils.cpp +++ b/lld/wasm/WriterUtils.cpp @@ -195,7 +195,7 @@ writeEventType(os, event.Type); } -void writeTableType(raw_ostream &os, const llvm::wasm::WasmTable &type) { +void writeTableType(raw_ostream &os, const WasmTableType &type) { writeU8(os, WASM_TYPE_FUNCREF, "table type"); writeLimits(os, type.Limits); } diff --git a/llvm/include/llvm/BinaryFormat/Wasm.h b/llvm/include/llvm/BinaryFormat/Wasm.h --- a/llvm/include/llvm/BinaryFormat/Wasm.h +++ b/llvm/include/llvm/BinaryFormat/Wasm.h @@ -67,12 +67,17 @@ uint64_t Maximum; }; -struct WasmTable { - uint32_t Index; +struct WasmTableType { uint8_t ElemType; WasmLimits Limits; }; +struct WasmTable { + uint32_t Index; + WasmTableType Type; + StringRef SymbolName; // from the "linking" section +}; + struct WasmInitExpr { uint8_t Opcode; union { @@ -115,7 +120,7 @@ union { uint32_t SigIndex; WasmGlobalType Global; - WasmTable Table; + WasmTableType Table; WasmLimits Memory; WasmEventType Event; }; diff --git a/llvm/lib/MC/WasmObjectWriter.cpp b/llvm/lib/MC/WasmObjectWriter.cpp --- a/llvm/lib/MC/WasmObjectWriter.cpp +++ b/llvm/lib/MC/WasmObjectWriter.cpp @@ -848,11 +848,11 @@ encodeULEB128(Tables.size(), W->OS); for (const wasm::WasmTable &Table : Tables) { - encodeULEB128(Table.ElemType, W->OS); - encodeULEB128(Table.Limits.Flags, W->OS); - encodeULEB128(Table.Limits.Initial, W->OS); - if (Table.Limits.Flags & wasm::WASM_LIMITS_FLAG_HAS_MAX) - encodeULEB128(Table.Limits.Maximum, W->OS); + encodeULEB128(Table.Type.ElemType, W->OS); + encodeULEB128(Table.Type.Limits.Flags, W->OS); + encodeULEB128(Table.Type.Limits.Initial, W->OS); + if (Table.Type.Limits.Flags & wasm::WASM_LIMITS_FLAG_HAS_MAX) + encodeULEB128(Table.Type.Limits.Maximum, W->OS); } endSection(Section); } @@ -1527,10 +1527,10 @@ if (WS.isDefined()) { assert(WasmIndices.count(&WS) == 0); wasm::WasmTable Table; - Table.ElemType = static_cast(WS.getTableType()); Table.Index = NumTableImports + Tables.size(); + Table.Type.ElemType = static_cast(WS.getTableType()); // FIXME: Work on custom limits is ongoing - Table.Limits = {wasm::WASM_LIMITS_FLAG_NONE, 0, 0}; + Table.Type.Limits = {wasm::WASM_LIMITS_FLAG_NONE, 0, 0}; WasmIndices[&WS] = Table.Index; Tables.push_back(Table); diff --git a/llvm/lib/Object/WasmObjectFile.cpp b/llvm/lib/Object/WasmObjectFile.cpp --- a/llvm/lib/Object/WasmObjectFile.cpp +++ b/llvm/lib/Object/WasmObjectFile.cpp @@ -214,12 +214,11 @@ return Result; } -static wasm::WasmTable readTable(WasmObjectFile::ReadContext &Ctx) { - wasm::WasmTable Table; - Table.ElemType = readUint8(Ctx); - Table.Limits = readLimits(Ctx); - // The caller needs to set Table.Index field for Table - return Table; +static wasm::WasmTableType readTableType(WasmObjectFile::ReadContext &Ctx) { + wasm::WasmTableType TableType; + TableType.ElemType = readUint8(Ctx); + TableType.Limits = readLimits(Ctx); + return TableType; } static Error readSection(WasmSection &Section, WasmObjectFile::ReadContext &Ctx, @@ -597,7 +596,9 @@ Info.Name = readString(Ctx); unsigned TableIndex = Info.ElementIndex - NumImportedTables; wasm::WasmTable &Table = Tables[TableIndex]; - TableType = Table.ElemType; + TableType = Table.Type.ElemType; + if (Table.SymbolName.empty()) + Table.SymbolName = Info.Name; } else { return make_error("undefined table symbol", object_error::parse_failed); @@ -1014,8 +1015,7 @@ HasMemory64 = true; break; case wasm::WASM_EXTERNAL_TABLE: { - Im.Table = readTable(Ctx); - Im.Table.Index = NumImportedTables + Tables.size(); + Im.Table = readTableType(Ctx); NumImportedTables++; auto ElemType = Im.Table.ElemType; if (ElemType != wasm::WASM_TYPE_FUNCREF && @@ -1063,10 +1063,11 @@ uint32_t Count = readVaruint32(Ctx); Tables.reserve(Count); while (Count--) { - wasm::WasmTable T = readTable(Ctx); + wasm::WasmTable T; + T.Type = readTableType(Ctx); T.Index = NumImportedTables + Tables.size(); Tables.push_back(T); - auto ElemType = Tables.back().ElemType; + auto ElemType = Tables.back().Type.ElemType; if (ElemType != wasm::WASM_TYPE_FUNCREF && ElemType != wasm::WASM_TYPE_EXTERNREF) { return make_error("Invalid table element type", diff --git a/llvm/tools/obj2yaml/wasm2yaml.cpp b/llvm/tools/obj2yaml/wasm2yaml.cpp --- a/llvm/tools/obj2yaml/wasm2yaml.cpp +++ b/llvm/tools/obj2yaml/wasm2yaml.cpp @@ -31,16 +31,6 @@ } // namespace -static WasmYAML::Table makeTable(const wasm::WasmTable &Table) { - WasmYAML::Table T; - T.ElemType = Table.ElemType; - T.TableLimits.Flags = Table.Limits.Flags; - T.TableLimits.Initial = Table.Limits.Initial; - T.TableLimits.Maximum = Table.Limits.Maximum; - T.Index = Table.Index; - return T; -} - static WasmYAML::Limits makeLimits(const wasm::WasmLimits &Limits) { WasmYAML::Limits L; L.Flags = Limits.Flags; @@ -49,6 +39,15 @@ return L; } +static WasmYAML::Table makeTable(uint32_t Index, + const wasm::WasmTableType &Type) { + WasmYAML::Table T; + T.Index = Index; + T.ElemType = Type.ElemType; + T.TableLimits = makeLimits(Type.Limits); + return T; +} + std::unique_ptr WasmDumper::dumpCustomSection(const WasmSection &WasmSec) { std::unique_ptr CustomSec; @@ -234,7 +233,9 @@ Im.EventImport.SigIndex = Import.Event.SigIndex; break; case wasm::WASM_EXTERNAL_TABLE: - Im.TableImport = makeTable(Import.Table); + // FIXME: Currently we always output an index of 0 for any imported + // table. + Im.TableImport = makeTable(0, Import.Table); break; case wasm::WASM_EXTERNAL_MEMORY: Im.Memory = makeLimits(Import.Memory); @@ -256,7 +257,7 @@ case wasm::WASM_SEC_TABLE: { auto TableSec = std::make_unique(); for (const wasm::WasmTable &Table : Obj.tables()) { - TableSec->Tables.push_back(makeTable(Table)); + TableSec->Tables.push_back(makeTable(Table.Index, Table.Type)); } S = std::move(TableSec); break;