Commit 57ecec57 by Paul Brook

arm.c (thumb_call_via_label): Include space for SP.

2005-04-01  Paul Brook  <paul@codesourcery.com>

	* config/arm/arm.c (thumb_call_via_label): Include space for SP.
	(arm_output_function_epilogue): Allow call_via_SP.
	(thumb_call_via_reg, arm_file_end): Ditto.
	* config/arm/arm.h (struct machine_function): Include space for SP.
	(thumb_call_via_label): Update declaration.

From-SVN: r97402
parent f972113f
...@@ -368,7 +368,7 @@ const char * structure_size_string = NULL; ...@@ -368,7 +368,7 @@ const char * structure_size_string = NULL;
int arm_structure_size_boundary = DEFAULT_STRUCTURE_SIZE_BOUNDARY; int arm_structure_size_boundary = DEFAULT_STRUCTURE_SIZE_BOUNDARY;
/* Used for Thumb call_via trampolines. */ /* Used for Thumb call_via trampolines. */
rtx thumb_call_via_label[13]; rtx thumb_call_via_label[14];
static int thumb_call_reg_needed; static int thumb_call_reg_needed;
/* Bit values used to identify processor capabilities. */ /* Bit values used to identify processor capabilities. */
...@@ -9680,7 +9680,7 @@ arm_output_function_epilogue (FILE *file ATTRIBUTE_UNUSED, ...@@ -9680,7 +9680,7 @@ arm_output_function_epilogue (FILE *file ATTRIBUTE_UNUSED,
/* Emit any call-via-reg trampolines that are needed for v4t support /* Emit any call-via-reg trampolines that are needed for v4t support
of call_reg and call_value_reg type insns. */ of call_reg and call_value_reg type insns. */
for (regno = 0; regno < SP_REGNUM; regno++) for (regno = 0; regno < LR_REGNUM; regno++)
{ {
rtx label = cfun->machine->call_via[regno]; rtx label = cfun->machine->call_via[regno];
...@@ -13775,7 +13775,7 @@ thumb_call_via_reg (rtx reg) ...@@ -13775,7 +13775,7 @@ thumb_call_via_reg (rtx reg)
int regno = REGNO (reg); int regno = REGNO (reg);
rtx *labelp; rtx *labelp;
gcc_assert (regno < SP_REGNUM); gcc_assert (regno < LR_REGNUM);
/* If we are in the normal text section we can use a single instance /* If we are in the normal text section we can use a single instance
per compilation unit. If we are doing function sections, then we need per compilation unit. If we are doing function sections, then we need
...@@ -13921,7 +13921,7 @@ arm_file_end (void) ...@@ -13921,7 +13921,7 @@ arm_file_end (void)
asm_fprintf (asm_out_file, "\t.code 16\n"); asm_fprintf (asm_out_file, "\t.code 16\n");
ASM_OUTPUT_ALIGN (asm_out_file, 1); ASM_OUTPUT_ALIGN (asm_out_file, 1);
for (regno = 0; regno < SP_REGNUM; regno++) for (regno = 0; regno < LR_REGNUM; regno++)
{ {
rtx label = thumb_call_via_label[regno]; rtx label = thumb_call_via_label[regno];
......
...@@ -1712,14 +1712,15 @@ typedef struct machine_function GTY(()) ...@@ -1712,14 +1712,15 @@ typedef struct machine_function GTY(())
register is needed to preserve stack alignment. */ register is needed to preserve stack alignment. */
int sibcall_blocked; int sibcall_blocked;
/* Labels for per-function Thumb call-via stubs. One per potential calling /* Labels for per-function Thumb call-via stubs. One per potential calling
register. We can never call via SP, LR or PC. */ register. We can never call via LR or PC. We can call via SP if a
rtx call_via[13]; trampoline happens to be on the top of the stack. */
rtx call_via[14];
} }
machine_function; machine_function;
/* As in the machine_function, a global set of call-via labels, for code /* As in the machine_function, a global set of call-via labels, for code
that is in text_section(). */ that is in text_section(). */
extern GTY(()) rtx thumb_call_via_label[13]; extern GTY(()) rtx thumb_call_via_label[14];
/* A C type for declaring a variable that is used as the first argument of /* A C type for declaring a variable that is used as the first argument of
`FUNCTION_ARG' and other related values. For some target machines, the `FUNCTION_ARG' and other related values. For some target machines, the
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment