164730095SGuillaume Chatelet //===-- Convenient sanitizer macros -----------------------------*- C++ -*-===// 264730095SGuillaume Chatelet // 364730095SGuillaume Chatelet // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 464730095SGuillaume Chatelet // See https://llvm.org/LICENSE.txt for license information. 564730095SGuillaume Chatelet // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 664730095SGuillaume Chatelet // 764730095SGuillaume Chatelet //===----------------------------------------------------------------------===// 864730095SGuillaume Chatelet 9270547f3SGuillaume Chatelet #ifndef LLVM_LIBC_SRC___SUPPORT_MACROS_SANITIZER_H 10270547f3SGuillaume Chatelet #define LLVM_LIBC_SRC___SUPPORT_MACROS_SANITIZER_H 1164730095SGuillaume Chatelet 126fb61ed5SGuillaume Chatelet #include "src/__support/macros/config.h" //LIBC_HAS_FEATURE 1364730095SGuillaume Chatelet 1464730095SGuillaume Chatelet //----------------------------------------------------------------------------- 1564730095SGuillaume Chatelet // Functions to unpoison memory 1664730095SGuillaume Chatelet //----------------------------------------------------------------------------- 1764730095SGuillaume Chatelet 18*1896ee38Slntue #if LIBC_HAS_FEATURE(address_sanitizer) || defined(__SANITIZE_ADDRESS__) 19*1896ee38Slntue #define LIBC_HAS_ADDRESS_SANITIZER 20*1896ee38Slntue #endif 21*1896ee38Slntue 22f7c673daSFangrui Song #if LIBC_HAS_FEATURE(memory_sanitizer) 23*1896ee38Slntue #define LIBC_HAS_MEMORY_SANITIZER 24*1896ee38Slntue #endif 25*1896ee38Slntue 26*1896ee38Slntue #if LIBC_HAS_FEATURE(undefined_behavior_sanitizer) 27*1896ee38Slntue #define LIBC_HAS_UNDEFINED_BEHAVIOR_SANITIZER 28*1896ee38Slntue #endif 29*1896ee38Slntue 30*1896ee38Slntue #if defined(LIBC_HAS_ADDRESS_SANITIZER) || \ 31*1896ee38Slntue defined(LIBC_HAS_MEMORY_SANITIZER) || \ 32*1896ee38Slntue defined(LIBC_HAS_UNDEFINED_BEHAVIOR_SANITIZER) 33*1896ee38Slntue #define LIBC_HAS_SANITIZER 34*1896ee38Slntue #endif 35*1896ee38Slntue 36*1896ee38Slntue #ifdef LIBC_HAS_MEMORY_SANITIZER 370177c1c4Slntue // Only perform MSAN unpoison in non-constexpr context. 3864730095SGuillaume Chatelet #include <sanitizer/msan_interface.h> 390177c1c4Slntue #define MSAN_UNPOISON(addr, size) \ 400177c1c4Slntue do { \ 41889dfd4aSGuillaume Chatelet if (!__builtin_is_constant_evaluated()) \ 420177c1c4Slntue __msan_unpoison(addr, size); \ 430177c1c4Slntue } while (0) 4464730095SGuillaume Chatelet #else 45e2263f14SGuillaume Chatelet #define MSAN_UNPOISON(ptr, size) 4664730095SGuillaume Chatelet #endif 47e2263f14SGuillaume Chatelet 48*1896ee38Slntue #ifdef LIBC_HAS_ADDRESS_SANITIZER 49e2263f14SGuillaume Chatelet #include <sanitizer/asan_interface.h> 50e2263f14SGuillaume Chatelet #define ASAN_POISON_MEMORY_REGION(addr, size) \ 51e2263f14SGuillaume Chatelet __asan_poison_memory_region((addr), (size)) 52e2263f14SGuillaume Chatelet #define ASAN_UNPOISON_MEMORY_REGION(addr, size) \ 53e2263f14SGuillaume Chatelet __asan_unpoison_memory_region((addr), (size)) 54e2263f14SGuillaume Chatelet #else 55e2263f14SGuillaume Chatelet #define ASAN_POISON_MEMORY_REGION(addr, size) ((void)(addr), (void)(size)) 56e2263f14SGuillaume Chatelet #define ASAN_UNPOISON_MEMORY_REGION(addr, size) ((void)(addr), (void)(size)) 57e2263f14SGuillaume Chatelet #endif 58e2263f14SGuillaume Chatelet 59270547f3SGuillaume Chatelet #endif // LLVM_LIBC_SRC___SUPPORT_MACROS_SANITIZER_H 60