Index: include/llvm/Object/Wasm.h =================================================================== --- include/llvm/Object/Wasm.h +++ include/llvm/Object/Wasm.h @@ -41,10 +41,12 @@ DEBUG_FUNCTION_NAME, }; - WasmSymbol(StringRef Name, SymbolType Type) : Name(Name), Type(Type) {} + WasmSymbol(StringRef Name, SymbolType Type, uint32_t SectionIndex) + : Name(Name), Type(Type), SectionIndex(SectionIndex) {} StringRef Name; SymbolType Type; + uint32_t SectionIndex; }; class WasmSection { Index: lib/Object/WasmObjectFile.cpp =================================================================== --- lib/Object/WasmObjectFile.cpp +++ lib/Object/WasmObjectFile.cpp @@ -257,7 +257,8 @@ StringRef Name = readString(Ptr); if (!Name.empty()) Symbols.emplace_back(Name, - WasmSymbol::SymbolType::DEBUG_FUNCTION_NAME); + WasmSymbol::SymbolType::DEBUG_FUNCTION_NAME, + Sections.size()); } break; } @@ -392,12 +393,14 @@ switch (Im.Kind) { case wasm::WASM_EXTERNAL_FUNCTION: Im.SigIndex = readVaruint32(Ptr); - Symbols.emplace_back(Im.Field, WasmSymbol::SymbolType::FUNCTION_IMPORT); + Symbols.emplace_back(Im.Field, WasmSymbol::SymbolType::FUNCTION_IMPORT, + Sections.size()); break; case wasm::WASM_EXTERNAL_GLOBAL: Im.GlobalType = readVarint7(Ptr); Im.GlobalMutable = readVaruint1(Ptr); - Symbols.emplace_back(Im.Field, WasmSymbol::SymbolType::GLOBAL_IMPORT); + Symbols.emplace_back(Im.Field, WasmSymbol::SymbolType::GLOBAL_IMPORT, + Sections.size()); break; default: // TODO(sbc): Handle other kinds of imports @@ -483,10 +486,12 @@ Exports.push_back(Ex); switch (Ex.Kind) { case wasm::WASM_EXTERNAL_FUNCTION: - Symbols.emplace_back(Ex.Name, WasmSymbol::SymbolType::FUNCTION_EXPORT); + Symbols.emplace_back(Ex.Name, WasmSymbol::SymbolType::FUNCTION_EXPORT, + Sections.size()); break; case wasm::WASM_EXTERNAL_GLOBAL: - Symbols.emplace_back(Ex.Name, WasmSymbol::SymbolType::GLOBAL_EXPORT); + Symbols.emplace_back(Ex.Name, WasmSymbol::SymbolType::GLOBAL_EXPORT, + Sections.size()); break; default: // TODO(sbc): Handle other kinds of exports @@ -655,14 +660,23 @@ Expected WasmObjectFile::getSymbolType(DataRefImpl Symb) const { - llvm_unreachable("not yet implemented"); - return errorCodeToError(object_error::invalid_symbol_index); + switch (Symbols[Symb.d.a].Type) { + case WasmSymbol::SymbolType::FUNCTION_IMPORT: + case WasmSymbol::SymbolType::FUNCTION_EXPORT: + case WasmSymbol::SymbolType::DEBUG_FUNCTION_NAME: + return object::SymbolRef::ST_Function; + case WasmSymbol::SymbolType::GLOBAL_IMPORT: + case WasmSymbol::SymbolType::GLOBAL_EXPORT: + return object::SymbolRef::ST_Data; + } + llvm_unreachable("Unknown WasmSymbol::SymbolType"); } Expected WasmObjectFile::getSymbolSection(DataRefImpl Symb) const { - llvm_unreachable("not yet implemented"); - return errorCodeToError(object_error::invalid_symbol_index); + DataRefImpl Ref; + Ref.d.a = getWasmSymbol(Symb).SectionIndex; + return section_iterator(SectionRef(Ref, this)); } void WasmObjectFile::moveSectionNext(DataRefImpl &Sec) const { Sec.d.a++; } Index: test/tools/llvm-objdump/WebAssembly/symbol-table.test =================================================================== --- /dev/null +++ test/tools/llvm-objdump/WebAssembly/symbol-table.test @@ -0,0 +1,8 @@ +RUN: llvm-objdump -t %p/../Inputs/test.wasm | FileCheck %s + +CHECK: SYMBOL TABLE: +CHECK: 00000000 l F IMPORT bar +CHECK: 00000001 g F EXPORT baz +CHECK: 00000002 g F EXPORT quux +CHECK: 00000003 l F name $import +CHECK: 00000004 l F name $func0