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 -Wimplicit-fallthrough option. 214dnl # 215AC_DEFUN([ZFS_AC_CONFIG_ALWAYS_CC_IMPLICIT_FALLTHROUGH], [ 216 AC_MSG_CHECKING([whether $CC supports -Wimplicit-fallthrough]) 217 218 saved_flags="$CFLAGS" 219 CFLAGS="$CFLAGS -Werror -Wimplicit-fallthrough" 220 221 AC_COMPILE_IFELSE([AC_LANG_PROGRAM([], [])], [ 222 IMPLICIT_FALLTHROUGH=-Wimplicit-fallthrough 223 AC_DEFINE([HAVE_IMPLICIT_FALLTHROUGH], 1, 224 [Define if compiler supports -Wimplicit-fallthrough]) 225 AC_MSG_RESULT([yes]) 226 ], [ 227 IMPLICIT_FALLTHROUGH= 228 AC_MSG_RESULT([no]) 229 ]) 230 231 CFLAGS="$saved_flags" 232 AC_SUBST([IMPLICIT_FALLTHROUGH]) 233]) 234 235dnl # 236dnl # Check if cc supports -Winfinite-recursion option. 237dnl # 238AC_DEFUN([ZFS_AC_CONFIG_ALWAYS_CC_INFINITE_RECURSION], [ 239 AC_MSG_CHECKING([whether $CC supports -Winfinite-recursion]) 240 241 saved_flags="$CFLAGS" 242 CFLAGS="$CFLAGS -Werror -Winfinite-recursion" 243 244 AC_COMPILE_IFELSE([AC_LANG_PROGRAM([], [])], [ 245 INFINITE_RECURSION=-Winfinite-recursion 246 AC_DEFINE([HAVE_INFINITE_RECURSION], 1, 247 [Define if compiler supports -Winfinite-recursion]) 248 AC_MSG_RESULT([yes]) 249 ], [ 250 INFINITE_RECURSION= 251 AC_MSG_RESULT([no]) 252 ]) 253 254 CFLAGS="$saved_flags" 255 AC_SUBST([INFINITE_RECURSION]) 256]) 257 258dnl # 259dnl # Check if kernel cc supports -Winfinite-recursion option. 260dnl # 261AC_DEFUN([ZFS_AC_CONFIG_ALWAYS_KERNEL_CC_INFINITE_RECURSION], [ 262 saved_cc="$CC" 263 AS_IF( 264 [ test -n "$KERNEL_CC" ], [ CC="$KERNEL_CC" ], 265 [ test -n "$KERNEL_LLVM" ], [ CC="clang" ], 266 [ CC="gcc" ] 267 ) 268 AC_MSG_CHECKING([whether $CC supports -Winfinite-recursion]) 269 270 saved_flags="$CFLAGS" 271 CFLAGS="$CFLAGS -Werror -Winfinite-recursion" 272 273 AC_COMPILE_IFELSE([AC_LANG_PROGRAM([], [])], [ 274 KERNEL_INFINITE_RECURSION=-Winfinite-recursion 275 AC_DEFINE([HAVE_KERNEL_INFINITE_RECURSION], 1, 276 [Define if compiler supports -Winfinite-recursion]) 277 AC_MSG_RESULT([yes]) 278 ], [ 279 KERNEL_INFINITE_RECURSION= 280 AC_MSG_RESULT([no]) 281 ]) 282 283 CC="$saved_cc" 284 CFLAGS="$saved_flags" 285 AC_SUBST([KERNEL_INFINITE_RECURSION]) 286]) 287 288dnl # 289dnl # Check if cc supports -Wformat-overflow option. 290dnl # 291AC_DEFUN([ZFS_AC_CONFIG_ALWAYS_CC_FORMAT_OVERFLOW], [ 292 AC_MSG_CHECKING([whether $CC supports -Wformat-overflow]) 293 294 saved_flags="$CFLAGS" 295 CFLAGS="$CFLAGS -Werror -Wformat-overflow" 296 297 AC_COMPILE_IFELSE([AC_LANG_PROGRAM([], [])], [ 298 FORMAT_OVERFLOW=-Wformat-overflow 299 AC_DEFINE([HAVE_FORMAT_OVERFLOW], 1, 300 [Define if compiler supports -Wformat-overflow]) 301 AC_MSG_RESULT([yes]) 302 ], [ 303 FORMAT_OVERFLOW= 304 AC_MSG_RESULT([no]) 305 ]) 306 307 CFLAGS="$saved_flags" 308 AC_SUBST([FORMAT_OVERFLOW]) 309]) 310 311dnl # 312dnl # Check if cc supports -fno-omit-frame-pointer option. 313dnl # 314AC_DEFUN([ZFS_AC_CONFIG_ALWAYS_CC_NO_OMIT_FRAME_POINTER], [ 315 AC_MSG_CHECKING([whether $CC supports -fno-omit-frame-pointer]) 316 317 saved_flags="$CFLAGS" 318 CFLAGS="$CFLAGS -Werror -fno-omit-frame-pointer" 319 320 AC_COMPILE_IFELSE([AC_LANG_PROGRAM([], [])], [ 321 NO_OMIT_FRAME_POINTER=-fno-omit-frame-pointer 322 AC_MSG_RESULT([yes]) 323 ], [ 324 NO_OMIT_FRAME_POINTER= 325 AC_MSG_RESULT([no]) 326 ]) 327 328 CFLAGS="$saved_flags" 329 AC_SUBST([NO_OMIT_FRAME_POINTER]) 330]) 331 332dnl # 333dnl # Check if cc supports -fno-ipa-sra option. 334dnl # 335AC_DEFUN([ZFS_AC_CONFIG_ALWAYS_CC_NO_IPA_SRA], [ 336 AC_MSG_CHECKING([whether $CC supports -fno-ipa-sra]) 337 338 saved_flags="$CFLAGS" 339 CFLAGS="$CFLAGS -Werror -fno-ipa-sra" 340 341 AC_COMPILE_IFELSE([AC_LANG_PROGRAM([], [])], [ 342 NO_IPA_SRA=-fno-ipa-sra 343 AC_MSG_RESULT([yes]) 344 ], [ 345 NO_IPA_SRA= 346 AC_MSG_RESULT([no]) 347 ]) 348 349 CFLAGS="$saved_flags" 350 AC_SUBST([NO_IPA_SRA]) 351]) 352 353dnl # 354dnl # Check if kernel cc supports -fno-ipa-sra option. 355dnl # 356AC_DEFUN([ZFS_AC_CONFIG_ALWAYS_KERNEL_CC_NO_IPA_SRA], [ 357 saved_cc="$CC" 358 AS_IF( 359 [ test -n "$KERNEL_CC" ], [ CC="$KERNEL_CC" ], 360 [ test -n "$KERNEL_LLVM" ], [ CC="clang" ], 361 [ CC="gcc" ] 362 ) 363 AC_MSG_CHECKING([whether $CC supports -fno-ipa-sra]) 364 365 saved_flags="$CFLAGS" 366 CFLAGS="$CFLAGS -Werror -fno-ipa-sra" 367 368 AC_COMPILE_IFELSE([AC_LANG_PROGRAM([], [])], [ 369 KERNEL_NO_IPA_SRA=-fno-ipa-sra 370 AC_MSG_RESULT([yes]) 371 ], [ 372 KERNEL_NO_IPA_SRA= 373 AC_MSG_RESULT([no]) 374 ]) 375 376 CC="$saved_cc" 377 CFLAGS="$saved_flags" 378 AC_SUBST([KERNEL_NO_IPA_SRA]) 379]) 380