Index: include/llvm/Object/Wasm.h =================================================================== --- include/llvm/Object/Wasm.h +++ include/llvm/Object/Wasm.h @@ -41,10 +41,14 @@ DEBUG_FUNCTION_NAME, }; - WasmSymbol(StringRef Name, SymbolType Type) : Name(Name), Type(Type) {} + WasmSymbol(StringRef Name, SymbolType Type, uint32_t Section, + uint32_t ElementIndex) + : Name(Name), Type(Type), Section(Section), ElementIndex(ElementIndex) {} StringRef Name; SymbolType Type; + uint32_t Section; + uint32_t ElementIndex; }; class WasmSection { Index: lib/Object/WasmObjectFile.cpp =================================================================== --- lib/Object/WasmObjectFile.cpp +++ lib/Object/WasmObjectFile.cpp @@ -253,11 +253,12 @@ case wasm::WASM_NAMES_FUNCTION: { uint32_t Count = readVaruint32(Ptr); while (Count--) { - /*uint32_t Index =*/readVaruint32(Ptr); + uint32_t Index = readVaruint32(Ptr); StringRef Name = readString(Ptr); if (!Name.empty()) Symbols.emplace_back(Name, - WasmSymbol::SymbolType::DEBUG_FUNCTION_NAME); + WasmSymbol::SymbolType::DEBUG_FUNCTION_NAME, + Sections.size(), Index); } break; } @@ -384,7 +385,7 @@ Error WasmObjectFile::parseImportSection(const uint8_t *Ptr, const uint8_t *End) { uint32_t Count = readVaruint32(Ptr); Imports.reserve(Count); - while (Count--) { + for (uint32_t i = 0; i < Count; i++) { wasm::WasmImport Im; Im.Module = readString(Ptr); Im.Field = readString(Ptr); @@ -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(), i); 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(), i); break; default: // TODO(sbc): Handle other kinds of imports @@ -475,7 +478,7 @@ Error WasmObjectFile::parseExportSection(const uint8_t *Ptr, const uint8_t *End) { uint32_t Count = readVaruint32(Ptr); Exports.reserve(Count); - while (Count--) { + for (uint32_t i = 0; i < Count; i++) { wasm::WasmExport Ex; Ex.Name = readString(Ptr); Ex.Kind = readUint8(Ptr); @@ -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(), i); 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(), i); break; default: // TODO(sbc): Handle other kinds of exports @@ -635,12 +640,12 @@ } Expected WasmObjectFile::getSymbolAddress(DataRefImpl Symb) const { - return (uint64_t)Symb.d.a; + return getSymbolValue(Symb); } uint64_t WasmObjectFile::getSymbolValueImpl(DataRefImpl Symb) const { - llvm_unreachable("not yet implemented"); - return 0; + const WasmSymbol &Sym = getWasmSymbol(Symb); + return Sym.ElementIndex; } uint32_t WasmObjectFile::getSymbolAlignment(DataRefImpl Symb) const { @@ -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).Section; + 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: 00000000 g F EXPORT baz +CHECK: 00000001 g F EXPORT quux +CHECK: 00000000 l F name $import +CHECK: 00000001 l F name $func0