]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
Save call-clobbered registers in _mcount on 32-bit Solaris/x86 (PR target/38239)
authorRainer Orth <ro@CeBiTec.Uni-Bielefeld.DE>
Mon, 21 Mar 2016 11:24:40 +0000 (11:24 +0000)
committerRainer Orth <ro@gcc.gnu.org>
Mon, 21 Mar 2016 11:24:40 +0000 (11:24 +0000)
Backport from mainline
2016-03-16  Rainer Orth  <ro@CeBiTec.Uni-Bielefeld.DE>

PR target/38239
* config/gmon-sol2.c [__i386__] (_mcount): Save and restore
call-clobbered registers.
(internal_mcount): Remove __i386__ handling.

From-SVN: r234366

libgcc/ChangeLog
libgcc/config/gmon-sol2.c

index 2ac182ce7be922e23b4bf0946466b7899c15a855..b8fedcc2f824319da1630118929e95276293a86c 100644 (file)
@@ -1,3 +1,13 @@
+2016-03-21  Rainer Orth  <ro@CeBiTec.Uni-Bielefeld.DE>
+
+       Backport from mainline
+       2016-03-16  Rainer Orth  <ro@CeBiTec.Uni-Bielefeld.DE>
+
+       PR target/38239
+       * config/gmon-sol2.c [__i386__] (_mcount): Save and restore
+       call-clobbered registers.
+       (internal_mcount): Remove __i386__ handling.
+
 2015-12-09  John David Anglin  <danglin@gcc.gnu.org>
 
        * config/pa/fptr.c (__canonicalize_funcptr_for_compare): Remove code
index 7d6149665d0c3fa989f46fb34cba2b6632bddfbb..810012609e1aada072d4f6fb27919b04d2fa4da2 100644 (file)
 
 extern void monstartup (char *, char *);
 extern void _mcleanup (void);
-#ifdef __i386__
-static void internal_mcount (void) __attribute__ ((used));
-#else
 static void internal_mcount (char *, unsigned short *) __attribute__ ((used));
-#endif
 static void moncontrol (int);
 
 struct phdr {
@@ -222,8 +218,19 @@ _mcleanup (void)
 /* Solaris 2 libraries use _mcount.  */
 #if defined __i386__
 asm(".globl _mcount\n"
+    "  .type   _mcount, @function\n"
     "_mcount:\n"
-    "  jmp     internal_mcount\n");
+    /* Save and restore the call-clobbered registers.  */
+    "  pushl   %eax\n"
+    "  pushl   %ecx\n"
+    "  pushl   %edx\n"
+    "  movl    12(%esp), %edx\n"
+    "  movl    4(%ebp), %eax\n"
+    "  call    internal_mcount\n"
+    "  popl    %edx\n"
+    "  popl    %ecx\n"
+    "  popl    %eax\n"
+    "  ret\n");
 #elif defined __x86_64__
 /* See GLIBC for additional information about this technique.  */
 asm(".globl _mcount\n" 
@@ -298,32 +305,13 @@ asm(".global _mcount\n"
 #endif
 
 static void
-#ifdef __i386__
-internal_mcount (void)
-#else
 internal_mcount (char *selfpc, unsigned short *frompcindex)
-#endif
 {
   struct tostruct *top;
   struct tostruct *prevtop;
   long toindex;
   static char already_setup;
 
-#ifdef __i386__
-  char *selfpc;
-  unsigned short *frompcindex;
-
-  /* Find the return address for mcount and the return address for mcount's
-     caller.  */
-
-  /* selfpc = pc pushed by mcount call.
-     This identifies the function that was just entered.  */
-  selfpc = (void *) __builtin_return_address (0);
-  /* frompcindex = pc in preceding frame.
-     This identifies the caller of the function just entered.  */
-  frompcindex = (void *) __builtin_return_address (1);
-#endif
-
   if(!already_setup) {
     extern char etext[];