[MC] Emit unused undefined symbol even if its binding is not set
authorFangrui Song <maskray@google.com>
Sun, 29 Sep 2019 15:26:12 +0000 (15:26 +0000)
committerFangrui Song <maskray@google.com>
Fri, 8 Nov 2019 22:47:48 +0000 (14:47 -0800)
commit8f089f2099d39021bbfb76a2cd575612382a7cf6
tree52aaa06536fd0e4b82d37f2684b7f422750144df
parent3a7a22445e806c08f80cf6d83d1760f7ff732ed0
[MC] Emit unused undefined symbol even if its binding is not set

Recommit r373168, which was reverted by r373242. This actually exposed a
boringssl bug which has been fixed for more than one month.

For the following two cases, we currently suppress the symbols. This
patch emits them (compatible with GNU as).

* `test2_a = undef`: if `undef` is otherwise unused.
* `.hidden hidden`: if `hidden` is unused. This is the main point of the
  patch, because omitting the symbol would cause a linker semantic
  difference.

It causes a behavior change that is not compatible with GNU as:

.weakref foo1, bar1

When neither foo1 nor bar1 is used, we now emit bar1, which is arguably
more consistent.

Another change is that we will emit .TOC. for .TOC.@tocbase .  For this
directive, suppressing .TOC. can be seen as a size optimization, but we
choose to drop it for simplicity and consistency.
lld/test/ELF/ppc64-abs64-dyn.s
lld/test/ELF/ppc64-relocs.s
llvm/lib/MC/ELFObjectWriter.cpp
llvm/test/MC/ELF/undef.s
llvm/test/MC/ELF/weakref.s