blob: 9637f657f928c95d570732de8bda5631716a0e7e [file] [log] [blame]
Ben Murdochb8a8cc12014-11-26 15:28:44 +00001// 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__
Emily Bernierd0a1eb72015-03-24 16:35:39 -040032#elif defined(__pnacl__)
33// PNaCl is also ILP-32.
34#define V8_HOST_ARCH_IA32 1
35#define V8_HOST_ARCH_32_BIT 1
Ben Murdochb8a8cc12014-11-26 15:28:44 +000036#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
Ben Murdoch4a90d5f2016-03-22 12:00:34 +000051#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
Ben Murdochb8a8cc12014-11-26 15:28:44 +000065#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
Ben Murdoch4a90d5f2016-03-22 12:00:34 +000078#if defined(__ARM_ARCH_8A__)
79# define CAN_USE_ARMV8_INSTRUCTIONS 1
80#endif
81
Ben Murdochb8a8cc12014-11-26 15:28:44 +000082
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.
Ben Murdoch4a90d5f2016-03-22 12:00:34 +000086#if !V8_TARGET_ARCH_X64 && !V8_TARGET_ARCH_IA32 && !V8_TARGET_ARCH_X87 && \
Ben Murdochb8a8cc12014-11-26 15:28:44 +000087 !V8_TARGET_ARCH_ARM && !V8_TARGET_ARCH_ARM64 && !V8_TARGET_ARCH_MIPS && \
Ben Murdoch4a90d5f2016-03-22 12:00:34 +000088 !V8_TARGET_ARCH_MIPS64 && !V8_TARGET_ARCH_PPC && !V8_TARGET_ARCH_S390
Ben Murdochb8a8cc12014-11-26 15:28:44 +000089#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
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000125#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
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000137#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
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000184#if defined(__MIPSEB__) || defined(V8_TARGET_ARCH_MIPS64_BE)
185#define V8_TARGET_BIG_ENDIAN 1
186#else
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000187#define V8_TARGET_LITTLE_ENDIAN 1
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000188#endif
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000189#elif V8_TARGET_ARCH_X87
190#define V8_TARGET_LITTLE_ENDIAN 1
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000191#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
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000201#else
202#error Unknown target architecture endianness
203#endif
204
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000205#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
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000212// Number of bits to represent the page size for paged spaces. The value of 20
213// gives 1Mb bytes per page.
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000214#if V8_HOST_ARCH_PPC && V8_TARGET_ARCH_PPC && V8_OS_LINUX
215// Bump up for Power Linux due to larger (64K) page size.
216const int kPageSizeBits = 22;
217#else
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000218const int kPageSizeBits = 20;
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000219#endif
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000220
221#endif // V8_BASE_BUILD_CONFIG_H_