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 @@ -597,20 +602,23 @@ void WasmObjectFile::moveSymbolNext(DataRefImpl &Symb) const { Symb.d.a++; } uint32_t WasmObjectFile::getSymbolFlags(DataRefImpl Symb) const { + uint32_t Result = SymbolRef::SF_None; const WasmSymbol &Sym = getWasmSymbol(Symb); + switch (Sym.Type) { case WasmSymbol::SymbolType::FUNCTION_IMPORT: - return object::SymbolRef::SF_Undefined | SymbolRef::SF_Executable; + Result |= SymbolRef::SF_Undefined | SymbolRef::SF_Executable; case WasmSymbol::SymbolType::FUNCTION_EXPORT: - return object::SymbolRef::SF_Global | SymbolRef::SF_Executable; + Result |= SymbolRef::SF_Global | SymbolRef::SF_Executable; case WasmSymbol::SymbolType::DEBUG_FUNCTION_NAME: - return object::SymbolRef::SF_Executable; + Result |= SymbolRef::SF_Executable; case WasmSymbol::SymbolType::GLOBAL_IMPORT: - return object::SymbolRef::SF_Undefined; + Result |= SymbolRef::SF_Undefined; case WasmSymbol::SymbolType::GLOBAL_EXPORT: - return object::SymbolRef::SF_Global; + Result |= SymbolRef::SF_Global; } - llvm_unreachable("Unknown WasmSymbol::SymbolType"); + + return Result; } basic_symbol_iterator WasmObjectFile::symbol_begin() const { @@ -635,12 +643,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 +663,27 @@ Expected WasmObjectFile::getSymbolType(DataRefImpl Symb) const { - llvm_unreachable("not yet implemented"); - return errorCodeToError(object_error::invalid_symbol_index); + const WasmSymbol &Sym = getWasmSymbol(Symb); + + switch (Sym.Type) { + case WasmSymbol::SymbolType::FUNCTION_IMPORT: + case WasmSymbol::SymbolType::FUNCTION_EXPORT: + case WasmSymbol::SymbolType::DEBUG_FUNCTION_NAME: + return SymbolRef::ST_Function; + case WasmSymbol::SymbolType::GLOBAL_IMPORT: + case WasmSymbol::SymbolType::GLOBAL_EXPORT: + return SymbolRef::ST_Data; + } + + llvm_unreachable("Unknown WasmSymbol::SymbolType"); + return SymbolRef::ST_Other; } 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