asan_test_utils.h revision 5af39e50366f1aacbebc284f572f08ad1ad07357
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 431cffef3e39cad4eb33606afbebac78d6637361acAlexey Samsonov#if __has_feature(address_sanitizer) 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 561e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany// Make the compiler think that something is going on there. 575092682c3a6902e460a6e439cf48b3dc7d48dc65Alexey Samsonovextern "C" void break_optimization(void *arg); 581e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany 591e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany// This function returns its parameter but in such a way that compiler 601e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany// can not prove it. 611e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryanytemplate<class T> 62938106753364d96cedc11cbdc35a15030fb44d0cTimur IskhodzhanovNOINLINE 631e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryanystatic T Ident(T t) { 641e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany T ret = t; 651e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany break_optimization(&ret); 661e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany return ret; 671e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany} 681e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany 691e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany#endif // ASAN_TEST_UTILS_H 70