[ELF][PPC64] Improve "call lacks nop" diagnostic and make it compatible with GCC...
authorFangrui Song <maskray@google.com>
Wed, 18 Dec 2019 00:45:04 +0000 (16:45 -0800)
committerFangrui Song <maskray@google.com>
Mon, 30 Dec 2019 07:05:11 +0000 (23:05 -0800)
commitbb87364f26ce6b1fbb2cc5e155fd8ff82aafbe8d
tree94d733f419e1b8308cc9a3b2c9670726c676aa8f
parentfb2944bd7f8ac6d7c4bccd3ac2033ba58c690038
[ELF][PPC64] Improve "call lacks nop" diagnostic and make it compatible with GCC<5.5 and GCC<6.4

GCC before r245813 (https://gcc.gnu.org/bugzilla/show_bug.cgi?id=79439)
did not emit nop after b/bl. This can happen with recursive calls.
r245813 was back ported to GCC 5.5 and GCC 6.4.

This is common, for example, libstdc++.a(locale.o) shipped with GCC 4.9
and many objects in netlib lapack can cause lld to error.  gold allows
such calls to the same section. Our __plt_foo symbol's `section` field
is used for ThunkSection, so we can't implement a similar loosen rule
easily. But we can make use of its `file` field which is currently NULL.

Differential Revision: https://reviews.llvm.org/D71639
lld/ELF/InputSection.cpp
lld/ELF/Thunks.cpp
lld/test/ELF/ppc64-bsymbolic-toc-restore.s
lld/test/ELF/ppc64-error-toc-restore.s
lld/test/ELF/ppc64-error-toc-tail-call.s