m32r.h (RETURN_ADDR_RTX): Define.
authorKazuhiro Inaoka <inaoka.kazuhiro@renesas.com>
Tue, 15 Jun 2004 10:01:34 +0000 (10:01 +0000)
committerNick Clifton <nickc@gcc.gnu.org>
Tue, 15 Jun 2004 10:01:34 +0000 (10:01 +0000)
* config/m32r/m32r.h (RETURN_ADDR_RTX): Define.
  (INCOMING_RETURN_ADDR_RTX): Define.
* config/m32r/m32r-protos.h (m32r_return_addr): Added.
* config/m32r/m32r.c (m32r_exppand_prologue): Changed for
  __builtin_return_address(0).
  (m32r_return_addr): Added for __builtin_return_address(0).
  (m32r_reload_lr): Ditto.

From-SVN: r83171

gcc/ChangeLog
gcc/config/m32r/m32r-protos.h
gcc/config/m32r/m32r.c
gcc/config/m32r/m32r.h

index 5ae9715ade7590ecc7658ca33e5f8515c24beadd..e6038259986830db2a3e178e774d5f69365ff505 100644 (file)
@@ -1,3 +1,13 @@
+2004-06-15  Kazuhiro Inaoka  <inaoka.kazuhiro@renesas.com>
+
+       * config/m32r/m32r.h (RETURN_ADDR_RTX): Define.
+       (INCOMING_RETURN_ADDR_RTX): Define.
+       * config/m32r/m32r-protos.h (m32r_return_addr): Added.
+       * config/m32r/m32r.c (m32r_exppand_prologue): Changed for
+       __builtin_return_address(0).
+       (m32r_return_addr): Added for __builtin_return_address(0).
+       (m32r_reload_lr): Ditto.
+
 2004-06-15  Paolo Bonzini  <bonzini@gnu.org>
 
        * doc/install.texi (Prerequisites): Update libbanshee,
        * config/arm/t-xscale-elf: Disable iwmmxt multilibs until they can
        be safely built.
 
-2004-04-16  Kazuhiro Inaoka <inaoka dot kazuhiro at renesas dot com>
+2004-04-16  Kazuhiro Inaoka <inaoka.kazuhiro@renesas.com>
 
        * config/m32r/m32r.h (BIG_ENDIAN_BIT): Deleted to fix endian
        bug.
index 97247d63143dade797328dbe506d74f126982df2..4bc4c6c8ca71878d7531ba58dd413f26115a133c 100644 (file)
@@ -58,6 +58,7 @@ extern int    m32r_not_same_reg (rtx, rtx);
 extern int    m32r_hard_regno_rename_ok (unsigned int, unsigned int);
 extern int    m32r_legitimate_pic_operand_p (rtx);
 extern rtx    m32r_legitimize_pic_address (rtx, rtx);
+extern rtx    m32r_return_addr (int);
 
 #ifdef HAVE_MACHINE_MODES
 extern int    call_address_operand (rtx, Mmode);
index fa898bcd18985a8a4ffa549e23defd269d50ee40..6599dc64bbe267255bacc35e7e6cf5ecd88b7729 100644 (file)
@@ -1905,6 +1905,29 @@ m32r_compute_frame_size (int size)       /* # of var. bytes allocated.  */
 /* The table we use to reference PIC data.  */
 static rtx global_offset_table;
                                                                                 
+static void
+m32r_reload_lr (rtx sp, int size)
+{
+  rtx lr = gen_rtx_REG (Pmode, RETURN_ADDR_REGNUM);
+
+  if (size == 0)
+    emit_insn (gen_movsi (lr, gen_rtx_MEM (Pmode, sp)));
+  else if (size <= 32768)
+    emit_insn (gen_movsi (lr, gen_rtx_MEM (Pmode,
+                                          gen_rtx_PLUS (Pmode, sp,
+                                                        GEN_INT (size)))));
+  else
+    {   
+      rtx tmp = gen_rtx_REG (Pmode, PROLOGUE_TMP_REGNUM);
+
+      emit_insn (gen_movsi (tmp, GEN_INT (size)));
+      emit_insn (gen_addsi3 (tmp, tmp, sp));
+      emit_insn (gen_movsi (lr, gen_rtx_MEM (Pmode, tmp)));
+    }
+
+  emit_insn (gen_rtx_USE (VOIDmode, lr));
+}
+
 void
 m32r_load_pic_register (void)
 {
@@ -1993,7 +2016,11 @@ m32r_expand_prologue (void)
                                gen_rtx_REG (Pmode, RETURN_ADDR_REGNUM)));
                                                                                 
   if (pic_reg_used)
-    m32r_load_pic_register ();
+    {
+      m32r_load_pic_register ();
+      m32r_reload_lr (stack_pointer_rtx,
+                      (current_function_profile ? 0 : frame_size));
+    }
 
   if (current_function_profile && !pic_reg_used)
     emit_insn (gen_blockage ());
@@ -3052,3 +3079,12 @@ m32r_hard_regno_rename_ok (unsigned int old_reg ATTRIBUTE_UNUSED,
 
   return 1;
 }
+
+rtx
+m32r_return_addr (int count)
+{
+  if (count != 0)
+    return const0_rtx;
+  
+  return get_hard_reg_initial_val (Pmode, RETURN_ADDR_REGNUM);
+}
index 82b265b10652fb13a9eb69ab96af7922f4f6f087..c20b0424bb0178999cda52ddaa48103997fabe8e 100644 (file)
@@ -1265,6 +1265,10 @@ L2:     .word STATIC
 /* Generate calls to memcpy, memcmp and memset.  */
 #define TARGET_MEM_FUNCTIONS
 \f
+#define RETURN_ADDR_RTX(COUNT, FRAME) m32r_return_addr (COUNT)
+
+#define INCOMING_RETURN_ADDR_RTX   gen_rtx_REG (Pmode, RETURN_ADDR_REGNUM)
+
 /* Addressing modes, and classification of registers for them.  */
 
 /* Maximum number of registers that can appear in a valid memory address.  */