From 38d185128b0bb0a3cf5991d36e88fc0d013abbb0 Mon Sep 17 00:00:00 2001 From: Rainer Orth Date: Mon, 21 Mar 2016 11:24:40 +0000 Subject: [PATCH] Save call-clobbered registers in _mcount on 32-bit Solaris/x86 (PR target/38239) Backport from mainline 2016-03-16 Rainer Orth 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 | 10 ++++++++++ libgcc/config/gmon-sol2.c | 36 ++++++++++++------------------------ 2 files changed, 22 insertions(+), 24 deletions(-) diff --git a/libgcc/ChangeLog b/libgcc/ChangeLog index 2ac182ce7be9..b8fedcc2f824 100644 --- a/libgcc/ChangeLog +++ b/libgcc/ChangeLog @@ -1,3 +1,13 @@ +2016-03-21 Rainer Orth + + Backport from mainline + 2016-03-16 Rainer Orth + + 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 * config/pa/fptr.c (__canonicalize_funcptr_for_compare): Remove code diff --git a/libgcc/config/gmon-sol2.c b/libgcc/config/gmon-sol2.c index 7d6149665d0c..810012609e1a 100644 --- a/libgcc/config/gmon-sol2.c +++ b/libgcc/config/gmon-sol2.c @@ -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 @@ _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[]; -- 2.47.2