pa.c (pa_init_machine_status, [...]): Delete.
authorJohn David Anglin <dave@hiauly1.hia.nrc.ca>
Mon, 9 Jul 2001 22:55:21 +0000 (22:55 +0000)
committerJohn David Anglin <danglin@gcc.gnu.org>
Mon, 9 Jul 2001 22:55:21 +0000 (22:55 +0000)
* pa.c (pa_init_machine_status, pa_mark_machine_status,
pa_free_machine_status, hppa_init_pic_save): Delete.
(hppa_pic_save_rtx): New.  Use get_hard_reg_initial_val.
(hppa_profile_hook): Use hppa_pic_save_rtx.
* pa.h (struct machine_function, PIC_OFFSET_TABLE_SAVE_RTX,
hppa_init_pic_save): Delete.
(hppa_pic_save_rtx): Declare.
* pa.md (call, call_value, sibcall, sibcall_value,
builtin_setjmp_receiver): Use hppa_pic_save_rtx.

From-SVN: r43883

gcc/ChangeLog
gcc/config/pa/pa.c
gcc/config/pa/pa.h
gcc/config/pa/pa.md

index 62516014b805094fa8e1a1228783172f2195c450..cd1ac54fd1dc74c5c22be2d233322e4c44fb2ccc 100644 (file)
@@ -1,3 +1,15 @@
+2001-07-09  John David Anglin  <dave@hiauly1.hia.nrc.ca>
+
+       * pa.c (pa_init_machine_status, pa_mark_machine_status,
+       pa_free_machine_status, hppa_init_pic_save): Delete.
+       (hppa_pic_save_rtx): New.  Use get_hard_reg_initial_val.
+       (hppa_profile_hook): Use hppa_pic_save_rtx.
+       * pa.h (struct machine_function, PIC_OFFSET_TABLE_SAVE_RTX,
+       hppa_init_pic_save): Delete.
+       (hppa_pic_save_rtx): Declare.
+       * pa.md (call, call_value, sibcall, sibcall_value,
+       builtin_setjmp_receiver): Use hppa_pic_save_rtx.
+
 2001-07-09  Kazu Hirata  <kazu@hxi.com>
 
        * config/h8300/t-h8300 (LIB1ASMFUNCS): Add _floatdisf and _fixsfdi.
index 36aad1b5b7a33473229bbb94ed764516dcd3b4bf..05de6dd7eddf7772ec60c7540478b1872685da00 100644 (file)
@@ -35,6 +35,7 @@ Boston, MA 02111-1307, USA.  */
 #include "reload.h"
 #include "expr.h"
 #include "c-tree.h"
+#include "integrate.h"
 #include "function.h"
 #include "obstack.h"
 #include "toplev.h"
@@ -52,9 +53,6 @@ Boston, MA 02111-1307, USA.  */
 #endif
 #endif
 
-static void pa_init_machine_status PARAMS ((struct function *));
-static void pa_mark_machine_status PARAMS ((struct function *));
-static void pa_free_machine_status PARAMS ((struct function *));
 static inline rtx force_mode PARAMS ((enum machine_mode, rtx));
 static void pa_combine_instructions PARAMS ((rtx));
 static int pa_can_combine_p PARAMS ((rtx, rtx, rtx, int, rtx, rtx, rtx));
@@ -202,46 +200,8 @@ override_options ()
 
   /* Register global variables with the garbage collector.  */
   pa_add_gc_roots ();
