Warning: This file is not a C or C++ file. It does not have highlighting.
1 | /* SPDX-License-Identifier: GPL-2.0 */ |
---|---|
2 | #ifndef __LINUX_COMPILER_TYPES_H |
3 | #error "Please don't include <linux/compiler-gcc.h> directly, include <linux/compiler.h> instead." |
4 | #endif |
5 | |
6 | /* |
7 | * Common definitions for all gcc versions go here. |
8 | */ |
9 | #define GCC_VERSION (__GNUC__ * 10000 \ |
10 | + __GNUC_MINOR__ * 100 \ |
11 | + __GNUC_PATCHLEVEL__) |
12 | |
13 | /* |
14 | * This macro obfuscates arithmetic on a variable address so that gcc |
15 | * shouldn't recognize the original var, and make assumptions about it. |
16 | * |
17 | * This is needed because the C standard makes it undefined to do |
18 | * pointer arithmetic on "objects" outside their boundaries and the |
19 | * gcc optimizers assume this is the case. In particular they |
20 | * assume such arithmetic does not wrap. |
21 | * |
22 | * A miscompilation has been observed because of this on PPC. |
23 | * To work around it we hide the relationship of the pointer and the object |
24 | * using this macro. |
25 | * |
26 | * Versions of the ppc64 compiler before 4.1 had a bug where use of |
27 | * RELOC_HIDE could trash r30. The bug can be worked around by changing |
28 | * the inline assembly constraint from =g to =r, in this particular |
29 | * case either is valid. |
30 | */ |
31 | #define RELOC_HIDE(ptr, off) \ |
32 | ({ \ |
33 | unsigned long __ptr; \ |
34 | __asm__ ("" : "=r"(__ptr) : "0"(ptr)); \ |
35 | (typeof(ptr)) (__ptr + (off)); \ |
36 | }) |
37 | |
38 | #ifdef CONFIG_RETPOLINE |
39 | #define __noretpoline __attribute__((__indirect_branch__("keep"))) |
40 | #endif |
41 | |
42 | #if defined(LATENT_ENTROPY_PLUGIN) && !defined(__CHECKER__) |
43 | #define __latent_entropy __attribute__((latent_entropy)) |
44 | #endif |
45 | |
46 | /* |
47 | * calling noreturn functions, __builtin_unreachable() and __builtin_trap() |
48 | * confuse the stack allocation in gcc, leading to overly large stack |
49 | * frames, see https://gcc.gnu.org/bugzilla/show_bug.cgi?id=82365 |
50 | * |
51 | * Adding an empty inline assembly before it works around the problem |
52 | */ |
53 | #define barrier_before_unreachable() asm volatile("") |
54 | |
55 | /* |
56 | * Mark a position in code as unreachable. This can be used to |
57 | * suppress control flow warnings after asm blocks that transfer |
58 | * control elsewhere. |
59 | */ |
60 | #define unreachable() \ |
61 | do { \ |
62 | annotate_unreachable(); \ |
63 | barrier_before_unreachable(); \ |
64 | __builtin_unreachable(); \ |
65 | } while (0) |
66 | |
67 | #if defined(CONFIG_ARCH_USE_BUILTIN_BSWAP) |
68 | #define __HAVE_BUILTIN_BSWAP32__ |
69 | #define __HAVE_BUILTIN_BSWAP64__ |
70 | #define __HAVE_BUILTIN_BSWAP16__ |
71 | #endif /* CONFIG_ARCH_USE_BUILTIN_BSWAP */ |
72 | |
73 | #if GCC_VERSION >= 70000 |
74 | #define KASAN_ABI_VERSION 5 |
75 | #else |
76 | #define KASAN_ABI_VERSION 4 |
77 | #endif |
78 | |
79 | #ifdef CONFIG_SHADOW_CALL_STACK |
80 | #define __noscs __attribute__((__no_sanitize__("shadow-call-stack"))) |
81 | #endif |
82 | |
83 | #define __no_sanitize_address __attribute__((__no_sanitize_address__)) |
84 | |
85 | #if defined(__SANITIZE_THREAD__) |
86 | #define __no_sanitize_thread __attribute__((__no_sanitize_thread__)) |
87 | #else |
88 | #define __no_sanitize_thread |
89 | #endif |
90 | |
91 | #define __no_sanitize_undefined __attribute__((__no_sanitize_undefined__)) |
92 | |
93 | /* |
94 | * Only supported since gcc >= 12 |
95 | */ |
96 | #if defined(CONFIG_KCOV) && __has_attribute(__no_sanitize_coverage__) |
97 | #define __no_sanitize_coverage __attribute__((__no_sanitize_coverage__)) |
98 | #else |
99 | #define __no_sanitize_coverage |
100 | #endif |
101 | |
102 | /* |
103 | * Treat __SANITIZE_HWADDRESS__ the same as __SANITIZE_ADDRESS__ in the kernel, |
104 | * matching the defines used by Clang. |
105 | */ |
106 | #ifdef __SANITIZE_HWADDRESS__ |
107 | #define __SANITIZE_ADDRESS__ |
108 | #endif |
109 | |
110 | /* |
111 | * GCC does not support KMSAN. |
112 | */ |
113 | #define __no_sanitize_memory |
114 | #define __no_kmsan_checks |
115 | |
116 | /* |
117 | * Turn individual warnings and errors on and off locally, depending |
118 | * on version. |
119 | */ |
120 | #define __diag_GCC(version, severity, s) \ |
121 | __diag_GCC_ ## version(__diag_GCC_ ## severity s) |
122 | |
123 | /* Severity used in pragma directives */ |
124 | #define __diag_GCC_ignore ignored |
125 | #define __diag_GCC_warn warning |
126 | #define __diag_GCC_error error |
127 | |
128 | #define __diag_str1(s) #s |
129 | #define __diag_str(s) __diag_str1(s) |
130 | #define __diag(s) _Pragma(__diag_str(GCC diagnostic s)) |
131 | |
132 | #if GCC_VERSION >= 80000 |
133 | #define __diag_GCC_8(s) __diag(s) |
134 | #else |
135 | #define __diag_GCC_8(s) |
136 | #endif |
137 | |
138 | #define __diag_ignore_all(option, comment) \ |
139 | __diag_GCC(8, ignore, option) |
140 | |
141 | /* |
142 | * Prior to 9.1, -Wno-alloc-size-larger-than (and therefore the "alloc_size" |
143 | * attribute) do not work, and must be disabled. |
144 | */ |
145 | #if GCC_VERSION < 90100 |
146 | #undef __alloc_size__ |
147 | #endif |
148 |
Warning: This file is not a C or C++ file. It does not have highlighting.