lkml.org 
[lkml]   [2012]   [Sep]   [28]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 7/10] compiler{,-gcc4}.h: Introduce __flatten function attribute
    Date
    For gcc 4.1 & later, expands to __attribute__((flatten)) which forces
    the compiler to inline everything it can into the function. This is
    useful in combination with noinline when you want to control the depth
    of inlining, or create a single function where inline expansions will
    occur. (see
    http://gcc.gnu.org/onlinedocs/gcc/Function-Attributes.html#index-g_t_0040code_007bflatten_007d-function-attribute-2512)

    Normally, it's best to leave this type of thing up to the compiler.
    However, the generic rbtree code uses inline functions just to be able
    to inject compile-time constant data that specifies how the caller wants
    the function to behave (via struct rb_relationship). This data can be
    thought of as the template parameters of a C++ templatized function.
    Since some of these functions, once expanded, become quite large, gcc
    sometimes decides not to perform some important inlining, in one case,
    even generating a few bytes more code by not doing so. (Note: I have not
    eliminated the possibility that this was an optimization bug, but the
    flatten attribute fixes it in either case.)

    Combining __flatten and noinline insures that important optimizations
    occur in these cases and that the inline expansion occurs in exactly one
    place, thus not leading to unnecissary bloat. However, it also can
    eliminate some opportunities for optimization should gcc otherwise
    decide the function its self is a good candidate for inlining.

    Signed-off-by: Daniel Santos <daniel.santos@pobox.com>
    ---
    include/linux/compiler-gcc4.h | 7 ++++++-
    include/linux/compiler.h | 4 ++++
    2 files changed, 10 insertions(+), 1 deletions(-)

    diff --git a/include/linux/compiler-gcc4.h b/include/linux/compiler-gcc4.h
    index ad610f2..5a0897e 100644
    --- a/include/linux/compiler-gcc4.h
    +++ b/include/linux/compiler-gcc4.h
    @@ -15,7 +15,12 @@

    #if GCC_VERSION >= 40102
    # define __compiletime_object_size(obj) __builtin_object_size(obj, 0)
    -#endif
    +
    +/* flatten introduced in 4.1, but broken in 4.6.0 (gcc bug #48731)*/
    +# if GCC_VERSION != 40600
    +# define __flatten __attribute__((flatten))
    +# endif
    +#endif /* GCC_VERSION >= 40102 */

    #if GCC_VERSION >= 40300
    /* Mark functions as cold. gcc will assume any path leading to a call
    diff --git a/include/linux/compiler.h b/include/linux/compiler.h
    index fd455aa..268aeb6 100644
    --- a/include/linux/compiler.h
    +++ b/include/linux/compiler.h
    @@ -244,6 +244,10 @@ void ftrace_likely_update(struct ftrace_branch_data *f, int val, int expect);
    #define __always_inline inline
    #endif

    +#ifndef __flatten
    +#define __flatten
    +#endif
    +
    #endif /* __KERNEL__ */

    /*
    --
    1.7.3.4


    \
     
     \ /
      Last update: 2012-09-29 02:21    [W:3.014 / U:0.696 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site