tile: improve detection for missing -mcmodel=large support

The existing test avoided passing -mcmodel=large if the compiler didn't
support it.  However, we need to test not just the compiler support, but
also the toolchain (as and ld) support, so make the test more complete.
In addition, we have to avoid using the hwN_plt() assembly operators if
that support is missing, so guard the uses with #ifdef NO_PLT_PCREL.

This allows us to properly build glibc with the current community
binutils, which doesn't yet have the PC-relative PLT operator support.
The -mcmodel=large support is in gcc 4.8, but the toolchain support
won't be present in the community until binutils 2.24.
This commit is contained in:
Chris Metcalf 2013-05-24 14:02:31 -04:00
parent e8bdba36c5
commit 86bd05fbc8
4 changed files with 41 additions and 4 deletions

View File

@ -1,3 +1,12 @@
2013-05-23 Chris Metcalf <cmetcalf@tilera.com>
* sysdeps/tile/tilegx/Makefile ($(cflags-mcmodel-large)):
Test for assembler and linker support for "-mcmodel=large -fpic"
in addition to compiler support; provide -DNO_PLT_PCREL if not.
* sysdeps/tile/start.S [NO_PLT_PCREL]: Guard for no PC-relative
PLT operators in assembly.
* sysdeps/tile/crti.S [NO_PLT_PCREL]: Likewise.
2013-05-22 Edjunior Barbosa Machado <emachado@linux.vnet.ibm.com>
* sysdeps/unix/sysv/linux/tile/bits/siginfo.h (siginfo_t): Fix comment

View File

@ -95,7 +95,7 @@ _init:
LD_PTR r0, r0
BEQZ r0, .Lno_weak_fn
jalr r0
#elif defined(__tilegx__)
#elif defined(__tilegx__) && !defined(NO_PLT_PCREL)
/* Since we are calling from the start of the object to the PLT,
call by loading the full address into a register. */
lnk r2

View File

@ -62,6 +62,13 @@
#include <sysdep.h>
#include <arch/abi.h>
/* Just create no-ops if we don't support PC-relative PLT relocations. */
#ifdef NO_PLT_PCREL
# define hw2_last_plt(x) 0
# define hw1_plt(x) 0
# define hw0_plt(x) 0
#endif
.text
.global _start
.type _start,@function
@ -155,7 +162,11 @@ _start:
}
{
ADD_PTR r4, r4, r13
jalr r12
# ifdef NO_PLT_PCREL
j plt(__libc_start_main)
# else
jr r12
# endif
}
#else
addli r0, r13, lo16(main - .Lmy_pc)

View File

@ -1,12 +1,16 @@
include $(common-objpfx)cflags-mcmodel-large.mk
# Check for gcc to support the command-line switch, and for
# binutils to support the hwN_plt() assembly operators and relocations.
$(common-objpfx)cflags-mcmodel-large.mk: $(common-objpfx)config.make
mcmodel=no; \
$(CC) -S -o /dev/null -xc /dev/null -mcmodel=large && mcmodel=yes; \
(echo 'int main() { return getuid(); }' | \
$(CC) -o /dev/null -xc - -mcmodel=large -fpic) && mcmodel=yes; \
echo "cflags-mcmodel-large = $$mcmodel" > $@
ifeq ($(subdir),csu)
ifeq (yes,$(cflags-mcmodel-large))
ifeq ($(subdir),csu)
# elf-init.c is in libc_nonshared.o (the end of the shared object) but
# must reach the _init symbol at the very start of the shared object.
CFLAGS-elf-init.c += -mcmodel=large
@ -15,4 +19,17 @@ CFLAGS-elf-init.c += -mcmodel=large
# with profiling, but calls to libc.so via the PLT at the very end.
CFLAGS-gmon-start.c += -mcmodel=large
endif
else
# Don't try to compile assembly code with hwN_plt() directives if the
# toolchain doesn't support -mcmodel=large.
ifeq ($(subdir),csu)
CPPFLAGS-start.S += -DNO_PLT_PCREL
CPPFLAGS-crti.S += -DNO_PLT_PCREL
endif
ifeq ($(subdir),nptl)
CPPFLAGS-pt-crti.S += -DNO_PLT_PCREL
endif
endif