xref: /openbsd-src/gnu/llvm/compiler-rt/lib/sanitizer_common/tests/sanitizer_test_utils.h (revision d89ec533011f513df1010f142a111086a0785f09)
13cab2bb3Spatrick //===-- sanitizer_test_utils.h ----------------------------------*- C++ -*-===//
23cab2bb3Spatrick //
33cab2bb3Spatrick // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
43cab2bb3Spatrick // See https://llvm.org/LICENSE.txt for license information.
53cab2bb3Spatrick // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
63cab2bb3Spatrick //
73cab2bb3Spatrick //===----------------------------------------------------------------------===//
83cab2bb3Spatrick //
93cab2bb3Spatrick // This file is a part of *Sanitizer runtime.
103cab2bb3Spatrick // Common unit tests utilities.
113cab2bb3Spatrick //
123cab2bb3Spatrick //===----------------------------------------------------------------------===//
133cab2bb3Spatrick 
143cab2bb3Spatrick #ifndef SANITIZER_TEST_UTILS_H
153cab2bb3Spatrick #define SANITIZER_TEST_UTILS_H
163cab2bb3Spatrick 
173cab2bb3Spatrick #if defined(_WIN32)
183cab2bb3Spatrick // <windows.h> should always be the first include on Windows.
193cab2bb3Spatrick # include <windows.h>
203cab2bb3Spatrick // MSVS headers define max/min as macros, so std::max/min gets crazy.
213cab2bb3Spatrick # undef max
223cab2bb3Spatrick # undef min
233cab2bb3Spatrick #endif
243cab2bb3Spatrick 
253cab2bb3Spatrick #if !defined(SANITIZER_EXTERNAL_TEST_CONFIG)
263cab2bb3Spatrick # define INCLUDED_FROM_SANITIZER_TEST_UTILS_H
273cab2bb3Spatrick # include "sanitizer_test_config.h"
283cab2bb3Spatrick # undef INCLUDED_FROM_SANITIZER_TEST_UTILS_H
293cab2bb3Spatrick #endif
303cab2bb3Spatrick 
313cab2bb3Spatrick #include <stdint.h>
323cab2bb3Spatrick 
333cab2bb3Spatrick #if defined(_MSC_VER)
343cab2bb3Spatrick # define NOINLINE __declspec(noinline)
353cab2bb3Spatrick #else  // defined(_MSC_VER)
363cab2bb3Spatrick # define NOINLINE __attribute__((noinline))
373cab2bb3Spatrick #endif  // defined(_MSC_VER)
383cab2bb3Spatrick 
393cab2bb3Spatrick #if !defined(_MSC_VER) || defined(__clang__)
403cab2bb3Spatrick # define UNUSED __attribute__((unused))
413cab2bb3Spatrick # define USED __attribute__((used))
423cab2bb3Spatrick #else
433cab2bb3Spatrick # define UNUSED
443cab2bb3Spatrick # define USED
453cab2bb3Spatrick #endif
463cab2bb3Spatrick 
473cab2bb3Spatrick #if !defined(__has_feature)
483cab2bb3Spatrick #define __has_feature(x) 0
493cab2bb3Spatrick #endif
503cab2bb3Spatrick 
513cab2bb3Spatrick #ifndef ATTRIBUTE_NO_SANITIZE_ADDRESS
523cab2bb3Spatrick # if __has_feature(address_sanitizer) || defined(__SANITIZE_ADDRESS__)
533cab2bb3Spatrick #  define ATTRIBUTE_NO_SANITIZE_ADDRESS \
543cab2bb3Spatrick     __attribute__((no_sanitize_address))
553cab2bb3Spatrick # else
563cab2bb3Spatrick #  define ATTRIBUTE_NO_SANITIZE_ADDRESS
573cab2bb3Spatrick # endif
583cab2bb3Spatrick #endif  // ATTRIBUTE_NO_SANITIZE_ADDRESS
593cab2bb3Spatrick 
603cab2bb3Spatrick #if __LP64__ || defined(_WIN64)
613cab2bb3Spatrick #  define SANITIZER_WORDSIZE 64
623cab2bb3Spatrick #else
633cab2bb3Spatrick #  define SANITIZER_WORDSIZE 32
643cab2bb3Spatrick #endif
653cab2bb3Spatrick 
663cab2bb3Spatrick // Make the compiler thinks that something is going on there.
break_optimization(void * arg)673cab2bb3Spatrick inline void break_optimization(void *arg) {
683cab2bb3Spatrick #if !defined(_WIN32) || defined(__clang__)
693cab2bb3Spatrick   __asm__ __volatile__("" : : "r" (arg) : "memory");
703cab2bb3Spatrick #endif
713cab2bb3Spatrick }
723cab2bb3Spatrick 
733cab2bb3Spatrick // This function returns its parameter but in such a way that compiler
743cab2bb3Spatrick // can not prove it.
753cab2bb3Spatrick template<class T>
763cab2bb3Spatrick NOINLINE
Ident(T t)773cab2bb3Spatrick static T Ident(T t) {
783cab2bb3Spatrick   T ret = t;
793cab2bb3Spatrick   break_optimization(&ret);
803cab2bb3Spatrick   return ret;
813cab2bb3Spatrick }
823cab2bb3Spatrick 
833cab2bb3Spatrick // Simple stand-alone pseudorandom number generator.
843cab2bb3Spatrick // Current algorithm is ANSI C linear congruential PRNG.
my_rand_r(uint32_t * state)853cab2bb3Spatrick static inline uint32_t my_rand_r(uint32_t* state) {
863cab2bb3Spatrick   return (*state = *state * 1103515245 + 12345) >> 16;
873cab2bb3Spatrick }
883cab2bb3Spatrick 
893cab2bb3Spatrick static uint32_t global_seed = 0;
903cab2bb3Spatrick 
my_rand()913cab2bb3Spatrick static inline uint32_t my_rand() {
923cab2bb3Spatrick   return my_rand_r(&global_seed);
933cab2bb3Spatrick }
943cab2bb3Spatrick 
953cab2bb3Spatrick // Set availability of platform-specific functions.
963cab2bb3Spatrick 
973cab2bb3Spatrick #if !defined(__APPLE__) && !defined(__ANDROID__) && !defined(_WIN32)
983cab2bb3Spatrick # define SANITIZER_TEST_HAS_POSIX_MEMALIGN 1
993cab2bb3Spatrick #else
1003cab2bb3Spatrick # define SANITIZER_TEST_HAS_POSIX_MEMALIGN 0
1013cab2bb3Spatrick #endif
1023cab2bb3Spatrick 
1033cab2bb3Spatrick #if !defined(__APPLE__) && !defined(__FreeBSD__) && !defined(__ANDROID__) && \
1043cab2bb3Spatrick     !defined(__NetBSD__) && !defined(_WIN32)
1053cab2bb3Spatrick # define SANITIZER_TEST_HAS_MEMALIGN 1
1063cab2bb3Spatrick #else
1073cab2bb3Spatrick # define SANITIZER_TEST_HAS_MEMALIGN 0
1083cab2bb3Spatrick #endif
1093cab2bb3Spatrick 
110*d89ec533Spatrick #if defined(__GLIBC__)
1113cab2bb3Spatrick # define SANITIZER_TEST_HAS_PVALLOC 1
1123cab2bb3Spatrick # define SANITIZER_TEST_HAS_MALLOC_USABLE_SIZE 1
1133cab2bb3Spatrick #else
1143cab2bb3Spatrick # define SANITIZER_TEST_HAS_PVALLOC 0
1153cab2bb3Spatrick # define SANITIZER_TEST_HAS_MALLOC_USABLE_SIZE 0
1163cab2bb3Spatrick #endif
1173cab2bb3Spatrick 
1183cab2bb3Spatrick #if !defined(__APPLE__)
1193cab2bb3Spatrick # define SANITIZER_TEST_HAS_STRNLEN 1
1203cab2bb3Spatrick #else
1213cab2bb3Spatrick # define SANITIZER_TEST_HAS_STRNLEN 0
1223cab2bb3Spatrick #endif
1233cab2bb3Spatrick 
1243cab2bb3Spatrick #if defined(__FreeBSD__) || defined(__NetBSD__)
1253cab2bb3Spatrick # define SANITIZER_TEST_HAS_PRINTF_L 1
1263cab2bb3Spatrick #else
1273cab2bb3Spatrick # define SANITIZER_TEST_HAS_PRINTF_L 0
1283cab2bb3Spatrick #endif
1293cab2bb3Spatrick 
1303cab2bb3Spatrick #if !defined(_MSC_VER)
1313cab2bb3Spatrick # define SANITIZER_TEST_HAS_STRNDUP 1
1323cab2bb3Spatrick #else
1333cab2bb3Spatrick # define SANITIZER_TEST_HAS_STRNDUP 0
1343cab2bb3Spatrick #endif
1353cab2bb3Spatrick 
1363cab2bb3Spatrick #endif  // SANITIZER_TEST_UTILS_H
137