diff options
-rw-r--r-- | ports/ChangeLog.tile | 9 | ||||
-rw-r--r-- | ports/sysdeps/tile/crti.S | 2 | ||||
-rw-r--r-- | ports/sysdeps/tile/start.S | 13 | ||||
-rw-r--r-- | ports/sysdeps/tile/tilegx/Makefile | 21 |
4 files changed, 41 insertions, 4 deletions
diff --git a/ports/ChangeLog.tile b/ports/ChangeLog.tile index 7204ae578b..33ffa71fe6 100644 --- a/ports/ChangeLog.tile +++ b/ports/ChangeLog.tile @@ -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 diff --git a/ports/sysdeps/tile/crti.S b/ports/sysdeps/tile/crti.S index 9046010dc1..7e8e559b91 100644 --- a/ports/sysdeps/tile/crti.S +++ b/ports/sysdeps/tile/crti.S @@ -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 diff --git a/ports/sysdeps/tile/start.S b/ports/sysdeps/tile/start.S index 99415647c2..3e7ec5cccf 100644 --- a/ports/sysdeps/tile/start.S +++ b/ports/sysdeps/tile/start.S @@ -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) diff --git a/ports/sysdeps/tile/tilegx/Makefile b/ports/sysdeps/tile/tilegx/Makefile index d3a0e970a7..4281dd98fc 100644 --- a/ports/sysdeps/tile/tilegx/Makefile +++ b/ports/sysdeps/tile/tilegx/Makefile @@ -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 |