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 #define V8_HOST_ARCH_X64 1
     16 #if defined(__x86_64__) && __SIZEOF_POINTER__ == 4  // Check for x32.
     17 #define V8_HOST_ARCH_32_BIT 1
     18 #else
     19 #define V8_HOST_ARCH_64_BIT 1
     20 #endif
     21 #elif defined(_M_IX86) || defined(__i386__)
     22 #define V8_HOST_ARCH_IA32 1
     23 #define V8_HOST_ARCH_32_BIT 1
     24 #elif defined(__AARCH64EL__)
     25 #define V8_HOST_ARCH_ARM64 1
     26 #define V8_HOST_ARCH_64_BIT 1
     27 #elif defined(__ARMEL__)
     28 #define V8_HOST_ARCH_ARM 1
     29 #define V8_HOST_ARCH_32_BIT 1
     30 #elif defined(__mips64)
     31 #define V8_HOST_ARCH_MIPS64 1
     32 #define V8_HOST_ARCH_64_BIT 1
     33 #elif defined(__MIPSEB__) || defined(__MIPSEL__)
     34 #define V8_HOST_ARCH_MIPS 1
     35 #define V8_HOST_ARCH_32_BIT 1
     36 #elif defined(__PPC__) || defined(_ARCH_PPC)
     37 #define V8_HOST_ARCH_PPC 1
     38 #if defined(__PPC64__) || defined(_ARCH_PPC64)
     39 #define V8_HOST_ARCH_64_BIT 1
     40 #else
     41 #define V8_HOST_ARCH_32_BIT 1
     42 #endif
     43 #elif defined(__s390__) || defined(__s390x__)
     44 #define V8_HOST_ARCH_S390 1
     45 #if defined(__s390x__)
     46 #define V8_HOST_ARCH_64_BIT 1
     47 #else
     48 #define V8_HOST_ARCH_32_BIT 1
     49 #endif
     50 #else
     51 #error "Host architecture was not detected as supported by v8"
     52 #endif
     53 
     54 #if defined(__ARM_ARCH_7A__) || \
     55     defined(__ARM_ARCH_7R__) || \
     56     defined(__ARM_ARCH_7__)
     57 # define CAN_USE_ARMV7_INSTRUCTIONS 1
     58 #ifdef __ARM_ARCH_EXT_IDIV__
     59 #define CAN_USE_SUDIV 1
     60 #endif
     61 # ifndef CAN_USE_VFP3_INSTRUCTIONS
     62 #define CAN_USE_VFP3_INSTRUCTIONS 1
     63 # endif
     64 #endif
     65 
     66 #if defined(__ARM_ARCH_8A__)
     67 #define CAN_USE_ARMV7_INSTRUCTIONS 1
     68 #define CAN_USE_SUDIV 1
     69 # define CAN_USE_ARMV8_INSTRUCTIONS 1
     70 #ifndef CAN_USE_VFP3_INSTRUCTIONS
     71 #define CAN_USE_VFP3_INSTRUCTIONS 1
     72 #endif
     73 #endif
     74 
     75 
     76 // Target architecture detection. This may be set externally. If not, detect
     77 // in the same way as the host architecture, that is, target the native
     78 // environment as presented by the compiler.
     79 #if !V8_TARGET_ARCH_X64 && !V8_TARGET_ARCH_IA32 && !V8_TARGET_ARCH_X87 &&   \
     80     !V8_TARGET_ARCH_ARM && !V8_TARGET_ARCH_ARM64 && !V8_TARGET_ARCH_MIPS && \
     81     !V8_TARGET_ARCH_MIPS64 && !V8_TARGET_ARCH_PPC && !V8_TARGET_ARCH_S390
     82 #if defined(_M_X64) || defined(__x86_64__)
     83 #define V8_TARGET_ARCH_X64 1
     84 #elif defined(_M_IX86) || defined(__i386__)
     85 #define V8_TARGET_ARCH_IA32 1
     86 #elif defined(__AARCH64EL__)
     87 #define V8_TARGET_ARCH_ARM64 1
     88 #elif defined(__ARMEL__)
     89 #define V8_TARGET_ARCH_ARM 1
     90 #elif defined(__mips64)
     91 #define V8_TARGET_ARCH_MIPS64 1
     92 #elif defined(__MIPSEB__) || defined(__MIPSEL__)
     93 #define V8_TARGET_ARCH_MIPS 1
     94 #else
     95 #error Target architecture was not detected as supported by v8
     96 #endif
     97 #endif
     98 
     99 // Determine architecture pointer size.
    100 #if V8_TARGET_ARCH_IA32
    101 #define V8_TARGET_ARCH_32_BIT 1
    102 #elif V8_TARGET_ARCH_X64
    103 #if !V8_TARGET_ARCH_32_BIT && !V8_TARGET_ARCH_64_BIT
    104 #if defined(__x86_64__) && __SIZEOF_POINTER__ == 4  // Check for x32.
    105 #define V8_TARGET_ARCH_32_BIT 1
    106 #else
    107 #define V8_TARGET_ARCH_64_BIT 1
    108 #endif
    109 #endif
    110 #elif V8_TARGET_ARCH_ARM
    111 #define V8_TARGET_ARCH_32_BIT 1
    112 #elif V8_TARGET_ARCH_ARM64
    113 #define V8_TARGET_ARCH_64_BIT 1
    114 #elif V8_TARGET_ARCH_MIPS
    115 #define V8_TARGET_ARCH_32_BIT 1
    116 #elif V8_TARGET_ARCH_MIPS64
    117 #define V8_TARGET_ARCH_64_BIT 1
    118 #elif V8_TARGET_ARCH_PPC
    119 #if V8_TARGET_ARCH_PPC64
    120 #define V8_TARGET_ARCH_64_BIT 1
    121 #else
    122 #define V8_TARGET_ARCH_32_BIT 1
    123 #endif
    124 #elif V8_TARGET_ARCH_S390
    125 #if V8_TARGET_ARCH_S390X
    126 #define V8_TARGET_ARCH_64_BIT 1
    127 #else
    128 #define V8_TARGET_ARCH_32_BIT 1
    129 #endif
    130 #elif V8_TARGET_ARCH_X87
    131 #define V8_TARGET_ARCH_32_BIT 1
    132 #else
    133 #error Unknown target architecture pointer size
    134 #endif
    135 
    136 // Check for supported combinations of host and target architectures.
    137 #if V8_TARGET_ARCH_IA32 && !V8_HOST_ARCH_IA32
    138 #error Target architecture ia32 is only supported on ia32 host
    139 #endif
    140 #if (V8_TARGET_ARCH_X64 && V8_TARGET_ARCH_64_BIT && \
    141      !(V8_HOST_ARCH_X64 && V8_HOST_ARCH_64_BIT))
    142 #error Target architecture x64 is only supported on x64 host
    143 #endif
    144 #if (V8_TARGET_ARCH_X64 && V8_TARGET_ARCH_32_BIT && \
    145      !(V8_HOST_ARCH_X64 && V8_HOST_ARCH_32_BIT))
    146 #error Target architecture x32 is only supported on x64 host with x32 support
    147 #endif
    148 #if (V8_TARGET_ARCH_ARM && !(V8_HOST_ARCH_IA32 || V8_HOST_ARCH_ARM))
    149 #error Target architecture arm is only supported on arm and ia32 host
    150 #endif
    151 #if (V8_TARGET_ARCH_ARM64 && !(V8_HOST_ARCH_X64 || V8_HOST_ARCH_ARM64))
    152 #error Target architecture arm64 is only supported on arm64 and x64 host
    153 #endif
    154 #if (V8_TARGET_ARCH_MIPS && !(V8_HOST_ARCH_IA32 || V8_HOST_ARCH_MIPS))
    155 #error Target architecture mips is only supported on mips and ia32 host
    156 #endif
    157 #if (V8_TARGET_ARCH_MIPS64 && !(V8_HOST_ARCH_X64 || V8_HOST_ARCH_MIPS64))
    158 #error Target architecture mips64 is only supported on mips64 and x64 host
    159 #endif
    160 
    161 // Determine architecture endianness.
    162 #if V8_TARGET_ARCH_IA32
    163 #define V8_TARGET_LITTLE_ENDIAN 1
    164 #elif V8_TARGET_ARCH_X64
    165 #define V8_TARGET_LITTLE_ENDIAN 1
    166 #elif V8_TARGET_ARCH_ARM
    167 #define V8_TARGET_LITTLE_ENDIAN 1
    168 #elif V8_TARGET_ARCH_ARM64
    169 #define V8_TARGET_LITTLE_ENDIAN 1
    170 #elif V8_TARGET_ARCH_MIPS
    171 #if defined(__MIPSEB__)
    172 #define V8_TARGET_BIG_ENDIAN 1
    173 #else
    174 #define V8_TARGET_LITTLE_ENDIAN 1
    175 #endif
    176 #elif V8_TARGET_ARCH_MIPS64
    177 #if defined(__MIPSEB__) || defined(V8_TARGET_ARCH_MIPS64_BE)
    178 #define V8_TARGET_BIG_ENDIAN 1
    179 #else
    180 #define V8_TARGET_LITTLE_ENDIAN 1
    181 #endif
    182 #elif V8_TARGET_ARCH_X87
    183 #define V8_TARGET_LITTLE_ENDIAN 1
    184 #elif V8_TARGET_ARCH_PPC_LE
    185 #define V8_TARGET_LITTLE_ENDIAN 1
    186 #elif V8_TARGET_ARCH_PPC_BE
    187 #define V8_TARGET_BIG_ENDIAN 1
    188 #elif V8_TARGET_ARCH_S390
    189 #if V8_TARGET_ARCH_S390_LE_SIM
    190 #define V8_TARGET_LITTLE_ENDIAN 1
    191 #else
    192 #define V8_TARGET_BIG_ENDIAN 1
    193 #endif
    194 #else
    195 #error Unknown target architecture endianness
    196 #endif
    197 
    198 #if defined(V8_TARGET_ARCH_IA32) || defined(V8_TARGET_ARCH_X64) || \
    199     defined(V8_TARGET_ARCH_X87)
    200 #define V8_TARGET_ARCH_STORES_RETURN_ADDRESS_ON_STACK 1
    201 #else
    202 #define V8_TARGET_ARCH_STORES_RETURN_ADDRESS_ON_STACK 0
    203 #endif
    204 
    205 // Number of bits to represent the page size for paged spaces. The value of 20
    206 // gives 1Mb bytes per page.
    207 const int kPageSizeBits = 19;
    208 
    209 #endif  // V8_BASE_BUILD_CONFIG_H_
    210