1 | /* SPDX-License-Identifier: GPL-2.0 */ |
2 | #ifndef __LINUX_COMPILER_TYPES_H |
3 | #error "Please don't include <linux/compiler-clang.h> directly, include <linux/compiler.h> instead." |
4 | #endif |
5 | |
6 | /* Compiler specific definitions for Clang compiler */ |
7 | |
8 | /* |
9 | * Clang prior to 17 is being silly and considers many __cleanup() variables |
10 | * as unused (because they are, their sole purpose is to go out of scope). |
11 | * |
12 | * https://reviews.llvm.org/D152180 |
13 | */ |
14 | #undef __cleanup |
15 | #define __cleanup(func) __maybe_unused __attribute__((__cleanup__(func))) |
16 | |
17 | /* all clang versions usable with the kernel support KASAN ABI version 5 */ |
18 | #define KASAN_ABI_VERSION 5 |
19 | |
20 | /* |
21 | * Note: Checking __has_feature(*_sanitizer) is only true if the feature is |
22 | * enabled. Therefore it is not required to additionally check defined(CONFIG_*) |
23 | * to avoid adding redundant attributes in other configurations. |
24 | */ |
25 | |
26 | #if __has_feature(address_sanitizer) || __has_feature(hwaddress_sanitizer) |
27 | /* Emulate GCC's __SANITIZE_ADDRESS__ flag */ |
28 | #define __SANITIZE_ADDRESS__ |
29 | #define __no_sanitize_address \ |
30 | __attribute__((no_sanitize("address", "hwaddress"))) |
31 | #else |
32 | #define __no_sanitize_address |
33 | #endif |
34 | |
35 | #if __has_feature(thread_sanitizer) |
36 | /* emulate gcc's __SANITIZE_THREAD__ flag */ |
37 | #define __SANITIZE_THREAD__ |
38 | #define __no_sanitize_thread \ |
39 | __attribute__((no_sanitize("thread"))) |
40 | #else |
41 | #define __no_sanitize_thread |
42 | #endif |
43 | |
44 | #if defined(CONFIG_ARCH_USE_BUILTIN_BSWAP) |
45 | #define __HAVE_BUILTIN_BSWAP32__ |
46 | #define __HAVE_BUILTIN_BSWAP64__ |
47 | #define __HAVE_BUILTIN_BSWAP16__ |
48 | #endif /* CONFIG_ARCH_USE_BUILTIN_BSWAP */ |
49 | |
50 | #if __has_feature(undefined_behavior_sanitizer) |
51 | /* GCC does not have __SANITIZE_UNDEFINED__ */ |
52 | #define __no_sanitize_undefined \ |
53 | __attribute__((no_sanitize("undefined"))) |
54 | #else |
55 | #define __no_sanitize_undefined |
56 | #endif |
57 | |
58 | #if __has_feature(memory_sanitizer) |
59 | #define __SANITIZE_MEMORY__ |
60 | /* |
61 | * Unlike other sanitizers, KMSAN still inserts code into functions marked with |
62 | * no_sanitize("kernel-memory"). Using disable_sanitizer_instrumentation |
63 | * provides the behavior consistent with other __no_sanitize_ attributes, |
64 | * guaranteeing that __no_sanitize_memory functions remain uninstrumented. |
65 | */ |
66 | #define __no_sanitize_memory __disable_sanitizer_instrumentation |
67 | |
68 | /* |
69 | * The __no_kmsan_checks attribute ensures that a function does not produce |
70 | * false positive reports by: |
71 | * - initializing all local variables and memory stores in this function; |
72 | * - skipping all shadow checks; |
73 | * - passing initialized arguments to this function's callees. |
74 | */ |
75 | #define __no_kmsan_checks __attribute__((no_sanitize("kernel-memory"))) |
76 | #else |
77 | #define __no_sanitize_memory |
78 | #define __no_kmsan_checks |
79 | #endif |
80 | |
81 | /* |
82 | * Support for __has_feature(coverage_sanitizer) was added in Clang 13 together |
83 | * with no_sanitize("coverage"). Prior versions of Clang support coverage |
84 | * instrumentation, but cannot be queried for support by the preprocessor. |
85 | */ |
86 | #if __has_feature(coverage_sanitizer) |
87 | #define __no_sanitize_coverage __attribute__((no_sanitize("coverage"))) |
88 | #else |
89 | #define __no_sanitize_coverage |
90 | #endif |
91 | |
92 | #if __has_feature(shadow_call_stack) |
93 | # define __noscs __attribute__((__no_sanitize__("shadow-call-stack"))) |
94 | #endif |
95 | |
96 | #if __has_feature(kcfi) |
97 | /* Disable CFI checking inside a function. */ |
98 | #define __nocfi __attribute__((__no_sanitize__("kcfi"))) |
99 | #endif |
100 | |
101 | /* |
102 | * Turn individual warnings and errors on and off locally, depending |
103 | * on version. |
104 | */ |
105 | #define __diag_clang(version, severity, s) \ |
106 | __diag_clang_ ## version(__diag_clang_ ## severity s) |
107 | |
108 | /* Severity used in pragma directives */ |
109 | #define __diag_clang_ignore ignored |
110 | #define __diag_clang_warn warning |
111 | #define __diag_clang_error error |
112 | |
113 | #define __diag_str1(s) #s |
114 | #define __diag_str(s) __diag_str1(s) |
115 | #define __diag(s) _Pragma(__diag_str(clang diagnostic s)) |
116 | |
117 | #if CONFIG_CLANG_VERSION >= 110000 |
118 | #define __diag_clang_11(s) __diag(s) |
119 | #else |
120 | #define __diag_clang_11(s) |
121 | #endif |
122 | |
123 | #define __diag_ignore_all(option, comment) \ |
124 | __diag_clang(11, ignore, option) |
125 | |