aboutsummaryrefslogtreecommitdiff
path: root/gcc/config/pa
diff options
context:
space:
mode:
authorJohn David Anglin <danglin@gcc.gnu.org>2018-07-29 15:50:13 +0000
committerJohn David Anglin <danglin@gcc.gnu.org>2018-07-29 15:50:13 +0000
commit4c2272b97ae49a358e745cefdfcecb04dec9ca8c (patch)
tree77ba75683e4187906ad8053b90356d667b2ecec1 /gcc/config/pa
parentbcce673f60ef4993c19883366ea8dede78a7e0cf (diff)
* config/pa/pa.c (pa_output_addr_vec): Align address table.
* config/pa/pa.h (JUMP_TABLES_IN_TEXT_SECTION): Revise comment. * config/pa/pa32-linux.h (JUMP_TABLES_IN_TEXT_SECTION): Define. git-svn-id: https://gcc.gnu.org/svn/gcc/trunk@263051 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc/config/pa')
-rw-r--r--gcc/config/pa/pa.c2
-rw-r--r--gcc/config/pa/pa.h22
-rw-r--r--gcc/config/pa/pa32-linux.h9
3 files changed, 23 insertions, 10 deletions
diff --git a/gcc/config/pa/pa.c b/gcc/config/pa/pa.c
index a32921a779d..715700e2d1d 100644
--- a/gcc/config/pa/pa.c
+++ b/gcc/config/pa/pa.c
@@ -10680,6 +10680,8 @@ pa_output_addr_vec (rtx lab, rtx body)
{
int idx, vlen = XVECLEN (body, 0);
+ if (!TARGET_SOM)
+ fputs ("\t.align 4\n", asm_out_file);
targetm.asm_out.internal_label (asm_out_file, "L", CODE_LABEL_NUMBER (lab));
if (TARGET_GAS)
fputs ("\t.begin_brtab\n", asm_out_file);
diff --git a/gcc/config/pa/pa.h b/gcc/config/pa/pa.h
index 024e7b831ec..a121e2016c4 100644
--- a/gcc/config/pa/pa.h
+++ b/gcc/config/pa/pa.h
@@ -1143,21 +1143,23 @@ do { \
#define ASM_OUTPUT_ASCII(FILE, P, SIZE) \
pa_output_ascii ((FILE), (P), (SIZE))
-/* Jump tables are always placed in the text section. Technically, it
- is possible to put them in the readonly data section. This has the
- benefit of getting the table out of .text and reducing branch lengths
- as a result.
+/* Jump tables are always placed in the text section. We have to do
+ this for the HP-UX SOM target as we can't switch sections in the
+ middle of a function.
- The downside is that an additional insn (addil) is needed to access
+ On ELF targets, it is possible to put them in the readonly-data section.
+ This would get the table out of .text and reduce branch lengths.
+
+ A downside is that an additional insn (addil) is needed to access
the table when generating PIC code. The address difference table
- also has to use 32-bit pc-relative relocations. Currently, GAS does
- not support these relocations, although it is easily modified to do
- this operation.
+ also has to use 32-bit pc-relative relocations.
The table entries need to look like "$L1+(.+8-$L0)-$PIC_pcrel$0"
when using ELF GAS. A simple difference can be used when using
- SOM GAS or the HP assembler. The final downside is GDB complains
- about the nesting of the label for the table when debugging. */
+ the HP assembler.
+
+ The final downside is GDB complains about the nesting of the label
+ for the table. */
#define JUMP_TABLES_IN_TEXT_SECTION 1
diff --git a/gcc/config/pa/pa32-linux.h b/gcc/config/pa/pa32-linux.h
index ffcd1c6f17c..4b470447f19 100644
--- a/gcc/config/pa/pa32-linux.h
+++ b/gcc/config/pa/pa32-linux.h
@@ -67,3 +67,12 @@ call_ ## FUNC (void) \
layout compatibility with the original linux thread implementation. */
#undef MALLOC_ABI_ALIGNMENT
#define MALLOC_ABI_ALIGNMENT 128
+
+/* Place jump tables in the text section except when generating non-PIC
+ code. When generating non-PIC code, the relocations needed to load the
+ address of the jump table result in a text label in the final executable
+ if the jump table is placed in the text section. This breaks the unwind
+ data for the function. Thus, the jump table needs to be placed in
+ rodata when generating non-PIC code. */
+#undef JUMP_TABLES_IN_TEXT_SECTION
+#define JUMP_TABLES_IN_TEXT_SECTION (flag_pic)