[llvm-nm][WebAssembly] Print function symbol sizes (#81315)
nm already prints sizes for data symbols. Do that for function symbols too, and update objdump to also print size information. Implements item 3 from https://github.com/llvm/llvm-project/issues/76107
This commit is contained in:
@@ -179,6 +179,7 @@ public:
|
||||
Expected<SymbolRef::Type> getSymbolType(DataRefImpl Symb) const override;
|
||||
Expected<section_iterator> getSymbolSection(DataRefImpl Symb) const override;
|
||||
uint32_t getSymbolSectionId(SymbolRef Sym) const;
|
||||
uint32_t getSymbolSize(SymbolRef Sym) const;
|
||||
|
||||
// Overrides from SectionRef.
|
||||
void moveSectionNext(DataRefImpl &Sec) const override;
|
||||
|
||||
@@ -1932,6 +1932,20 @@ uint32_t WasmObjectFile::getSymbolSectionIdImpl(const WasmSymbol &Sym) const {
|
||||
}
|
||||
}
|
||||
|
||||
uint32_t WasmObjectFile::getSymbolSize(SymbolRef Symb) const {
|
||||
const WasmSymbol &Sym = getWasmSymbol(Symb);
|
||||
if (!Sym.isDefined())
|
||||
return 0;
|
||||
if (Sym.isTypeData())
|
||||
return Sym.Info.DataRef.Size;
|
||||
if (Sym.isTypeFunction())
|
||||
return functions()[Sym.Info.ElementIndex - getNumImportedFunctions()].Size;
|
||||
// Currently symbol size is only tracked for data segments and functions. In
|
||||
// principle we could also track size (e.g. binary size) for tables, globals
|
||||
// and element segments etc too.
|
||||
return 0;
|
||||
}
|
||||
|
||||
void WasmObjectFile::moveSectionNext(DataRefImpl &Sec) const { Sec.d.a++; }
|
||||
|
||||
Expected<StringRef> WasmObjectFile::getSectionName(DataRefImpl Sec) const {
|
||||
|
||||
@@ -12,10 +12,10 @@ sym_a:
|
||||
.set sym_b, sym_a + 4
|
||||
|
||||
# CHECK-LABEL: SYMBOL TABLE:
|
||||
# CHECK-NEXT: 00000000 l O DATA foo
|
||||
# CHECK-NEXT: 00000004 l O DATA sym_a
|
||||
# CHECK-NEXT: 00000008 l O DATA sym_b
|
||||
# CHECK-NEXT: 00000001 l F CODE main
|
||||
# CHECK-NEXT: 00000000 l O DATA 00000004 foo
|
||||
# CHECK-NEXT: 00000004 l O DATA 00000008 sym_a
|
||||
# CHECK-NEXT: 00000008 l O DATA 00000004 sym_b
|
||||
# CHECK-NEXT: 00000001 l F CODE 00000012 main
|
||||
|
||||
.text
|
||||
.section .text,"",@
|
||||
|
||||
@@ -10,6 +10,6 @@ sym_a:
|
||||
|
||||
.set sym_b, sym_a
|
||||
|
||||
# CHECK: 00000000 l O DATA foo
|
||||
# CHECK: 00000004 l O DATA sym_a
|
||||
# CHECK: 00000004 l O DATA sym_b
|
||||
# CHECK: 00000000 l O DATA 00000004 foo
|
||||
# CHECK: 00000004 l O DATA 00000004 sym_a
|
||||
# CHECK: 00000004 l O DATA 00000004 sym_b
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
# RUN: llvm-nm -P %t.wasm | FileCheck %s
|
||||
#
|
||||
# Test that names from the linking section override those from the name section
|
||||
# CHECK: foo T 1 0
|
||||
# CHECK: foo T 1 3
|
||||
# CHECK-NOT: my_func_local_name
|
||||
|
||||
--- !WASM
|
||||
|
||||
@@ -2,9 +2,9 @@
|
||||
# RUN: llvm-objdump -t %t.wasm | FileCheck %s
|
||||
#
|
||||
# CHECK: SYMBOL TABLE:
|
||||
# CHECK-NEXT: 0000009f g F CODE my_func_export
|
||||
# CHECK-NEXT: 0000002a g O DATA my_global_export
|
||||
# CHECK-NEXT: 00000000 g TABLE my_table_export
|
||||
# CHECK-NEXT: 0000009f g F CODE 00000003 my_func_export
|
||||
# CHECK-NEXT: 0000002a g O DATA 00000000 my_global_export
|
||||
# CHECK-NEXT: 00000000 g TABLE 00000000 my_table_export
|
||||
|
||||
--- !WASM
|
||||
FileHeader:
|
||||
|
||||
@@ -1,10 +1,15 @@
|
||||
# RUN: yaml2obj %s -o %t.wasm
|
||||
# RUN: llvm-nm %t.wasm | FileCheck %s
|
||||
# RUN: llvm-nm -P %t.wasm | FileCheck %s --check-prefix=POSIX
|
||||
|
||||
# CHECK: 0000009f T my_func_export
|
||||
# CHECK-NEXT: 0000002a D my_global_export
|
||||
# CHECK-NEXT: 00000000 D my_table_export
|
||||
|
||||
# POSIX: my_func_export T 9f 3
|
||||
# POSIX-NEXT: my_global_export D 2a 0
|
||||
# POSIX-NEXT: my_table_export D 0 0
|
||||
|
||||
--- !WASM
|
||||
FileHeader:
|
||||
Version: 0x1
|
||||
|
||||
@@ -43,4 +43,4 @@ Sections:
|
||||
Size: 32
|
||||
|
||||
# CHECK: 00000000 00000020 D a_data_symbol
|
||||
# CHECK: 00000001 00000000 T a_func
|
||||
# CHECK: 00000001 0000000d T a_func
|
||||
|
||||
@@ -2,8 +2,8 @@
|
||||
# RUN: llvm-objdump -t %t.so | FileCheck %s
|
||||
#
|
||||
# CHECK: SYMBOL TABLE:
|
||||
# CHECK-NEXT: 00000001 g F CODE my_func_export
|
||||
# CHECK-NEXT: 0000002a g O DATA my_global_export
|
||||
# CHECK-NEXT: 00000001 g F CODE 00000003 my_func_export
|
||||
# CHECK-NEXT: 0000002a g O DATA 00000000 my_global_export
|
||||
|
||||
--- !WASM
|
||||
FileHeader:
|
||||
|
||||
@@ -2,12 +2,12 @@
|
||||
# RUN: llvm-objdump -t %t.wasm | FileCheck %s
|
||||
#
|
||||
# CHECK: SYMBOL TABLE:
|
||||
# CHECK-NEXT: 00000000 F *UND* my_func_import_name
|
||||
# CHECK-NEXT: 00000083 g F CODE my_func_export_name
|
||||
# CHECK-NEXT: 00000086 l F CODE my_func_local_name
|
||||
# CHECK-NEXT: 00000000 *UND* my_global_import_name
|
||||
# CHECK-NEXT: 00000001 g GLOBAL my_global_export_name
|
||||
# CHECK-NEXT: 00000000 l O DATA my_datasegment_name
|
||||
# CHECK-NEXT: 00000000 F *UND* 00000000 my_func_import_name
|
||||
# CHECK-NEXT: 00000083 g F CODE 00000003 my_func_export_name
|
||||
# CHECK-NEXT: 00000086 l F CODE 00000003 my_func_local_name
|
||||
# CHECK-NEXT: 00000000 *UND* 00000000 my_global_import_name
|
||||
# CHECK-NEXT: 00000001 g GLOBAL 00000000 my_global_export_name
|
||||
# CHECK-NEXT: 00000000 l O DATA 00000004 my_datasegment_name
|
||||
|
||||
--- !WASM
|
||||
FileHeader:
|
||||
|
||||
@@ -1,9 +1,9 @@
|
||||
RUN: llvm-objdump -t %p/Inputs/trivial.obj.wasm | FileCheck %s
|
||||
|
||||
CHECK: SYMBOL TABLE:
|
||||
CHECK-NEXT: 00000001 g F CODE main
|
||||
CHECK-NEXT: 00000000 l O DATA .L.str
|
||||
CHECK-NEXT: 00000000 F *UND* puts
|
||||
CHECK-NEXT: 00000019 l F CODE .LSomeOtherFunction_bitcast
|
||||
CHECK-NEXT: 00000000 F *UND* SomeOtherFunction
|
||||
CHECK-NEXT: 00000010 g O DATA var
|
||||
CHECK-NEXT: 00000001 g F CODE 00000018 main
|
||||
CHECK-NEXT: 00000000 l O DATA 0000000d .L.str
|
||||
CHECK-NEXT: 00000000 F *UND* 00000000 puts
|
||||
CHECK-NEXT: 00000019 l F CODE 0000000b .LSomeOtherFunction_bitcast
|
||||
CHECK-NEXT: 00000000 F *UND* 00000000 SomeOtherFunction
|
||||
CHECK-NEXT: 00000010 g O DATA 00000004 var
|
||||
|
||||
@@ -1854,11 +1854,8 @@ static bool getSymbolNamesFromObject(SymbolicFile &Obj,
|
||||
dyn_cast<const XCOFFObjectFile>(&Obj))
|
||||
S.Size = XCOFFObj->getSymbolSize(Sym.getRawDataRefImpl());
|
||||
|
||||
if (const WasmObjectFile *WasmObj = dyn_cast<WasmObjectFile>(&Obj)) {
|
||||
const WasmSymbol &WasmSym = WasmObj->getWasmSymbol(Sym);
|
||||
if (WasmSym.isTypeData() && !WasmSym.isUndefined())
|
||||
S.Size = WasmSym.Info.DataRef.Size;
|
||||
}
|
||||
if (const WasmObjectFile *WasmObj = dyn_cast<WasmObjectFile>(&Obj))
|
||||
S.Size = WasmObj->getSymbolSize(Sym);
|
||||
|
||||
if (PrintAddress && isa<ObjectFile>(Obj)) {
|
||||
SymbolRef SymRef(Sym);
|
||||
|
||||
@@ -2947,6 +2947,9 @@ void Dumper::printSymbol(const SymbolRef &Symbol,
|
||||
Symbol.getRawDataRefImpl()));
|
||||
else if (O.isELF())
|
||||
outs() << '\t' << format(Fmt, ELFSymbolRef(Symbol).getSize());
|
||||
else if (O.isWasm())
|
||||
outs() << '\t'
|
||||
<< format(Fmt, cast<WasmObjectFile>(O).getSymbolSize(Symbol));
|
||||
|
||||
if (O.isELF()) {
|
||||
if (!SymbolVersions.empty()) {
|
||||
|
||||
Reference in New Issue
Block a user