build_config.h 7.43 KB
Newer Older
1 2 3 4 5 6 7
// Copyright 2014 the V8 project authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#ifndef V8_BASE_BUILD_CONFIG_H_
#define V8_BASE_BUILD_CONFIG_H_

8
#include "include/v8config.h"
9 10 11 12 13 14 15

// Processor architecture detection.  For more info on what's defined, see:
//   http://msdn.microsoft.com/en-us/library/b0084kay.aspx
//   http://www.agner.org/optimize/calling_conventions.pdf
//   or with gcc, run: "echo | gcc -E -dM -"
#if defined(_M_X64) || defined(__x86_64__)
#define V8_HOST_ARCH_X64 1
16
#if defined(__x86_64__) && __SIZEOF_POINTER__ == 4  // Check for x32.
17 18
#define V8_HOST_ARCH_32_BIT 1
#else
19
#define V8_HOST_ARCH_64_BIT 1
20
#endif
21 22 23
#elif defined(_M_IX86) || defined(__i386__)
#define V8_HOST_ARCH_IA32 1
#define V8_HOST_ARCH_32_BIT 1
24
#elif defined(__AARCH64EL__) || defined(_M_ARM64)
25 26 27 28 29
#define V8_HOST_ARCH_ARM64 1
#define V8_HOST_ARCH_64_BIT 1
#elif defined(__ARMEL__)
#define V8_HOST_ARCH_ARM 1
#define V8_HOST_ARCH_32_BIT 1
30 31 32
#elif defined(__mips64)
#define V8_HOST_ARCH_MIPS64 1
#define V8_HOST_ARCH_64_BIT 1
33 34 35
#elif defined(__MIPSEB__) || defined(__MIPSEL__)
#define V8_HOST_ARCH_MIPS 1
#define V8_HOST_ARCH_32_BIT 1
36 37 38
#elif defined(__PPC64__) || defined(_ARCH_PPC64)
#define V8_HOST_ARCH_PPC64 1
#define V8_HOST_ARCH_64_BIT 1
39 40 41
#elif defined(__PPC__) || defined(_ARCH_PPC)
#define V8_HOST_ARCH_PPC 1
#define V8_HOST_ARCH_32_BIT 1
42 43 44 45 46 47 48
#elif defined(__s390__) || defined(__s390x__)
#define V8_HOST_ARCH_S390 1
#if defined(__s390x__)
#define V8_HOST_ARCH_64_BIT 1
#else
#define V8_HOST_ARCH_32_BIT 1
#endif
Brice Dobry's avatar
Brice Dobry committed
49 50 51 52 53 54 55
#elif defined(__riscv) || defined(__riscv__)
#if __riscv_xlen == 64
#define V8_HOST_ARCH_RISCV64 1
#define V8_HOST_ARCH_64_BIT 1
#else
#error "Cannot detect Riscv's bitwidth"
#endif
56 57 58 59
#else
#error "Host architecture was not detected as supported by v8"
#endif

Brice Dobry's avatar
Brice Dobry committed
60
#if defined(__ARM_ARCH_7A__) || defined(__ARM_ARCH_7R__) || \
61
    defined(__ARM_ARCH_7__)
Brice Dobry's avatar
Brice Dobry committed
62
#define CAN_USE_ARMV7_INSTRUCTIONS 1
63 64 65
#ifdef __ARM_ARCH_EXT_IDIV__
#define CAN_USE_SUDIV 1
#endif
Brice Dobry's avatar
Brice Dobry committed
66
#ifndef CAN_USE_VFP3_INSTRUCTIONS
67
#define CAN_USE_VFP3_INSTRUCTIONS 1
Brice Dobry's avatar
Brice Dobry committed
68
#endif
69 70
#endif

71
#if defined(__ARM_ARCH_8A__)
72 73
#define CAN_USE_ARMV7_INSTRUCTIONS 1
#define CAN_USE_SUDIV 1
Brice Dobry's avatar
Brice Dobry committed
74
#define CAN_USE_ARMV8_INSTRUCTIONS 1
75 76 77
#ifndef CAN_USE_VFP3_INSTRUCTIONS
#define CAN_USE_VFP3_INSTRUCTIONS 1
#endif
78 79
#endif

