Home | History | Annotate | Download | only in sanitizer_common
      1 //===-- sanitizer_platform.h ------------------------------------*- C++ -*-===//
      2 //
      3 //                     The LLVM Compiler Infrastructure
      4 //
      5 // This file is distributed under the University of Illinois Open Source
      6 // License. See LICENSE.TXT for details.
      7 //
      8 //===----------------------------------------------------------------------===//
      9 //
     10 // Common platform macros.
     11 //===----------------------------------------------------------------------===//
     12 
     13 #ifndef SANITIZER_PLATFORM_H
     14 #define SANITIZER_PLATFORM_H
     15 
     16 #if !defined(__linux__) && !defined(__FreeBSD__) && \
     17   !defined(__APPLE__) && !defined(_WIN32)
     18 # error "This operating system is not supported"
     19 #endif
     20 
     21 #if defined(__linux__)
     22 # define SANITIZER_LINUX   1
     23 #else
     24 # define SANITIZER_LINUX   0
     25 #endif
     26 
     27 #if defined(__FreeBSD__)
     28 # define SANITIZER_FREEBSD 1
     29 #else
     30 # define SANITIZER_FREEBSD 0
     31 #endif
     32 
     33 #if defined(__APPLE__)
     34 # define SANITIZER_MAC     1
     35 # include <TargetConditionals.h>
     36 # if TARGET_OS_IPHONE
     37 #  define SANITIZER_IOS    1
     38 # else
     39 #  define SANITIZER_IOS    0
     40 # endif
     41 #else
     42 # define SANITIZER_MAC     0
     43 # define SANITIZER_IOS     0
     44 #endif
     45 
     46 #if defined(_WIN32)
     47 # define SANITIZER_WINDOWS 1
     48 #else
     49 # define SANITIZER_WINDOWS 0
     50 #endif
     51 
     52 #if defined(__ANDROID__) || defined(ANDROID)
     53 # define SANITIZER_ANDROID 1
     54 #else
     55 # define SANITIZER_ANDROID 0
     56 #endif
     57 
     58 #define SANITIZER_POSIX (SANITIZER_FREEBSD || SANITIZER_LINUX || SANITIZER_MAC)
     59 
     60 #if __LP64__ || defined(_WIN64)
     61 #  define SANITIZER_WORDSIZE 64
     62 #else
     63 #  define SANITIZER_WORDSIZE 32
     64 #endif
     65 
     66 #if SANITIZER_WORDSIZE == 64
     67 # define FIRST_32_SECOND_64(a, b) (b)
     68 #else
     69 # define FIRST_32_SECOND_64(a, b) (a)
     70 #endif
     71 
     72 #if defined(__x86_64__) && !defined(_LP64)
     73 # define SANITIZER_X32 1
     74 #else
     75 # define SANITIZER_X32 0
     76 #endif
     77 
     78 // By default we allow to use SizeClassAllocator64 on 64-bit platform.
     79 // But in some cases (e.g. AArch64's 39-bit address space) SizeClassAllocator64
     80 // does not work well and we need to fallback to SizeClassAllocator32.
     81 // For such platforms build this code with -DSANITIZER_CAN_USE_ALLOCATOR64=0 or
     82 // change the definition of SANITIZER_CAN_USE_ALLOCATOR64 here.
     83 #ifndef SANITIZER_CAN_USE_ALLOCATOR64
     84 # if defined(__aarch64__)
     85 #  define SANITIZER_CAN_USE_ALLOCATOR64 0
     86 # else
     87 #  define SANITIZER_CAN_USE_ALLOCATOR64 (SANITIZER_WORDSIZE == 64)
     88 # endif
     89 #endif
     90 
     91 // The range of addresses which can be returned my mmap.
     92 // FIXME: this value should be different on different platforms,
     93 // e.g. on AArch64 it is most likely (1ULL << 39). Larger values will still work
     94 // but will consume more memory for TwoLevelByteMap.
     95 #if defined(__aarch64__)
     96 # define SANITIZER_MMAP_RANGE_SIZE FIRST_32_SECOND_64(1ULL << 32, 1ULL << 39)
     97 #else
     98 # define SANITIZER_MMAP_RANGE_SIZE FIRST_32_SECOND_64(1ULL << 32, 1ULL << 47)
     99 #endif
    100 
    101 // The AArch64 linux port uses the canonical syscall set as mandated by
    102 // the upstream linux community for all new ports. Other ports may still
    103 // use legacy syscalls.
    104 #ifndef SANITIZER_USES_CANONICAL_LINUX_SYSCALLS
    105 # if defined(__aarch64__) && SANITIZER_LINUX
    106 # define SANITIZER_USES_CANONICAL_LINUX_SYSCALLS 1
    107 # else
    108 # define SANITIZER_USES_CANONICAL_LINUX_SYSCALLS 0
    109 # endif
    110 #endif
    111 
    112 #endif // SANITIZER_PLATFORM_H
    113