tools compiler.h: Add attribute to disable tail calls
authorIan Rogers <irogers@google.com>
Sat, 30 May 2020 08:20:13 +0000 (01:20 -0700)
committerArnaldo Carvalho de Melo <acme@redhat.com>
Mon, 1 Jun 2020 15:24:21 +0000 (12:24 -0300)
Tail call optimizations can remove stack frames that are used in
unwinding tests. Add an attribute that can be used to disable the tail
call optimization. Tested  on clang and GCC.

Committer notes:

Old versions of clang don't like that __attribute__((optimize)), so add
an ifdef to make it go away.

Signed-off-by: Ian Rogers <irogers@google.com>
Cc: Alexander Shishkin <alexander.shishkin@linux.intel.com>
Cc: Alexei Starovoitov <ast@kernel.org>
Cc: clang-built-linux@googlegroups.com
Cc: Jakub Kicinski <kuba@kernel.org>
Cc: Jiri Olsa <jolsa@redhat.com>
Cc: Mark Rutland <mark.rutland@arm.com>
Cc: Namhyung Kim <namhyung@kernel.org>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Quentin Monnet <quentin@isovalent.com>
Cc: Stephane Eranian <eranian@google.com>
Link: http://lore.kernel.org/lkml/20200530082015.39162-2-irogers@google.com
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
tools/include/linux/compiler-gcc.h
tools/include/linux/compiler.h

index 95c072b70d0e832f70a4ac07470bcd0d1ed46deb..b9d4322e1e6551f3e987624073a08a9b3368b7f8 100644 (file)
 #define  __pure                __attribute__((pure))
 #endif
 #define  noinline      __attribute__((noinline))
+#ifdef __has_attribute
+#if __has_attribute(disable_tail_calls)
+#define __no_tail_call __attribute__((disable_tail_calls))
+#endif
+#endif
+#ifndef __no_tail_call
+#if GCC_VERSION > 40201
+#define __no_tail_call __attribute__((optimize("no-optimize-sibling-calls")))
+#else
+#define __no_tail_call
+#endif
+#endif
 #ifndef __packed
 #define __packed       __attribute__((packed))
 #endif
index 180f7714a5f10c75e53ffd883b0b6f680cdb6a37..9f9002734e19200506ec1bca8613674d74988181 100644 (file)
@@ -47,6 +47,9 @@
 #ifndef noinline
 #define noinline
 #endif
+#ifndef __no_tail_call
+#define __no_tail_call
+#endif
 
 /* Are two types/vars the same type (ignoring qualifiers)? */
 #ifndef __same_type