mirror of git://gcc.gnu.org/git/gcc.git
vms.h (SUBTARGET_OVERRIDE_OPTIONS): For pic code, unset flag_jump_tables.
* 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
This commit is contained in:
parent
aefa216b7e
commit
daccad6dd9
|
@ -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>
|
2012-05-02 Ulrich Weigand <ulrich.weigand@linaro.org>
|
||||||
|
|
||||||
* common/config/s390/s390-common.c (s390_option_optimization_table):
|
* common/config/s390/s390-common.c (s390_option_optimization_table):
|
||||||
|
|
|
@ -257,7 +257,15 @@ typedef struct {int num_args; enum avms_arg_type atypes[6];} avms_arg_info;
|
||||||
#undef ASM_FINAL_SPEC
|
#undef ASM_FINAL_SPEC
|
||||||
|
|
||||||
/* The VMS convention is to always provide minimal debug info
|
/* 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
|
#undef SUBTARGET_OVERRIDE_OPTIONS
|
||||||
#define SUBTARGET_OVERRIDE_OPTIONS \
|
#define SUBTARGET_OVERRIDE_OPTIONS \
|
||||||
|
@ -268,6 +276,8 @@ do { \
|
||||||
write_symbols = VMS_DEBUG; \
|
write_symbols = VMS_DEBUG; \
|
||||||
debug_info_level = DINFO_LEVEL_TERSE; \
|
debug_info_level = DINFO_LEVEL_TERSE; \
|
||||||
} \
|
} \
|
||||||
|
if (flag_pic) \
|
||||||
|
flag_jump_tables = 0; \
|
||||||
} while (0)
|
} while (0)
|
||||||
|
|
||||||
#undef LINK_SPEC
|
#undef LINK_SPEC
|
||||||
|
|
|
@ -2198,9 +2198,6 @@ expand_case (gimple stmt)
|
||||||
/* RANGE may be signed, and really large ranges will show up
|
/* RANGE may be signed, and really large ranges will show up
|
||||||
as negative numbers. */
|
as negative numbers. */
|
||||||
|| compare_tree_int (range, 0) < 0
|
|| compare_tree_int (range, 0) < 0
|
||||||
#ifndef ASM_OUTPUT_ADDR_DIFF_ELT
|
|
||||||
|| flag_pic
|
|
||||||
#endif
|
|
||||||
|| !flag_jump_tables
|
|| !flag_jump_tables
|
||||||
|| TREE_CONSTANT (index_expr)
|
|| TREE_CONSTANT (index_expr)
|
||||||
/* If neither casesi or tablejump is available, we can
|
/* If neither casesi or tablejump is available, we can
|
||||||
|
|
Loading…
Reference in New Issue