linux-sparse.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH v5 5/25] compiler{,-gcc4}.h: Remove duplicate macros
       [not found] <1348615467-9850-1-git-send-email-daniel.santos@pobox.com>
@ 2012-09-25 23:30 ` Daniel Santos
  2012-09-25 23:30 ` [PATCH v5 7/25] compiler{,-gcc4}.h: Introduce __flatten function attribute Daniel Santos
       [not found] ` <1348618742.22822.39.camel@gandalf.local.home>
  2 siblings, 0 replies; 4+ messages in thread
From: Daniel Santos @ 2012-09-25 23:30 UTC (permalink / raw)
  To: Christopher Li, Daniel Santos, Andrew Morton, David Howells,
	David Daney, David Rientjes, linux-sparse, Pavel Pisa,
	Richard Weinberger, LKML, Michel Lespinasse, Andrea Arcangeli,
	Peter Zijlstra, Rik van Riel

__linktime_error() does the same thing as __compiletime_error() and is
only used in bug.h.  Since the macro defines a function attribute that
will cause a failure at compile-time (not link-time), it makes more
sense to keep __compiletime_error(), which is also neatly mated with
__compiletime_warning().

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

diff --git a/include/linux/compiler-gcc4.h b/include/linux/compiler-gcc4.h
index 7ad60cd..5755e23 100644
--- a/include/linux/compiler-gcc4.h
+++ b/include/linux/compiler-gcc4.h
@@ -33,8 +33,6 @@
    the kernel context */
 #define __cold			__attribute__((__cold__))
 
-#define __linktime_error(message) __attribute__((__error__(message)))

^ permalink raw reply related	[flat|nested] 4+ messages in thread

* [PATCH v5 7/25] compiler{,-gcc4}.h: Introduce __flatten function attribute
       [not found] <1348615467-9850-1-git-send-email-daniel.santos@pobox.com>
  2012-09-25 23:30 ` [PATCH v5 5/25] compiler{,-gcc4}.h: Remove duplicate macros Daniel Santos
@ 2012-09-25 23:30 ` Daniel Santos
       [not found] ` <1348618742.22822.39.camel@gandalf.local.home>
  2 siblings, 0 replies; 4+ messages in thread
From: Daniel Santos @ 2012-09-25 23:30 UTC (permalink / raw)
  To: Christopher Li, Daniel Santos, Andrew Morton, David Howells,
	David Daney, David Rientjes, linux-sparse, Pavel Pisa,
	Richard Weinberger, LKML, Michel Lespinasse, Andrea Arcangeli,
	Peter Zijlstra, Rik van Riel

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 5755e23..38fb81d 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 4d9f353..b26d606 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


^ permalink raw reply related	[flat|nested] 4+ messages in thread

* Re: [PATCH v5 0/25] Generic Red-Black Trees (still WIP)
       [not found] ` <1348618742.22822.39.camel@gandalf.local.home>
@ 2012-09-26  1:02   ` Daniel Santos
  2012-09-26  1:28     ` Steven Rostedt
  0 siblings, 1 reply; 4+ messages in thread
From: Daniel Santos @ 2012-09-26  1:02 UTC (permalink / raw)
  To: Steven Rostedt; +Cc: linux-doc, linux-sparse, LKML


>> Q&A
>> ===
>> Q: Why did you add BUILD_BUG_ON_NON_CONST() and
>>    BUILD_BUG_ON_NON_CONST42()?
> A: Because BUILD_BUG_ON_NON_CONST42() will crash if it does not result
> in the answer to life, the universe and everything!

By the way, I have a theory before time, God was writing code on some
cosmic computer (beyond our understanding, of course) when he
accidentally tried to divide by zero, resulting in a core dump that we
now know as the universe we live in.  So thus, we are just the excrement
of some celestial computer after it failed to properly execute its code.

Daniel

^ permalink raw reply	[flat|nested] 4+ messages in thread

* Re: [PATCH v5 0/25] Generic Red-Black Trees (still WIP)
  2012-09-26  1:02   ` [PATCH v5 0/25] Generic Red-Black Trees (still WIP) Daniel Santos
@ 2012-09-26  1:28     ` Steven Rostedt
  0 siblings, 0 replies; 4+ messages in thread
From: Steven Rostedt @ 2012-09-26  1:28 UTC (permalink / raw)
  To: Daniel Santos; +Cc: linux-doc, linux-sparse, LKML

On Tue, 2012-09-25 at 20:02 -0500, Daniel Santos wrote:
> >> Q&A
> >> ===
> >> Q: Why did you add BUILD_BUG_ON_NON_CONST() and
> >>    BUILD_BUG_ON_NON_CONST42()?
> > A: Because BUILD_BUG_ON_NON_CONST42() will crash if it does not result
> > in the answer to life, the universe and everything!
> 
> By the way, I have a theory before time, God was writing code on some
> cosmic computer (beyond our understanding, of course) when he
> accidentally tried to divide by zero, resulting in a core dump that we
> now know as the universe we live in.  So thus, we are just the excrement
> of some celestial computer after it failed to properly execute its code.
> 

And that operation on which God failed on was:

ans = 42 / 0

Which totally explains the point where... "to understand the answer, you
must first understand the question".

-- Steve


^ permalink raw reply	[flat|nested] 4+ messages in thread

end of thread, other threads:[~2012-09-26  1:28 UTC | newest]

Thread overview: 4+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
     [not found] <1348615467-9850-1-git-send-email-daniel.santos@pobox.com>
2012-09-25 23:30 ` [PATCH v5 5/25] compiler{,-gcc4}.h: Remove duplicate macros Daniel Santos
2012-09-25 23:30 ` [PATCH v5 7/25] compiler{,-gcc4}.h: Introduce __flatten function attribute Daniel Santos
     [not found] ` <1348618742.22822.39.camel@gandalf.local.home>
2012-09-26  1:02   ` [PATCH v5 0/25] Generic Red-Black Trees (still WIP) Daniel Santos
2012-09-26  1:28     ` Steven Rostedt

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).