Skip to content

[llvm-nm][WebAssembly] Print function symbol sizes #81315

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 6 commits into from
Feb 9, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions llvm/include/llvm/Object/Wasm.h
Original file line number Diff line number Diff line change
Expand Up @@ -179,6 +179,7 @@ class WasmObjectFile : public ObjectFile {
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;
Expand Down
14 changes: 14 additions & 0 deletions llvm/lib/Object/WasmObjectFile.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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 {
Expand Down
8 changes: 4 additions & 4 deletions llvm/test/MC/WebAssembly/alias-offset.s
Original file line number Diff line number Diff line change
Expand Up @@ -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,"",@
Expand Down
6 changes: 3 additions & 3 deletions llvm/test/MC/WebAssembly/alias.s
Original file line number Diff line number Diff line change
Expand Up @@ -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 changes: 1 addition & 1 deletion llvm/test/Object/wasm-linked-namesec-with-linkingsec.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
6 changes: 3 additions & 3 deletions llvm/test/Object/wasm-linked-symbol-table.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -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:
Expand Down
5 changes: 5 additions & 0 deletions llvm/test/tools/llvm-nm/wasm/linked.yaml
Original file line number Diff line number Diff line change
@@ -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
Expand Down
2 changes: 1 addition & 1 deletion llvm/test/tools/llvm-nm/wasm/print-size.test
Original file line number Diff line number Diff line change
Expand Up @@ -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
4 changes: 2 additions & 2 deletions llvm/test/tools/llvm-objdump/wasm/dylink-symbol-table.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -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:
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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:
Expand Down
12 changes: 6 additions & 6 deletions llvm/test/tools/llvm-objdump/wasm/symbol-table.test
Original file line number Diff line number Diff line change
@@ -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
7 changes: 2 additions & 5 deletions llvm/tools/llvm-nm/llvm-nm.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand Down
3 changes: 3 additions & 0 deletions llvm/tools/llvm-objdump/llvm-objdump.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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()) {
Expand Down