diff options
author | danglin <danglin@138bc75d-0d04-0410-961f-82ee72b054a4> | 2007-12-21 23:37:07 +0000 |
---|---|---|
committer | danglin <danglin@138bc75d-0d04-0410-961f-82ee72b054a4> | 2007-12-21 23:37:07 +0000 |
commit | 3635d96372e22388238ab8c53626c277662d436e (patch) | |
tree | 727113008fa80c7445d73efff5a2d9df897d2185 /gcc/config/pa | |
parent | eb04e5feaf0be3418ac575983ee80f25845c66e6 (diff) | |
download | gcc-3635d96372e22388238ab8c53626c277662d436e.tar.gz |
PR target/34525
* pa.c (legitimize_pic_address): Emit insn to load function label
forced to memory.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@131126 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc/config/pa')
-rw-r--r-- | gcc/config/pa/pa.c | 38 |
1 files changed, 28 insertions, 10 deletions
diff --git a/gcc/config/pa/pa.c b/gcc/config/pa/pa.c index 46ecbc1a1df..fce53fe6209 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); |