Andi Kleen <a...@firstfloor.org> writes: PING^4 if it isn't already too late for 4.9.
> Andi Kleen <a...@firstfloor.org> writes: > > > PING^3 > > Since it doesn't look like a generic solution for the > LTO options problem will appear this development cycle, > I would still like to pursue this option for 4.9. > This would help fixing parts of the linux kernel LTO > build. > > Can someone please review the patch? > > Thanks > >> Andi Kleen <a...@firstfloor.org> writes: >> >> PING^2 >> >>> Andi Kleen <a...@firstfloor.org> writes: >>> >>>> From: Andi Kleen <a...@linux.intel.com> >>>> >>>> [I posted this originally quite some time ago. >>>> This version fixes all review problems, particularly >>>> it works for C++ too and the test case really works.] >>> >>> Ping! >>> >>> Could someone please review it. >>> >>> Note this might be obsolete with Honza's LTO option work, but if it's >>> not covered in his first iteration I would still have it earlier for the >>> Linux kernel LTO build (fixed ftrace) >>> >>> -Andi >>> >>>> This adds a new C/C++ option to force >>>> __attribute__((no_instrument_function)) on every function compiled. >>>> >>>> This is useful together with LTO. You may want to have the whole >>>> program compiled with -pg and have to specify that in the LTO >>>> link, but want to disable it for some specific files. As the >>>> option works on the frontend level it is already passed through >>>> properly by LTO. >>>> >>>> Without LTO it is equivalent to not specifing -pg or -mfentry. >>>> >>>> This fixes some missing functionality in the Linux kernel LTO port. >>>> >>>> Passed bootstrap and test suite on x86_64-linux. Ok? >>>> >>>> gcc/: >>>> >>>> 2013-08-10 Andi Kleen <a...@linux.intel.com> >>>> >>>> * c.opt (fno-instrument-function): Document. >>>> >>>> gcc/c: >>>> >>>> 2013-08-10 Andi Kleen <a...@linux.intel.com> >>>> >>>> * c-decl.c (start_function): Handle force_no_instrument_function >>>> >>>> gcc/cp: >>>> >>>> 2013-08-10 Andi Kleen <a...@linux.intel.com> >>>> >>>> * decl.c (start_preparsed_function): Handle >>>> force_no_instrument_function >>>> >>>> gcc/testsuite: >>>> >>>> 2013-08-10 Andi Kleen <a...@linux.intel.com> >>>> >>>> * g++.dg/fno-instrument-function.C: Add. >>>> * gcc.dg/fno-instrument-function.c: Add. >>>> --- >>>> gcc/c-family/c.opt | 4 ++++ >>>> gcc/c/c-decl.c | 3 +++ >>>> gcc/cp/decl.c | 3 +++ >>>> gcc/doc/invoke.texi | 8 +++++++- >>>> gcc/testsuite/g++.dg/fno-instrument-function.C | 18 ++++++++++++++++++ >>>> gcc/testsuite/gcc.dg/fno-instrument-function.c | 24 >>>> ++++++++++++++++++++++++ >>>> 6 files changed, 59 insertions(+), 1 deletion(-) >>>> create mode 100644 gcc/testsuite/g++.dg/fno-instrument-function.C >>>> create mode 100644 gcc/testsuite/gcc.dg/fno-instrument-function.c >>>> >>>> diff --git a/gcc/c-family/c.opt b/gcc/c-family/c.opt >>>> index 10ae84d..2159f89 100644 >>>> --- a/gcc/c-family/c.opt >>>> +++ b/gcc/c-family/c.opt >>>> @@ -1014,6 +1014,10 @@ fnil-receivers >>>> ObjC ObjC++ Var(flag_nil_receivers) Init(1) >>>> Assume that receivers of Objective-C messages may be nil >>>> >>>> +fno-instrument-function >>>> +C C++ ObjC ObjC++ RejectNegative Report Var(force_no_instrument_function) >>>> +Force __attribute__((no_instrument_function)) for all functions in >>>> translation unit. >>>> + >>>> fnonansi-builtins >>>> C++ ObjC++ Var(flag_no_nonansi_builtin, 0) >>>> >>>> diff --git a/gcc/c/c-decl.c b/gcc/c/c-decl.c >>>> index d9bbf5c..15717a9 100644 >>>> --- a/gcc/c/c-decl.c >>>> +++ b/gcc/c/c-decl.c >>>> @@ -7876,6 +7876,9 @@ start_function (struct c_declspecs *declspecs, >>>> struct c_declarator *declarator, >>>> if (current_scope == file_scope) >>>> maybe_apply_pragma_weak (decl1); >>>> >>>> + if (force_no_instrument_function) >>>> + DECL_NO_INSTRUMENT_FUNCTION_ENTRY_EXIT (decl1) = 1; >>>> + >>>> /* Warn for unlikely, improbable, or stupid declarations of `main'. */ >>>> if (warn_main && MAIN_NAME_P (DECL_NAME (decl1))) >>>> { >>>> diff --git a/gcc/cp/decl.c b/gcc/cp/decl.c >>>> index 01804d2..103188b 100644 >>>> --- a/gcc/cp/decl.c >>>> +++ b/gcc/cp/decl.c >>>> @@ -13023,6 +13023,9 @@ start_preparsed_function (tree decl1, tree attrs, >>>> int flags) >>>> && lookup_attribute ("noinline", attrs)) >>>> warning (0, "inline function %q+D given attribute noinline", decl1); >>>> >>>> + if (force_no_instrument_function) >>>> + DECL_NO_INSTRUMENT_FUNCTION_ENTRY_EXIT (decl1) = 1; >>>> + >>>> /* Handle gnu_inline attribute. */ >>>> if (GNU_INLINE_P (decl1)) >>>> { >>>> diff --git a/gcc/doc/invoke.texi b/gcc/doc/invoke.texi >>>> index 782b569..bc20a77 100644 >>>> --- a/gcc/doc/invoke.texi >>>> +++ b/gcc/doc/invoke.texi >>>> @@ -169,7 +169,7 @@ in the following sections. >>>> -aux-info @var{filename} -fallow-parameterless-variadic-functions @gol >>>> -fno-asm -fno-builtin -fno-builtin-@var{function} @gol >>>> -fhosted -ffreestanding -fopenmp -fms-extensions -fplan9-extensions @gol >>>> --trigraphs -traditional -traditional-cpp @gol >>>> +-trigraphs -traditional -traditional-cpp -fno-instrument-function @gol >>>> -fallow-single-precision -fcond-mismatch -flax-vector-conversions @gol >>>> -fsigned-bitfields -fsigned-char @gol >>>> -funsigned-bitfields -funsigned-char} >>>> @@ -1868,6 +1868,12 @@ Allow implicit conversions between vectors with >>>> differing numbers of >>>> elements and/or incompatible element types. This option should not be >>>> used for new code. >>>> >>>> +@item -fno-instrument-function >>>> +@opindex fno-instrument-function >>>> +Override @option{-pg} for this translation unit. This is useful with >>>> +Link Time Optimization (LTO) to override the effects of -pg for a >>>> +specific source file. >>>> + >>>> @item -funsigned-char >>>> @opindex funsigned-char >>>> Let the type @code{char} be unsigned, like @code{unsigned char}. >>>> diff --git a/gcc/testsuite/g++.dg/fno-instrument-function.C >>>> b/gcc/testsuite/g++.dg/fno-instrument-function.C >>>> new file mode 100644 >>>> index 0000000..e2f6518 >>>> --- /dev/null >>>> +++ b/gcc/testsuite/g++.dg/fno-instrument-function.C >>>> @@ -0,0 +1,18 @@ >>>> +/* Test -fno-instrument-function */ >>>> +/* { dg-do compile } */ >>>> +/* { dg-options "-pg -fno-instrument-function" } */ >>>> +/* { dg-final { scan-assembler-not "mcount" } } */ >>>> +/* Origin: Andi Kleen */ >>>> +extern void foobar(const char *); >>>> + >>>> +void func(void) >>>> +{ >>>> + foobar ("Hello world\n"); >>>> +} >>>> + >>>> +void func2(void) >>>> +{ >>>> + int i; >>>> + for (i = 0; i < 10; i++) >>>> + foobar ("Hello world"); >>>> +} >>>> diff --git a/gcc/testsuite/gcc.dg/fno-instrument-function.c >>>> b/gcc/testsuite/gcc.dg/fno-instrument-function.c >>>> new file mode 100644 >>>> index 0000000..9c68fa8 >>>> --- /dev/null >>>> +++ b/gcc/testsuite/gcc.dg/fno-instrument-function.c >>>> @@ -0,0 +1,24 @@ >>>> +/* Test -fno-instrument-function */ >>>> +/* { dg-do compile } */ >>>> +/* { dg-options "-pg -fno-instrument-function" } */ >>>> +/* { dg-final { scan-assembler-not "mcount" } } */ >>>> +/* Origin: Andi Kleen */ >>>> +extern void foobar(char *); >>>> + >>>> +void func(void) >>>> +{ >>>> + foobar ("Hello world\n"); >>>> +} >>>> + >>>> +void func2(void) >>>> +{ >>>> + int i; >>>> + for (i = 0; i < 10; i++) >>>> + foobar ("Hello world"); >>>> +} >>>> + >>>> +void func3(a) >>>> +char *a; >>>> +{ >>>> + foobar("Hello world"); >>>> +} -- a...@linux.intel.com -- Speaking for myself only