Skip to content

Commit 01706e7

Browse files
authored
[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 #76107
1 parent 0b77b19 commit 01706e7

File tree

13 files changed

+51
-31
lines changed

13 files changed

+51
-31
lines changed

llvm/include/llvm/Object/Wasm.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -179,6 +179,7 @@ class WasmObjectFile : public ObjectFile {
179179
Expected<SymbolRef::Type> getSymbolType(DataRefImpl Symb) const override;
180180
Expected<section_iterator> getSymbolSection(DataRefImpl Symb) const override;
181181
uint32_t getSymbolSectionId(SymbolRef Sym) const;
182+
uint32_t getSymbolSize(SymbolRef Sym) const;
182183

183184
// Overrides from SectionRef.
184185
void moveSectionNext(DataRefImpl &Sec) const override;

llvm/lib/Object/WasmObjectFile.cpp

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1932,6 +1932,20 @@ uint32_t WasmObjectFile::getSymbolSectionIdImpl(const WasmSymbol &Sym) const {
19321932
}
19331933
}
19341934

1935+
uint32_t WasmObjectFile::getSymbolSize(SymbolRef Symb) const {
1936+
const WasmSymbol &Sym = getWasmSymbol(Symb);
1937+
if (!Sym.isDefined())
1938+
return 0;
1939+
if (Sym.isTypeData())
1940+
return Sym.Info.DataRef.Size;
1941+
if (Sym.isTypeFunction())
1942+
return functions()[Sym.Info.ElementIndex - getNumImportedFunctions()].Size;
1943+
// Currently symbol size is only tracked for data segments and functions. In
1944+
// principle we could also track size (e.g. binary size) for tables, globals
1945+
// and element segments etc too.
1946+
return 0;
1947+
}
1948+
19351949
void WasmObjectFile::moveSectionNext(DataRefImpl &Sec) const { Sec.d.a++; }
19361950

19371951
Expected<StringRef> WasmObjectFile::getSectionName(DataRefImpl Sec) const {

llvm/test/MC/WebAssembly/alias-offset.s

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -12,10 +12,10 @@ sym_a:
1212
.set sym_b, sym_a + 4
1313

1414
# CHECK-LABEL: SYMBOL TABLE:
15-
# CHECK-NEXT: 00000000 l O DATA foo
16-
# CHECK-NEXT: 00000004 l O DATA sym_a
17-
# CHECK-NEXT: 00000008 l O DATA sym_b
18-
# CHECK-NEXT: 00000001 l F CODE main
15+
# CHECK-NEXT: 00000000 l O DATA 00000004 foo
16+
# CHECK-NEXT: 00000004 l O DATA 00000008 sym_a
17+
# CHECK-NEXT: 00000008 l O DATA 00000004 sym_b
18+
# CHECK-NEXT: 00000001 l F CODE 00000012 main
1919

2020
.text
2121
.section .text,"",@

llvm/test/MC/WebAssembly/alias.s

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,6 @@ sym_a:
1010

1111
.set sym_b, sym_a
1212

13-
# CHECK: 00000000 l O DATA foo
14-
# CHECK: 00000004 l O DATA sym_a
15-
# CHECK: 00000004 l O DATA sym_b
13+
# CHECK: 00000000 l O DATA 00000004 foo
14+
# CHECK: 00000004 l O DATA 00000004 sym_a
15+
# CHECK: 00000004 l O DATA 00000004 sym_b

llvm/test/Object/wasm-linked-namesec-with-linkingsec.yaml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
# RUN: llvm-nm -P %t.wasm | FileCheck %s
33
#
44
# Test that names from the linking section override those from the name section
5-
# CHECK: foo T 1 0
5+
# CHECK: foo T 1 3
66
# CHECK-NOT: my_func_local_name
77

88
--- !WASM

llvm/test/Object/wasm-linked-symbol-table.yaml

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,9 @@
22
# RUN: llvm-objdump -t %t.wasm | FileCheck %s
33
#
44
# CHECK: SYMBOL TABLE:
5-
# CHECK-NEXT: 0000009f g F CODE my_func_export
6-
# CHECK-NEXT: 0000002a g O DATA my_global_export
7-
# CHECK-NEXT: 00000000 g TABLE my_table_export
5+
# CHECK-NEXT: 0000009f g F CODE 00000003 my_func_export
6+
# CHECK-NEXT: 0000002a g O DATA 00000000 my_global_export
7+
# CHECK-NEXT: 00000000 g TABLE 00000000 my_table_export
88

99
--- !WASM
1010
FileHeader:

llvm/test/tools/llvm-nm/wasm/linked.yaml

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,15 @@
11
# RUN: yaml2obj %s -o %t.wasm
22
# RUN: llvm-nm %t.wasm | FileCheck %s
3+
# RUN: llvm-nm -P %t.wasm | FileCheck %s --check-prefix=POSIX
34

45
# CHECK: 0000009f T my_func_export
56
# CHECK-NEXT: 0000002a D my_global_export
67
# CHECK-NEXT: 00000000 D my_table_export
78

9+
# POSIX: my_func_export T 9f 3
10+
# POSIX-NEXT: my_global_export D 2a 0
11+
# POSIX-NEXT: my_table_export D 0 0
12+
813
--- !WASM
914
FileHeader:
1015
Version: 0x1

llvm/test/tools/llvm-nm/wasm/print-size.test

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -43,4 +43,4 @@ Sections:
4343
Size: 32
4444

4545
# CHECK: 00000000 00000020 D a_data_symbol
46-
# CHECK: 00000001 00000000 T a_func
46+
# CHECK: 00000001 0000000d T a_func

llvm/test/tools/llvm-objdump/wasm/dylink-symbol-table.yaml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,8 @@
22
# RUN: llvm-objdump -t %t.so | FileCheck %s
33
#
44
# CHECK: SYMBOL TABLE:
5-
# CHECK-NEXT: 00000001 g F CODE my_func_export
6-
# CHECK-NEXT: 0000002a g O DATA my_global_export
5+
# CHECK-NEXT: 00000001 g F CODE 00000003 my_func_export
6+
# CHECK-NEXT: 0000002a g O DATA 00000000 my_global_export
77

88
--- !WASM
99
FileHeader:

llvm/test/tools/llvm-objdump/wasm/linked-symbol-table-namesec.yaml

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -2,12 +2,12 @@
22
# RUN: llvm-objdump -t %t.wasm | FileCheck %s
33
#
44
# CHECK: SYMBOL TABLE:
5-
# CHECK-NEXT: 00000000 F *UND* my_func_import_name
6-
# CHECK-NEXT: 00000083 g F CODE my_func_export_name
7-
# CHECK-NEXT: 00000086 l F CODE my_func_local_name
8-
# CHECK-NEXT: 00000000 *UND* my_global_import_name
9-
# CHECK-NEXT: 00000001 g GLOBAL my_global_export_name
10-
# CHECK-NEXT: 00000000 l O DATA my_datasegment_name
5+
# CHECK-NEXT: 00000000 F *UND* 00000000 my_func_import_name
6+
# CHECK-NEXT: 00000083 g F CODE 00000003 my_func_export_name
7+
# CHECK-NEXT: 00000086 l F CODE 00000003 my_func_local_name
8+
# CHECK-NEXT: 00000000 *UND* 00000000 my_global_import_name
9+
# CHECK-NEXT: 00000001 g GLOBAL 00000000 my_global_export_name
10+
# CHECK-NEXT: 00000000 l O DATA 00000004 my_datasegment_name
1111

1212
--- !WASM
1313
FileHeader:
Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,9 @@
11
RUN: llvm-objdump -t %p/Inputs/trivial.obj.wasm | FileCheck %s
22

33
CHECK: SYMBOL TABLE:
4-
CHECK-NEXT: 00000001 g F CODE main
5-
CHECK-NEXT: 00000000 l O DATA .L.str
6-
CHECK-NEXT: 00000000 F *UND* puts
7-
CHECK-NEXT: 00000019 l F CODE .LSomeOtherFunction_bitcast
8-
CHECK-NEXT: 00000000 F *UND* SomeOtherFunction
9-
CHECK-NEXT: 00000010 g O DATA var
4+
CHECK-NEXT: 00000001 g F CODE 00000018 main
5+
CHECK-NEXT: 00000000 l O DATA 0000000d .L.str
6+
CHECK-NEXT: 00000000 F *UND* 00000000 puts
7+
CHECK-NEXT: 00000019 l F CODE 0000000b .LSomeOtherFunction_bitcast
8+
CHECK-NEXT: 00000000 F *UND* 00000000 SomeOtherFunction
9+
CHECK-NEXT: 00000010 g O DATA 00000004 var

llvm/tools/llvm-nm/llvm-nm.cpp

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1854,11 +1854,8 @@ static bool getSymbolNamesFromObject(SymbolicFile &Obj,
18541854
dyn_cast<const XCOFFObjectFile>(&Obj))
18551855
S.Size = XCOFFObj->getSymbolSize(Sym.getRawDataRefImpl());
18561856

1857-
if (const WasmObjectFile *WasmObj = dyn_cast<WasmObjectFile>(&Obj)) {
1858-
const WasmSymbol &WasmSym = WasmObj->getWasmSymbol(Sym);
1859-
if (WasmSym.isTypeData() && !WasmSym.isUndefined())
1860-
S.Size = WasmSym.Info.DataRef.Size;
1861-
}
1857+
if (const WasmObjectFile *WasmObj = dyn_cast<WasmObjectFile>(&Obj))
1858+
S.Size = WasmObj->getSymbolSize(Sym);
18621859

18631860
if (PrintAddress && isa<ObjectFile>(Obj)) {
18641861
SymbolRef SymRef(Sym);

llvm/tools/llvm-objdump/llvm-objdump.cpp

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2947,6 +2947,9 @@ void Dumper::printSymbol(const SymbolRef &Symbol,
29472947
Symbol.getRawDataRefImpl()));
29482948
else if (O.isELF())
29492949
outs() << '\t' << format(Fmt, ELFSymbolRef(Symbol).getSize());
2950+
else if (O.isWasm())
2951+
outs() << '\t'
2952+
<< format(Fmt, cast<WasmObjectFile>(O).getSymbolSize(Symbol));
29502953

29512954
if (O.isELF()) {
29522955
if (!SymbolVersions.empty()) {

0 commit comments

Comments
 (0)