From 83b74544c658ad8cc8db721d2796586c0736dd38 Mon Sep 17 00:00:00 2001 From: Pierre Gousseau Date: Wed, 2 Feb 2022 10:54:22 +0000 Subject: [PATCH] [MSVC] Workaround missing search path for sanitizer headers. This is to fix build errors "Cannot open include file: 'sanitizer/asan_interface.h'" when building LLVM with MSVC and LLVM_USE_SANITIZER=Address. asan_interface.h is not available in MSVC's search path, instead it is located under %VCToolsInstallDir%/crt/src/sanitizer. This is an alternate solution to https://reviews.llvm.org/D118159, to avoid adding all internal crt sources to the header search paths. Tested with visual studio 2019 v16.9.6 and visual studio 2022 v17.0.5 Reviewed By: aaron.ballman, rnk Differential Revision: https://reviews.llvm.org/D118624 --- llvm/include/llvm/Support/Compiler.h | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/llvm/include/llvm/Support/Compiler.h b/llvm/include/llvm/Support/Compiler.h index f3317049524f..1f044813bd74 100644 --- a/llvm/include/llvm/Support/Compiler.h +++ b/llvm/include/llvm/Support/Compiler.h @@ -39,6 +39,10 @@ # define __has_builtin(x) 0 #endif +#ifndef __has_include +# define __has_include(x) 0 +#endif + // Only use __has_cpp_attribute in C++ mode. GCC defines __has_cpp_attribute in // C mode, but the :: in __has_cpp_attribute(scoped::attribute) is invalid. #ifndef LLVM_HAS_CPP_ATTRIBUTE @@ -444,8 +448,21 @@ /// Whether LLVM itself is built with AddressSanitizer instrumentation. #if __has_feature(address_sanitizer) || defined(__SANITIZE_ADDRESS__) # define LLVM_ADDRESS_SANITIZER_BUILD 1 +#if __has_include() # include #else +// These declarations exist to support ASan with MSVC. If MSVC eventually ships +// asan_interface.h in their headers, then we can remove this. +#ifdef __cplusplus +extern "C" { +#endif +void __asan_poison_memory_region(void const volatile *addr, size_t size); +void __asan_unpoison_memory_region(void const volatile *addr, size_t size); +#ifdef __cplusplus +} // extern "C" +#endif +#endif +#else # define LLVM_ADDRESS_SANITIZER_BUILD 0 # define __asan_poison_memory_region(p, size) # define __asan_unpoison_memory_region(p, size)