-
-  /* Arrange to save and restore machine status around nested functions.  */
-  init_machine_status = pa_init_machine_status;
-  mark_machine_status = pa_mark_machine_status;
-  free_machine_status = pa_free_machine_status;
-}
-
-/* Functions to initialize pic_offset_table_save_rtx.
-   These will be called, via pointer variables,
-   from push_function_context and pop_function_context.  */
-
-static void
-pa_init_machine_status (p)
-     struct function *p;
-{
-  p->machine = (machine_function *) xmalloc (sizeof (machine_function));
-
-  p->machine->pic_offset_table_save_rtx = NULL_RTX;
-}
-
-static void
-pa_mark_machine_status (p)
-     struct function *p;
-{
-  if (p->machine)
-    ggc_mark_rtx (p->machine->pic_offset_table_save_rtx);
-}
-
-static void
-pa_free_machine_status (p)
-     struct function *p;
-{
-  if (p->machine == NULL)
-    return;
-
-  free (p->machine);
-  p->machine = NULL;
 }
 
-
 /* Return non-zero only if OP is a register of mode MODE,
    or CONST0_RTX.  */
 int
@@ -3397,23 +3357,10 @@ hppa_expand_epilogue ()
     FRP (load_reg (2, ret_off, STACK_POINTER_REGNUM));
 }
 
-/* Set up a callee saved register for the pic offset table register.  */
-void
-hppa_init_pic_save ()
+rtx
+hppa_pic_save_rtx ()
 {
-  rtx insn, picreg;
-
-  picreg = gen_rtx_REG (word_mode, PIC_OFFSET_TABLE_REGNUM);
-  PIC_OFFSET_TABLE_SAVE_RTX = gen_reg_rtx (Pmode);
-  RTX_UNCHANGING_P (PIC_OFFSET_TABLE_SAVE_RTX) = 1;
-  insn = gen_rtx_SET (VOIDmode, PIC_OFFSET_TABLE_SAVE_RTX, picreg);
-
-  /* Emit the insn at the beginning of the function after the prologue.  */
-  if (tail_recursion_reentry)
-    emit_insn_before (insn, tail_recursion_reentry);
-  else
-    /* We must have been called via PROFILE_HOOK.  */
-    emit_insn (insn);
+  return get_hard_reg_initial_val (word_mode, PIC_OFFSET_TABLE_REGNUM);
 }
 
 void
@@ -3434,9 +3381,6 @@ hppa_profile_hook (label_no)
                    gen_rtx_PLUS (word_mode, virtual_outgoing_args_rtx,
                                  GEN_INT (64)));
 
-  if (flag_pic && PIC_OFFSET_TABLE_SAVE_RTX == NULL_RTX)
-    hppa_init_pic_save ();
-
   emit_move_insn (gen_rtx_REG (word_mode, 26), gen_rtx_REG (word_mode, 2));
 
 #ifndef NO_PROFILE_COUNTERS
@@ -3495,7 +3439,7 @@ hppa_profile_hook (label_no)
       if (TARGET_64BIT)
        use_reg (&CALL_INSN_FUNCTION_USAGE (call_insn), arg_pointer_rtx);
 
-      emit_move_insn (pic_offset_table_rtx, PIC_OFFSET_TABLE_SAVE_RTX);
+      emit_move_insn (pic_offset_table_rtx, hppa_pic_save_rtx ());
     }
 }
 
index 28b496d885a3770a1bdeb04a38b2dc906e0423be..09d4e14bf8598e0eb5735be627b8355ba121df80 100644 (file)
@@ -71,12 +71,6 @@ enum architecture_type
 };
 
 struct rtx_def;
-/* A C structure for machine-specific, per-function data.
-   This is added to the cfun structure.  */
-typedef struct machine_function
-{
-  struct rtx_def *pic_offset_table_save_rtx;
-} machine_function;
 
 /* For -march= option.  */
 extern const char *pa_arch_string;
@@ -517,10 +511,9 @@ extern int target_flags;
 #define PIC_OFFSET_TABLE_REGNUM (TARGET_64BIT ? 27 : 19)
 #define PIC_OFFSET_TABLE_REG_CALL_CLOBBERED 1
 
