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

Reply via email to