HaikuConfig.h revision 5ffbe7d7
1/*
2 * Copyright 2009-2010, Haiku, Inc. All Rights Reserved.
3 * Distributed under the terms of the MIT License.
4 */
5#ifndef _CONFIG_HAIKU_CONFIG_H
6#define _CONFIG_HAIKU_CONFIG_H
7
8
9/* Determine the architecture and define macros for some fundamental
10   properties:
11   __HAIKU_ARCH					- short name of the architecture (used in paths)
12   __HAIKU_ARCH_ABI				- name of ABI (as in package architecture)
13   __HAIKU_ARCH_<arch>			- defined to 1 for the respective architecture
14   __HAIKU_ARCH_BITS			- defined to 32/64 on 32/64 bit architectures
15   								  (defaults to 32)
16   __HAIKU_ARCH_PHYSICAL_BITS	- defined to 32/64 on architectures with 32/64
17   								  (defaults to __HAIKU_ARCH_BITS)
18   __HAIKU_BIG_ENDIAN			- defined to 1 on big endian architectures
19   								  (defaults to undefined)
20*/
21#if defined(__i386__)
22#	define __HAIKU_ARCH					x86
23#	if __GNUC__ == 2
24#		define __HAIKU_ARCH_ABI			"x86_gcc2"
25#	else
26#		define __HAIKU_ARCH_ABI			"x86"
27#	endif
28#	define __HAIKU_ARCH_X86				1
29#	define __HAIKU_ARCH_PHYSICAL_BITS	64
30#elif defined(__x86_64__)
31#	define __HAIKU_ARCH					x86_64
32#	define __HAIKU_ARCH_ABI				"x86_64"
33#	define __HAIKU_ARCH_X86_64			1
34#	define __HAIKU_ARCH_BITS			64
35#elif defined(__POWERPC__)
36#	define __HAIKU_ARCH					ppc
37#	define __HAIKU_ARCH_ABI				"ppc"
38#	define __HAIKU_ARCH_PPC				1
39#	define __HAIKU_ARCH_PHYSICAL_BITS	64
40#	define __HAIKU_BIG_ENDIAN			1
41#elif defined(__M68K__)
42#	define __HAIKU_ARCH					m68k
43#	define __HAIKU_ARCH_ABI				"m68k"
44#	define __HAIKU_ARCH_M68K			1
45#	define __HAIKU_BIG_ENDIAN			1
46#elif defined(__MIPSEL__)
47#	define __HAIKU_ARCH					mipsel
48#	define __HAIKU_ARCH_ABI				"mipsel"
49#	define __HAIKU_ARCH_MIPSEL			1
50#elif defined(__ARMEL__) || defined(__arm__)
51#	define __HAIKU_ARCH					arm
52#	define __HAIKU_ARCH_ABI				"arm"
53#	define __HAIKU_ARCH_ARM				1
54#elif defined(__ARMEB__)
55#	define __HAIKU_ARCH					armeb
56#	define __HAIKU_ARCH_ABI				"armeb"
57#	define __HAIKU_ARCH_ARM				1
58#	define __HAIKU_BIG_ENDIAN			1
59#elif defined(__arm64__)
60#	define __HAIKU_ARCH					arm64
61#	define __HAIKU_ARCH_ABI				"arm64"
62#	define __HAIKU_ARCH_ARM64			1
63#	define __HAIKU_ARCH_BITS			64
64#elif defined(__riscv32__) || (defined(__riscv) && __riscv_xlen == 32)
65#	define __HAIKU_ARCH					riscv32
66#	define __HAIKU_ARCH_ABI				"riscv32"
67#	define __HAIKU_ARCH_RISCV32			1
68#	define __HAIKU_ARCH_BITS			32
69#elif defined(__riscv64__) || (defined(__riscv) && __riscv_xlen == 64)
70#	define __HAIKU_ARCH					riscv64
71#	define __HAIKU_ARCH_ABI				"riscv64"
72#	define __HAIKU_ARCH_RISCV32			1
73#	define __HAIKU_ARCH_BITS			64
74#elif defined(__sparc64__)
75#	define __HAIKU_ARCH					sparc64
76#	define __HAIKU_ARCH_ABI				"sparc"
77#	define __HAIKU_ARCH_SPARC			1
78#	define __HAIKU_ARCH_PHYSICAL_BITS	64
79#	define __HAIKU_BIG_ENDIAN			1
80#	define __HAIKU_ARCH_BITS			64
81#else
82#	error Unsupported architecture!
83#endif
84
85/* implied properties:
86   __HAIKU_ARCH_{32,64}_BIT		- defined to 1 on 32/64 bit architectures, i.e.
87   								  using 32/64 bit virtual addresses
88   __HAIKU_ARCH_PHYSICAL_BITS	- defined to 32/64 on architectures with 32/64
89   								  bit physical addresses
90   __HAIKU_ARCH_PHYSICAL_{32,64}_BIT - defined to 1 on architectures using 64
91   								  bit physical addresses
92   __HAIKU_BIG_ENDIAN			- defined to 1 on big endian architectures
93*/
94
95/* bitness */
96#ifndef __HAIKU_ARCH_BITS
97#	define __HAIKU_ARCH_BITS		32
98#endif
99
100#if __HAIKU_ARCH_BITS == 32
101#	define __HAIKU_ARCH_32_BIT		1
102#elif __HAIKU_ARCH_BITS == 64
103#	define __HAIKU_ARCH_64_BIT		1
104#else
105#	error Unsupported bitness!
106#endif
107
108/* physical bitness */
109#ifndef __HAIKU_ARCH_PHYSICAL_BITS
110#	define __HAIKU_ARCH_PHYSICAL_BITS	__HAIKU_ARCH_BITS
111#endif
112
113#if __HAIKU_ARCH_PHYSICAL_BITS == 32
114#	define __HAIKU_ARCH_PHYSICAL_32_BIT	1
115#elif __HAIKU_ARCH_PHYSICAL_BITS == 64
116#	define __HAIKU_ARCH_PHYSICAL_64_BIT	1
117#else
118#	error Unsupported physical bitness!
119#endif
120
121/* endianess */
122#ifndef __HAIKU_BIG_ENDIAN
123#	define	__HAIKU_LITTLE_ENDIAN	1
124#endif
125
126/* architecture specific include macros */
127#define __HAIKU_ARCH_HEADER(header)					<arch/__HAIKU_ARCH/header>
128#define __HAIKU_SUBDIR_ARCH_HEADER(subdir, header)	\
129	<subdir/arch/__HAIKU_ARCH/header>
130
131/* BeOS R5 binary compatibility (gcc 2 on x86) */
132#if defined(__HAIKU_ARCH_X86) && __GNUC__ == 2
133#	define __HAIKU_BEOS_COMPATIBLE	1
134#endif
135
136/* BeOS R5 compatible types */
137#ifndef __HAIKU_ARCH_64_BIT
138/*#ifdef __HAIKU_ARCH_X86*/
139	/* TODO: This should be "#ifdef __HAIKU_BEOS_COMPATIBLE", but this will
140	   break all gcc 4 C++ optional packages. I.e. switch that at a suitable
141	   time.
142	*/
143#	define __HAIKU_BEOS_COMPATIBLE_TYPES	1
144#endif
145
146
147#endif	/* _CONFIG_HAIKU_CONFIG_H */
148