1*436bf2bcSAndroid Build Coastguard Worker /* SPDX-License-Identifier: GPL-2.0 */ 2*436bf2bcSAndroid Build Coastguard Worker #ifndef _TOOLS_LINUX_COMPILER_H_ 3*436bf2bcSAndroid Build Coastguard Worker #error "Please don't include <linux/compiler-gcc.h> directly, include <linux/compiler.h> instead." 4*436bf2bcSAndroid Build Coastguard Worker #endif 5*436bf2bcSAndroid Build Coastguard Worker 6*436bf2bcSAndroid Build Coastguard Worker /* 7*436bf2bcSAndroid Build Coastguard Worker * Common definitions for all gcc versions go here. 8*436bf2bcSAndroid Build Coastguard Worker */ 9*436bf2bcSAndroid Build Coastguard Worker #ifndef GCC_VERSION 10*436bf2bcSAndroid Build Coastguard Worker #define GCC_VERSION (__GNUC__ * 10000 \ 11*436bf2bcSAndroid Build Coastguard Worker + __GNUC_MINOR__ * 100 \ 12*436bf2bcSAndroid Build Coastguard Worker + __GNUC_PATCHLEVEL__) 13*436bf2bcSAndroid Build Coastguard Worker #endif 14*436bf2bcSAndroid Build Coastguard Worker 15*436bf2bcSAndroid Build Coastguard Worker #if GCC_VERSION >= 70000 && !defined(__CHECKER__) 16*436bf2bcSAndroid Build Coastguard Worker # define __fallthrough __attribute__ ((fallthrough)) 17*436bf2bcSAndroid Build Coastguard Worker #endif 18*436bf2bcSAndroid Build Coastguard Worker 19*436bf2bcSAndroid Build Coastguard Worker #if GCC_VERSION >= 40300 20*436bf2bcSAndroid Build Coastguard Worker # define __compiletime_error(message) __attribute__((error(message))) 21*436bf2bcSAndroid Build Coastguard Worker #endif /* GCC_VERSION >= 40300 */ 22*436bf2bcSAndroid Build Coastguard Worker 23*436bf2bcSAndroid Build Coastguard Worker /* &a[0] degrades to a pointer: a different type from an array */ 24*436bf2bcSAndroid Build Coastguard Worker #define __must_be_array(a) BUILD_BUG_ON_ZERO(__same_type((a), &(a)[0])) 25*436bf2bcSAndroid Build Coastguard Worker 26*436bf2bcSAndroid Build Coastguard Worker #ifndef __pure 27*436bf2bcSAndroid Build Coastguard Worker #define __pure __attribute__((pure)) 28*436bf2bcSAndroid Build Coastguard Worker #endif 29*436bf2bcSAndroid Build Coastguard Worker #define noinline __attribute__((noinline)) 30*436bf2bcSAndroid Build Coastguard Worker #ifdef __has_attribute 31*436bf2bcSAndroid Build Coastguard Worker #if __has_attribute(disable_tail_calls) 32*436bf2bcSAndroid Build Coastguard Worker #define __no_tail_call __attribute__((disable_tail_calls)) 33*436bf2bcSAndroid Build Coastguard Worker #endif 34*436bf2bcSAndroid Build Coastguard Worker #endif 35*436bf2bcSAndroid Build Coastguard Worker #ifndef __no_tail_call 36*436bf2bcSAndroid Build Coastguard Worker #if GCC_VERSION > 40201 37*436bf2bcSAndroid Build Coastguard Worker #define __no_tail_call __attribute__((optimize("no-optimize-sibling-calls"))) 38*436bf2bcSAndroid Build Coastguard Worker #else 39*436bf2bcSAndroid Build Coastguard Worker #define __no_tail_call 40*436bf2bcSAndroid Build Coastguard Worker #endif 41*436bf2bcSAndroid Build Coastguard Worker #endif 42*436bf2bcSAndroid Build Coastguard Worker #ifndef __packed 43*436bf2bcSAndroid Build Coastguard Worker #define __packed __attribute__((packed)) 44*436bf2bcSAndroid Build Coastguard Worker #endif 45*436bf2bcSAndroid Build Coastguard Worker #ifndef __noreturn 46*436bf2bcSAndroid Build Coastguard Worker #define __noreturn __attribute__((noreturn)) 47*436bf2bcSAndroid Build Coastguard Worker #endif 48*436bf2bcSAndroid Build Coastguard Worker #ifndef __aligned 49*436bf2bcSAndroid Build Coastguard Worker #define __aligned(x) __attribute__((aligned(x))) 50*436bf2bcSAndroid Build Coastguard Worker #endif 51*436bf2bcSAndroid Build Coastguard Worker #define __printf(a, b) __attribute__((format(printf, a, b))) 52*436bf2bcSAndroid Build Coastguard Worker #define __scanf(a, b) __attribute__((format(scanf, a, b))) 53*436bf2bcSAndroid Build Coastguard Worker 54*436bf2bcSAndroid Build Coastguard Worker #if GCC_VERSION >= 50100 55*436bf2bcSAndroid Build Coastguard Worker #define COMPILER_HAS_GENERIC_BUILTIN_OVERFLOW 1 56*436bf2bcSAndroid Build Coastguard Worker #endif 57