[PATCH 1/3] tools compiler.h: Add attribute to disable tail calls

From: Ian Rogers
Date: Sat May 30 2020 - 04:20:40 EST


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.

Signed-off-by: Ian Rogers <irogers@xxxxxxxxxx>
---
tools/include/linux/compiler-gcc.h | 8 ++++++++
tools/include/linux/compiler.h | 3 +++
2 files changed, 11 insertions(+)

diff --git a/tools/include/linux/compiler-gcc.h b/tools/include/linux/compiler-gcc.h
index 95c072b70d0e..cda555b47d3d 100644
--- a/tools/include/linux/compiler-gcc.h
+++ b/tools/include/linux/compiler-gcc.h
@@ -27,6 +27,14 @@
#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
+#define __no_tail_call __attribute__((optimize("no-optimize-sibling-calls")))
+#endif
#ifndef __packed
#define __packed __attribute__((packed))
#endif
diff --git a/tools/include/linux/compiler.h b/tools/include/linux/compiler.h
index 180f7714a5f1..9f9002734e19 100644
--- a/tools/include/linux/compiler.h
+++ b/tools/include/linux/compiler.h
@@ -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
--
2.27.0.rc2.251.g90737beb825-goog