aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMichael Meissner <meissner@cygnus.com>1998-03-16 15:35:24 +0000
committerMichael Meissner <meissner@gcc.gnu.org>1998-03-16 15:35:24 +0000
commitdbf55e5349e10486b12221c9dad95e6bcfbca0ed (patch)
treeb0da91d7b2ad7db01fe32552fbf20f3df30f1b98
parente29ef9202e54f4572c345540e4de17b2b9ff19e1 (diff)
downloadgcc-dbf55e5349e10486b12221c9dad95e6bcfbca0ed.zip
gcc-dbf55e5349e10486b12221c9dad95e6bcfbca0ed.tar.gz
gcc-dbf55e5349e10486b12221c9dad95e6bcfbca0ed.tar.bz2
Ensure sum from SDA is 16-bit
From-SVN: r18631
-rw-r--r--gcc/ChangeLog4
-rw-r--r--gcc/config/rs6000/rs6000.c13
2 files changed, 16 insertions, 1 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 7017ba0..4ffc5e4 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -3,6 +3,10 @@ Mon Mar 16 15:57:17 1998 Michael Meissner <meissner@cygnus.com>
* gcc.c (default_arg): Don't wander off the end of allocated
memory.
+ (From Geoffrey Keating <geoffk@ozemail.com.au>)
+ * rs6000.c (small_data_operand): Ensure that any address
+ referenced relative to the small data area is inside the SDA.
+
Mon Mar 16 12:55:15 1998 Jim Wilson <wilson@cygnus.com>
* config/m68k/netbsd.h (ASM_SPEC): Add %{m68060}.
diff --git a/gcc/config/rs6000/rs6000.c b/gcc/config/rs6000/rs6000.c
index 8b7f340..aa80812 100644
--- a/gcc/config/rs6000/rs6000.c
+++ b/gcc/config/rs6000/rs6000.c
@@ -1080,7 +1080,18 @@ small_data_operand (op, mode)
return 0;
else
- sym_ref = XEXP (XEXP (op, 0), 0);
+ {
+ rtx sum = XEXP (op, 0);
+ HOST_WIDE_INT summand;
+
+ /* We have to be careful here, because it is the referenced address
+ that must be 32k from _SDA_BASE_, not just the symbol. */
+ summand = INTVAL (XEXP (sum, 1));
+ if (summand < 0 || summand > g_switch_value)
+ return 0;
+
+ sym_ref = XEXP (sum, 0);
+ }
if (*XSTR (sym_ref, 0) != '@')
return 0;