This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[arm] call_via_sp


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

Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]