1#ifndef MACHINE_H
2#define MACHINE_H
3
4#if defined(__BYTE_ORDER__) && (__BYTE_ORDER__ == __ORDER_BIG_ENDIAN__)
5#define ARCH_BIG_ENDIAN 1
6#else
7#define ARCH_BIG_ENDIAN 0
8#endif
9
10
11enum bitness {
12	ARCH_LP32,
13	ARCH_X32,
14	ARCH_LP64,
15	ARCH_LLP64,
16};
17
18#ifdef __LP64__
19#define ARCH_M64_DEFAULT ARCH_LP64
20#elif defined(__x86_64__) || defined(__x86_64)
21#define ARCH_M64_DEFAULT ARCH_X32
22#else
23#define ARCH_M64_DEFAULT ARCH_LP32
24#endif
25
26
27enum machine {
28	MACH_ARM,	MACH_ARM64,
29	MACH_I386,	MACH_X86_64,
30	MACH_MIPS32,	MACH_MIPS64,
31	MACH_PPC32,	MACH_PPC64,
32	MACH_RISCV32,	MACH_RISCV64,
33	MACH_SPARC32,	MACH_SPARC64,
34	MACH_S390,	MACH_S390X,
35	MACH_ALPHA,
36	MACH_BFIN,
37	MACH_H8300,
38	MACH_M68K,
39	MACH_MICROBLAZE,
40	MACH_NDS32,
41	MACH_NIOS2,
42	MACH_OPENRISC,
43	MACH_SH,
44	MACH_XTENSA,
45	MACH_UNKNOWN
46};
47
48#if defined(__aarch64__)
49#define MACH_NATIVE	MACH_ARM64
50#elif defined(__alpha__) || defined(__alpha)
51#define	MACH_NATIVE	MACH_ALPHA
52#elif defined(__arm__)
53#define	MACH_NATIVE	MACH_ARM
54#elif defined(__x86_64__) || defined(__x86_64)
55#define	MACH_NATIVE	MACH_X86_64
56#elif defined(__i386__) || defined(__i386)
57#define	MACH_NATIVE	MACH_I386
58#elif defined(__mips64__) || (defined(__mips) && __mips == 64)
59#define	MACH_NATIVE	MACH_MIPS64
60#elif defined(__mips__) || defined(__mips)
61#define	MACH_NATIVE	MACH_MIPS32
62#elif defined(__powerpc64__) || defined(__ppc64__)
63#define	MACH_NATIVE	MACH_PPC64
64#elif defined(__powerpc__) || defined(__powerpc) || defined(__ppc__)
65#define	MACH_NATIVE	MACH_PPC32
66#elif defined(__riscv) && (__riscv_xlen == 64)
67#define	MACH_NATIVE	MACH_RISCV64
68#elif defined(__riscv) && (__riscv_xlen == 32)
69#define	MACH_NATIVE	MACH_RISCV32
70#elif defined(__sparc_v9__) || defined(__sparcv9)
71#define	MACH_NATIVE	MACH_SPARC64
72#elif defined(__sparc__) || defined(__sparc)
73#define	MACH_NATIVE	MACH_SPARC32
74#elif defined(__m68k__)
75#define MACH_NATIVE	MACH_M68K
76#elif defined(__s390x__) || defined(__zarch__)
77#define MACH_NATIVE	MACH_S390X
78#elif defined(__s390__)
79#define MACH_NATIVE	MACH_S390
80#else
81#define MACH_NATIVE	MACH_UNKNOWN
82#endif
83
84
85enum fp_abi {
86	FP_ABI_HARD,
87	FP_ABI_SOFT,
88	FP_ABI_HYBRID,
89};
90
91#if defined(__ARM_PCS_VFP)
92#define FP_ABI_NATIVE		FP_ABI_HARD
93#elif defined(__ARM_PCS) && !defined(__SOFTFP__)
94#define FP_ABI_NATIVE		FP_ABI_HYBRID
95#else
96#define FP_ABI_NATIVE		FP_ABI_SOFT
97#endif
98
99
100enum {
101	OS_UNKNOWN,
102	OS_NONE,
103	OS_UNIX,
104	OS_CYGWIN,
105	OS_DARWIN,
106	OS_FREEBSD,
107	OS_LINUX,
108	OS_NETBSD,
109	OS_OPENBSD,
110	OS_SUNOS,
111};
112
113#if defined(__CYGWIN__)
114#define OS_NATIVE	OS_CYGWIN
115#elif defined(__APPLE__)
116#define OS_NATIVE	OS_DARWIN
117#elif defined(__FreeBSD__)
118#define OS_NATIVE	OS_FREEBSD
119#elif defined(__linux__) || defined(__linux)
120#define OS_NATIVE	OS_LINUX
121#elif defined(__NetBSD__)
122#define OS_NATIVE	OS_NETBSD
123#elif defined(__OpenBSD__)
124#define OS_NATIVE	OS_OPENBSD
125#elif defined(__sun__) || defined(__sun)
126#define OS_NATIVE	OS_SUNOS
127#elif defined(__unix__) || defined(__unix)
128#define OS_NATIVE	OS_UNIX
129#else
130#define OS_NATIVE	OS_UNKNOWN
131#endif
132
133#endif
134