From d8b9a256e0d92ff9606b9b054f54eca2c7f7879c Mon Sep 17 00:00:00 2001 From: John David Anglin Date: Sun, 3 Jun 2012 12:41:02 +0000 Subject: [PATCH] re PR target/52999 (ICE, segmentation fault in c_tree_printer) PR target/52999 * config/pa/pa.c (TARGET_SECTION_TYPE_FLAGS): Define. (pa_section_type_flags): New. * config/pa/pa.h (LEGITIMATE_CONSTANT_P): Revert previous change. From-SVN: r188150 --- gcc/ChangeLog | 7 +++++++ gcc/config/pa/pa.c | 23 +++++++++++++++++++++++ gcc/config/pa/pa.h | 3 ++- 3 files changed, 32 insertions(+), 1 deletion(-) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 24a9a04c42cf..0fd9ac9ecf10 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,10 @@ +2012-06-03 John David Anglin + + PR target/52999 + * config/pa/pa.c (TARGET_SECTION_TYPE_FLAGS): Define. + (pa_section_type_flags): New. + * config/pa/pa.h (LEGITIMATE_CONSTANT_P): Revert previous change. + 2012-05-31 Richard Guenther PR middle-end/53541 diff --git a/gcc/config/pa/pa.c b/gcc/config/pa/pa.c index 5e5a0f05b797..6f67ca8ea345 100644 --- a/gcc/config/pa/pa.c +++ b/gcc/config/pa/pa.c @@ -185,6 +185,7 @@ static bool pa_can_eliminate (const int, const int); static void pa_conditional_register_usage (void); static enum machine_mode pa_c_mode_for_suffix (char); static section *pa_function_section (tree, enum node_frequency, bool, bool); +static unsigned int pa_section_type_flags (tree, const char *, int); /* The following extra sections are only used for SOM. */ static GTY(()) section *som_readonly_data_section; @@ -400,6 +401,9 @@ static const struct default_options pa_option_optimization_table[] = #undef TARGET_ASM_FUNCTION_SECTION #define TARGET_ASM_FUNCTION_SECTION pa_function_section +#undef TARGET_SECTION_TYPE_FLAGS +#define TARGET_SECTION_TYPE_FLAGS pa_section_type_flags + struct gcc_target targetm = TARGET_INITIALIZER; /* Parse the -mfixed-range= option string. */ @@ -10431,4 +10435,23 @@ pa_function_section (tree decl, enum node_frequency freq, return default_function_section (decl, freq, startup, exit); } +/* Implement TARGET_SECTION_TYPE_FLAGS. */ + +static unsigned int +pa_section_type_flags (tree decl, const char *name, int reloc) +{ + unsigned int flags; + + flags = default_section_type_flags (decl, name, reloc); + + /* Function labels are placed in the constant pool. This can + cause a section conflict if decls are put in ".data.rel.ro" + or ".data.rel.ro.local" using the __attribute__ construct. */ + if (strcmp (name, ".data.rel.ro") == 0 + || strcmp (name, ".data.rel.ro.local") == 0) + flags |= SECTION_WRITE | SECTION_RELRO; + + return flags; +} + #include "gt-pa.h" diff --git a/gcc/config/pa/pa.h b/gcc/config/pa/pa.h index 6c587941b5a8..012186854de5 100644 --- a/gcc/config/pa/pa.h +++ b/gcc/config/pa/pa.h @@ -859,7 +859,8 @@ extern int may_call_alloca; || reload_in_progress \ || reload_completed \ || LEGITIMATE_64BIT_CONST_INT_P (INTVAL (X)) \ - || cint_ok_for_move (INTVAL (X)))) + || cint_ok_for_move (INTVAL (X))) \ + && !function_label_operand (X, VOIDmode)) /* Target flags set on a symbol_ref. */ -- 2.47.2