Account for FP registers saved to stack during prologue
authorNick Clifton <nickc@cambridge.redhat.com>
Fri, 31 Aug 2001 17:09:58 +0000 (17:09 +0000)
committerNick Clifton <nickc@gcc.gnu.org>
Fri, 31 Aug 2001 17:09:58 +0000 (17:09 +0000)
From-SVN: r45325

gcc/ChangeLog
gcc/config/arm/arm.c
gcc/config/arm/unknown-elf.h

index d3406b65c0be843f952fbf8b6f24c148d08c222d..34785e91c41bced16f1d5deef45d36521b23066d 100644 (file)
@@ -122,6 +122,18 @@ Thu Aug 30 10:21:43 2001  J"orn Rennecke <amylaar@redhat.com>
        * c-typeck.c (pointer_diff): Try to eliminate common term before
        doing conversions.
 
+2001-08-30  Nick Clifton  <nickc@cambridge.redhat.com>
+
+       * config/arm/arm.c (arm_compute_initial_elimination_offset):
+       Account for the saves of the FP registers.
+
+       * config/arm/unknown-elf.h (TEXT_SECTION): Delete.
+       (TEXT_SECTION_ASM_OP): Define.
+       (INIT_SECTION_ASM_OP): Define.
+       (FINI_SECTION_ASM_OP): Define.
+       (SUBTARGET_EXTRA_SECTIONS): Remove trailing comma.
+       (RDATA_SECTION_FUNCITON): Provide prototype.
+
 2001-08-29  Geoffrey Keating  <geoffk@redhat.com>
 
        * reload1.c (move2add_note_store): Correct typo checking for
index 825a46516d90039aba66ec732398f9d78df221df..c3f4e2eadefa3515974e97254cf6db1d01196a28 100644 (file)
@@ -7943,16 +7943,23 @@ arm_compute_initial_elimination_offset (from, to)
     {
       unsigned int reg;
 
+      /* In theory we should check all of the hard registers to
+        see if they will be saved onto the stack.  In practice
+        registers 11 upwards have special meanings and need to
+        be check individually.  */
       for (reg = 0; reg <= 10; reg ++)
        if (regs_ever_live[reg] && ! call_used_regs[reg])
          call_saved_registers += 4;
 
+      /* Determine if register 11 will be clobbered.  */
       if (! TARGET_APCS_FRAME
          && ! frame_pointer_needed
          && regs_ever_live[HARD_FRAME_POINTER_REGNUM]
          && ! call_used_regs[HARD_FRAME_POINTER_REGNUM])
        call_saved_registers += 4;
 
+      /* The PIC register is fixed, so if the function will
+        corrupt it, it has to be saved onto the stack.  */
       if (flag_pic && regs_ever_live[PIC_OFFSET_TABLE_REGNUM])
        call_saved_registers += 4;
 
@@ -7962,6 +7969,13 @@ arm_compute_initial_elimination_offset (from, to)
             for it here.  */
          && ! frame_pointer_needed)
        call_saved_registers += 4;
+
+      /* If the hard floating point registers are going to be
+        used then they must be saved on the stack as well.
+         Each register occupies 12 bytes of stack space.  */
+      for (reg = FIRST_ARM_FP_REGNUM; reg <= LAST_ARM_FP_REGNUM; reg ++)
+       if (regs_ever_live[reg] && ! call_used_regs[reg])
+         call_saved_registers += 12;
     }
 
   /* The stack frame contains 4 registers - the old frame pointer,
@@ -7969,8 +7983,6 @@ arm_compute_initial_elimination_offset (from, to)
      of the function.  */
   stack_frame = frame_pointer_needed ? 16 : 0;
 
-  /* FIXME: we should allow for saved floating point registers.  */
-
   /* OK, now we have enough information to compute the distances.
      There must be an entry in these switch tables for each pair
      of registers in ELIMINABLE_REGS, even if some of the entries
index fca292ab4753c5497b7343be8b319312588e21bc..aa6927815d1ffff7a5d8952743338282daaec6f9 100644 (file)
@@ -37,7 +37,9 @@ Boston, MA 02111-1307, USA.  */
 #define USER_LABEL_PREFIX      ""
 #define LOCAL_LABEL_PREFIX     "."
 
-#define TEXT_SECTION "         .text"
+#define TEXT_SECTION_ASM_OP    "\t.text"
+#define INIT_SECTION_ASM_OP    "\t.section\t.init"
+#define FINI_SECTION_ASM_OP    "\t.section\t.fini"
 
 #define INVOKE__main
 
@@ -51,7 +53,7 @@ Boston, MA 02111-1307, USA.  */
 
 /* A list of other sections which the compiler might be "in" at any
    given time.  */
-#define SUBTARGET_EXTRA_SECTIONS in_rdata,
+#define SUBTARGET_EXTRA_SECTIONS in_rdata
 
 /* A list of extra section function definitions.  */
 #define SUBTARGET_EXTRA_SECTION_FUNCTIONS      RDATA_SECTION_FUNCTION
@@ -59,6 +61,8 @@ Boston, MA 02111-1307, USA.  */
 #define RDATA_SECTION_ASM_OP   "\t.section .rodata"
 
 #define RDATA_SECTION_FUNCTION                                         \
+void rdata_section PARAMS ((void));                            \
+                                                               \
 void                                                           \
 rdata_section ()                                               \
 {                                                              \