gcc/
authorjules <jules@138bc75d-0d04-0410-961f-82ee72b054a4>
Fri, 20 Nov 2009 16:48:28 +0000 (16:48 +0000)
committerjules <jules@138bc75d-0d04-0410-961f-82ee72b054a4>
Fri, 20 Nov 2009 16:48:28 +0000 (16:48 +0000)
* config/arm/arm.h (ASM_OUTPUT_REG_PUSH): Handle STATIC_CHAIN_REGNUM
specially for Thumb-1.
(ASM_OUTPUT_REG_POP): Likewise.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@154372 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/ChangeLog
gcc/config/arm/arm.h

index b6cf53a..4a7f32e 100644 (file)
@@ -1,3 +1,9 @@
+2009-11-20  Julian Brown  <julian@codesourcery.com>
+
+       * config/arm/arm.h (ASM_OUTPUT_REG_PUSH): Handle STATIC_CHAIN_REGNUM
+       specially for Thumb-1.
+       (ASM_OUTPUT_REG_POP): Likewise.
+
 2009-11-19  Jason Merrill  <jason@redhat.com>
 
        * dwarf2out.c (get_context_die): Take TYPE_MAIN_VARIANT.
index 663f07e..98abdb1 100644 (file)
@@ -2274,24 +2274,44 @@ extern int making_const_table;
 #define ASM_APP_OFF (TARGET_THUMB1 ? "\t.code\t16\n" : \
                     TARGET_THUMB2 ? "\t.thumb\n" : "")
 
-/* Output a push or a pop instruction (only used when profiling).  */
+/* Output a push or a pop instruction (only used when profiling).
+   We can't push STATIC_CHAIN_REGNUM (r12) directly with Thumb-1.  We know
+   that ASM_OUTPUT_REG_PUSH will be matched with ASM_OUTPUT_REG_POP, and
+   that r7 isn't used by the function profiler, so we can use it as a
+   scratch reg.  WARNING: This isn't safe in the general case!  It may be
+   sensitive to future changes in final.c:profile_function.  */
 #define ASM_OUTPUT_REG_PUSH(STREAM, REGNO)             \
   do                                                   \
     {                                                  \
       if (TARGET_ARM)                                  \
        asm_fprintf (STREAM,"\tstmfd\t%r!,{%r}\n",      \
                     STACK_POINTER_REGNUM, REGNO);      \
+      else if (TARGET_THUMB1                           \
+              && (REGNO) == STATIC_CHAIN_REGNUM)       \
+       {                                               \
+         asm_fprintf (STREAM, "\tpush\t{r7}\n");       \
+         asm_fprintf (STREAM, "\tmov\tr7, %r\n", REGNO);\
+         asm_fprintf (STREAM, "\tpush\t{r7}\n");       \
+       }                                               \
       else                                             \
        asm_fprintf (STREAM, "\tpush {%r}\n", REGNO);   \
     } while (0)
 
 
+/* See comment for ASM_OUTPUT_REG_PUSH concerning Thumb-1 issue.  */
 #define ASM_OUTPUT_REG_POP(STREAM, REGNO)              \
   do                                                   \
     {                                                  \
       if (TARGET_ARM)                                  \
        asm_fprintf (STREAM, "\tldmfd\t%r!,{%r}\n",     \
                     STACK_POINTER_REGNUM, REGNO);      \
+      else if (TARGET_THUMB1                           \
+              && (REGNO) == STATIC_CHAIN_REGNUM)       \
+       {                                               \
+         asm_fprintf (STREAM, "\tpop\t{r7}\n");        \
+         asm_fprintf (STREAM, "\tmov\t%r, r7\n", REGNO);\
+         asm_fprintf (STREAM, "\tpop\t{r7}\n");        \
+       }                                               \
       else                                             \
        asm_fprintf (STREAM, "\tpop {%r}\n", REGNO);    \
     } while (0)