]> git.ipfire.org Git - thirdparty/glibc.git/commitdiff
tile: improve detection for missing -mcmodel=large support
authorChris Metcalf <cmetcalf@tilera.com>
Fri, 24 May 2013 18:02:31 +0000 (14:02 -0400)
committerChris Metcalf <cmetcalf@tilera.com>
Sun, 9 Jun 2013 15:19:37 +0000 (11:19 -0400)
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.

(cherry picked from commit 86bd05fbc8b3a635148f6a7d8b4fb89c9a524e58)

ports/ChangeLog.tile
ports/sysdeps/tile/crti.S
ports/sysdeps/tile/start.S
ports/sysdeps/tile/tilegx/Makefile

index da39a6efaeda48dcb280be6d113b3d9989354d8e..68e1b0a61e7e8650d3ffea0583755c846242af0e 100644 (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.
+
 2012-12-14  Chris Metcalf  <cmetcalf@tilera.com>
 
        * sysdeps/unix/sysv/linux/tile/nptl/clone.S: Fix DWARF info.
index 467816c7878a9dec24a95d52e79d1d4afcbc5b08..25ad4919bfffc9a4014a6f8b8df2b38b97fb7e3d 100644 (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
index 54f015f4d0f660e9790795fd970a349668880c50..47a7b4088b537024150b89d37eb59be445b53577 100644 (file)
 #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)
index d3a0e970a77e115bfc6d0eab7cf1420dfd3cd738..4281dd98fc7ca62e8991c515f1c6948d0ce6cf13 100644 (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