Message ID | 55035CB1.4020801@redhat.com |
---|---|
State | New |
Headers | show |
On Fri, Mar 13, 2015 at 03:54:57PM -0600, Martin Sebor wrote: > Attached is a patch that eliminates the unused stack frame > allocated by gcc 5 with -pg -mprofile-kernel on powepc64le > and brings the code into parity with previous gcc versions. > > The patch doesn't do anything to change the emitted code > when -mprofile-kernel is used without -pg. Since the former > option isn't fully documented (as noted in pr 65372) it's > unclear what effect it should be expected to have without > -pg. -mprofile-kernel does nothing without profiling enabled. Maybe it should just have been called -pk or something horrid like that. The effect it should have is to do what the only user of the option (the 64-bit PowerPC Linux kernel) wants. The effect it does have is to make the 64-bit ABI more like the 32-bit ABI for mcount. > 2015-03-13 Anton Blanchard <anton@samba.org> > > PR target/63354 > * gcc/config/rs6000/linux64.h (ARGET_KEEP_LEAF_WHEN_PROFILED): Define. ^ typo > * cc/config/rs6000/rs6000.c (rs6000_keep_leaf_when_profiled). New ^ typo ^ typo It shouldn't have "gcc/" in the path names at all, actually. > +/* -mprofile-kernel code calls mcount before the function prolog, "prologue". > + so a profiled leaf function should stay a leaf function. */ > + > +static bool > +rs6000_keep_leaf_when_profiled (void) > +{ > + return TARGET_PROFILE_KERNEL; > +} Something like switch (DEFAULT_ABI) { case ABI_AIX: case ABI_ELFv2: return TARGET_PROFILE_KERNEL; default: return true; } although I'm not sure about Darwin here. More conservative is to return false for anything untested, of course. > --- /dev/null > +++ b/gcc/testsuite/gcc.target/powerpc/pr63354.c > @@ -0,0 +1,10 @@ > +/* { dg-do compile { target { powerpc*-*-* } } } */ > +/* { dg-options "-O2 -pg -mprofile-kernel" } */ > + > +int foo (void) > +{ > + return 1; > +} > + > +/* { dg-final { scan-assembler "bl _mcount" } } */ > +/* { dg-final { scan-assembler-not "\(addi|stdu\) 1," } } */ Either you should run this only on AIX/ELFv2 ABIs, or you want to test for "stwu" as well. Bare "1" does not work for all assemblers (only Darwin again?) Segher
2015-03-13 Anton Blanchard <anton@samba.org> PR target/63354 * gcc/config/rs6000/linux64.h (ARGET_KEEP_LEAF_WHEN_PROFILED): Define. * cc/config/rs6000/rs6000.c (rs6000_keep_leaf_when_profiled). New function. 2015-03-13 Martin Sebor <msebor@redhat.com> PR target/63354 * gcc.target/powerpc/pr63354.c: New test. diff --git a/gcc/config/rs6000/linux64.h b/gcc/config/rs6000/linux64.h index 0879e7e..f51e892 100644 --- a/gcc/config/rs6000/linux64.h +++ b/gcc/config/rs6000/linux64.h @@ -59,6 +59,9 @@ extern int dot_symbols; #define TARGET_PROFILE_KERNEL profile_kernel +#undef TARGET_KEEP_LEAF_WHEN_PROFILED +#define TARGET_KEEP_LEAF_WHEN_PROFILED rs6000_keep_leaf_when_profiled + #define TARGET_USES_LINUX64_OPT 1 #ifdef HAVE_LD_LARGE_TOC #undef TARGET_CMODEL diff --git a/gcc/config/rs6000/rs6000.c b/gcc/config/rs6000/rs6000.c index 3171eef..77731c56 100644 --- a/gcc/config/rs6000/rs6000.c +++ b/gcc/config/rs6000/rs6000.c @@ -24395,6 +24395,15 @@ rs6000_output_function_prologue (FILE *file, rs6000_pic_labelno++; } +/* -mprofile-kernel code calls mcount before the function prolog, + so a profiled leaf function should stay a leaf function. */ + +static bool +rs6000_keep_leaf_when_profiled (void) +{ + return TARGET_PROFILE_KERNEL; +} + /* Non-zero if vmx regs are restored before the frame pop, zero if we restore after the pop when possible. */ #define ALWAYS_RESTORE_ALTIVEC_BEFORE_POP 0 diff --git a/gcc/testsuite/gcc.target/powerpc/pr63354.c b/gcc/testsuite/gcc.target/powerpc/pr63354.c new file mode 100644 index 0000000..dd6ad08 --- /dev/null +++ b/gcc/testsuite/gcc.target/powerpc/pr63354.c @@ -0,0 +1,10 @@ +/* { dg-do compile { target { powerpc*-*-* } } } */ +/* { dg-options "-O2 -pg -mprofile-kernel" } */ + +int foo (void) +{ + return 1; +} + +/* { dg-final { scan-assembler "bl _mcount" } } */ +/* { dg-final { scan-assembler-not "\(addi|stdu\) 1," } } */