summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorjoseph <joseph@7b3dc134-2b1b-0410-93df-9e9f96275f8d>2013-06-15 17:38:58 +0000
committerjoseph <joseph@7b3dc134-2b1b-0410-93df-9e9f96275f8d>2013-06-15 17:38:58 +0000
commit050accca72bb128c92d1f15442786fde6daae188 (patch)
tree7791cf063ab1090e6e1d9baebbe619db7ae7fc4f
parentb31cca09051a433bcaafa91a4502292880a009fa (diff)
Merge changes between r23218 and r23297 from /fsf/glibc-2_17-branch.
git-svn-id: svn://svn.eglibc.org/branches/eglibc-2_17@23298 7b3dc134-2b1b-0410-93df-9e9f96275f8d
-rw-r--r--libc/ports/ChangeLog.tile9
-rw-r--r--libc/ports/sysdeps/tile/crti.S2
-rw-r--r--libc/ports/sysdeps/tile/start.S13
-rw-r--r--libc/ports/sysdeps/tile/tilegx/Makefile21
4 files changed, 41 insertions, 4 deletions
diff --git a/libc/ports/ChangeLog.tile b/libc/ports/ChangeLog.tile
index da39a6efa..68e1b0a61 100644
--- a/libc/ports/ChangeLog.tile
+++ b/libc/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.
+
2012-12-14 Chris Metcalf <cmetcalf@tilera.com>
* sysdeps/unix/sysv/linux/tile/nptl/clone.S: Fix DWARF info.
diff --git a/libc/ports/sysdeps/tile/crti.S b/libc/ports/sysdeps/tile/crti.S
index 467816c78..25ad4919b 100644
--- a/libc/ports/sysdeps/tile/crti.S
+++ b/libc/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/libc/ports/sysdeps/tile/start.S b/libc/ports/sysdeps/tile/start.S
index 54f015f4d..47a7b4088 100644
--- a/libc/ports/sysdeps/tile/start.S
+++ b/libc/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/libc/ports/sysdeps/tile/tilegx/Makefile b/libc/ports/sysdeps/tile/tilegx/Makefile
index d3a0e970a..4281dd98f 100644
--- a/libc/ports/sysdeps/tile/tilegx/Makefile
+++ b/libc/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