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 @@ -728,6 +728,15 @@ } 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 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) diff --git a/llvm/test/DebugInfo/Symbolize/ELF/riscv-empty-name-symbol.s b/llvm/test/DebugInfo/Symbolize/ELF/riscv-empty-name-symbol.s new file mode 100644 --- /dev/null +++ b/llvm/test/DebugInfo/Symbolize/ELF/riscv-empty-name-symbol.s @@ -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