aboutsummaryrefslogtreecommitdiff
path: root/gcc/config
diff options
context:
space:
mode:
authorJohn David Anglin <danglin@gcc.gnu.org>2020-01-01 22:57:54 +0000
committerJohn David Anglin <danglin@gcc.gnu.org>2020-01-01 22:57:54 +0000
commit5b15f31ae8263268f140f0ffaf214df88b36ecbc (patch)
treee2578fcc5d721b44b1d4c390473503dfadfc5ee0 /gcc/config
parentb31f1b64ab243b3c5879479577583b813672892d (diff)
downloadgcc-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.c21
-rw-r--r--gcc/config/pa/pa32-linux.h5
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