[lld/mac] Fix mislink with ICF
authorNico Weber <thakis@chromium.org>
Sat, 30 Oct 2021 02:25:23 +0000 (22:25 -0400)
committerNico Weber <thakis@chromium.org>
Sat, 30 Oct 2021 22:58:59 +0000 (18:58 -0400)
commit2d48b19136722f76e467c5e72d36208455f63953
tree60432aa803a0a95061b47c9e7c467b43435be776
parent82ed106567063ea269c6d5669278b733e173a42f
[lld/mac] Fix mislink with ICF

When comparing relocations against two symbols, ICF's equalsConstant() did not
look at the value of the two symbols. With subsections_via_symbols, the value
is usually 0 but not always: In particular, it isn't 0 for constants in string
and literal sections. Since we ignored the value, comparing two constant string
symbols or two literal symbols always compared the 0th's element, so functions
in the same TU always compared as equal.

This can cause mislinks, and, with -dead_strip, crashes.

Fixes PR52349, see that bug for lots of details and examples of mislinks.

While here, make the existing assembly in icf-literals.s a bit more realistic
(use leaq instead of movq with strings, and use foo(%rip) instead of
foo@gotpcrel(%rip)). This has no interesting effect, it just maybe makes the
test look a bit less surprising.

Differential Revision: https://reviews.llvm.org/D112862
lld/MachO/ICF.cpp
lld/test/MachO/icf-literals.s