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 cc supports -Wno-clobbered option. 160dnl # 161dnl # We actually invoke it with the -Wclobbered option 162dnl # and infer the 'no-' version does or doesn't exist based upon 163dnl # the results. This is required because when checking any of 164dnl # no- prefixed options gcc always returns success. 165dnl # 166AC_DEFUN([ZFS_AC_CONFIG_ALWAYS_CC_NO_CLOBBERED], [ 167 AC_MSG_CHECKING([whether $CC supports -Wno-clobbered]) 168 169 saved_flags="$CFLAGS" 170 CFLAGS="$CFLAGS -Werror -Wclobbered" 171 172 AC_COMPILE_IFELSE([AC_LANG_PROGRAM([], [])], [ 173 NO_CLOBBERED=-Wno-clobbered 174 AC_MSG_RESULT([yes]) 175 ], [ 176 NO_CLOBBERED= 177 AC_MSG_RESULT([no]) 178 ]) 179 180 CFLAGS="$saved_flags" 181 AC_SUBST([NO_CLOBBERED]) 182]) 183 184dnl # 185dnl # Check if cc supports -Wimplicit-fallthrough option. 186dnl # 187AC_DEFUN([ZFS_AC_CONFIG_ALWAYS_CC_IMPLICIT_FALLTHROUGH], [ 188 AC_MSG_CHECKING([whether $CC supports -Wimplicit-fallthrough]) 189 190 saved_flags="$CFLAGS" 191 CFLAGS="$CFLAGS -Werror -Wimplicit-fallthrough" 192 193 AC_COMPILE_IFELSE([AC_LANG_PROGRAM([], [])], [ 194 IMPLICIT_FALLTHROUGH=-Wimplicit-fallthrough 195 AC_DEFINE([HAVE_IMPLICIT_FALLTHROUGH], 1, 196 [Define if compiler supports -Wimplicit-fallthrough]) 197 AC_MSG_RESULT([yes]) 198 ], [ 199 IMPLICIT_FALLTHROUGH= 200 AC_MSG_RESULT([no]) 201 ]) 202 203 CFLAGS="$saved_flags" 204 AC_SUBST([IMPLICIT_FALLTHROUGH]) 205]) 206 207dnl # 208dnl # Check if cc supports -Winfinite-recursion option. 209dnl # 210AC_DEFUN([ZFS_AC_CONFIG_ALWAYS_CC_INFINITE_RECURSION], [ 211 AC_MSG_CHECKING([whether $CC supports -Winfinite-recursion]) 212 213 saved_flags="$CFLAGS" 214 CFLAGS="$CFLAGS -Werror -Winfinite-recursion" 215 216 AC_COMPILE_IFELSE([AC_LANG_PROGRAM([], [])], [ 217 INFINITE_RECURSION=-Winfinite-recursion 218 AC_DEFINE([HAVE_INFINITE_RECURSION], 1, 219 [Define if compiler supports -Winfinite-recursion]) 220 AC_MSG_RESULT([yes]) 221 ], [ 222 INFINITE_RECURSION= 223 AC_MSG_RESULT([no]) 224 ]) 225 226 CFLAGS="$saved_flags" 227 AC_SUBST([INFINITE_RECURSION]) 228]) 229 230dnl # 231dnl # Check if kernel cc supports -Winfinite-recursion option. 232dnl # 233AC_DEFUN([ZFS_AC_CONFIG_ALWAYS_KERNEL_CC_INFINITE_RECURSION], [ 234 AC_MSG_CHECKING([whether $KERNEL_CC supports -Winfinite-recursion]) 235 236 saved_cc="$CC" 237 saved_flags="$CFLAGS" 238 CC="gcc" 239 CFLAGS="$CFLAGS -Werror -Winfinite-recursion" 240 241 AS_IF([ test -n "$KERNEL_CC" ], [ 242 CC="$KERNEL_CC" 243 ]) 244 AS_IF([ test -n "$KERNEL_LLVM" ], [ 245 CC="clang" 246 ]) 247 248 AC_COMPILE_IFELSE([AC_LANG_PROGRAM([], [])], [ 249 KERNEL_INFINITE_RECURSION=-Winfinite-recursion 250 AC_DEFINE([HAVE_KERNEL_INFINITE_RECURSION], 1, 251 [Define if compiler supports -Winfinite-recursion]) 252 AC_MSG_RESULT([yes]) 253 ], [ 254 KERNEL_INFINITE_RECURSION= 255 AC_MSG_RESULT([no]) 256 ]) 257 258 CC="$saved_cc" 259 CFLAGS="$saved_flags" 260 AC_SUBST([KERNEL_INFINITE_RECURSION]) 261]) 262 263dnl # 264dnl # Check if cc supports -Wformat-overflow option. 265dnl # 266AC_DEFUN([ZFS_AC_CONFIG_ALWAYS_CC_FORMAT_OVERFLOW], [ 267 AC_MSG_CHECKING([whether $CC supports -Wformat-overflow]) 268 269 saved_flags="$CFLAGS" 270 CFLAGS="$CFLAGS -Werror -Wformat-overflow" 271 272 AC_COMPILE_IFELSE([AC_LANG_PROGRAM([], [])], [ 273 FORMAT_OVERFLOW=-Wformat-overflow 274 AC_DEFINE([HAVE_FORMAT_OVERFLOW], 1, 275 [Define if compiler supports -Wformat-overflow]) 276 AC_MSG_RESULT([yes]) 277 ], [ 278 FORMAT_OVERFLOW= 279 AC_MSG_RESULT([no]) 280 ]) 281 282 CFLAGS="$saved_flags" 283 AC_SUBST([FORMAT_OVERFLOW]) 284]) 285 286dnl # 287dnl # Check if cc supports -fno-omit-frame-pointer option. 288dnl # 289AC_DEFUN([ZFS_AC_CONFIG_ALWAYS_CC_NO_OMIT_FRAME_POINTER], [ 290 AC_MSG_CHECKING([whether $CC supports -fno-omit-frame-pointer]) 291 292 saved_flags="$CFLAGS" 293 CFLAGS="$CFLAGS -Werror -fno-omit-frame-pointer" 294 295 AC_COMPILE_IFELSE([AC_LANG_PROGRAM([], [])], [ 296 NO_OMIT_FRAME_POINTER=-fno-omit-frame-pointer 297 AC_MSG_RESULT([yes]) 298 ], [ 299 NO_OMIT_FRAME_POINTER= 300 AC_MSG_RESULT([no]) 301 ]) 302 303 CFLAGS="$saved_flags" 304 AC_SUBST([NO_OMIT_FRAME_POINTER]) 305]) 306 307dnl # 308dnl # Check if cc supports -fno-ipa-sra option. 309dnl # 310AC_DEFUN([ZFS_AC_CONFIG_ALWAYS_CC_NO_IPA_SRA], [ 311 AC_MSG_CHECKING([whether $CC supports -fno-ipa-sra]) 312 313 saved_flags="$CFLAGS" 314 CFLAGS="$CFLAGS -Werror -fno-ipa-sra" 315 316 AC_COMPILE_IFELSE([AC_LANG_PROGRAM([], [])], [ 317 NO_IPA_SRA=-fno-ipa-sra 318 AC_MSG_RESULT([yes]) 319 ], [ 320 NO_IPA_SRA= 321 AC_MSG_RESULT([no]) 322 ]) 323 324 CFLAGS="$saved_flags" 325 AC_SUBST([NO_IPA_SRA]) 326]) 327 328dnl # 329dnl # Check if kernel cc supports -fno-ipa-sra option. 330dnl # 331AC_DEFUN([ZFS_AC_CONFIG_ALWAYS_KERNEL_CC_NO_IPA_SRA], [ 332 AC_MSG_CHECKING([whether $KERNEL_CC supports -fno-ipa-sra]) 333 334 saved_cc="$CC" 335 saved_flags="$CFLAGS" 336 CC="gcc" 337 CFLAGS="$CFLAGS -Werror -fno-ipa-sra" 338 339 AS_IF([ test -n "$KERNEL_CC" ], [ 340 CC="$KERNEL_CC" 341 ]) 342 AS_IF([ test -n "$KERNEL_LLVM" ], [ 343 CC="clang" 344 ]) 345 346 AC_COMPILE_IFELSE([AC_LANG_PROGRAM([], [])], [ 347 KERNEL_NO_IPA_SRA=-fno-ipa-sra 348 AC_MSG_RESULT([yes]) 349 ], [ 350 KERNEL_NO_IPA_SRA= 351 AC_MSG_RESULT([no]) 352 ]) 353 354 CC="$saved_cc" 355 CFLAGS="$saved_flags" 356 AC_SUBST([KERNEL_NO_IPA_SRA]) 357]) 358