diff --git a/llvm/include/llvm/Object/ELFObjectFile.h b/llvm/include/llvm/Object/ELFObjectFile.h --- a/llvm/include/llvm/Object/ELFObjectFile.h +++ b/llvm/include/llvm/Object/ELFObjectFile.h @@ -772,8 +772,10 @@ } } else if (EF.getHeader().e_machine == ELF::EM_RISCV) { if (Expected NameOrErr = getSymbolName(Sym)) { - // Mark empty name symbols used for label differences. - if (NameOrErr->empty()) + StringRef Name = *NameOrErr; + // Mark empty name symbols (used for label differences) and mapping + // symbols. + if (Name.empty() || Name.startswith("$d") || Name.startswith("$x")) Result |= SymbolRef::SF_FormatSpecific; } else { // TODO: Actually report errors helpfully. diff --git a/llvm/test/DebugInfo/Symbolize/ELF/riscv-mapping-symbol.s b/llvm/test/DebugInfo/Symbolize/ELF/riscv-mapping-symbol.s new file mode 100644 --- /dev/null +++ b/llvm/test/DebugInfo/Symbolize/ELF/riscv-mapping-symbol.s @@ -0,0 +1,21 @@ +# REQUIRES: riscv-registered-target +## Ignore RISC-V mapping symbols (with a prefix of $d or $x). + +# RUN: llvm-mc -filetype=obj -triple=riscv64 %s -o %t +# RUN: llvm-symbolizer --obj=%t 0 4 0xc | FileCheck %s + +# CHECK: foo +# CHECK-NEXT: ??:0:0 +# CHECK-EMPTY: +# CHECK: foo +# CHECK-NEXT: ??:0:0 +# CHECK-EMPTY: +# CHECK: foo +# CHECK-NEXT: ??:0:0 + + .global foo +foo: + .word 32 + nop + nop + .word 42