80 81 82
// Target architecture detection. This may be set externally. If not, detect
// in the same way as the host architecture, that is, target the native
// environment as presented by the compiler.
Jakob Kummerow's avatar
Jakob Kummerow committed
83 84
#if !V8_TARGET_ARCH_X64 && !V8_TARGET_ARCH_IA32 && !V8_TARGET_ARCH_ARM &&      \
    !V8_TARGET_ARCH_ARM64 && !V8_TARGET_ARCH_MIPS && !V8_TARGET_ARCH_MIPS64 && \
Brice Dobry's avatar
Brice Dobry committed
85 86
    !V8_TARGET_ARCH_PPC && !V8_TARGET_ARCH_PPC64 && !V8_TARGET_ARCH_S390 &&    \
    !V8_TARGET_ARCH_RISCV64
87 88 89 90
#if defined(_M_X64) || defined(__x86_64__)
#define V8_TARGET_ARCH_X64 1
#elif defined(_M_IX86) || defined(__i386__)
#define V8_TARGET_ARCH_IA32 1
91
#elif defined(__AARCH64EL__) || defined(_M_ARM64)
92 93 94
#define V8_TARGET_ARCH_ARM64 1
#elif defined(__ARMEL__)
#define V8_TARGET_ARCH_ARM 1
95 96
#elif defined(__mips64)
#define V8_TARGET_ARCH_MIPS64 1
97 98
#elif defined(__MIPSEB__) || defined(__MIPSEL__)
#define V8_TARGET_ARCH_MIPS 1
99 100
#elif defined(_ARCH_PPC64)
#define V8_TARGET_ARCH_PPC64 1
101 102
#elif defined(_ARCH_PPC)
#define V8_TARGET_ARCH_PPC 1
Brice Dobry's avatar
Brice Dobry committed
103 104 105 106
#elif defined(__riscv) || defined(__riscv__)
#if __riscv_xlen == 64
#define V8_TARGET_ARCH_RISCV64 1
#endif
107 108 109 110 111
#else
#error Target architecture was not detected as supported by v8
#endif
#endif

112 113 114 115 116
// Determine architecture pointer size.
#if V8_TARGET_ARCH_IA32
#define V8_TARGET_ARCH_32_BIT 1
#elif V8_TARGET_ARCH_X64
#if !V8_TARGET_ARCH_32_BIT && !V8_TARGET_ARCH_64_BIT
117
#if defined(__x86_64__) && __SIZEOF_POINTER__ == 4  // Check for x32.
118 119 120 121 122 123 124 125 126 127 128
#define V8_TARGET_ARCH_32_BIT 1
#else
#define V8_TARGET_ARCH_64_BIT 1
#endif
#endif
#elif V8_TARGET_ARCH_ARM
#define V8_TARGET_ARCH_32_BIT 1
#elif V8_TARGET_ARCH_ARM64
#define V8_TARGET_ARCH_64_BIT 1
#elif V8_TARGET_ARCH_MIPS
#define V8_TARGET_ARCH_32_BIT 1
129 130
#elif V8_TARGET_ARCH_MIPS64
#define V8_TARGET_ARCH_64_BIT 1
131 132
#elif V8_TARGET_ARCH_PPC
#define V8_TARGET_ARCH_32_BIT 1
133 134
#elif V8_TARGET_ARCH_PPC64
#define V8_TARGET_ARCH_64_BIT 1
135 136 137 138 139 140
#elif V8_TARGET_ARCH_S390
#if V8_TARGET_ARCH_S390X
#define V8_TARGET_ARCH_64_BIT 1
#else
#define V8_TARGET_ARCH_32_BIT 1
#endif
Brice Dobry's avatar
Brice Dobry committed
141 142
#elif V8_TARGET_ARCH_RISCV64
#define V8_TARGET_ARCH_64_BIT 1
143 144 145 146
#else
#error Unknown target architecture pointer size
#endif

147 148 149 150
// Check for supported combinations of host and target architectures.
#if V8_TARGET_ARCH_IA32 && !V8_HOST_ARCH_IA32
#error Target architecture ia32 is only supported on ia32 host
#endif
151 152
#if (V8_TARGET_ARCH_X64 && V8_TARGET_ARCH_64_BIT && \
     !(V8_HOST_ARCH_X64 && V8_HOST_ARCH_64_BIT))
153 154
#error Target architecture x64 is only supported on x64 host
#endif
155 156 157 158
#if (V8_TARGET_ARCH_X64 && V8_TARGET_ARCH_32_BIT && \
     !(V8_HOST_ARCH_X64 && V8_HOST_ARCH_32_BIT))
