vapier 16/01/20 20:27:57 Modified: README.history Added: 36_all_gcc-ia64-pr60465.patch Log: add ia64 reloc fixes #503838
Revision Changes Path 1.2 src/patchsets/gcc/5.3.0/gentoo/README.history file : http://sources.gentoo.org/viewvc.cgi/gentoo/src/patchsets/gcc/5.3.0/gentoo/README.history?rev=1.2&view=markup plain: http://sources.gentoo.org/viewvc.cgi/gentoo/src/patchsets/gcc/5.3.0/gentoo/README.history?rev=1.2&content-type=text/plain diff : http://sources.gentoo.org/viewvc.cgi/gentoo/src/patchsets/gcc/5.3.0/gentoo/README.history?r1=1.1&r2=1.2 Index: README.history =================================================================== RCS file: /var/cvsroot/gentoo/src/patchsets/gcc/5.3.0/gentoo/README.history,v retrieving revision 1.1 retrieving revision 1.2 diff -u -r1.1 -r1.2 --- README.history 5 Dec 2015 21:12:19 -0000 1.1 +++ README.history 20 Jan 2016 20:27:57 -0000 1.2 @@ -1,3 +1,6 @@ +1.1 [pending] + + 36_all_gcc-ia64-pr60465.patch + 1.0 05 Dec 2015 + 05_all_gcc-spec-env.patch + 09_all_default-ssp.patch 1.1 src/patchsets/gcc/5.3.0/gentoo/36_all_gcc-ia64-pr60465.patch file : http://sources.gentoo.org/viewvc.cgi/gentoo/src/patchsets/gcc/5.3.0/gentoo/36_all_gcc-ia64-pr60465.patch?rev=1.1&view=markup plain: http://sources.gentoo.org/viewvc.cgi/gentoo/src/patchsets/gcc/5.3.0/gentoo/36_all_gcc-ia64-pr60465.patch?rev=1.1&content-type=text/plain Index: 36_all_gcc-ia64-pr60465.patch =================================================================== https://bugs.gentoo.org/503838 https://gcc.gnu.org/PR60465 >From baa1cebceba62edf9d0dace8094f5162e07b1651 Mon Sep 17 00:00:00 2001 From: vapier <vapier@138bc75d-0d04-0410-961f-82ee72b054a4> Date: Tue, 19 Jan 2016 23:12:22 +0000 Subject: [PATCH] ia64: don't use dynamic relocations for local symbols Backported from trunk for PR other/60465. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/branches/gcc-5-branch@232594 138bc75d-0d04-0410-961f-82ee72b054a4 --- gcc/ChangeLog | 9 ++++++++ gcc/config/ia64/ia64.c | 9 ++++++++ gcc/config/ia64/predicates.md | 26 +++++++++++++++++++++ gcc/testsuite/ChangeLog | 7 ++++++ .../gcc.target/ia64/pr60465-gprel64-c37.c | 10 ++++++++ gcc/testsuite/gcc.target/ia64/pr60465-gprel64.c | 27 ++++++++++++++++++++++ 6 files changed, 88 insertions(+) create mode 100644 gcc/testsuite/gcc.target/ia64/pr60465-gprel64-c37.c create mode 100644 gcc/testsuite/gcc.target/ia64/pr60465-gprel64.c 2016-01-19 Sergei Trofimovich <[email protected]> Backport from mainline PR other/60465 * config/ia64/ia64.c (ia64_expand_load_address): Use gprel64 for local symbolic operands. * config/ia64/predicates.md (local_symbolic_operand64): New predicate. diff --git a/gcc/config/ia64/ia64.c b/gcc/config/ia64/ia64.c index 21da9e2..cf42b0d 100644 --- a/gcc/config/ia64/ia64.c +++ b/gcc/config/ia64/ia64.c @@ -1146,6 +1146,15 @@ ia64_expand_load_address (rtx dest, rtx src) emit_insn (gen_load_fptr (dest, src)); else if (sdata_symbolic_operand (src, VOIDmode)) emit_insn (gen_load_gprel (dest, src)); + else if (local_symbolic_operand64 (src, VOIDmode)) + { + /* We want to use @gprel rather than @ltoff relocations for local + symbols: + - @gprel does not require dynamic linker + - and does not use .sdata section + https://gcc.gnu.org/bugzilla/60465 */ + emit_insn (gen_load_gprel64 (dest, src)); + } else { HOST_WIDE_INT addend = 0; diff --git a/gcc/config/ia64/predicates.md b/gcc/config/ia64/predicates.md index 2aa7a78..2e148f2e 100644 --- a/gcc/config/ia64/predicates.md +++ b/gcc/config/ia64/predicates.md @@ -97,6 +97,32 @@ } }) +;; True if OP refers to a local symbol [+any offset]. +;; To be encoded as: +;; movl % = @gprel(symbol+offset) +;; add % = %, gp +(define_predicate "local_symbolic_operand64" + (match_code "symbol_ref,const") +{ + switch (GET_CODE (op)) + { + case CONST: + op = XEXP (op, 0); + if (GET_CODE (op) != PLUS + || GET_CODE (XEXP (op, 0)) != SYMBOL_REF + || GET_CODE (XEXP (op, 1)) != CONST_INT) + return false; + op = XEXP (op, 0); + /* FALLTHRU */ + + case SYMBOL_REF: + return SYMBOL_REF_LOCAL_P (op); + + default: + gcc_unreachable (); + } +}) + ;; True if OP refers to a symbol in the small address area. (define_predicate "small_addr_symbolic_operand" (match_code "symbol_ref,const") 2016-01-19 Sergei Trofimovich <[email protected]> Backport from mainline PR other/60465 * gcc.target/ia64/pr60465-gprel64.c: New test. * gcc.target/ia64/pr60465-gprel64-c37.c: New test. diff --git a/gcc/testsuite/gcc.target/ia64/pr60465-gprel64-c37.c b/gcc/testsuite/gcc.target/ia64/pr60465-gprel64-c37.c new file mode 100644 index 0000000..a7e6809 --- /dev/null +++ b/gcc/testsuite/gcc.target/ia64/pr60465-gprel64-c37.c @@ -0,0 +1,10 @@ +/* { dg-do compile { target ia64-*-* } } */ +/* { dg-options "-O2 -fpic" } */ +/* { dg-final { scan-assembler-not "@ltoffx" } } */ + +/* A bit of https://bugzilla.redhat.com/show_bug.cgi?id=33354 + where many stores to static variables overflow .sdata */ + +static const char *s90; +void f() { s90 = "string 90"; } +const char * g() { return s90; } diff --git a/gcc/testsuite/gcc.target/ia64/pr60465-gprel64.c b/gcc/testsuite/gcc.target/ia64/pr60465-gprel64.c new file mode 100644 index 0000000..c00ecc9 --- /dev/null +++ b/gcc/testsuite/gcc.target/ia64/pr60465-gprel64.c @@ -0,0 +1,27 @@ +/* { dg-do compile { target ia64-*-* } } */ +/* { dg-options "-O2 -fpic" } */ +/* { dg-final { scan-assembler-not "@ltoffx" } } */ + +/* Test imitates early ld.so setup in glibc + where no dynamic relocations must be present. */ + +struct rtld_global +{ + long *p[77]; +}; + +struct rtld_global _rtld_local __attribute__ ((visibility ("hidden"), section (".sdata"))); + +static void __attribute__ ((unused, noinline)) +elf_get_dynamic_info (struct rtld_global * g, long * dyn) +{ + long **info = g->p; + + info[(0x6ffffeff - *dyn) + 66] = dyn; +} + +void __attribute__ ((unused, noinline)) +_dl_start (long * dyn) +{ + elf_get_dynamic_info(&_rtld_local, dyn); +} -- 2.6.2
