aboutsummaryrefslogtreecommitdiff
path: root/gcc/config/pa
diff options
context:
space:
mode:
authorJohn David Anglin <dave.anglin@nrc-cnrc.gc.ca>2007-12-21 23:37:07 +0000
committerJohn David Anglin <danglin@gcc.gnu.org>2007-12-21 23:37:07 +0000
commit7813231b94b7bc1f95e309be840f1025f29d1d4a (patch)
tree727113008fa80c7445d73efff5a2d9df897d2185 /gcc/config/pa
parentb721df48de315f97bfe6b225e83426e2cb040c5d (diff)
downloadgcc-7813231b94b7bc1f95e309be840f1025f29d1d4a.zip
gcc-7813231b94b7bc1f95e309be840f1025f29d1d4a.tar.gz
gcc-7813231b94b7bc1f95e309be840f1025f29d1d4a.tar.bz2
re PR target/34525 (ICE in extract_insn, at recog.c:1990 on hppa)
PR target/34525 * pa.c (legitimize_pic_address): Emit insn to load function label forced to memory. From-SVN: r131126
Diffstat (limited to 'gcc/config/pa')
-rw-r--r--gcc/config/pa/pa.c38
1 files changed, 28 insertions, 10 deletions
diff --git a/gcc/config/pa/pa.c b/gcc/config/pa/pa.c
index 46ecbc1..fce53fe 100644
--- a/gcc/config/pa/pa.c
+++ b/gcc/config/pa/pa.c
@@ -694,19 +694,37 @@ legitimize_pic_address (rtx orig, enum machine_mode mode, rtx reg)
tmp_reg = ((reload_in_progress || reload_completed)
? reg : gen_reg_rtx (Pmode));
- /* Force function labels into memory. */
if (function_label_operand (orig, mode))
- orig = force_const_mem (mode, orig);
-
- emit_move_insn (tmp_reg,
- gen_rtx_PLUS (word_mode, pic_offset_table_rtx,
- gen_rtx_HIGH (word_mode, orig)));
- pic_ref
- = gen_const_mem (Pmode,
- gen_rtx_LO_SUM (Pmode, tmp_reg,
- gen_rtx_UNSPEC (Pmode,
+ {
+ /* Force function label into memory. */
+ orig = XEXP (force_const_mem (mode, orig), 0);
+ /* Load plabel address from DLT. */
+ emit_move_insn (tmp_reg,
+ gen_rtx_PLUS (word_mode, pic_offset_table_rtx,
+ gen_rtx_HIGH (word_mode, orig)));
+ pic_ref
+ = gen_const_mem (Pmode,
+ gen_rtx_LO_SUM (Pmode, tmp_reg,
+ gen_rtx_UNSPEC (Pmode,
gen_rtvec (1, orig),
UNSPEC_DLTIND14R)));
+ emit_move_insn (reg, pic_ref);
+ /* Now load address of function descriptor. */
+ pic_ref = gen_rtx_MEM (Pmode, reg);
+ }
+ else
+ {
+ /* Load symbol reference from DLT. */
+ emit_move_insn (tmp_reg,
+ gen_rtx_PLUS (word_mode, pic_offset_table_rtx,
+ gen_rtx_HIGH (word_mode, orig)));
+ pic_ref
+ = gen_const_mem (Pmode,
+ gen_rtx_LO_SUM (Pmode, tmp_reg,
+ gen_rtx_UNSPEC (Pmode,
+ gen_rtvec (1, orig),
+ UNSPEC_DLTIND14R)));
+ }
current_function_uses_pic_offset_table = 1;
mark_reg_pointer (reg, BITS_PER_UNIT);