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