]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
re PR target/34525 (ICE in extract_insn, at recog.c:1990 on hppa)
authorJohn David Anglin <dave.anglin@nrc-cnrc.gc.ca>
Fri, 21 Dec 2007 23:37:07 +0000 (23:37 +0000)
committerJohn David Anglin <danglin@gcc.gnu.org>
Fri, 21 Dec 2007 23:37:07 +0000 (23:37 +0000)
PR target/34525
* pa.c (legitimize_pic_address): Emit insn to load function label
forced to memory.

From-SVN: r131126

gcc/ChangeLog
gcc/config/pa/pa.c

index 6f257a97879516e34c5ead269c3131418f567268..b9ea66f240d62c65b8214f03063bf08d5a9ff023 100644 (file)
@@ -1,3 +1,9 @@
+2007-12-21  John David Anglin  <dave.anglin@nrc-cnrc.gc.ca>
+
+       PR target/34525
+       * pa.c (legitimize_pic_address): Emit insn to load function label
+       forced to memory.
+
 2007-12-21  Andrew Pinski  <pinskia@gmail.com>
        Rask Ingemann Lambertsen  <rask@sygehus.dk>
 
index 46ecbc1a1dfe16bd1e771e5b51d5e92fb5b8a09a..fce53fe62093208ad9960fb546e8b3a89d228d03 100644 (file)
@@ -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);