ObjFW
platform.h
1 /*
2  * Copyright (c) 2008-2026 Jonathan Schleifer <js@nil.im>
3  *
4  * All rights reserved.
5  *
6  * This program is free software: you can redistribute it and/or modify it
7  * under the terms of the GNU Lesser General Public License version 3.0 only,
8  * as published by the Free Software Foundation.
9  *
10  * This program is distributed in the hope that it will be useful, but WITHOUT
11  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
12  * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License
13  * version 3.0 for more details.
14  *
15  * You should have received a copy of the GNU Lesser General Public License
16  * version 3.0 along with this program. If not, see
17  * <https://www.gnu.org/licenses/>.
18  */
19 
20 #include "objfw-defs.h"
21 
22 /* Required to build universal binaries on OS X */
23 #ifdef OF_UNIVERSAL
24 # if __BIG_ENDIAN__
25 # define OF_BIG_ENDIAN
26 # define OF_FLOAT_BIG_ENDIAN
27 # elif !__LITTLE_ENDIAN__
28 # error OF_UNIVERSAL defined, but neither __BIG_ENDIAN__ nor __LITTLE_ENDIAN__!
29 # endif
30 #endif
31 
32 #if (defined(__x86_64__) || defined(__amd64__)) && \
33  (defined(__LP64__) || defined(_WIN64))
34 # define OF_AMD64
35 #elif defined(__i386__)
36 # define OF_X86
37 #elif defined(__powerpc64__) || defined(__ppc64__) || defined(__PPC64__)
38 # define OF_POWERPC64
39 #elif defined(__powerpc__) || defined(__ppc__) || defined(__PPC__)
40 # define OF_POWERPC
41 #elif defined(__arm64__) || defined(__aarch64__) || defined(__ARM64_ARCH_8__)
42 # define OF_ARM64
43 #elif defined(__arm__) || defined(__ARM__)
44 # define OF_ARM
45 # if defined(__ARM_ARCH_7__) || defined(__ARM_ARCH_7A__) || \
46  defined(__ARM_ARCH_7R__) || defined(__ARM_ARCH_7M__) || \
47  defined(__ARM_ARCH_7EM__)
48 # define OF_ARMV7
49 # endif
50 # if defined(OF_ARMV7) || defined(__ARM_ARCH_6__) || \
51  defined(__ARM_ARCH_6J__) || defined(__ARM_ARCH_6K__) || \
52  defined(__ARM_ARCH_6Z__) || defined(__ARM_ARCH_6ZK__) || \
53  defined(__ARM_ARCH_6T2__)
54 # define OF_ARMV6
55 # endif
56 #elif defined(_MIPS_SIM)
57 # if _MIPS_SIM == _ABI64
58 # define OF_MIPS64
59 # define OF_MIPS64_N64
60 # elif _MIPS_SIM == _ABIN32
61 # define OF_MIPS64
62 # define OF_MIPS64_N32
63 # elif _MIPS_SIM == _ABIO32
64 # define OF_MIPS
65 # define OF_MIPS_O32
66 # endif
67 #elif defined(__mips_eabi) && _MIPS_SZPTR == 32
68 # define OF_MIPS
69 # define OF_MIPS_EABI
70 #elif defined(__sparc64__) || (defined(__sparc__) && defined(__arch64__))
71 # define OF_SPARC64
72 #elif defined(__sparc__) && !defined(__arch64__)
73 # define OF_SPARC
74 #elif defined(__hppa64__) || defined(_PA_RISC2_0)
75 # define OF_PA_RISC_2_0
76 #elif defined(__hppa__) || defined(_PA_RISC1_0) || defined(_PA_RISC1_1)
77 # define OF_PA_RISC
78 #elif defined(__ia64__) || defined(__IA64__)
79 # define OF_ITANIUM
80 #elif defined(__m68k__)
81 # define OF_M68K
82 # ifdef __mc68060__
83 # define OF_M68060
84 # endif
85 # if defined(__mc68040__) || defined(OF_M68060)
86 # define OF_M68040
87 # endif
88 # if defined(__mc68030__) || defined(OF_M68040)
89 # define OF_M68030
90 # endif
91 # if defined(__mc68020__) || defined(OF_M68030)
92 # define OF_M68020
93 # endif
94 # if defined(__mc68010__) || defined(OF_M68020)
95 # define OF_M68010
96 # endif
97 #elif defined(__riscv) && defined(__riscv_xlen) && __riscv_xlen == 64
98 # define OF_RISCV64
99 #elif defined(__riscv)
100 # define OF_RISCV
101 #elif defined(__s390x__)
102 # define OF_S390X
103 #elif defined(__s390__)
104 # define OF_S390
105 #elif defined(__sh__)
106 # define OF_SUPERH
107 #elif defined(__e2k__)
108 # define OF_ELBRUS_2000
109 #elif defined(__loongarch64)
110 # define OF_LOONGARCH64
111 #endif
112 
113 #if defined(__APPLE__)
114 # include <TargetConditionals.h>
115 # if (defined(TARGET_OS_IPHONE) && TARGET_OS_IPHONE) || \
116  (defined(TARGET_OS_SIMULATOR) && TARGET_OS_SIMULATOR)
117 # define OF_IOS
118 # else
119 # define OF_MACOS
120 # endif
121 #elif defined(__linux__)
122 # define OF_LINUX
123 #elif defined(_WIN32)
124 # define OF_WINDOWS
125 #elif defined(__FreeBSD__)
126 # define OF_FREEBSD
127 #elif defined(__NetBSD__)
128 # define OF_NETBSD
129 #elif defined(__OpenBSD__)
130 # define OF_OPENBSD
131 #elif defined(__DragonFly__)
132 # define OF_DRAGONFLYBSD
133 #elif defined(__ANDROID__)
134 # define OF_ANDROID
135 #elif defined(__HAIKU__)
136 # define OF_HAIKU
137 #elif defined(_AIX)
138 # define OF_AIX
139 #elif defined(__MORPHOS__)
140 # define OF_MORPHOS
141 # define OF_AMIGAOS
142 #elif defined(__amigaos4__)
143 # define OF_AMIGAOS4
144 # define OF_AMIGAOS
145 #elif defined(__amigaos__)
146 # define OF_AMIGAOS_M68K
147 # define OF_AMIGAOS
148 #elif defined(__sun__)
149 # define OF_SOLARIS
150 #elif defined(__QNX__)
151 # define OF_QNX
152 #elif defined(__hpux__)
153 # define OF_HPUX
154 #elif defined(_PSP)
155 # define OF_PSP
156 #elif defined(__DJGPP__)
157 # define OF_DJGPP
158 # define OF_MSDOS
159 #elif defined(__riscos__)
160 # define OF_ACORN_RISC_OS
161 #elif defined(__MINT__)
162 # define OF_MINT
163 #elif defined(__gnu_hurd__)
164 # define OF_HURD
165 #elif defined(__serenity__)
166 # define OF_SERENITYOS
167 #endif
168 
169 #ifdef __GLIBC__
170 # define OF_GLIBC
171 #endif
172 
173 #if defined(__ELF__)
174 # define OF_ELF
175 #elif defined(__MACH__)
176 # define OF_MACH_O
177 #endif
178 
179 #if defined(__PIC__) || defined(__pic__)
180 # define OF_PIC
181 #endif