This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
[arm] call_via_sp
- From: Paul Brook <paul at codesourcery dot com>
- To: gcc-patches at gcc dot gnu dot org
- Date: Fri, 1 Apr 2005 16:54:53 +0100
- Subject: [arm] call_via_sp
- Organization: CodeSourcery
The arm backend generates interworking stubs for thumb indirect calls. It
assumes that an indirect call will never be made via sp. However with nested
functions the trampoline may happen to be at the same the same address as the
stack pointer.
This actually occurs in pactice on csl-arm-branch.
gcc4 is much cleverer how it handles nested functions, but I think it's still
theoretically possible.
Tested with cross to arm-non-eabi.
Applied to mainline and csl-arm-branch.
Paul
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.
Index: gcc/config/arm/arm.c
===================================================================
RCS file: /var/cvsroot/gcc-cvs/gcc/gcc/config/arm/arm.c,v
retrieving revision 1.432
diff -u -p -r1.432 arm.c
--- gcc/config/arm/arm.c 29 Mar 2005 03:00:23 -0000 1.432
+++ gcc/config/arm/arm.c 1 Apr 2005 15:25:26 -0000
@@ -368,7 +368,7 @@ const char * structure_size_string = NUL
int arm_structure_size_boundary = DEFAULT_STRUCTURE_SIZE_BOUNDARY;
/* Used for Thumb call_via trampolines. */
-rtx thumb_call_via_label[13];
+rtx thumb_call_via_label[14];
static int thumb_call_reg_needed;
/* Bit values used to identify processor capabilities. */
@@ -9665,7 +9665,7 @@ arm_output_function_epilogue (FILE *file
/* Emit any call-via-reg trampolines that are needed for v4t support
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];
@@ -13760,7 +13760,7 @@ thumb_call_via_reg (rtx reg)
int regno = REGNO (reg);
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
per compilation unit. If we are doing function sections, then we need
@@ -13906,7 +13906,7 @@ arm_file_end (void)
asm_fprintf (asm_out_file, "\t.code 16\n");
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];
Index: gcc/config/arm/arm.h
===================================================================
RCS file: /var/cvsroot/gcc-cvs/gcc/gcc/config/arm/arm.h,v
retrieving revision 1.269
diff -u -p -r1.269 arm.h
--- gcc/config/arm/arm.h 29 Mar 2005 03:00:27 -0000 1.269
+++ gcc/config/arm/arm.h 1 Apr 2005 15:23:45 -0000
@@ -1712,14 +1712,15 @@ typedef struct machine_function GTY(())
register is needed to preserve stack alignment. */
int sibcall_blocked;
/* Labels for per-function Thumb call-via stubs. One per potential calling
- register. We can never call via SP, LR or PC. */
- rtx call_via[13];
+ register. We can never call via LR or PC. We can call via SP if a
+ trampoline happens to be on the top of the stack. */
+ rtx call_via[14];
}
machine_function;
/* As in the machine_function, a global set of call-via labels, for code
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
`FUNCTION_ARG' and other related values. For some target machines, the