mirror of
git://git.kernel.org/pub/scm/linux/kernel/git/xiang/erofs.git
synced 2026-11-08 10:31:43 +01:00
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 <[email protected]> Cc: Alexander Shishkin <[email protected]> Cc: Alexei Starovoitov <[email protected]> Cc: [email protected] Cc: Jakub Kicinski <[email protected]> Cc: Jiri Olsa <[email protected]> Cc: Mark Rutland <[email protected]> Cc: Namhyung Kim <[email protected]> Cc: Peter Zijlstra <[email protected]> Cc: Quentin Monnet <[email protected]> Cc: Stephane Eranian <[email protected]> Link: http://lore.kernel.org/lkml/[email protected] Signed-off-by: Arnaldo Carvalho de Melo <[email protected]>
57 lines
1.5 KiB
C
57 lines
1.5 KiB
C
/* SPDX-License-Identifier: GPL-2.0 */
|
|
#ifndef _TOOLS_LINUX_COMPILER_H_
|
|
#error "Please don't include <linux/compiler-gcc.h> directly, include <linux/compiler.h> instead."
|
|
#endif
|
|
|
|
/*
|
|
* Common definitions for all gcc versions go here.
|
|
*/
|
|
#ifndef GCC_VERSION
|
|
#define GCC_VERSION (__GNUC__ * 10000 \
|
|
+ __GNUC_MINOR__ * 100 \
|
|
+ __GNUC_PATCHLEVEL__)
|
|
#endif
|
|
|
|
#if GCC_VERSION >= 70000 && !defined(__CHECKER__)
|
|
# define __fallthrough __attribute__ ((fallthrough))
|
|
#endif
|
|
|
|
#if GCC_VERSION >= 40300
|
|
# define __compiletime_error(message) __attribute__((error(message)))
|
|
#endif /* GCC_VERSION >= 40300 */
|
|
|
|
/* &a[0] degrades to a pointer: a different type from an array */
|
|
#define __must_be_array(a) BUILD_BUG_ON_ZERO(__same_type((a), &(a)[0]))
|
|
|
|
#ifndef __pure
|
|
#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
|
|
#ifndef __noreturn
|
|
#define __noreturn __attribute__((noreturn))
|
|
#endif
|
|
#ifndef __aligned
|
|
#define __aligned(x) __attribute__((aligned(x)))
|
|
#endif
|
|
#define __printf(a, b) __attribute__((format(printf, a, b)))
|
|
#define __scanf(a, b) __attribute__((format(scanf, a, b)))
|
|
|
|
#if GCC_VERSION >= 50100
|
|
#define COMPILER_HAS_GENERIC_BUILTIN_OVERFLOW 1
|
|
#endif
|