PING^2 Re: [PATCH] Add -fno-instrument-function v2
Andi Kleen
andi@firstfloor.org
Mon Oct 7 23:00:00 GMT 2013
Andi Kleen <andi@firstfloor.org> writes:
PING^2
> Andi Kleen <andi@firstfloor.org> writes:
>
>> From: Andi Kleen <ak@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 <ak@linux.intel.com>
>>
>> * c.opt (fno-instrument-function): Document.
>>
>> gcc/c:
>>
>> 2013-08-10 Andi Kleen <ak@linux.intel.com>
>>
>> * c-decl.c (start_function): Handle force_no_instrument_function
>>
>> gcc/cp:
>>
>> 2013-08-10 Andi Kleen <ak@linux.intel.com>
>>
>> * decl.c (start_preparsed_function): Handle
>> force_no_instrument_function
>>
>> gcc/testsuite:
>>
>> 2013-08-10 Andi Kleen <ak@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");
>> +}
--
ak@linux.intel.com -- Speaking for myself only
More information about the Gcc-patches
mailing list