mirror of git://gcc.gnu.org/git/gcc.git
Save call-clobbered registers in _mcount on 32-bit Solaris/x86 (PR target/38239)
PR target/38239 * config/sol2/gmon.c [__i386__] (_mcount): Save and restore call-clobbered registers. (internal_mcount): Remove __i386__ handling. From-SVN: r234256
This commit is contained in:
parent
197adb6983
commit
a5046f48b3
|
|
@ -1,3 +1,10 @@
|
||||||
|
2016-03-16 Rainer Orth <ro@CeBiTec.Uni-Bielefeld.DE>
|
||||||
|
|
||||||
|
PR target/38239
|
||||||
|
* config/sol2/gmon.c [__i386__] (_mcount): Save and restore
|
||||||
|
call-clobbered registers.
|
||||||
|
(internal_mcount): Remove __i386__ handling.
|
||||||
|
|
||||||
2016-02-26 Joel Sherrill <joel@rtems.org>
|
2016-02-26 Joel Sherrill <joel@rtems.org>
|
||||||
|
|
||||||
* config.host: Add x86_64-*-rtems*.
|
* config.host: Add x86_64-*-rtems*.
|
||||||
|
|
|
||||||
|
|
@ -44,11 +44,7 @@
|
||||||
|
|
||||||
extern void monstartup (char *, char *);
|
extern void monstartup (char *, char *);
|
||||||
extern void _mcleanup (void);
|
extern void _mcleanup (void);
|
||||||
#ifdef __i386__
|
|
||||||
static void internal_mcount (void) __attribute__ ((used));
|
|
||||||
#else
|
|
||||||
static void internal_mcount (char *, unsigned short *) __attribute__ ((used));
|
static void internal_mcount (char *, unsigned short *) __attribute__ ((used));
|
||||||
#endif
|
|
||||||
static void moncontrol (int);
|
static void moncontrol (int);
|
||||||
|
|
||||||
struct phdr {
|
struct phdr {
|
||||||
|
|
@ -223,8 +219,19 @@ _mcleanup (void)
|
||||||
/* Solaris 2 libraries use _mcount. */
|
/* Solaris 2 libraries use _mcount. */
|
||||||
#if defined __i386__
|
#if defined __i386__
|
||||||
asm(".globl _mcount\n"
|
asm(".globl _mcount\n"
|
||||||
|
" .type _mcount, @function\n"
|
||||||
"_mcount:\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__
|
#elif defined __x86_64__
|
||||||
/* See GLIBC for additional information about this technique. */
|
/* See GLIBC for additional information about this technique. */
|
||||||
asm(".globl _mcount\n"
|
asm(".globl _mcount\n"
|
||||||
|
|
@ -299,32 +306,13 @@ asm(".global _mcount\n"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
static void
|
static void
|
||||||
#ifdef __i386__
|
|
||||||
internal_mcount (void)
|
|
||||||
#else
|
|
||||||
internal_mcount (char *selfpc, unsigned short *frompcindex)
|
internal_mcount (char *selfpc, unsigned short *frompcindex)
|
||||||
#endif
|
|
||||||
{
|
{
|
||||||
struct tostruct *top;
|
struct tostruct *top;
|
||||||
struct tostruct *prevtop;
|
struct tostruct *prevtop;
|
||||||
long toindex;
|
long toindex;
|
||||||
static char already_setup;
|
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
|
/* Only necessary without the Solaris CRTs or a proper gcrt1.o, otherwise
|
||||||
crtpg.o or gcrt1.o take care of that.
|
crtpg.o or gcrt1.o take care of that.
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue