[lld] [lld/COFF] Demangle symbol name in discarded section relocation error message (PR #119726)
Nico Weber via llvm-commits
llvm-commits at lists.llvm.org
Thu Dec 12 09:23:25 PST 2024
https://github.com/nico updated https://github.com/llvm/llvm-project/pull/119726
>From a02dbbcf512ca74fefcace349488f926a57b03bb Mon Sep 17 00:00:00 2001
From: Nico Weber <thakis at chromium.org>
Date: Thu, 12 Dec 2024 12:21:16 -0500
Subject: [PATCH] [lld/COFF] Demangle symbol name in discarded section
relocation error message
---
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 23fab0e66bb67f..c3a8b2f91999bc 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<std::string> symbolLocations =
diff --git a/lld/COFF/Symbols.cpp b/lld/COFF/Symbols.cpp
index 7de2c3829d1b0d..35c421d599ff55 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 3b367a38c889f4..465d4df52c6300 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 378804b623128c..667df0faeb5a89 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
More information about the llvm-commits
mailing list