From d73ef9749e72e59d1d34275e89d4d2fffddd3e8c Mon Sep 17 00:00:00 2001 From: Nico Weber Date: Fri, 13 Dec 2024 19:35:51 -0500 Subject: [PATCH] [lld/COFF] Demangle symbol name in discarded section relocation error message (#119726) --- lld/COFF/Chunks.cpp | 7 ++++--- lld/COFF/Symbols.cpp | 4 ++-- lld/COFF/Symbols.h | 4 ++++ lld/test/COFF/reloc-discarded.s | 11 ++++++++--- 4 files changed, 18 insertions(+), 8 deletions(-) diff --git a/lld/COFF/Chunks.cpp b/lld/COFF/Chunks.cpp index 23fab0e66bb6..c3a8b2f91999 100644 --- a/lld/COFF/Chunks.cpp +++ b/lld/COFF/Chunks.cpp @@ -369,13 +369,14 @@ static void maybeReportRelocationToDiscarded(const SectionChunk *fromChunk, // Get the name of the symbol. If it's null, it was discarded early, so we // have to go back to the object file. ObjFile *file = fromChunk->file; - StringRef name; + std::string name; if (sym) { - name = sym->getName(); + name = toString(file->ctx, *sym); } else { COFFSymbolRef coffSym = check(file->getCOFFObj()->getSymbol(rel.SymbolTableIndex)); - name = check(file->getCOFFObj()->getSymbolName(coffSym)); + name = maybeDemangleSymbol( + file->ctx, check(file->getCOFFObj()->getSymbolName(coffSym))); } std::vector symbolLocations = diff --git a/lld/COFF/Symbols.cpp b/lld/COFF/Symbols.cpp index 7de2c3829d1b..35c421d599ff 100644 --- a/lld/COFF/Symbols.cpp +++ b/lld/COFF/Symbols.cpp @@ -28,8 +28,8 @@ static_assert(sizeof(SymbolUnion) <= 48, "symbols should be optimized for memory usage"); // Returns a symbol name for an error message. -static std::string maybeDemangleSymbol(const COFFLinkerContext &ctx, - StringRef symName) { +std::string maybeDemangleSymbol(const COFFLinkerContext &ctx, + StringRef symName) { if (ctx.config.demangle) { std::string prefix; StringRef prefixless = symName; diff --git a/lld/COFF/Symbols.h b/lld/COFF/Symbols.h index 3b367a38c889..465d4df52c63 100644 --- a/lld/COFF/Symbols.h +++ b/lld/COFF/Symbols.h @@ -533,6 +533,10 @@ std::string toString(const coff::COFFLinkerContext &ctx, coff::Symbol &b); std::string toCOFFString(const coff::COFFLinkerContext &ctx, const llvm::object::Archive::Symbol &b); +// Returns a symbol name for an error message. +std::string maybeDemangleSymbol(const coff::COFFLinkerContext &ctx, + StringRef symName); + } // namespace lld #endif diff --git a/lld/test/COFF/reloc-discarded.s b/lld/test/COFF/reloc-discarded.s index 378804b62312..667df0faeb5a 100644 --- a/lld/test/COFF/reloc-discarded.s +++ b/lld/test/COFF/reloc-discarded.s @@ -8,10 +8,15 @@ # RUN: not lld-link -entry:main -nodefaultlib %t1.obj %t2.obj -out:%t.exe -opt:ref 2>&1 | FileCheck %s # RUN: not lld-link -entry:main -nodefaultlib %t1.obj %t2.obj -out:%t.exe -opt:noref 2>&1 | FileCheck %s +# RUN: not lld-link -entry:main -nodefaultlib %t1.obj %t2.obj -out:%t.exe -demangle:no 2>&1 \ +# RUN: | FileCheck --check-prefix=NODEMANGLE %s -# CHECK: error: relocation against symbol in discarded section: assoc_global +# CHECK: error: relocation against symbol in discarded section: int __cdecl assoc_global(void) # CHECK: >>> referenced by {{.*}}reloc-discarded{{.*}}.obj:(main) +# NODEMANGLE: error: relocation against symbol in discarded section: ?assoc_global@@YAHXZ +# NODEMANGLE: >>> referenced by {{.*}}reloc-discarded{{.*}}.obj:(main) + .section .bss,"bw",discard,main_global .globl main_global .p2align 2 @@ -20,12 +25,12 @@ main_global: .section .CRT$XCU,"dr",associative,main_global .p2align 3 -assoc_global: +"?assoc_global@@YAHXZ": .quad main_global .text .globl main main: - movq assoc_global(%rip), %rax + movq "?assoc_global@@YAHXZ"(%rip), %rax movl (%rax), %eax retq