diff options
author | John David Anglin <danglin@gcc.gnu.org> | 2020-01-01 22:57:54 +0000 |
---|---|---|
committer | John David Anglin <danglin@gcc.gnu.org> | 2020-01-01 22:57:54 +0000 |
commit | 5b15f31ae8263268f140f0ffaf214df88b36ecbc (patch) | |
tree | e2578fcc5d721b44b1d4c390473503dfadfc5ee0 /gcc/config | |
parent | b31f1b64ab243b3c5879479577583b813672892d (diff) | |
download | gcc-5b15f31ae8263268f140f0ffaf214df88b36ecbc.zip gcc-5b15f31ae8263268f140f0ffaf214df88b36ecbc.tar.gz gcc-5b15f31ae8263268f140f0ffaf214df88b36ecbc.tar.bz2 |
re PR target/67834 (Local references inside comdat groups)
PR target/67834
* config/pa/pa.c (pa_elf_select_rtx_section): New. Put references to
COMDAT group function labels in .data.rel.ro.local section.
* config/pa/pa32-linux.h (TARGET_ASM_SELECT_RTX_SECTION): Define.
From-SVN: r279823
Diffstat (limited to 'gcc/config')
-rw-r--r-- | gcc/config/pa/pa.c | 21 | ||||
-rw-r--r-- | gcc/config/pa/pa32-linux.h | 5 |
2 files changed, 26 insertions, 0 deletions
diff --git a/gcc/config/pa/pa.c b/gcc/config/pa/pa.c index 07051d4..fb7e2ee 100644 --- a/gcc/config/pa/pa.c +++ b/gcc/config/pa/pa.c @@ -203,6 +203,7 @@ static bool pa_hard_regno_mode_ok (unsigned int, machine_mode); static bool pa_modes_tieable_p (machine_mode, machine_mode); static bool pa_can_change_mode_class (machine_mode, machine_mode, reg_class_t); static HOST_WIDE_INT pa_starting_frame_offset (void); +static section* pa_elf_select_rtx_section(machine_mode, rtx, unsigned HOST_WIDE_INT) ATTRIBUTE_UNUSED; /* The following extra sections are only used for SOM. */ static GTY(()) section *som_readonly_data_section; @@ -9838,6 +9839,26 @@ pa_select_section (tree exp, int reloc, return data_section; } +/* Implement pa_elf_select_rtx_section. If X is a function label operand + and the function is in a COMDAT group, place the plabel reference in the + .data.rel.ro.local section. The linker ignores references to symbols in + discarded sections from this section. */ + +static section * +pa_elf_select_rtx_section (machine_mode mode, rtx x, + unsigned HOST_WIDE_INT align) +{ + if (function_label_operand (x, VOIDmode)) + { + tree decl = SYMBOL_REF_DECL (x); + + if (DECL_P (decl) && DECL_COMDAT_GROUP (decl)) + return get_named_section (NULL, ".data.rel.ro.local", 1); + } + + return default_elf_select_rtx_section (mode, x, align); +} + /* Implement pa_reloc_rw_mask. */ static int diff --git a/gcc/config/pa/pa32-linux.h b/gcc/config/pa/pa32-linux.h index ea6fd6c..f271bbf 100644 --- a/gcc/config/pa/pa32-linux.h +++ b/gcc/config/pa/pa32-linux.h @@ -76,3 +76,8 @@ call_ ## FUNC (void) \ rodata when generating non-PIC code. */ #undef JUMP_TABLES_IN_TEXT_SECTION #define JUMP_TABLES_IN_TEXT_SECTION (flag_pic) + +/* We need to override default selection to put references to functions + in COMDAT groups in .data.rel.ro.local. */ +#undef TARGET_ASM_SELECT_RTX_SECTION +#define TARGET_ASM_SELECT_RTX_SECTION pa_elf_select_rtx_section |