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