]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
mips.c (mips_symbolic_constant_p): Don't allow out-of-bounds accesses to string const...
authorRichard Sandiford <rsandifo@redhat.com>
Sun, 11 Jan 2004 10:37:49 +0000 (10:37 +0000)
committerRichard Sandiford <rsandifo@gcc.gnu.org>
Sun, 11 Jan 2004 10:37:49 +0000 (10:37 +0000)
* config/mips/mips.c (mips_symbolic_constant_p): Don't allow
out-of-bounds accesses to string constants.  Simplify mips16
case accordingly.

From-SVN: r75670

gcc/ChangeLog
gcc/config/mips/mips.c

index aa363b4934520db6f8a3ef87d65a706351d4b7fd..6d23396e3e96f57426434fd71e23d8ffcfbcbe29 100644 (file)
@@ -1,3 +1,9 @@
+2004-01-11  Richard Sandiford  <rsandifo@redhat.com>
+
+       * config/mips/mips.c (mips_symbolic_constant_p): Don't allow
+       out-of-bounds accesses to string constants.  Simplify mips16
+       case accordingly.
+
 2004-01-11  Richard Sandiford  <rsandifo@redhat.com>
 
        PR optimization/13469
index 66bc05344fba78299169aaa95a14d6cedb90df5d..1e04fa7a9541517e1228ae5892dd698dd4b6b028 100644 (file)
@@ -902,6 +902,16 @@ mips_symbolic_constant_p (rtx x, enum mips_symbol_type *symbol_type)
   if (offset == 0)
     return true;
 
+  /* If X refers to a string constant, and that constant is put into a
+     mergeable section, the linker will need to know which string is
+     being accessed.  It has no way of distinguishing an out-of-bounds
+     access to X from an in-bounds access to a later or earlier string.  */
+  if (GET_CODE (x) == SYMBOL_REF
+      && SYMBOL_REF_DECL (x) != 0
+      && TREE_CODE (SYMBOL_REF_DECL (x)) == STRING_CST
+      && !(offset > 0 && offset < TREE_STRING_LENGTH (SYMBOL_REF_DECL (x))))
+    return false;
+
   /* Check whether a nonzero offset is valid for the underlying
      relocations.  */
   switch (*symbol_type)
@@ -917,11 +927,9 @@ mips_symbolic_constant_p (rtx x, enum mips_symbol_type *symbol_type)
       return (offset > 0 && offset < mips_section_threshold);
 
     case SYMBOL_CONSTANT_POOL:
-      /* Similarly check the range of offsets for mips16 constant
-        pool entries.  */
-      return (CONSTANT_POOL_ADDRESS_P (x)
-             && offset > 0
-             && offset < (int) GET_MODE_SIZE (get_pool_mode (x)));
+      /* We don't generate out-of-bounds accesses to normal constant
+        pool entries.  String constants were handled above.  */
+      return true;
 
     case SYMBOL_GOT_LOCAL:
     case SYMBOL_GOTOFF_PAGE: