#
# https://gcc.gnu.org/bugzilla/show_bug.cgi?id=38239
# This will be fixed in 4.9.4
#
# Index: libgcc/ChangeLog
# ===================================================================
# --- libgcc/ChangeLog (revision 234365)
# +++ libgcc/ChangeLog (revision 234366)
# @@ -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/gmon-sol2.c [__i386__] (_mcount): Save and restore
# + call-clobbered registers.
# + (internal_mcount): Remove __i386__ handling.
# +
# 2015-12-09 John David Anglin <[email protected]>
#
# * config/pa/fptr.c (__canonicalize_funcptr_for_compare): Remove code
Index: libgcc/config/gmon-sol2.c
===================================================================
--- libgcc/config/gmon-sol2.c (revision 234365)
+++ libgcc/config/gmon-sol2.c (revision 234366)
@@ -43,11 +43,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 {
@@ -222,8 +218,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"
@@ -298,11 +305,7 @@
#endif
static void
-#ifdef __i386__
-internal_mcount (void)
-#else
internal_mcount (char *selfpc, unsigned short *frompcindex)
-#endif
{
struct tostruct *top;
struct tostruct *prevtop;
@@ -309,21 +312,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
-
if(!already_setup) {
extern char etext[];