From: Nick Clifton Date: Fri, 31 Aug 2001 17:09:58 +0000 (+0000) Subject: Account for FP registers saved to stack during prologue X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=ef7112de26b338a77e76e5e2b2ef0ca4ed306a37;p=gcc.git Account for FP registers saved to stack during prologue From-SVN: r45325 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index d3406b65c0b..34785e91c41 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -122,6 +122,18 @@ Thu Aug 30 10:21:43 2001 J"orn Rennecke * c-typeck.c (pointer_diff): Try to eliminate common term before doing conversions. +2001-08-30 Nick Clifton + + * 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 * reload1.c (move2add_note_store): Correct typo checking for diff --git a/gcc/config/arm/arm.c b/gcc/config/arm/arm.c index 825a46516d9..c3f4e2eadef 100644 --- a/gcc/config/arm/arm.c +++ b/gcc/config/arm/arm.c @@ -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 diff --git a/gcc/config/arm/unknown-elf.h b/gcc/config/arm/unknown-elf.h index fca292ab475..aa6927815d1 100644 --- a/gcc/config/arm/unknown-elf.h +++ b/gcc/config/arm/unknown-elf.h @@ -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 () \ { \