xref: /freebsd/sys/contrib/openzfs/config/always-compiler-options.m4 (revision 24e4dcf4ba5e9dedcf89efd358ea3e1fe5867020)
1dnl #
2dnl # Enabled -fsanitize=address if supported by $CC.
3dnl #
4dnl # LDFLAGS needs -fsanitize=address at all times so libraries compiled with
5dnl # it will be linked successfully. CFLAGS will vary by binary being built.
6dnl #
7dnl # The ASAN_OPTIONS environment variable can be used to further control
8dnl # the behavior of binaries and libraries build with -fsanitize=address.
9dnl #
10AC_DEFUN([ZFS_AC_CONFIG_ALWAYS_CC_ASAN], [
11	AC_MSG_CHECKING([whether to build with -fsanitize=address support])
12	AC_ARG_ENABLE([asan],
13		[AS_HELP_STRING([--enable-asan],
14		[Enable -fsanitize=address support  @<:@default=no@:>@])],
15		[],
16		[enable_asan=no])
17
18	AM_CONDITIONAL([ASAN_ENABLED], [test x$enable_asan = xyes])
19	AC_SUBST([ASAN_ENABLED], [$enable_asan])
20	AC_MSG_RESULT($enable_asan)
21
22	AS_IF([ test "$enable_asan" = "yes" ], [
23		AC_MSG_CHECKING([whether $CC supports -fsanitize=address])
24		saved_cflags="$CFLAGS"
25		CFLAGS="$CFLAGS -Werror -fsanitize=address"
26		AC_LINK_IFELSE([
27			AC_LANG_SOURCE([[ int main() { return 0; } ]])
28		], [
29			ASAN_CFLAGS="-fsanitize=address"
30			ASAN_LDFLAGS="-fsanitize=address"
31			ASAN_ZFS="_with_asan"
32			AC_MSG_RESULT([yes])
33		], [
34			AC_MSG_ERROR([$CC does not support -fsanitize=address])
35		])
36		CFLAGS="$saved_cflags"
37	], [
38		ASAN_CFLAGS=""
39		ASAN_LDFLAGS=""
40		ASAN_ZFS="_without_asan"
41	])
42
43	AC_SUBST([ASAN_CFLAGS])
44	AC_SUBST([ASAN_LDFLAGS])
45	AC_SUBST([ASAN_ZFS])
46])
47
48dnl #
49dnl # Enabled -fsanitize=undefined if supported by cc.
50dnl #
51dnl # LDFLAGS needs -fsanitize=undefined at all times so libraries compiled with
52dnl # it will be linked successfully. CFLAGS will vary by binary being built.
53dnl #
54dnl # The UBSAN_OPTIONS environment variable can be used to further control
55dnl # the behavior of binaries and libraries build with -fsanitize=undefined.
56dnl #
57AC_DEFUN([ZFS_AC_CONFIG_ALWAYS_CC_UBSAN], [
58	AC_MSG_CHECKING([whether to build with -fsanitize=undefined support])
59	AC_ARG_ENABLE([ubsan],
60		[AS_HELP_STRING([--enable-ubsan],
61		[Enable -fsanitize=undefined support  @<:@default=no@:>@])],
62		[],
63		[enable_ubsan=no])
64
65	AM_CONDITIONAL([UBSAN_ENABLED], [test x$enable_ubsan = xyes])
66	AC_SUBST([UBSAN_ENABLED], [$enable_ubsan])
67	AC_MSG_RESULT($enable_ubsan)
68
69	AS_IF([ test "$enable_ubsan" = "yes" ], [
70		AC_MSG_CHECKING([whether $CC supports -fsanitize=undefined])
71		saved_cflags="$CFLAGS"
72		CFLAGS="$CFLAGS -Werror -fsanitize=undefined"
73		AC_LINK_IFELSE([
74			AC_LANG_SOURCE([[ int main() { return 0; } ]])
75		], [
76			UBSAN_CFLAGS="-fsanitize=undefined"
77			UBSAN_LDFLAGS="-fsanitize=undefined"
78			UBSAN_ZFS="_with_ubsan"
79			AC_MSG_RESULT([yes])
80		], [
81			AC_MSG_ERROR([$CC does not support -fsanitize=undefined])
82		])
83		CFLAGS="$saved_cflags"
84	], [
85		UBSAN_CFLAGS=""
86		UBSAN_LDFLAGS=""
87		UBSAN_ZFS="_without_ubsan"
88	])
89
90	AC_SUBST([UBSAN_CFLAGS])
91	AC_SUBST([UBSAN_LDFLAGS])
92	AC_SUBST([UBSAN_ZFS])
93])
94
95dnl #
96dnl # Check if cc supports -Wframe-larger-than=<size> option.
97dnl #
98AC_DEFUN([ZFS_AC_CONFIG_ALWAYS_CC_FRAME_LARGER_THAN], [
99	AC_MSG_CHECKING([whether $CC supports -Wframe-larger-than=<size>])
100
101	saved_flags="$CFLAGS"
102	CFLAGS="$CFLAGS -Werror -Wframe-larger-than=4096"
103
104	AC_COMPILE_IFELSE([AC_LANG_PROGRAM([], [])], [
105		FRAME_LARGER_THAN="-Wframe-larger-than=4096"
106		AC_MSG_RESULT([yes])
107	], [
108		FRAME_LARGER_THAN=""
109		AC_MSG_RESULT([no])
110	])
111
112	CFLAGS="$saved_flags"
113	AC_SUBST([FRAME_LARGER_THAN])
114])
115
116dnl #
117dnl # Check if cc supports -Wno-format-truncation option.
118dnl #
119AC_DEFUN([ZFS_AC_CONFIG_ALWAYS_CC_NO_FORMAT_TRUNCATION], [
120	AC_MSG_CHECKING([whether $CC supports -Wno-format-truncation])
121
122	saved_flags="$CFLAGS"
123	CFLAGS="$CFLAGS -Werror -Wno-format-truncation"
124
125	AC_COMPILE_IFELSE([AC_LANG_PROGRAM([], [])], [
126		NO_FORMAT_TRUNCATION=-Wno-format-truncation
127		AC_MSG_RESULT([yes])
128	], [
129		NO_FORMAT_TRUNCATION=
130		AC_MSG_RESULT([no])
131	])
132
133	CFLAGS="$saved_flags"
134	AC_SUBST([NO_FORMAT_TRUNCATION])
135])
136
137dnl #
138dnl # Check if cc supports -Wno-format-zero-length option.
139dnl #
140AC_DEFUN([ZFS_AC_CONFIG_ALWAYS_CC_NO_FORMAT_ZERO_LENGTH], [
141	AC_MSG_CHECKING([whether $CC supports -Wno-format-zero-length])
142
143	saved_flags="$CFLAGS"
144	CFLAGS="$CFLAGS -Werror -Wno-format-zero-length"
145
146	AC_COMPILE_IFELSE([AC_LANG_PROGRAM([], [])], [
147		NO_FORMAT_ZERO_LENGTH=-Wno-format-zero-length
148		AC_MSG_RESULT([yes])
149	], [
150		NO_FORMAT_ZERO_LENGTH=
151		AC_MSG_RESULT([no])
152	])
153
154	CFLAGS="$saved_flags"
155	AC_SUBST([NO_FORMAT_ZERO_LENGTH])
156])
157
158dnl #
159dnl # Check if kernel cc supports -Wno-format-zero-length option.
160dnl #
161AC_DEFUN([ZFS_AC_CONFIG_ALWAYS_KERNEL_CC_NO_FORMAT_ZERO_LENGTH], [
162	saved_cc="$CC"
163	AS_IF(
164		[ test -n "$KERNEL_CC" ], [ CC="$KERNEL_CC" ],
165		[ test -n "$KERNEL_LLVM" ], [ CC="clang" ],
166		[ CC="gcc" ]
167	)
168	AC_MSG_CHECKING([whether $CC supports -Wno-format-zero-length])
169
170	saved_flags="$CFLAGS"
171	CFLAGS="$CFLAGS -Werror -Wno-format-zero-length"
172
173	AC_COMPILE_IFELSE([AC_LANG_PROGRAM([], [])], [
174		KERNEL_NO_FORMAT_ZERO_LENGTH=-Wno-format-zero-length
175		AC_MSG_RESULT([yes])
176	], [
177		KERNEL_NO_FORMAT_ZERO_LENGTH=
178		AC_MSG_RESULT([no])
179	])
180
181	CC="$saved_cc"
182	CFLAGS="$saved_flags"
183	AC_SUBST([KERNEL_NO_FORMAT_ZERO_LENGTH])
184])
185
186dnl #
187dnl # Check if cc supports -Wno-clobbered option.
188dnl #
189dnl # We actually invoke it with the -Wclobbered option
190dnl # and infer the 'no-' version does or doesn't exist based upon
191dnl # the results.  This is required because when checking any of
192dnl # no- prefixed options gcc always returns success.
193dnl #
194AC_DEFUN([ZFS_AC_CONFIG_ALWAYS_CC_NO_CLOBBERED], [
195	AC_MSG_CHECKING([whether $CC supports -Wno-clobbered])
196
197	saved_flags="$CFLAGS"
198	CFLAGS="$CFLAGS -Werror -Wclobbered"
199
200	AC_COMPILE_IFELSE([AC_LANG_PROGRAM([], [])], [
201		NO_CLOBBERED=-Wno-clobbered
202		AC_MSG_RESULT([yes])
203	], [
204		NO_CLOBBERED=
205		AC_MSG_RESULT([no])
206	])
207
208	CFLAGS="$saved_flags"
209	AC_SUBST([NO_CLOBBERED])
210])
211
212dnl #
213dnl # Check if cc supports -Wno-atomic-alignment option.
214dnl #
215AC_DEFUN([ZFS_AC_CONFIG_ALWAYS_CC_NO_ATOMIC_ALIGNMENT], [
216	AC_MSG_CHECKING([whether $CC supports -Wno-atomic-alignment])
217
218	saved_flags="$CFLAGS"
219	CFLAGS="$CFLAGS -Werror -Wno-atomic-alignment"
220
221	AC_COMPILE_IFELSE([AC_LANG_PROGRAM([], [])], [
222		NO_ATOMIC_ALIGNMENT=-Wno-atomic-alignment
223		AC_MSG_RESULT([yes])
224	], [
225		NO_ATOMIC_ALIGNMENT=
226		AC_MSG_RESULT([no])
227	])
228
229	CFLAGS="$saved_flags"
230	AC_SUBST([NO_ATOMIC_ALIGNMENT])
231])
232
233dnl #
234dnl # Check if cc supports -Wimplicit-fallthrough option.
235dnl #
236AC_DEFUN([ZFS_AC_CONFIG_ALWAYS_CC_IMPLICIT_FALLTHROUGH], [
237	AC_MSG_CHECKING([whether $CC supports -Wimplicit-fallthrough])
238
239	saved_flags="$CFLAGS"
240	CFLAGS="$CFLAGS -Werror -Wimplicit-fallthrough"
241
242	AC_COMPILE_IFELSE([AC_LANG_PROGRAM([], [])], [
243		IMPLICIT_FALLTHROUGH=-Wimplicit-fallthrough
244		AC_DEFINE([HAVE_IMPLICIT_FALLTHROUGH], 1,
245			[Define if compiler supports -Wimplicit-fallthrough])
246		AC_MSG_RESULT([yes])
247	], [
248		IMPLICIT_FALLTHROUGH=
249		AC_MSG_RESULT([no])
250	])
251
252	CFLAGS="$saved_flags"
253	AC_SUBST([IMPLICIT_FALLTHROUGH])
254])
255
256dnl #
257dnl # Check if cc supports -Winfinite-recursion option.
258dnl #
259AC_DEFUN([ZFS_AC_CONFIG_ALWAYS_CC_INFINITE_RECURSION], [
260	AC_MSG_CHECKING([whether $CC supports -Winfinite-recursion])
261
262	saved_flags="$CFLAGS"
263	CFLAGS="$CFLAGS -Werror -Winfinite-recursion"
264
265	AC_COMPILE_IFELSE([AC_LANG_PROGRAM([], [])], [
266		INFINITE_RECURSION=-Winfinite-recursion
267		AC_DEFINE([HAVE_INFINITE_RECURSION], 1,
268			[Define if compiler supports -Winfinite-recursion])
269		AC_MSG_RESULT([yes])
270	], [
271		INFINITE_RECURSION=
272		AC_MSG_RESULT([no])
273	])
274
275	CFLAGS="$saved_flags"
276	AC_SUBST([INFINITE_RECURSION])
277])
278
279dnl #
280dnl # Check if kernel cc supports -Winfinite-recursion option.
281dnl #
282AC_DEFUN([ZFS_AC_CONFIG_ALWAYS_KERNEL_CC_INFINITE_RECURSION], [
283	saved_cc="$CC"
284	AS_IF(
285		[ test -n "$KERNEL_CC" ], [ CC="$KERNEL_CC" ],
286		[ test -n "$KERNEL_LLVM" ], [ CC="clang" ],
287		[ CC="gcc" ]
288	)
289	AC_MSG_CHECKING([whether $CC supports -Winfinite-recursion])
290
291	saved_flags="$CFLAGS"
292	CFLAGS="$CFLAGS -Werror -Winfinite-recursion"
293
294	AC_COMPILE_IFELSE([AC_LANG_PROGRAM([], [])], [
295		KERNEL_INFINITE_RECURSION=-Winfinite-recursion
296		AC_DEFINE([HAVE_KERNEL_INFINITE_RECURSION], 1,
297			[Define if compiler supports -Winfinite-recursion])
298		AC_MSG_RESULT([yes])
299	], [
300		KERNEL_INFINITE_RECURSION=
301		AC_MSG_RESULT([no])
302	])
303
304	CC="$saved_cc"
305	CFLAGS="$saved_flags"
306	AC_SUBST([KERNEL_INFINITE_RECURSION])
307])
308
309dnl #
310dnl # Check if cc supports -Wformat-overflow option.
311dnl #
312AC_DEFUN([ZFS_AC_CONFIG_ALWAYS_CC_FORMAT_OVERFLOW], [
313	AC_MSG_CHECKING([whether $CC supports -Wformat-overflow])
314
315	saved_flags="$CFLAGS"
316	CFLAGS="$CFLAGS -Werror -Wformat-overflow"
317
318	AC_COMPILE_IFELSE([AC_LANG_PROGRAM([], [])], [
319		FORMAT_OVERFLOW=-Wformat-overflow
320		AC_DEFINE([HAVE_FORMAT_OVERFLOW], 1,
321			[Define if compiler supports -Wformat-overflow])
322		AC_MSG_RESULT([yes])
323	], [
324		FORMAT_OVERFLOW=
325		AC_MSG_RESULT([no])
326	])
327
328	CFLAGS="$saved_flags"
329	AC_SUBST([FORMAT_OVERFLOW])
330])
331
332dnl #
333dnl # Check if cc supports -fno-omit-frame-pointer option.
334dnl #
335AC_DEFUN([ZFS_AC_CONFIG_ALWAYS_CC_NO_OMIT_FRAME_POINTER], [
336	AC_MSG_CHECKING([whether $CC supports -fno-omit-frame-pointer])
337
338	saved_flags="$CFLAGS"
339	CFLAGS="$CFLAGS -Werror -fno-omit-frame-pointer"
340
341	AC_COMPILE_IFELSE([AC_LANG_PROGRAM([], [])], [
342		NO_OMIT_FRAME_POINTER=-fno-omit-frame-pointer
343		AC_MSG_RESULT([yes])
344	], [
345		NO_OMIT_FRAME_POINTER=
346		AC_MSG_RESULT([no])
347	])
348
349	CFLAGS="$saved_flags"
350	AC_SUBST([NO_OMIT_FRAME_POINTER])
351])
352
353dnl #
354dnl # Check if cc supports -fno-ipa-sra option.
355dnl #
356AC_DEFUN([ZFS_AC_CONFIG_ALWAYS_CC_NO_IPA_SRA], [
357	AC_MSG_CHECKING([whether $CC supports -fno-ipa-sra])
358
359	saved_flags="$CFLAGS"
360	CFLAGS="$CFLAGS -Werror -fno-ipa-sra"
361
362	AC_COMPILE_IFELSE([AC_LANG_PROGRAM([], [])], [
363		NO_IPA_SRA=-fno-ipa-sra
364		AC_MSG_RESULT([yes])
365	], [
366		NO_IPA_SRA=
367		AC_MSG_RESULT([no])
368	])
369
370	CFLAGS="$saved_flags"
371	AC_SUBST([NO_IPA_SRA])
372])
373
374dnl #
375dnl # Check if kernel cc supports -fno-ipa-sra option.
376dnl #
377AC_DEFUN([ZFS_AC_CONFIG_ALWAYS_KERNEL_CC_NO_IPA_SRA], [
378	saved_cc="$CC"
379	AS_IF(
380		[ test -n "$KERNEL_CC" ], [ CC="$KERNEL_CC" ],
381		[ test -n "$KERNEL_LLVM" ], [ CC="clang" ],
382		[ CC="gcc" ]
383	)
384	AC_MSG_CHECKING([whether $CC supports -fno-ipa-sra])
385
386	saved_flags="$CFLAGS"
387	CFLAGS="$CFLAGS -Werror -fno-ipa-sra"
388
389	AC_COMPILE_IFELSE([AC_LANG_PROGRAM([], [])], [
390		KERNEL_NO_IPA_SRA=-fno-ipa-sra
391		AC_MSG_RESULT([yes])
392	], [
393		KERNEL_NO_IPA_SRA=
394		AC_MSG_RESULT([no])
395	])
396
397	CC="$saved_cc"
398	CFLAGS="$saved_flags"
399	AC_SUBST([KERNEL_NO_IPA_SRA])
400])
401