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