sanitizer_platform.h revision 2d1fdb26e458c4ddc04155c1d421bced3ba90cd0
12a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)//===-- sanitizer_platform.h ------------------------------------*- C++ -*-===// 22a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// 32a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// The LLVM Compiler Infrastructure 42a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// 52a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// This file is distributed under the University of Illinois Open Source 62a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// License. See LICENSE.TXT for details. 72a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// 8ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch//===----------------------------------------------------------------------===// 92a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// 102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Common platform macros. 112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)//===----------------------------------------------------------------------===// 122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 13ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch#ifndef SANITIZER_PLATFORM_H 142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#define SANITIZER_PLATFORM_H 15ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#if !defined(__linux__) && !defined(__FreeBSD__) && \ 172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) !defined(__APPLE__) && !defined(_WIN32) 182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)# error "This operating system is not supported" 192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif 202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#if defined(__linux__) 222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)# define SANITIZER_LINUX 1 232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#else 242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)# define SANITIZER_LINUX 0 252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif 26ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 27ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch#if defined(__FreeBSD__) 28ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch# define SANITIZER_FREEBSD 1 29ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch#else 30ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch# define SANITIZER_FREEBSD 0 312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif 322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#if defined(__APPLE__) 342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)# define SANITIZER_MAC 1 352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)# include <TargetConditionals.h> 36ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch# if TARGET_OS_IPHONE 37ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch# define SANITIZER_IOS 1 38ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch# else 39ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch# define SANITIZER_IOS 0 40ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch# endif 412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#else 422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)# define SANITIZER_MAC 0 432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)# define SANITIZER_IOS 0 442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif 452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 464e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#if defined(_WIN32) 47ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch# define SANITIZER_WINDOWS 1 484e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#else 49ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch# define SANITIZER_WINDOWS 0 50ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch#endif 51ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 52ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch#if defined(__ANDROID__) || defined(ANDROID) 53ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch# define SANITIZER_ANDROID 1 54ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch#else 554e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)# define SANITIZER_ANDROID 0 56ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch#endif 57ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 58ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch#define SANITIZER_POSIX (SANITIZER_FREEBSD || SANITIZER_LINUX || SANITIZER_MAC) 594e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 60ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch#if __LP64__ || defined(_WIN64) 61ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch# define SANITIZER_WORDSIZE 64 62ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch#else 63ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch# define SANITIZER_WORDSIZE 32 64ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch#endif 654e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 66ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch#if SANITIZER_WORDSIZE == 64 67ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch# define FIRST_32_SECOND_64(a, b) (b) 68ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch#else 69ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch# define FIRST_32_SECOND_64(a, b) (a) 70ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch#endif 71ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 72ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch#if defined(__x86_64__) && !defined(_LP64) 73ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch# define SANITIZER_X32 1 74ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch#else 754e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)# define SANITIZER_X32 0 76ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch#endif 77ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// By default we allow to use SizeClassAllocator64 on 64-bit platform. 79ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch// But in some cases (e.g. AArch64's 39-bit address space) SizeClassAllocator64 80ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch// does not work well and we need to fallback to SizeClassAllocator32. 812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// For such platforms build this code with -DSANITIZER_CAN_USE_ALLOCATOR64=0 or 822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// change the definition of SANITIZER_CAN_USE_ALLOCATOR64 here. 832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#ifndef SANITIZER_CAN_USE_ALLOCATOR64 842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)# if defined(__aarch64__) 852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)# define SANITIZER_CAN_USE_ALLOCATOR64 0 862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)# else 872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)# define SANITIZER_CAN_USE_ALLOCATOR64 (SANITIZER_WORDSIZE == 64) 882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)# endif 892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif 902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// The range of addresses which can be returned my mmap. 922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// FIXME: this value should be different on different platforms, 932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// e.g. on AArch64 it is most likely (1ULL << 39). Larger values will still work 942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// but will consume more memory for TwoLevelByteMap. 952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#if defined(__aarch64__) 962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)# define SANITIZER_MMAP_RANGE_SIZE FIRST_32_SECOND_64(1ULL << 32, 1ULL << 39) 972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#else 98ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch# define SANITIZER_MMAP_RANGE_SIZE FIRST_32_SECOND_64(1ULL << 32, 1ULL << 47) 99ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch#endif 100ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 101ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch// The AArch64 linux port uses the canonical syscall set as mandated by 102ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch// the upstream linux community for all new ports. Other ports may still 103ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch// use legacy syscalls. 104ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch#ifndef SANITIZER_USES_CANONICAL_LINUX_SYSCALLS 105ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch# if defined(__aarch64__) && SANITIZER_LINUX 106ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch# define SANITIZER_USES_CANONICAL_LINUX_SYSCALLS 1 107ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch# else 108ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch# define SANITIZER_USES_CANONICAL_LINUX_SYSCALLS 0 1092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)# endif 1102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif 1112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif // SANITIZER_PLATFORM_H 1132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)