components/gcc5/patches/009-r234365.patch
author Norm Jacobs <Norm.Jacobs@Oracle.COM>
Wed, 07 Sep 2016 18:09:38 -0500
changeset 6859 569bef81e3c4
parent 5928 components/gcc53/patches/009-r234365.patch@f0b68e20e980
permissions -rw-r--r--
22991497 /usr/gcc/5.3 should be /usr/gcc/5

#
# https://gcc.gnu.org/bugzilla/show_bug.cgi?id=38239 
# This will be fixed in 5.4.
# 
# Index: libgcc/ChangeLog
# ===================================================================
# --- a/libgcc/ChangeLog	(revision 234364)
# +++ b/libgcc/ChangeLog	(revision 234365)
# @@ -1,3 +1,13 @@
# +2016-03-21  Rainer Orth  <[email protected]>
# +
# +	Backport from mainline
# +	2016-03-16  Rainer Orth  <[email protected]>
# +
# +	PR target/38239
# +	* config/sol2/gmon.c [__i386__] (_mcount): Save and restore
# +	call-clobbered registers.
# +	(internal_mcount): Remove __i386__ handling.
# +
#  2016-02-10  Ian Lance Taylor  <[email protected]>
#  
#  	PR go/68562
Index: libgcc/config/sol2/gmon.c
===================================================================
--- a/libgcc/config/sol2/gmon.c	(revision 234364)
+++ b/libgcc/config/sol2/gmon.c	(revision 234365)
@@ -44,11 +44,7 @@
 
 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 {
@@ -223,8 +219,19 @@
 /* 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" 
@@ -299,11 +306,7 @@
 #endif
 
 static void
-#ifdef __i386__
-internal_mcount (void)
-#else
 internal_mcount (char *selfpc, unsigned short *frompcindex)
-#endif
 {
   struct tostruct *top;
   struct tostruct *prevtop;
@@ -310,21 +313,6 @@
   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
-
 /* Only necessary without the Solaris CRTs or a proper gcrt1.o, otherwise
    crtpg.o or gcrt1.o take care of that.