[lld/COFF] Demangle symbol name in discarded section relocation error message (#119726)

This commit is contained in:
Nico Weber 2024-12-13 19:35:51 -05:00 committed by GitHub
parent f22cff7675
commit d73ef9749e
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
4 changed files with 18 additions and 8 deletions

View File

@ -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 =

View File

@ -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;

View File

@ -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

View File

@ -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