about summary refs log tree commit diff
path: root/ports/sysdeps/tile/tilegx
diff options
context:
space:
mode:
authorChris Metcalf <cmetcalf@tilera.com>2013-05-24 14:02:31 -0400
committerChris Metcalf <cmetcalf@tilera.com>2013-05-24 14:02:31 -0400
commit86bd05fbc8b3a635148f6a7d8b4fb89c9a524e58 (patch)
tree27f5694a5169d2e4bbb9437f3f70b90debbf0600 /ports/sysdeps/tile/tilegx
parente8bdba36c5fdfdb7e85af2b7ed80ea9013794180 (diff)
downloadglibc-86bd05fbc8b3a635148f6a7d8b4fb89c9a524e58.tar.gz
glibc-86bd05fbc8b3a635148f6a7d8b4fb89c9a524e58.tar.xz
glibc-86bd05fbc8b3a635148f6a7d8b4fb89c9a524e58.zip
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.
Diffstat (limited to 'ports/sysdeps/tile/tilegx')
-rw-r--r--ports/sysdeps/tile/tilegx/Makefile21
1 files changed, 19 insertions, 2 deletions
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