aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorAndreas Krebbel <Andreas.Krebbel@de.ibm.com>2011-03-04 20:47:11 +0000
committerAndreas Krebbel <krebbel@gcc.gnu.org>2011-03-04 20:47:11 +0000
commitbc6ce33429e1ab0818366de28189d7b17900d46a (patch)
tree071f3c965c7ee30a7905be74fa3ae7c2ce82face /gcc
parent78a8b16bad41d3d358ea1fe9e5c44d9270a377bf (diff)
downloadgcc-bc6ce33429e1ab0818366de28189d7b17900d46a.zip
gcc-bc6ce33429e1ab0818366de28189d7b17900d46a.tar.gz
gcc-bc6ce33429e1ab0818366de28189d7b17900d46a.tar.bz2
s390.c (s390_decompose_address): Reject non-literal pool references in UNSPEC_LTREL_OFFSET.
2011-03-04 Andreas Krebbel <Andreas.Krebbel@de.ibm.com> * config/s390/s390.c (s390_decompose_address): Reject non-literal pool references in UNSPEC_LTREL_OFFSET. From-SVN: r170685
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog5
-rw-r--r--gcc/config/s390/s390.c10
2 files changed, 15 insertions, 0 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 6b8dc64..76a2bd2 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,8 @@
+2011-03-04 Andreas Krebbel <Andreas.Krebbel@de.ibm.com>
+
+ * config/s390/s390.c (s390_decompose_address): Reject non-literal
+ pool references in UNSPEC_LTREL_OFFSET.
+
2011-03-04 Jan Hubicka <jh@suse.cz>
PR lto/47497
diff --git a/gcc/config/s390/s390.c b/gcc/config/s390/s390.c
index f43b376..3e6edb7 100644
--- a/gcc/config/s390/s390.c
+++ b/gcc/config/s390/s390.c
@@ -2065,6 +2065,16 @@ s390_decompose_address (rtx addr, struct s390_address *out)
else if (GET_CODE (disp) == UNSPEC
&& XINT (disp, 1) == UNSPEC_LTREL_OFFSET)
{
+ /* In case CSE pulled a non literal pool reference out of
+ the pool we have to reject the address. This is
+ especially important when loading the GOT pointer on non
+ zarch CPUs. In this case the literal pool contains an lt
+ relative offset to the _GLOBAL_OFFSET_TABLE_ label which
+ will most likely exceed the displacement. */
+ if (GET_CODE (XVECEXP (disp, 0, 0)) != SYMBOL_REF
+ || !CONSTANT_POOL_ADDRESS_P (XVECEXP (disp, 0, 0)))
+ return false;
+
orig_disp = gen_rtx_CONST (Pmode, disp);
if (offset)
{