-/* Register into which we save the PIC_OFFSET_TABLE_REGNUM so that it
-   can be restored across function calls.  */
-#define PIC_OFFSET_TABLE_SAVE_RTX (cfun->machine->pic_offset_table_save_rtx)
-extern void hppa_init_pic_save PARAMS ((void));
+/* Function to return the rtx used to save the pic offset table register
+   across function calls.  */
+extern struct rtx_def *hppa_pic_save_rtx PARAMS ((void));
 
 #define DEFAULT_PCC_STRUCT_RETURN 0
 
index 59b4c766fa292021de1fdb6a0263c67119e9d324..3e2efad05272a0cbb4784d2ccdb57184937c40be 100644 (file)
                    gen_rtx_PLUS (word_mode, virtual_outgoing_args_rtx,
                                  GEN_INT (64)));
 
-  if (flag_pic && PIC_OFFSET_TABLE_SAVE_RTX == NULL_RTX)
-    hppa_init_pic_save ();
-
   /* Use two different patterns for calls to explicitly named functions
      and calls through function pointers.  This is necessary as these two
      types of calls use different calling conventions, and CSE might try
 
       /* After each call we must restore the PIC register, even if it
         doesn't appear to be used.  */
-      emit_move_insn (pic_offset_table_rtx, PIC_OFFSET_TABLE_SAVE_RTX);
+      emit_move_insn (pic_offset_table_rtx, hppa_pic_save_rtx ());
     }
   DONE;
 }")
                    gen_rtx_PLUS (word_mode, virtual_outgoing_args_rtx,
                                  GEN_INT (64)));
 
-  if (flag_pic && PIC_OFFSET_TABLE_SAVE_RTX == NULL_RTX)
-    hppa_init_pic_save ();
-
   /* Use two different patterns for calls to explicitly named functions
      and calls through function pointers.  This is necessary as these two
      types of calls use different calling conventions, and CSE might try
 
       /* After each call we must restore the PIC register, even if it
         doesn't appear to be used.  */
-      emit_move_insn (pic_offset_table_rtx, PIC_OFFSET_TABLE_SAVE_RTX);
+      emit_move_insn (pic_offset_table_rtx, hppa_pic_save_rtx ());
     }
   DONE;
 }")
 
   op = XEXP (operands[0], 0);
 
-  if (flag_pic && PIC_OFFSET_TABLE_SAVE_RTX == NULL_RTX)
-    hppa_init_pic_save ();
-
   /* We do not allow indirect sibling calls.  */
   call_insn = emit_call_insn (gen_sibcall_internal_symref (op, operands[1]));
 
 
       /* After each call we must restore the PIC register, even if it
         doesn't appear to be used.  */
-      emit_move_insn (pic_offset_table_rtx, PIC_OFFSET_TABLE_SAVE_RTX);
+      emit_move_insn (pic_offset_table_rtx, hppa_pic_save_rtx ());
     }
   DONE;
 }")
 
   op = XEXP (operands[1], 0);
 
-  if (flag_pic && PIC_OFFSET_TABLE_SAVE_RTX == NULL_RTX)
-    hppa_init_pic_save ();
-
   /* We do not allow indirect sibling calls.  */
   call_insn = emit_call_insn (gen_sibcall_value_internal_symref (operands[0],
                                                                 op,
 
       /* After each call we must restore the PIC register, even if it
         doesn't appear to be used.  */
-      emit_move_insn (pic_offset_table_rtx, PIC_OFFSET_TABLE_SAVE_RTX);
+      emit_move_insn (pic_offset_table_rtx, hppa_pic_save_rtx ());
     }
   DONE;
 }")
   "flag_pic"
   "
 {
-  if (PIC_OFFSET_TABLE_SAVE_RTX == NULL_RTX)
-    hppa_init_pic_save ();
-
   /* Restore the PIC register.  Hopefully, this will always be from
      a stack slot.  The only registers that are valid after a
      builtin_longjmp are the stack and frame pointers.  */
-  emit_move_insn (pic_offset_table_rtx, PIC_OFFSET_TABLE_SAVE_RTX);
+  emit_move_insn (pic_offset_table_rtx, hppa_pic_save_rtx ());
   DONE;
 }")