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 # if TARGET_IPHONE_SIMULATOR
     42 #  define SANITIZER_IOSSIM 1
     43 # else
     44 #  define SANITIZER_IOSSIM 0
     45 # endif
     46 #else
     47 # define SANITIZER_MAC     0
     48 # define SANITIZER_IOS     0
     49 # define SANITIZER_IOSSIM  0
     50 #endif
     51 
     52 #if defined(_WIN32)
     53 # define SANITIZER_WINDOWS 1
     54 #else
     55 # define SANITIZER_WINDOWS 0
     56 #endif
     57 
     58 #if defined(__ANDROID__)
     59 # define SANITIZER_ANDROID 1
     60 #else
     61 # define SANITIZER_ANDROID 0
     62 #endif
     63 
     64 #define SANITIZER_POSIX (SANITIZER_FREEBSD || SANITIZER_LINUX || SANITIZER_MAC)
     65 
     66 #if __LP64__ || defined(_WIN64)
     67 #  define SANITIZER_WORDSIZE 64
     68 #else
     69 #  define SANITIZER_WORDSIZE 32
     70 #endif
     71 
     72 #if SANITIZER_WORDSIZE == 64
     73 # define FIRST_32_SECOND_64(a, b) (b)
     74 #else
     75 # define FIRST_32_SECOND_64(a, b) (a)
     76 #endif
     77 
     78 #if defined(__x86_64__) && !defined(_LP64)
     79 # define SANITIZER_X32 1
     80 #else
     81 # define SANITIZER_X32 0
     82 #endif
     83 
     84 // By default we allow to use SizeClassAllocator64 on 64-bit platform.
     85 // But in some cases (e.g. AArch64's 39-bit address space) SizeClassAllocator64
     86 // does not work well and we need to fallback to SizeClassAllocator32.
     87 // For such platforms build this code with -DSANITIZER_CAN_USE_ALLOCATOR64=0 or
     88 // change the definition of SANITIZER_CAN_USE_ALLOCATOR64 here.
     89 #ifndef SANITIZER_CAN_USE_ALLOCATOR64
     90 # if defined(__mips64) || defined(__aarch64__)
     91 #  define SANITIZER_CAN_USE_ALLOCATOR64 0
     92 # else
     93 #  define SANITIZER_CAN_USE_ALLOCATOR64 (SANITIZER_WORDSIZE == 64)
     94 # endif
     95 #endif
     96 
     97 // The range of addresses which can be returned my mmap.
     98 // FIXME: this value should be different on different platforms.  Larger values
     99 // will still work but will consume more memory for TwoLevelByteMap.
    100 #if defined(__mips__)
    101 # define SANITIZER_MMAP_RANGE_SIZE FIRST_32_SECOND_64(1ULL << 32, 1ULL << 40)
    102 #else
    103 # define SANITIZER_MMAP_RANGE_SIZE FIRST_32_SECOND_64(1ULL << 32, 1ULL << 47)
    104 #endif
    105 
    106 // The AArch64 linux port uses the canonical syscall set as mandated by
    107 // the upstream linux community for all new ports. Other ports may still
    108 // use legacy syscalls.
    109 #ifndef SANITIZER_USES_CANONICAL_LINUX_SYSCALLS
    110 # if defined(__aarch64__) && SANITIZER_LINUX
    111 # define SANITIZER_USES_CANONICAL_LINUX_SYSCALLS 1
    112 # else
    113 # define SANITIZER_USES_CANONICAL_LINUX_SYSCALLS 0
    114 # endif
    115 #endif
    116 
    117 // udi16 syscalls can only be used when the following conditions are
    118 // met:
    119 // * target is one of arm32, x86-32, sparc32, sh or m68k
    120 // * libc version is libc5, glibc-2.0, glibc-2.1 or glibc-2.2 to 2.15
    121 //   built against > linux-2.2 kernel headers
    122 // Since we don't want to include libc headers here, we check the
    123 // target only.
    124 #if defined(__arm__) || SANITIZER_X32 || defined(__sparc__)
    125 #define SANITIZER_USES_UID16_SYSCALLS 1
    126 #else
    127 #define SANITIZER_USES_UID16_SYSCALLS 0
    128 #endif
    129 
    130 #if defined(__mips__)
    131 # define SANITIZER_POINTER_FORMAT_LENGTH FIRST_32_SECOND_64(8, 10)
    132 #else
    133 # define SANITIZER_POINTER_FORMAT_LENGTH FIRST_32_SECOND_64(8, 12)
    134 #endif
    135 
    136 // Assume obsolete RPC headers are available by default
    137 #if !defined(HAVE_RPC_XDR_H) && !defined(HAVE_TIRPC_RPC_XDR_H)
    138 # define HAVE_RPC_XDR_H (SANITIZER_LINUX && !SANITIZER_ANDROID)
    139 # define HAVE_TIRPC_RPC_XDR_H 0
    140 #endif
    141 
    142 /// \macro MSC_PREREQ
    143 /// \brief Is the compiler MSVC of at least the specified version?
    144 /// The common \param version values to check for are:
    145 ///  * 1800: Microsoft Visual Studio 2013 / 12.0
    146 ///  * 1900: Microsoft Visual Studio 2015 / 14.0
    147 #ifdef _MSC_VER
    148 # define MSC_PREREQ(version) (_MSC_VER >= (version))
    149 #else
    150 # define MSC_PREREQ(version) 0
    151 #endif
    152 
    153 #endif // SANITIZER_PLATFORM_H
    154