]> gcc.gnu.org Git - gcc.git/commitdiff
vms.h (SUBTARGET_OVERRIDE_OPTIONS): For pic code, unset flag_jump_tables.
authorSteven Bosscher <steven@gcc.gnu.org>
Wed, 2 May 2012 22:18:11 +0000 (22:18 +0000)
committerSteven Bosscher <steven@gcc.gnu.org>
Wed, 2 May 2012 22:18:11 +0000 (22:18 +0000)
* config/alpha/vms.h (SUBTARGET_OVERRIDE_OPTIONS): For pic code,
unset flag_jump_tables.
* stmt.c (expand_case): Remove special flag_pic case conditional
on ASM_OUTPUT_ADDR_DIFF_ELT not being defined.

From-SVN: r187065

gcc/ChangeLog
gcc/config/alpha/vms.h
gcc/stmt.c

index 4d945c4e1f6238ef3cecb88c40c880e6199fb486..a72cd97dc795bf4449ac381b2473947dd64ba95a 100644 (file)
@@ -1,3 +1,10 @@
+2012-05-02  Steven Bosscher  <steven@gcc.gnu.org>
+
+       * config/alpha/vms.h (SUBTARGET_OVERRIDE_OPTIONS): For pic code,
+       unset flag_jump_tables.
+       * stmt.c (expand_case): Remove special flag_pic case conditional
+       on ASM_OUTPUT_ADDR_DIFF_ELT not being defined.
+
 2012-05-02  Ulrich Weigand  <ulrich.weigand@linaro.org>
 
        * common/config/s390/s390-common.c (s390_option_optimization_table):
index 8caec548ef851a96337f52e824de8d90f1dacadc..73e45a5f85c18bb273d7db278aff9d2a1de1566a 100644 (file)
@@ -257,7 +257,15 @@ typedef struct {int num_args; enum avms_arg_type atypes[6];} avms_arg_info;
 #undef ASM_FINAL_SPEC
 
 /* The VMS convention is to always provide minimal debug info
-   for a traceback unless specifically overridden.  */
+   for a traceback unless specifically overridden.
+
+   Because ASM_OUTPUT_ADDR_DIFF_ELT is not defined for alpha-vms,
+   jump tables cannot be output for PIC code, because you can't put
+   an absolute address in a readonly section.  Putting the table in
+   a writable section is a security hole.  Therefore, we unset the
+   flag_jump_tables flag, forcing switch statements to be expanded
+   using decision trees.  There are probably other ways to address
+   this issue, but using a decision tree is clearly safe.  */
 
 #undef SUBTARGET_OVERRIDE_OPTIONS
 #define SUBTARGET_OVERRIDE_OPTIONS                  \
@@ -268,6 +276,8 @@ do {                                                \
       write_symbols = VMS_DEBUG;                    \
       debug_info_level = DINFO_LEVEL_TERSE;         \
     }                                               \
+  if (flag_pic)                                     \
+    flag_jump_tables = 0;                           \
 } while (0)
 
 #undef LINK_SPEC
index 8f7b1506eef168a701185360ea92a3d7c36d717d..dd34890d46215679ccf3ac10f31960da1129a3b1 100644 (file)
@@ -2198,9 +2198,6 @@ expand_case (gimple stmt)
               /* RANGE may be signed, and really large ranges will show up
                  as negative numbers.  */
               || compare_tree_int (range, 0) < 0
-#ifndef ASM_OUTPUT_ADDR_DIFF_ELT
-              || flag_pic
-#endif
               || !flag_jump_tables
               || TREE_CONSTANT (index_expr)
               /* If neither casesi or tablejump is available, we can
This page took 0.077046 seconds and 5 git commands to generate.