asan_test_utils.h revision 2697687059e64a4f1319dc23a0a3ca59982d53f6
17da8503a90c7f84787aa1ba978e2223893fa7727Alexey Samsonov//===-- asan_test_utils.h ---------------------------------------*- C++ -*-===//
21e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany//
31e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany//                     The LLVM Compiler Infrastructure
41e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany//
51e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany// This file is distributed under the University of Illinois Open Source
61e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany// License. See LICENSE.TXT for details.
71e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany//
81e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany//===----------------------------------------------------------------------===//
91e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany//
101e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany// This file is a part of AddressSanitizer, an address sanity checker.
111e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany//
121e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany//===----------------------------------------------------------------------===//
131e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany
141e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany#ifndef ASAN_TEST_UTILS_H
151e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany#define ASAN_TEST_UTILS_H
161e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany
177da8503a90c7f84787aa1ba978e2223893fa7727Alexey Samsonov#if !defined(ASAN_EXTERNAL_TEST_CONFIG)
187da8503a90c7f84787aa1ba978e2223893fa7727Alexey Samsonov# define INCLUDED_FROM_ASAN_TEST_UTILS_H
197da8503a90c7f84787aa1ba978e2223893fa7727Alexey Samsonov# include "asan_test_config.h"
207da8503a90c7f84787aa1ba978e2223893fa7727Alexey Samsonov# undef INCLUDED_FROM_ASAN_TEST_UTILS_H
217da8503a90c7f84787aa1ba978e2223893fa7727Alexey Samsonov#endif
227da8503a90c7f84787aa1ba978e2223893fa7727Alexey Samsonov
23938106753364d96cedc11cbdc35a15030fb44d0cTimur Iskhodzhanov#if defined(_WIN32)
24938106753364d96cedc11cbdc35a15030fb44d0cTimur Iskhodzhanovtypedef unsigned __int8  uint8_t;
25938106753364d96cedc11cbdc35a15030fb44d0cTimur Iskhodzhanovtypedef unsigned __int16 uint16_t;
26938106753364d96cedc11cbdc35a15030fb44d0cTimur Iskhodzhanovtypedef unsigned __int32 uint32_t;
27938106753364d96cedc11cbdc35a15030fb44d0cTimur Iskhodzhanovtypedef unsigned __int64 uint64_t;
28938106753364d96cedc11cbdc35a15030fb44d0cTimur Iskhodzhanovtypedef __int8           int8_t;
29938106753364d96cedc11cbdc35a15030fb44d0cTimur Iskhodzhanovtypedef __int16          int16_t;
30938106753364d96cedc11cbdc35a15030fb44d0cTimur Iskhodzhanovtypedef __int32          int32_t;
31938106753364d96cedc11cbdc35a15030fb44d0cTimur Iskhodzhanovtypedef __int64          int64_t;
32938106753364d96cedc11cbdc35a15030fb44d0cTimur Iskhodzhanov# define NOINLINE __declspec(noinline)
33fa7e95da75c30b7111224e68cb4405357bdc0f4bAlexey Samsonov# define USED
34938106753364d96cedc11cbdc35a15030fb44d0cTimur Iskhodzhanov#else  // defined(_WIN32)
35938106753364d96cedc11cbdc35a15030fb44d0cTimur Iskhodzhanov# define NOINLINE __attribute__((noinline))
36fa7e95da75c30b7111224e68cb4405357bdc0f4bAlexey Samsonov# define USED __attribute__((used))
37938106753364d96cedc11cbdc35a15030fb44d0cTimur Iskhodzhanov#endif  // defined(_WIN32)
38938106753364d96cedc11cbdc35a15030fb44d0cTimur Iskhodzhanov
39938106753364d96cedc11cbdc35a15030fb44d0cTimur Iskhodzhanov#if !defined(__has_feature)
40938106753364d96cedc11cbdc35a15030fb44d0cTimur Iskhodzhanov#define __has_feature(x) 0
41938106753364d96cedc11cbdc35a15030fb44d0cTimur Iskhodzhanov#endif
42938106753364d96cedc11cbdc35a15030fb44d0cTimur Iskhodzhanov
43badab16503e025326a46a45da8faa6fd20e5fc3dKostya Serebryany#if __has_feature(address_sanitizer) || defined(__SANITIZE_ADDRESS__)
441cffef3e39cad4eb33606afbebac78d6637361acAlexey Samsonov# define ATTRIBUTE_NO_ADDRESS_SAFETY_ANALYSIS \
451cffef3e39cad4eb33606afbebac78d6637361acAlexey Samsonov    __attribute__((no_address_safety_analysis))
461cffef3e39cad4eb33606afbebac78d6637361acAlexey Samsonov#else
471cffef3e39cad4eb33606afbebac78d6637361acAlexey Samsonov# define ATTRIBUTE_NO_ADDRESS_SAFETY_ANALYSIS
481cffef3e39cad4eb33606afbebac78d6637361acAlexey Samsonov#endif
491cffef3e39cad4eb33606afbebac78d6637361acAlexey Samsonov
50938106753364d96cedc11cbdc35a15030fb44d0cTimur Iskhodzhanov#if __LP64__ || defined(_WIN64)
515af39e50366f1aacbebc284f572f08ad1ad07357Kostya Serebryany#  define SANITIZER_WORDSIZE 64
52938106753364d96cedc11cbdc35a15030fb44d0cTimur Iskhodzhanov#else
535af39e50366f1aacbebc284f572f08ad1ad07357Kostya Serebryany#  define SANITIZER_WORDSIZE 32
54938106753364d96cedc11cbdc35a15030fb44d0cTimur Iskhodzhanov#endif
55938106753364d96cedc11cbdc35a15030fb44d0cTimur Iskhodzhanov
564cf06575e772d64907d4dc7d49f2ecc7830137f6Kostya Serebryany// Make the compiler thinks that something is going on there.
574cf06575e772d64907d4dc7d49f2ecc7830137f6Kostya Serebryanyinline void break_optimization(void *arg) {
584cf06575e772d64907d4dc7d49f2ecc7830137f6Kostya Serebryany  __asm__ __volatile__ ("" : : "r" (arg) : "memory");
594cf06575e772d64907d4dc7d49f2ecc7830137f6Kostya Serebryany}
601e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany
611e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany// This function returns its parameter but in such a way that compiler
621e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany// can not prove it.
631e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryanytemplate<class T>
64938106753364d96cedc11cbdc35a15030fb44d0cTimur IskhodzhanovNOINLINE
651e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryanystatic T Ident(T t) {
661e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany  T ret = t;
671e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany  break_optimization(&ret);
681e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany  return ret;
691e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany}
701e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany
712697687059e64a4f1319dc23a0a3ca59982d53f6Kostya Serebryany// Check that pthread_create/pthread_join return success.
722697687059e64a4f1319dc23a0a3ca59982d53f6Kostya Serebryany#define PTHREAD_CREATE(a, b, c, d) EXPECT_EQ(0, pthread_create(a, b, c, d))
732697687059e64a4f1319dc23a0a3ca59982d53f6Kostya Serebryany#define PTHREAD_JOIN(a, b) EXPECT_EQ(0, pthread_join(a, b))
742697687059e64a4f1319dc23a0a3ca59982d53f6Kostya Serebryany
751e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany#endif  // ASAN_TEST_UTILS_H
76