[ELF] --warn-backrefs: save the referenced InputFile *
For a diagnostic `A refers to B` where B refers to a bitcode file, if the
symbol gets optimized out, the user may see `A refers to <internal>`; if the
symbol is retained, the user may see `A refers to lto.tmp`.
Save the reference InputFile * in the DenseMap so that the original filename is
available in reportBackrefs().
diff --git a/lld/ELF/Symbols.cpp b/lld/ELF/Symbols.cpp
index 8f2f554..eed0251 100644
--- a/lld/ELF/Symbols.cpp
+++ b/lld/ELF/Symbols.cpp
@@ -64,7 +64,8 @@
Defined *ElfSym::relaIpltEnd;
Defined *ElfSym::riscvGlobalPointer;
Defined *ElfSym::tlsModuleBase;
-DenseMap<const Symbol *, const InputFile *> elf::backwardReferences;
+DenseMap<const Symbol *, std::pair<const InputFile *, const InputFile *>>
+ elf::backwardReferences;
static uint64_t getSymVA(const Symbol &sym, int64_t &addend) {
switch (sym.kind()) {
@@ -377,7 +378,8 @@
for (auto &it : backwardReferences) {
const Symbol &sym = *it.first;
warn("backward reference detected: " + sym.getName() + " in " +
- toString(it.second) + " refers to " + toString(sym.file));
+ toString(it.second.first) + " refers to " +
+ toString(it.second.second));
}
}
@@ -532,9 +534,10 @@
// A traditional linker does not error for -ldef1 -lref -ldef2 (linking
// sandwich), where def2 may or may not be the same as def1. We don't want
// to warn for this case, so dismiss the warning if we see a subsequent lazy
- // definition.
+ // definition. this->file needs to be saved because in the case of LTO it
+ // may be reset to nullptr or be replaced with a file named lto.tmp.
if (backref && !isWeak())
- backwardReferences.try_emplace(this, other.file);
+ backwardReferences.try_emplace(this, std::make_pair(other.file, file));
return;
}