This is an alternative design to D77512.
D45195 added --warn-backrefs to detect
- A. certain input orders which GNU ld either errors ("undefined reference") or has different resolution semantics
- B. (byproduct) some latent multiple definition problems (-ldef1 -lref -ldef2) which I call "linking sandwich problems". def2 may or may not be the same as def1.
When an archive appears more than once (-ldef -lref -ldef), lld and GNU
ld may have the same resolution but --warn-backrefs may warn. This is
not uncommon. For example, currently lld itself has such a problem:
liblldCommon.a liblldCOFF.a ... liblldCommon.a _ZN3lld10DWARFCache13getDILineInfoEmm in liblldCOFF.a refers to liblldCommon.a(DWARF.cpp.o) libLLVMSupport.a also appears twice and has a similar warning
glibc has such problems. It is somewhat destined because of its separate
libc/libpthread/... and arbitrary grouping. The situation is getting
improved over time but I have seen:
-lc __isnanl references -lm -lc _IO_funlockfile references -lpthread
There are also various issues in interaction with other runtime
libraries such as libgcc_eh and libunwind:
-lc __gcc_personality_v0 references -lgcc_eh -lpthread __gcc_personality_v0 references -lgcc_eh -lpthread _Unwind_GetCFA references -lunwind
These problems are actually benign. We want --warn-backrefs to focus on
its main task A and defer task B (which is also useful) to a more
specific future feature (see gold --detect-odr-violations).
Instead of warning immediately, we store the message and only report it
if no subsequent lazy definition exists.
The use of the static variable backrefDiags is similar to undefs in
Relocations.cpp
clang-format-diff not found in user's PATH; not linting file.