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 @@ -724,7 +724,7 @@ if (IsDefined) { auto Index = readVaruint32(Ctx); if (Index >= DataSegments.size()) - return make_error("invalid data symbol index", + return make_error("invalid data segment index", object_error::parse_failed); auto Offset = readVaruint64(Ctx); auto Size = readVaruint64(Ctx); diff --git a/llvm/test/tools/llvm-nm/wasm/print-size.test b/llvm/test/tools/llvm-nm/wasm/print-size.test new file mode 100644 --- /dev/null +++ b/llvm/test/tools/llvm-nm/wasm/print-size.test @@ -0,0 +1,46 @@ +# RUN: yaml2obj %s -o %t.o +# RUN: llvm-nm --print-size %t.o | FileCheck %s --strict-whitespace +# RUN: llvm-nm -S %t.o | FileCheck %s --strict-whitespace + +--- !WASM +FileHeader: + Version: 0x1 +Sections: + - Type: TYPE + Signatures: + - Index: 0 + ParamTypes: [] + ReturnTypes: [] + - Type: FUNCTION + FunctionTypes: [ 0 ] + - Type: CODE + Functions: + - Index: 0 + Locals: + Body: 200008808080800041000B + - Type: DATA + Segments: + - SectionOffset: 6 + InitFlags: 0 + Offset: + Opcode: I32_CONST + Value: 0 + Content: '00000000' + - Type: CUSTOM + Name: linking + Version: 2 + SymbolTable: + - Index: 0 + Kind: FUNCTION + Name: a_func + Flags: [ ] + Function: 0 + - Index: 1 + Kind: DATA + Name: a_data_symbol + Flags: [ ] + Segment: 0 + Size: 32 + +# CHECK: 00000000 00000020 D a_data_symbol +# CHECK: 00000001 00000000 T a_func diff --git a/llvm/tools/llvm-nm/llvm-nm.cpp b/llvm/tools/llvm-nm/llvm-nm.cpp --- a/llvm/tools/llvm-nm/llvm-nm.cpp +++ b/llvm/tools/llvm-nm/llvm-nm.cpp @@ -1818,6 +1818,12 @@ dyn_cast(&Obj)) S.Size = XCOFFObj->getSymbolSize(Sym.getRawDataRefImpl()); + if (const WasmObjectFile *WasmObj = dyn_cast(&Obj)) { + const WasmSymbol &WasmSym = WasmObj->getWasmSymbol(Sym); + if (WasmSym.isTypeData()) + S.Size = WasmSym.Info.DataRef.Size; + } + if (PrintAddress && isa(Obj)) { SymbolRef SymRef(Sym); Expected AddressOrErr = SymRef.getAddress();