1
0
mirror of https://github.com/RPCS3/llvm-mirror.git synced 2024-11-22 10:42:39 +01:00

[RISCV] Make empty name symbols SF_FormatSpecific so that llvm-symbolizer ignores them for symbolization

On RISC-V, clang emits empty name symbols used for label differences. (In GCC the symbols are typically `.L0`)
After D95916, the empty name symbols can show up in llvm-symbolizer's symbolization output.
They have no names and thus not useful. Set `SF_FormatSpecific` so that llvm-symbolizer will ignore them.

`SF_FormatSpecific` is also used in LTO but that case should not matter.

Corresponding addr2line problem: https://sourceware.org/bugzilla/show_bug.cgi?id=27585

Reviewed By: luismarques

Differential Revision: https://reviews.llvm.org/D98669
This commit is contained in:
Fangrui Song 2021-03-16 14:12:18 -07:00
parent efc20bdcf7
commit 73df85ab79
2 changed files with 35 additions and 0 deletions

View File

@ -728,6 +728,15 @@ Expected<uint32_t> ELFObjectFile<ELFT>::getSymbolFlags(DataRefImpl Sym) const {
}
if (ESym->getType() == ELF::STT_FUNC && (ESym->st_value & 1) == 1)
Result |= SymbolRef::SF_Thumb;
} else if (EF.getHeader().e_machine == ELF::EM_RISCV) {
if (Expected<StringRef> NameOrErr = getSymbolName(Sym)) {
// Mark empty name symbols used for label differences.
if (NameOrErr->empty())
Result |= SymbolRef::SF_FormatSpecific;
} else {
// TODO: Actually report errors helpfully.
consumeError(NameOrErr.takeError());
}
}
if (ESym->st_shndx == ELF::SHN_UNDEF)

View File

@ -0,0 +1,26 @@
# REQUIRES: riscv-registered-target
## Ignore empty name symbols.
# RUN: llvm-mc -filetype=obj -triple=riscv64 %s -o %t
# RUN: llvm-readelf -s %t | FileCheck %s --check-prefix=SYM
# SYM: 0000000000000004 0 NOTYPE LOCAL DEFAULT [[#]] {{$}}
# SYM: 0000000000000000 0 NOTYPE GLOBAL DEFAULT [[#]] foo
## Make sure we test at an address larger than or equal to an empty name symbol.
# RUN: llvm-symbolizer --obj=%t 0 4 | FileCheck %s
# CHECK: foo
# CHECK-NEXT: ??:0:0
# CHECK-EMPTY:
# CHECK-NEXT: foo
# CHECK-NEXT: ??:0:0
.globl foo
foo:
nop
.file 1 "/tmp" "a.s"
.loc 1 1 0
nop
.section .debug_line,"",@progbits