Index: include/llvm/Object/Wasm.h =================================================================== --- include/llvm/Object/Wasm.h +++ include/llvm/Object/Wasm.h @@ -279,9 +279,6 @@ uint32_t NumExportedFunctions = 0; uint32_t ImportSection = 0; uint32_t ExportSection = 0; - - // TODO: will get rid of this map in next commit - StringMap> SymbolMap; // name to pair(kind,index) }; } // end namespace object Index: include/llvm/ObjectYAML/WasmYAML.h =================================================================== --- include/llvm/ObjectYAML/WasmYAML.h +++ include/llvm/ObjectYAML/WasmYAML.h @@ -130,7 +130,8 @@ }; struct SymbolInfo { - StringRef Name; + ExportKind Kind; + uint32_t Index; SymbolFlags Flags; }; Index: lib/MC/WasmObjectWriter.cpp =================================================================== --- lib/MC/WasmObjectWriter.cpp +++ lib/MC/WasmObjectWriter.cpp @@ -30,6 +30,7 @@ #include "llvm/Support/ErrorHandling.h" #include "llvm/Support/LEB128.h" #include "llvm/Support/StringSaver.h" +#include #include using namespace llvm; @@ -146,6 +147,13 @@ uint32_t Index; }; +// Information about a single symbol to be written into the linking metadata +struct WasmSymEntry { + uint32_t Kind; + uint32_t Index; + uint32_t Flags; +}; + // Information about a single relocation. struct WasmRelocationEntry { uint64_t Offset; // Where is the relocation. @@ -296,7 +304,7 @@ void writeDataRelocSection(); void writeLinkingMetaDataSection( ArrayRef Segments, uint32_t DataSize, - ArrayRef> SymbolFlags, + ArrayRef SymbolInfo, ArrayRef> InitFuncs, const std::map>& Comdats); @@ -935,19 +943,20 @@ void WasmObjectWriter::writeLinkingMetaDataSection( ArrayRef Segments, uint32_t DataSize, - ArrayRef> SymbolFlags, + ArrayRef SymbolInfo, ArrayRef> InitFuncs, const std::map>& Comdats) { SectionBookkeeping Section; startSection(Section, wasm::WASM_SEC_CUSTOM, "linking"); SectionBookkeeping SubSection; - if (SymbolFlags.size() != 0) { + if (!SymbolInfo.empty()) { startSection(SubSection, wasm::WASM_SYMBOL_INFO); - encodeULEB128(SymbolFlags.size(), getStream()); - for (auto Pair: SymbolFlags) { - writeString(Pair.first); - encodeULEB128(Pair.second, getStream()); + encodeULEB128(SymbolInfo.size(), getStream()); + for (const auto &SI : SymbolInfo) { + encodeULEB128(SI.Kind, getStream()); + encodeULEB128(SI.Index, getStream()); + encodeULEB128(SI.Flags, getStream()); } endSection(SubSection); } @@ -1022,13 +1031,15 @@ return Pair.first->second; } -static void addFlags(SmallVector, 4> &SymbolFlags, - const MCSymbolWasm &WS) { +static void addFlags(SmallVector &SymbolInfo, + uint32_t SymbolIndex, const MCSymbolWasm &WS) { uint32_t Flags = (WS.isWeak() ? wasm::WASM_SYMBOL_BINDING_WEAK : 0) | (WS.isHidden() ? wasm::WASM_SYMBOL_VISIBILITY_HIDDEN : 0) | (!WS.isExternal() && WS.isDefined() ? wasm::WASM_SYMBOL_BINDING_LOCAL : 0); if (Flags != 0) { - SymbolFlags.emplace_back(WS.getName(), Flags); + uint32_t Kind = WS.isFunction() ? wasm::WASM_EXTERNAL_FUNCTION + : wasm::WASM_EXTERNAL_GLOBAL; + SymbolInfo.emplace_back(WasmSymEntry{Kind, SymbolIndex, Flags}); } } @@ -1043,7 +1054,7 @@ SmallVector TableElems; SmallVector Imports; SmallVector Exports; - SmallVector, 4> SymbolFlags; + SmallVector SymbolInfo; SmallVector, 2> InitFuncs; std::map> Comdats; unsigned NumFuncExports = 0; @@ -1168,7 +1179,7 @@ ++NumGlobalImports; - addFlags(SymbolFlags, WS); + addFlags(SymbolInfo, SymbolIndex, WS); } Imports.push_back(Import); @@ -1288,7 +1299,7 @@ Globals.push_back(Global); } - addFlags(SymbolFlags, WS); + addFlags(SymbolInfo, SymbolIndex, WS); // If the symbol is visible outside this translation unit, export it. if (WS.isDefined()) { @@ -1339,7 +1350,7 @@ SymbolIndices[&WS] = SymbolIndex; WasmIndices[&WS] = WasmIndex; - addFlags(SymbolFlags, WS); + addFlags(SymbolInfo, SymbolIndex, WS); WasmExport Export; Export.FieldName = WS.getName(); @@ -1443,7 +1454,7 @@ writeNameSection(Functions, Imports); writeCodeRelocSection(); writeDataRelocSection(); - writeLinkingMetaDataSection(DataSegments, DataSize, SymbolFlags, + writeLinkingMetaDataSection(DataSegments, DataSize, SymbolInfo, InitFuncs, Comdats); // TODO: Translate the .comment section to the output. Index: lib/Object/WasmObjectFile.cpp =================================================================== --- lib/Object/WasmObjectFile.cpp +++ lib/Object/WasmObjectFile.cpp @@ -320,6 +320,7 @@ Error WasmObjectFile::populateSymbolTable() { FunctionSymbols.reserve(NumImportedFunctions + NumExportedFunctions); GlobalSymbols.reserve(NumImportedGlobals + NumExportedGlobals); + StringSet<> SymbolNames; // Add imports to symbol table for (const wasm::WasmImport& Import : Imports) { @@ -340,7 +341,7 @@ default: continue; } - if (!SymbolMap.try_emplace(Import.Field, Import.Kind, Symbols->size()).second) + if (!SymbolNames.insert(Import.Field).second) return make_error( "Duplicate symbol name " + Import.Field, object_error::parse_failed); @@ -384,7 +385,7 @@ default: continue; } - if (!SymbolMap.try_emplace(Export.Name, Export.Kind, Symbols->size()).second) + if (!SymbolNames.insert(Export.Name).second) return make_error( "Duplicate symbol name " + Export.Name, object_error::parse_failed); @@ -421,24 +422,28 @@ case wasm::WASM_SYMBOL_INFO: { uint32_t Count = readVaruint32(Ptr); while (Count--) { - StringRef Symbol = readString(Ptr); - uint32_t Flags = readVaruint32(Ptr); - auto iter = SymbolMap.find(Symbol); - if (iter == SymbolMap.end()) { - return make_error( - "Invalid symbol name in linking section: " + Symbol, - object_error::parse_failed); + uint32_t Kind = readVaruint32(Ptr); + std::vector *Symbols; + switch (Kind) { + case wasm::WASM_EXTERNAL_GLOBAL: + Symbols = &GlobalSymbols; + break; + case wasm::WASM_EXTERNAL_FUNCTION: + Symbols = &FunctionSymbols; + break; + default: + return make_error("Unexpected syminfo kind", + object_error::parse_failed); } - uint32_t Kind = iter->second.first; - uint32_t SymIndex = iter->second.second; - std::vector &Symbols = - Kind == wasm::WASM_EXTERNAL_FUNCTION ? FunctionSymbols : GlobalSymbols; - assert(SymIndex < Symbols.size()); - Symbols[SymIndex].Flags = Flags; - DEBUG(dbgs() << "Set symbol flags index:" - << SymIndex << " name:" - << Symbols[SymIndex].Name << " expected:" - << Symbol << " flags: " << Flags << "\n"); + uint32_t SymIndex = readVaruint32(Ptr); + if (SymIndex >= Symbols->size()) + return make_error("Invalid syminfo index", + object_error::parse_failed); + uint32_t Flags = readVaruint32(Ptr); + (*Symbols)[SymIndex].Flags = Flags; + DEBUG(dbgs() << "Set symbol flags index:" << SymIndex + << " name:" << (*Symbols)[SymIndex].Name + << " flags: " << Flags << "\n"); } break; } Index: lib/ObjectYAML/WasmYAML.cpp =================================================================== --- lib/ObjectYAML/WasmYAML.cpp +++ lib/ObjectYAML/WasmYAML.cpp @@ -391,7 +391,8 @@ void MappingTraits::mapping(IO &IO, WasmYAML::SymbolInfo &Info) { - IO.mapRequired("Name", Info.Name); + IO.mapRequired("Kind", Info.Kind); + IO.mapRequired("Index", Info.Index); IO.mapRequired("Flags", Info.Flags); } Index: test/MC/WebAssembly/array-fill.ll =================================================================== --- test/MC/WebAssembly/array-fill.ll +++ test/MC/WebAssembly/array-fill.ll @@ -16,7 +16,8 @@ ; CHECK-NEXT: Name: linking ; CHECK-NEXT: DataSize: 2 ; CHECK-NEXT: SymbolInfo: -; CHECK-NEXT: - Name: gBd +; CHECK-NEXT: - Kind: GLOBAL +; CHECK-NEXT: Index: 0 ; CHECK-NEXT: Flags: [ VISIBILITY_HIDDEN ] ; CHECK-NEXT: SegmentInfo: ; CHECK-NEXT: - Index: 0 Index: test/MC/WebAssembly/comdat.ll =================================================================== --- test/MC/WebAssembly/comdat.ll +++ test/MC/WebAssembly/comdat.ll @@ -108,11 +108,14 @@ ; CHECK-NEXT: Name: linking ; CHECK-NEXT: DataSize: 3 ; CHECK-NEXT: SymbolInfo: -; CHECK-NEXT: - Name: basicInlineFn +; CHECK-NEXT: - Kind: FUNCTION +; CHECK-NEXT: Index: 2 ; CHECK-NEXT: Flags: [ BINDING_WEAK ] -; CHECK-NEXT: - Name: sharedFn +; CHECK-NEXT: - Kind: FUNCTION +; CHECK-NEXT: Index: 3 ; CHECK-NEXT: Flags: [ BINDING_WEAK ] -; CHECK-NEXT: - Name: constantData +; CHECK-NEXT: - Kind: GLOBAL +; CHECK-NEXT: Index: 0 ; CHECK-NEXT: Flags: [ BINDING_WEAK ] ; CHECK-NEXT: SegmentInfo: ; CHECK-NEXT: - Index: 0 Index: test/MC/WebAssembly/global-ctor-dtor.ll =================================================================== --- test/MC/WebAssembly/global-ctor-dtor.ll +++ test/MC/WebAssembly/global-ctor-dtor.ll @@ -161,15 +161,20 @@ ; CHECK-NEXT: Name: linking ; CHECK-NEXT: DataSize: 4 ; CHECK-NEXT: SymbolInfo: -; CHECK-NEXT: - Name: .Lcall_dtors.42 +; CHECK-NEXT: - Kind: FUNCTION +; CHECK-NEXT: Index: 5 ; CHECK-NEXT: Flags: [ BINDING_LOCAL ] -; CHECK-NEXT: - Name: .Lregister_call_dtors.42 +; CHECK-NEXT: - Kind: FUNCTION +; CHECK-NEXT: Index: 6 ; CHECK-NEXT: Flags: [ BINDING_LOCAL ] -; CHECK-NEXT: - Name: .Lcall_dtors +; CHECK-NEXT: - Kind: FUNCTION +; CHECK-NEXT: Index: 7 ; CHECK-NEXT: Flags: [ BINDING_LOCAL ] -; CHECK-NEXT: - Name: .Lregister_call_dtors +; CHECK-NEXT: - Kind: FUNCTION +; CHECK-NEXT: Index: 8 ; CHECK-NEXT: Flags: [ BINDING_LOCAL ] -; CHECK-NEXT: - Name: __dso_handle +; CHECK-NEXT: - Kind: GLOBAL +; CHECK-NEXT: Index: 0 ; CHECK-NEXT: Flags: [ BINDING_WEAK, VISIBILITY_HIDDEN ] ; CHECK-NEXT: SegmentInfo: ; CHECK-NEXT: - Index: 0 Index: test/MC/WebAssembly/unnamed-data.ll =================================================================== --- test/MC/WebAssembly/unnamed-data.ll +++ test/MC/WebAssembly/unnamed-data.ll @@ -84,9 +84,11 @@ ; CHECK-NEXT: Name: linking ; CHECK-NEXT: DataSize: 28 ; CHECK-NEXT: SymbolInfo: -; CHECK-NEXT: - Name: .L.str1 +; CHECK-NEXT: - Kind: GLOBAL +; CHECK-NEXT: Index: 0 ; CHECK-NEXT: Flags: [ BINDING_LOCAL ] -; CHECK-NEXT: - Name: .L.str2 +; CHECK-NEXT: - Kind: GLOBAL +; CHECK-NEXT: Index: 1 ; CHECK-NEXT: Flags: [ BINDING_LOCAL ] ; CHECK-NEXT: SegmentInfo: ; CHECK-NEXT: - Index: 0 Index: test/MC/WebAssembly/visibility.ll =================================================================== --- test/MC/WebAssembly/visibility.ll +++ test/MC/WebAssembly/visibility.ll @@ -18,6 +18,7 @@ ; CHECK-NEXT: Name: linking ; CHECK-NEXT: DataSize: 0 ; CHECK-NEXT: SymbolInfo: -; CHECK-NEXT: - Name: hiddenVis +; CHECK-NEXT: - Kind: FUNCTION +; CHECK-NEXT: Index: 1 ; CHECK-NEXT: Flags: [ VISIBILITY_HIDDEN ] ; CHECK-NEXT: ... Index: test/MC/WebAssembly/weak-alias.ll =================================================================== --- test/MC/WebAssembly/weak-alias.ll +++ test/MC/WebAssembly/weak-alias.ll @@ -202,20 +202,27 @@ ; CHECK-NEXT: - Type: CUSTOM ; CHECK-NEXT: Name: linking ; CHECK-NEXT: DataSize: 20 -; CHECK-NEXT: SymbolInfo: -; CHECK-NEXT: - Name: foo +; CHECK-NEXT: SymbolInfo: +; CHECK-NEXT: - Kind: FUNCTION +; CHECK-NEXT: Index: 0 ; CHECK-NEXT: Flags: [ VISIBILITY_HIDDEN ] -; CHECK-NEXT: - Name: call_direct +; CHECK-NEXT: - Kind: FUNCTION +; CHECK-NEXT: Index: 1 ; CHECK-NEXT: Flags: [ VISIBILITY_HIDDEN ] -; CHECK-NEXT: - Name: call_alias +; CHECK-NEXT: - Kind: FUNCTION +; CHECK-NEXT: Index: 2 ; CHECK-NEXT: Flags: [ VISIBILITY_HIDDEN ] -; CHECK-NEXT: - Name: call_direct_ptr +; CHECK-NEXT: - Kind: FUNCTION +; CHECK-NEXT: Index: 3 ; CHECK-NEXT: Flags: [ VISIBILITY_HIDDEN ] -; CHECK-NEXT: - Name: call_alias_ptr +; CHECK-NEXT: - Kind: FUNCTION +; CHECK-NEXT: Index: 4 ; CHECK-NEXT: Flags: [ VISIBILITY_HIDDEN ] -; CHECK-NEXT: - Name: foo_alias +; CHECK-NEXT: - Kind: FUNCTION +; CHECK-NEXT: Index: 5 ; CHECK-NEXT: Flags: [ BINDING_WEAK, VISIBILITY_HIDDEN ] -; CHECK-NEXT: - Name: bar_alias +; CHECK-NEXT: - Kind: GLOBAL +; CHECK-NEXT: Index: 3 ; CHECK-NEXT: Flags: [ BINDING_WEAK, VISIBILITY_HIDDEN ] ; CHECK-NEXT: SegmentInfo: ; CHECK-NEXT: - Index: 0 Index: test/MC/WebAssembly/weak.ll =================================================================== --- test/MC/WebAssembly/weak.ll +++ test/MC/WebAssembly/weak.ll @@ -32,8 +32,10 @@ ; CHECK-NEXT: Name: linking ; CHECK-NEXT: DataSize: 0 ; CHECK-NEXT: SymbolInfo: -; CHECK-NEXT: - Name: weak_function +; CHECK-NEXT: - Kind: FUNCTION +; CHECK-NEXT: Index: 0 ; CHECK-NEXT: Flags: [ BINDING_WEAK, VISIBILITY_HIDDEN ] -; CHECK-NEXT: - Name: weak_external_data +; CHECK-NEXT: - Kind: GLOBAL +; CHECK-NEXT: Index: 0 ; CHECK-NEXT: Flags: [ BINDING_WEAK ] ; CHECK-NEXT: ... Index: test/ObjectYAML/wasm/linking_section.yaml =================================================================== --- test/ObjectYAML/wasm/linking_section.yaml +++ test/ObjectYAML/wasm/linking_section.yaml @@ -31,7 +31,8 @@ Name: linking DataSize: 999 SymbolInfo: - - Name: bar + - Kind: FUNCTION + Index: 0 Flags: [ BINDING_WEAK ] SegmentInfo: - Index: 0 @@ -50,7 +51,8 @@ # CHECK-NEXT: Name: linking # CHECK-NEXT: DataSize: 999 # CHECK-NEXT: SymbolInfo: -# CHECK-NEXT: - Name: bar +# CHECK-NEXT: - Kind: FUNCTION +# CHECK-NEXT: Index: 0 # CHECK-NEXT: Flags: [ BINDING_WEAK ] # CHECK-NEXT: SegmentInfo: # CHECK-NEXT: - Index: 0 Index: test/ObjectYAML/wasm/weak_symbols.yaml =================================================================== --- test/ObjectYAML/wasm/weak_symbols.yaml +++ test/ObjectYAML/wasm/weak_symbols.yaml @@ -38,9 +38,11 @@ Name: linking DataSize: 10 SymbolInfo: - - Name: function_export + - Kind: FUNCTION + Index: 0 Flags: [ BINDING_WEAK ] - - Name: global_export + - Kind: GLOBAL + Index: 0 Flags: [ BINDING_WEAK ] ... # CHECK: --- !WASM @@ -59,7 +61,9 @@ # CHECK: Name: linking # CHECK: DataSize: 10 # CHECK: SymbolInfo: -# CHECK: - Name: function_export +# CHECK: - Kind: FUNCTION +# CHECK: Index: 0 # CHECK: Flags: [ BINDING_WEAK ] -# CHECK: - Name: global_export +# CHECK: - Kind: GLOBAL +# CHECK: Index: 0 # CHECK: Flags: [ BINDING_WEAK ] Index: test/tools/llvm-nm/wasm/weak-symbols.yaml =================================================================== --- test/tools/llvm-nm/wasm/weak-symbols.yaml +++ test/tools/llvm-nm/wasm/weak-symbols.yaml @@ -72,13 +72,17 @@ Name: linking DataSize: 0 SymbolInfo: - - Name: weak_global_func + - Kind: FUNCTION + Index: 1 Flags: [ BINDING_WEAK ] - - Name: weak_global_data + - Kind: GLOBAL + Index: 1 Flags: [ BINDING_WEAK ] - - Name: weak_import_func + - Kind: FUNCTION + Index: 0 Flags: [ BINDING_WEAK ] - - Name: weak_import_data + - Kind: GLOBAL + Index: 0 Flags: [ BINDING_WEAK ] # CHECK: 00000400 W weak_global_data Index: tools/obj2yaml/wasm2yaml.cpp =================================================================== --- tools/obj2yaml/wasm2yaml.cpp +++ tools/obj2yaml/wasm2yaml.cpp @@ -94,7 +94,9 @@ for (const object::SymbolRef& Sym: Obj.symbols()) { const object::WasmSymbol Symbol = Obj.getWasmSymbol(Sym); if (Symbol.Flags != 0) { - WasmYAML::SymbolInfo Info{Symbol.Name, Symbol.Flags}; + WasmYAML::SymbolInfo Info{Symbol.isFunction() ? wasm::WASM_EXTERNAL_FUNCTION + : wasm::WASM_EXTERNAL_GLOBAL, + Symbol.SymbolIndex, Symbol.Flags}; LinkingSec->SymbolInfos.emplace_back(Info); } } Index: tools/yaml2obj/yaml2wasm.cpp =================================================================== --- tools/yaml2obj/yaml2wasm.cpp +++ tools/yaml2obj/yaml2wasm.cpp @@ -146,7 +146,8 @@ encodeULEB128(Section.SymbolInfos.size(), SubSection.GetStream()); for (const WasmYAML::SymbolInfo &Info : Section.SymbolInfos) { - writeStringRef(Info.Name, SubSection.GetStream()); + encodeULEB128(Info.Kind, SubSection.GetStream()); + encodeULEB128(Info.Index, SubSection.GetStream()); encodeULEB128(Info.Flags, SubSection.GetStream()); }