#error Target architecture x32 is only supported on x64 host with x32 support
#endif
159 160 161 162 163 164 165 166 167
#if (V8_TARGET_ARCH_ARM && !(V8_HOST_ARCH_IA32 || V8_HOST_ARCH_ARM))
#error Target architecture arm is only supported on arm and ia32 host
#endif
#if (V8_TARGET_ARCH_ARM64 && !(V8_HOST_ARCH_X64 || V8_HOST_ARCH_ARM64))
#error Target architecture arm64 is only supported on arm64 and x64 host
#endif
#if (V8_TARGET_ARCH_MIPS && !(V8_HOST_ARCH_IA32 || V8_HOST_ARCH_MIPS))
#error Target architecture mips is only supported on mips and ia32 host
#endif
168 169 170
#if (V8_TARGET_ARCH_MIPS64 && !(V8_HOST_ARCH_X64 || V8_HOST_ARCH_MIPS64))
#error Target architecture mips64 is only supported on mips64 and x64 host
#endif
Brice Dobry's avatar
Brice Dobry committed
171 172 173
#if (V8_TARGET_ARCH_RISCV64 && !(V8_HOST_ARCH_X64 || V8_HOST_ARCH_RISCV64))
#error Target architecture riscv64 is only supported on riscv64 and x64 host
#endif
174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189

// Determine architecture endianness.
#if V8_TARGET_ARCH_IA32
#define V8_TARGET_LITTLE_ENDIAN 1
#elif V8_TARGET_ARCH_X64
#define V8_TARGET_LITTLE_ENDIAN 1
#elif V8_TARGET_ARCH_ARM
#define V8_TARGET_LITTLE_ENDIAN 1
#elif V8_TARGET_ARCH_ARM64
#define V8_TARGET_LITTLE_ENDIAN 1
#elif V8_TARGET_ARCH_MIPS
#if defined(__MIPSEB__)
#define V8_TARGET_BIG_ENDIAN 1
#else
#define V8_TARGET_LITTLE_ENDIAN 1
#endif
190
#elif V8_TARGET_ARCH_MIPS64
191 192 193
#if defined(__MIPSEB__) || defined(V8_TARGET_ARCH_MIPS64_BE)
#define V8_TARGET_BIG_ENDIAN 1
#else
194
#define V8_TARGET_LITTLE_ENDIAN 1
195
#endif
196 197
#elif __BIG_ENDIAN__  // FOR PPCGR on AIX
#define V8_TARGET_BIG_ENDIAN 1
198 199 200 201
#elif V8_TARGET_ARCH_PPC_LE
#define V8_TARGET_LITTLE_ENDIAN 1
#elif V8_TARGET_ARCH_PPC_BE
#define V8_TARGET_BIG_ENDIAN 1
202 203 204 205 206 207
#elif V8_TARGET_ARCH_S390
#if V8_TARGET_ARCH_S390_LE_SIM
#define V8_TARGET_LITTLE_ENDIAN 1
#else
#define V8_TARGET_BIG_ENDIAN 1
#endif
Brice Dobry's avatar
Brice Dobry committed
208 209
#elif V8_TARGET_ARCH_RISCV64
#define V8_TARGET_LITTLE_ENDIAN 1
210 211 212 213
#else
#error Unknown target architecture endianness
#endif

Jakob Kummerow's avatar
Jakob Kummerow committed
214
#if defined(V8_TARGET_ARCH_IA32) || defined(V8_TARGET_ARCH_X64)
215
#define V8_TARGET_ARCH_STORES_RETURN_ADDRESS_ON_STACK true
216
#else
217
#define V8_TARGET_ARCH_STORES_RETURN_ADDRESS_ON_STACK false
218
#endif
219 220
constexpr int kReturnAddressStackSlotCount =
    V8_TARGET_ARCH_STORES_RETURN_ADDRESS_ON_STACK ? 1 : 0;
221

222 223 224
// Number of bits to represent the page size for paged spaces.
#if defined(V8_TARGET_ARCH_PPC) || defined(V8_TARGET_ARCH_PPC64)
// PPC has large (64KB) physical pages.
225
const int kPageSizeBits = 19;
226
#else
227 228 229 230
// Arm64 supports up to 64k OS pages on Linux, however 4k pages are more common
// so we keep the V8 page size at 256k. Nonetheless, we need to make sure we
// don't decrease it further in the future due to reserving 3 OS pages for every
// executable V8 page.
231 232
const int kPageSizeBits = 18;
#endif
233

234
#endif  // V8_BASE_BUILD_CONFIG_H_