File tree 4 files changed +30
-15
lines changed
4 files changed +30
-15
lines changed Original file line number Diff line number Diff line change @@ -388,8 +388,8 @@ static void lkdtm_FAM_BOUNDS(void)
388
388
389
389
pr_err ("FAIL: survived access of invalid flexible array member index!\n" );
390
390
391
- if (!__has_attribute ( __counted_by__ ))
392
- pr_warn ("This is expected since this %s was built a compiler supporting __counted_by\n" ,
391
+ if (!IS_ENABLED ( CONFIG_CC_HAS_COUNTED_BY ))
392
+ pr_warn ("This is expected since this %s was built with a compiler that does not support __counted_by\n" ,
393
393
lkdtm_kernel_info );
394
394
else if (IS_ENABLED (CONFIG_UBSAN_BOUNDS ))
395
395
pr_expected_config (CONFIG_UBSAN_TRAP );
Original file line number Diff line number Diff line change 94
94
# define __copy (symbol )
95
95
#endif
96
96
97
- /*
98
- * Optional: only supported since gcc >= 14
99
- * Optional: only supported since clang >= 18
100
- *
101
- * gcc: https://gcc.gnu.org/bugzilla/show_bug.cgi?id=108896
102
- * clang: https://reviews.llvm.org/D148381
103
- */
104
- #if __has_attribute (__counted_by__ )
105
- # define __counted_by (member ) __attribute__((__counted_by__(member)))
106
- #else
107
- # define __counted_by (member )
108
- #endif
109
-
110
97
/*
111
98
* Optional: not supported by gcc
112
99
* Optional: only supported since clang >= 14.0
Original file line number Diff line number Diff line change @@ -295,6 +295,25 @@ struct ftrace_likely_data {
295
295
#define __no_sanitize_or_inline __always_inline
296
296
#endif
297
297
298
+ /*
299
+ * Optional: only supported since gcc >= 15
300
+ * Optional: only supported since clang >= 18
301
+ *
302
+ * gcc: https://gcc.gnu.org/bugzilla/show_bug.cgi?id=108896
303
+ * clang: https://github.com/llvm/llvm-project/pull/76348
304
+ *
305
+ * __bdos on clang < 19.1.2 can erroneously return 0:
306
+ * https://github.com/llvm/llvm-project/pull/110497
307
+ *
308
+ * __bdos on clang < 19.1.3 can be off by 4:
309
+ * https://github.com/llvm/llvm-project/pull/112636
310
+ */
311
+ #ifdef CONFIG_CC_HAS_COUNTED_BY
312
+ # define __counted_by (member ) __attribute__((__counted_by__(member)))
313
+ #else
314
+ # define __counted_by (member )
315
+ #endif
316
+
298
317
/* Section for code which can't be instrumented at all */
299
318
#define __noinstr_section (section ) \
300
319
noinline notrace __attribute((__section__(section))) \
Original file line number Diff line number Diff line change @@ -107,6 +107,15 @@ config CC_HAS_ASM_INLINE
107
107
config CC_HAS_NO_PROFILE_FN_ATTR
108
108
def_bool $(success,echo '__attribute__((no_profile_instrument_function)) int x();' | $(CC) -x c - -c -o /dev/null -Werror)
109
109
110
+ config CC_HAS_COUNTED_BY
111
+ # TODO: when gcc 15 is released remove the build test and add
112
+ # a gcc version check
113
+ def_bool $(success,echo 'struct flex { int count; int array[] __attribute__((__counted_by__(count))); };' | $(CC) $(CLANG_FLAGS) -x c - -c -o /dev/null -Werror)
114
+ # clang needs to be at least 19.1.3 to avoid __bdos miscalculations
115
+ # https://github.com/llvm/llvm-project/pull/110497
116
+ # https://github.com/llvm/llvm-project/pull/112636
117
+ depends on !(CC_IS_CLANG && CLANG_VERSION < 190103)
118
+
110
119
config PAHOLE_VERSION
111
120
int
112
121
default $(shell,$(srctree)/scripts/pahole-version.sh $(PAHOLE))
You can’t perform that action at this time.
0 commit comments