Home | History | Annotate | Download | only in base
      1 // Copyright 2014 the V8 project authors. All rights reserved.
      2 // Use of this source code is governed by a BSD-style license that can be
      3 // found in the LICENSE file.
      4 
      5 #ifndef V8_BASE_BUILD_CONFIG_H_
      6 #define V8_BASE_BUILD_CONFIG_H_
      7 
      8 #include "include/v8config.h"
      9 
     10 // Processor architecture detection.  For more info on what's defined, see:
     11 //   http://msdn.microsoft.com/en-us/library/b0084kay.aspx
     12 //   http://www.agner.org/optimize/calling_conventions.pdf
     13 //   or with gcc, run: "echo | gcc -E -dM -"
     14 #if defined(_M_X64) || defined(__x86_64__)
     15 #if defined(__native_client__)
     16 // For Native Client builds of V8, use V8_TARGET_ARCH_ARM, so that V8
     17 // generates ARM machine code, together with a portable ARM simulator
     18 // compiled for the host architecture in question.
     19 //
     20 // Since Native Client is ILP-32 on all architectures we use
     21 // V8_HOST_ARCH_IA32 on both 32- and 64-bit x86.
     22 #define V8_HOST_ARCH_IA32 1
     23 #define V8_HOST_ARCH_32_BIT 1
     24 #else
     25 #define V8_HOST_ARCH_X64 1
     26 #if defined(__x86_64__) && __SIZEOF_POINTER__ == 4  // Check for x32.
     27 #define V8_HOST_ARCH_32_BIT 1
     28 #else
     29 #define V8_HOST_ARCH_64_BIT 1
     30 #endif
     31 #endif  // __native_client__
     32 #elif defined(__pnacl__)
     33 // PNaCl is also ILP-32.
     34 #define V8_HOST_ARCH_IA32 1
     35 #define V8_HOST_ARCH_32_BIT 1
     36 #elif defined(_M_IX86) || defined(__i386__)
     37 #define V8_HOST_ARCH_IA32 1
     38 #define V8_HOST_ARCH_32_BIT 1
     39 #elif defined(__AARCH64EL__)
     40 #define V8_HOST_ARCH_ARM64 1
     41 #define V8_HOST_ARCH_64_BIT 1
     42 #elif defined(__ARMEL__)
     43 #define V8_HOST_ARCH_ARM 1
     44 #define V8_HOST_ARCH_32_BIT 1
     45 #elif defined(__mips64)
     46 #define V8_HOST_ARCH_MIPS64 1
     47 #define V8_HOST_ARCH_64_BIT 1
     48 #elif defined(__MIPSEB__) || defined(__MIPSEL__)
     49 #define V8_HOST_ARCH_MIPS 1
     50 #define V8_HOST_ARCH_32_BIT 1
     51 #elif defined(__PPC__) || defined(_ARCH_PPC)
     52 #define V8_HOST_ARCH_PPC 1
     53 #if defined(__PPC64__) || defined(_ARCH_PPC64)
     54 #define V8_HOST_ARCH_64_BIT 1
     55 #else
     56 #define V8_HOST_ARCH_32_BIT 1
     57 #endif
     58 #elif defined(__s390__) || defined(__s390x__)
     59 #define V8_HOST_ARCH_S390 1
     60 #if defined(__s390x__)
     61 #define V8_HOST_ARCH_64_BIT 1
     62 #else
     63 #define V8_HOST_ARCH_32_BIT 1
     64 #endif
     65 #else
     66 #error "Host architecture was not detected as supported by v8"
     67 #endif
     68 
     69 #if defined(__ARM_ARCH_7A__) || \
     70     defined(__ARM_ARCH_7R__) || \
     71     defined(__ARM_ARCH_7__)
     72 # define CAN_USE_ARMV7_INSTRUCTIONS 1
     73 # ifndef CAN_USE_VFP3_INSTRUCTIONS
     74 #  define CAN_USE_VFP3_INSTRUCTIONS
     75 # endif
     76 #endif
     77 
     78 #if defined(__ARM_ARCH_8A__)
     79 # define CAN_USE_ARMV8_INSTRUCTIONS 1
     80 #endif
     81 
     82 
     83 // Target architecture detection. This may be set externally. If not, detect
     84 // in the same way as the host architecture, that is, target the native
     85 // environment as presented by the compiler.
     86 #if !V8_TARGET_ARCH_X64 && !V8_TARGET_ARCH_IA32 && !V8_TARGET_ARCH_X87 &&   \
     87     !V8_TARGET_ARCH_ARM && !V8_TARGET_ARCH_ARM64 && !V8_TARGET_ARCH_MIPS && \
     88     !V8_TARGET_ARCH_MIPS64 && !V8_TARGET_ARCH_PPC && !V8_TARGET_ARCH_S390
     89 #if defined(_M_X64) || defined(__x86_64__)
     90 #define V8_TARGET_ARCH_X64 1
     91 #elif defined(_M_IX86) || defined(__i386__)
     92 #define V8_TARGET_ARCH_IA32 1
     93 #elif defined(__AARCH64EL__)
     94 #define V8_TARGET_ARCH_ARM64 1
     95 #elif defined(__ARMEL__)
     96 #define V8_TARGET_ARCH_ARM 1
     97 #elif defined(__mips64)
     98 #define V8_TARGET_ARCH_MIPS64 1
     99 #elif defined(__MIPSEB__) || defined(__MIPSEL__)
    100 #define V8_TARGET_ARCH_MIPS 1
    101 #else
    102 #error Target architecture was not detected as supported by v8
    103 #endif
    104 #endif
    105 
    106 // Determine architecture pointer size.
    107 #if V8_TARGET_ARCH_IA32
    108 #define V8_TARGET_ARCH_32_BIT 1
    109 #elif V8_TARGET_ARCH_X64
    110 #if !V8_TARGET_ARCH_32_BIT && !V8_TARGET_ARCH_64_BIT
    111 #if defined(__x86_64__) && __SIZEOF_POINTER__ == 4  // Check for x32.
    112 #define V8_TARGET_ARCH_32_BIT 1
    113 #else
    114 #define V8_TARGET_ARCH_64_BIT 1
    115 #endif
    116 #endif
    117 #elif V8_TARGET_ARCH_ARM
    118 #define V8_TARGET_ARCH_32_BIT 1
    119 #elif V8_TARGET_ARCH_ARM64
    120 #define V8_TARGET_ARCH_64_BIT 1
    121 #elif V8_TARGET_ARCH_MIPS
    122 #define V8_TARGET_ARCH_32_BIT 1
    123 #elif V8_TARGET_ARCH_MIPS64
    124 #define V8_TARGET_ARCH_64_BIT 1
    125 #elif V8_TARGET_ARCH_PPC
    126 #if V8_TARGET_ARCH_PPC64
    127 #define V8_TARGET_ARCH_64_BIT 1
    128 #else
    129 #define V8_TARGET_ARCH_32_BIT 1
    130 #endif
    131 #elif V8_TARGET_ARCH_S390
    132 #if V8_TARGET_ARCH_S390X
    133 #define V8_TARGET_ARCH_64_BIT 1
    134 #else
    135 #define V8_TARGET_ARCH_32_BIT 1
    136 #endif
    137 #elif V8_TARGET_ARCH_X87
    138 #define V8_TARGET_ARCH_32_BIT 1
    139 #else
    140 #error Unknown target architecture pointer size
    141 #endif
    142 
    143 // Check for supported combinations of host and target architectures.
    144 #if V8_TARGET_ARCH_IA32 && !V8_HOST_ARCH_IA32
    145 #error Target architecture ia32 is only supported on ia32 host
    146 #endif
    147 #if (V8_TARGET_ARCH_X64 && V8_TARGET_ARCH_64_BIT && \
    148      !(V8_HOST_ARCH_X64 && V8_HOST_ARCH_64_BIT))
    149 #error Target architecture x64 is only supported on x64 host
    150 #endif
    151 #if (V8_TARGET_ARCH_X64 && V8_TARGET_ARCH_32_BIT && \
    152      !(V8_HOST_ARCH_X64 && V8_HOST_ARCH_32_BIT))
    153 #error Target architecture x32 is only supported on x64 host with x32 support
    154 #endif
    155 #if (V8_TARGET_ARCH_ARM && !(V8_HOST_ARCH_IA32 || V8_HOST_ARCH_ARM))
    156 #error Target architecture arm is only supported on arm and ia32 host
    157 #endif
    158 #if (V8_TARGET_ARCH_ARM64 && !(V8_HOST_ARCH_X64 || V8_HOST_ARCH_ARM64))
    159 #error Target architecture arm64 is only supported on arm64 and x64 host
    160 #endif
    161 #if (V8_TARGET_ARCH_MIPS && !(V8_HOST_ARCH_IA32 || V8_HOST_ARCH_MIPS))
    162 #error Target architecture mips is only supported on mips and ia32 host
    163 #endif
    164 #if (V8_TARGET_ARCH_MIPS64 && !(V8_HOST_ARCH_X64 || V8_HOST_ARCH_MIPS64))
    165 #error Target architecture mips64 is only supported on mips64 and x64 host
    166 #endif
    167 
    168 // Determine architecture endianness.
    169 #if V8_TARGET_ARCH_IA32
    170 #define V8_TARGET_LITTLE_ENDIAN 1
    171 #elif V8_TARGET_ARCH_X64
    172 #define V8_TARGET_LITTLE_ENDIAN 1
    173 #elif V8_TARGET_ARCH_ARM
    174 #define V8_TARGET_LITTLE_ENDIAN 1
    175 #elif V8_TARGET_ARCH_ARM64
    176 #define V8_TARGET_LITTLE_ENDIAN 1
    177 #elif V8_TARGET_ARCH_MIPS
    178 #if defined(__MIPSEB__)
    179 #define V8_TARGET_BIG_ENDIAN 1
    180 #else
    181 #define V8_TARGET_LITTLE_ENDIAN 1
    182 #endif
    183 #elif V8_TARGET_ARCH_MIPS64
    184 #if defined(__MIPSEB__) || defined(V8_TARGET_ARCH_MIPS64_BE)
    185 #define V8_TARGET_BIG_ENDIAN 1
    186 #else
    187 #define V8_TARGET_LITTLE_ENDIAN 1
    188 #endif
    189 #elif V8_TARGET_ARCH_X87
    190 #define V8_TARGET_LITTLE_ENDIAN 1
    191 #elif V8_TARGET_ARCH_PPC_LE
    192 #define V8_TARGET_LITTLE_ENDIAN 1
    193 #elif V8_TARGET_ARCH_PPC_BE
    194 #define V8_TARGET_BIG_ENDIAN 1
    195 #elif V8_TARGET_ARCH_S390
    196 #if V8_TARGET_ARCH_S390_LE_SIM
    197 #define V8_TARGET_LITTLE_ENDIAN 1
    198 #else
    199 #define V8_TARGET_BIG_ENDIAN 1
    200 #endif
    201 #else
    202 #error Unknown target architecture endianness
    203 #endif
    204 
    205 #if defined(V8_TARGET_ARCH_IA32) || defined(V8_TARGET_ARCH_X64) || \
    206     defined(V8_TARGET_ARCH_X87)
    207 #define V8_TARGET_ARCH_STORES_RETURN_ADDRESS_ON_STACK 1
    208 #else
    209 #define V8_TARGET_ARCH_STORES_RETURN_ADDRESS_ON_STACK 0
    210 #endif
    211 
    212 // Number of bits to represent the page size for paged spaces. The value of 20
    213 // gives 1Mb bytes per page.
    214 #if V8_HOST_ARCH_PPC && V8_TARGET_ARCH_PPC && V8_OS_LINUX
    215 // Bump up for Power Linux due to larger (64K) page size.
    216 const int kPageSizeBits = 22;
    217 #else
    218 const int kPageSizeBits = 20;
    219 #endif
    220 
    221 #endif  // V8_BASE_BUILD_CONFIG_H_
    222