1 1.11 alnsn /* $NetBSD: sljitConfigInternal.h,v 1.11 2019/01/20 23:14:16 alnsn Exp $ */ 2 1.9 alnsn 3 1.1 alnsn /* 4 1.1 alnsn * Stack-less Just-In-Time compiler 5 1.1 alnsn * 6 1.11 alnsn * Copyright Zoltan Herczeg (hzmester (at) freemail.hu). All rights reserved. 7 1.1 alnsn * 8 1.1 alnsn * Redistribution and use in source and binary forms, with or without modification, are 9 1.1 alnsn * permitted provided that the following conditions are met: 10 1.1 alnsn * 11 1.1 alnsn * 1. Redistributions of source code must retain the above copyright notice, this list of 12 1.1 alnsn * conditions and the following disclaimer. 13 1.1 alnsn * 14 1.1 alnsn * 2. Redistributions in binary form must reproduce the above copyright notice, this list 15 1.1 alnsn * of conditions and the following disclaimer in the documentation and/or other materials 16 1.1 alnsn * provided with the distribution. 17 1.1 alnsn * 18 1.1 alnsn * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDER(S) AND CONTRIBUTORS ``AS IS'' AND ANY 19 1.1 alnsn * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 20 1.1 alnsn * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT 21 1.1 alnsn * SHALL THE COPYRIGHT HOLDER(S) OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, 22 1.1 alnsn * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED 23 1.1 alnsn * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR 24 1.1 alnsn * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 25 1.1 alnsn * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN 26 1.1 alnsn * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 27 1.1 alnsn */ 28 1.1 alnsn 29 1.1 alnsn #ifndef _SLJIT_CONFIG_INTERNAL_H_ 30 1.1 alnsn #define _SLJIT_CONFIG_INTERNAL_H_ 31 1.1 alnsn 32 1.1 alnsn /* 33 1.10 alnsn SLJIT defines the following architecture dependent types and macros: 34 1.1 alnsn 35 1.10 alnsn Types: 36 1.10 alnsn sljit_s8, sljit_u8 : signed and unsigned 8 bit integer type 37 1.10 alnsn sljit_s16, sljit_u16 : signed and unsigned 16 bit integer type 38 1.10 alnsn sljit_s32, sljit_u32 : signed and unsigned 32 bit integer type 39 1.10 alnsn sljit_sw, sljit_uw : signed and unsigned machine word, enough to store a pointer 40 1.10 alnsn sljit_p : unsgined pointer value (usually the same as sljit_uw, but 41 1.10 alnsn some 64 bit ABIs may use 32 bit pointers) 42 1.10 alnsn sljit_f32 : 32 bit single precision floating point value 43 1.10 alnsn sljit_f64 : 64 bit double precision floating point value 44 1.10 alnsn 45 1.10 alnsn Macros for feature detection (boolean): 46 1.10 alnsn SLJIT_32BIT_ARCHITECTURE : 32 bit architecture 47 1.10 alnsn SLJIT_64BIT_ARCHITECTURE : 64 bit architecture 48 1.10 alnsn SLJIT_LITTLE_ENDIAN : little endian architecture 49 1.10 alnsn SLJIT_BIG_ENDIAN : big endian architecture 50 1.10 alnsn SLJIT_UNALIGNED : allows unaligned memory accesses for non-fpu operations (only!) 51 1.10 alnsn SLJIT_INDIRECT_CALL : see SLJIT_FUNC_OFFSET() for more information 52 1.10 alnsn 53 1.10 alnsn Constants: 54 1.10 alnsn SLJIT_NUMBER_OF_REGISTERS : number of available registers 55 1.10 alnsn SLJIT_NUMBER_OF_SCRATCH_REGISTERS : number of available scratch registers 56 1.10 alnsn SLJIT_NUMBER_OF_SAVED_REGISTERS : number of available saved registers 57 1.10 alnsn SLJIT_NUMBER_OF_FLOAT_REGISTERS : number of available floating point registers 58 1.10 alnsn SLJIT_NUMBER_OF_SCRATCH_FLOAT_REGISTERS : number of available floating point scratch registers 59 1.10 alnsn SLJIT_NUMBER_OF_SAVED_FLOAT_REGISTERS : number of available floating point saved registers 60 1.10 alnsn SLJIT_WORD_SHIFT : the shift required to apply when accessing a sljit_sw/sljit_uw array by index 61 1.10 alnsn SLJIT_F32_SHIFT : the shift required to apply when accessing 62 1.10 alnsn a single precision floating point array by index 63 1.10 alnsn SLJIT_F64_SHIFT : the shift required to apply when accessing 64 1.10 alnsn a double precision floating point array by index 65 1.10 alnsn SLJIT_LOCALS_OFFSET : local space starting offset (SLJIT_SP + SLJIT_LOCALS_OFFSET) 66 1.10 alnsn SLJIT_RETURN_ADDRESS_OFFSET : a return instruction always adds this offset to the return address 67 1.10 alnsn 68 1.10 alnsn Other macros: 69 1.10 alnsn SLJIT_CALL : C calling convention define for both calling JIT form C and C callbacks for JIT 70 1.10 alnsn SLJIT_W(number) : defining 64 bit constants on 64 bit architectures (compiler independent helper) 71 1.1 alnsn */ 72 1.1 alnsn 73 1.10 alnsn /*****************/ 74 1.10 alnsn /* Sanity check. */ 75 1.10 alnsn /*****************/ 76 1.10 alnsn 77 1.1 alnsn #if !((defined SLJIT_CONFIG_X86_32 && SLJIT_CONFIG_X86_32) \ 78 1.1 alnsn || (defined SLJIT_CONFIG_X86_64 && SLJIT_CONFIG_X86_64) \ 79 1.1 alnsn || (defined SLJIT_CONFIG_ARM_V5 && SLJIT_CONFIG_ARM_V5) \ 80 1.1 alnsn || (defined SLJIT_CONFIG_ARM_V7 && SLJIT_CONFIG_ARM_V7) \ 81 1.1 alnsn || (defined SLJIT_CONFIG_ARM_THUMB2 && SLJIT_CONFIG_ARM_THUMB2) \ 82 1.7 alnsn || (defined SLJIT_CONFIG_ARM_64 && SLJIT_CONFIG_ARM_64) \ 83 1.1 alnsn || (defined SLJIT_CONFIG_PPC_32 && SLJIT_CONFIG_PPC_32) \ 84 1.1 alnsn || (defined SLJIT_CONFIG_PPC_64 && SLJIT_CONFIG_PPC_64) \ 85 1.1 alnsn || (defined SLJIT_CONFIG_MIPS_32 && SLJIT_CONFIG_MIPS_32) \ 86 1.7 alnsn || (defined SLJIT_CONFIG_MIPS_64 && SLJIT_CONFIG_MIPS_64) \ 87 1.4 alnsn || (defined SLJIT_CONFIG_SPARC_32 && SLJIT_CONFIG_SPARC_32) \ 88 1.7 alnsn || (defined SLJIT_CONFIG_TILEGX && SLJIT_CONFIG_TILEGX) \ 89 1.1 alnsn || (defined SLJIT_CONFIG_AUTO && SLJIT_CONFIG_AUTO) \ 90 1.1 alnsn || (defined SLJIT_CONFIG_UNSUPPORTED && SLJIT_CONFIG_UNSUPPORTED)) 91 1.1 alnsn #error "An architecture must be selected" 92 1.1 alnsn #endif 93 1.1 alnsn 94 1.1 alnsn #if (defined SLJIT_CONFIG_X86_32 && SLJIT_CONFIG_X86_32) \ 95 1.1 alnsn + (defined SLJIT_CONFIG_X86_64 && SLJIT_CONFIG_X86_64) \ 96 1.1 alnsn + (defined SLJIT_CONFIG_ARM_V5 && SLJIT_CONFIG_ARM_V5) \ 97 1.1 alnsn + (defined SLJIT_CONFIG_ARM_V7 && SLJIT_CONFIG_ARM_V7) \ 98 1.1 alnsn + (defined SLJIT_CONFIG_ARM_THUMB2 && SLJIT_CONFIG_ARM_THUMB2) \ 99 1.7 alnsn + (defined SLJIT_CONFIG_ARM_64 && SLJIT_CONFIG_ARM_64) \ 100 1.1 alnsn + (defined SLJIT_CONFIG_PPC_32 && SLJIT_CONFIG_PPC_32) \ 101 1.1 alnsn + (defined SLJIT_CONFIG_PPC_64 && SLJIT_CONFIG_PPC_64) \ 102 1.7 alnsn + (defined SLJIT_CONFIG_TILEGX && SLJIT_CONFIG_TILEGX) \ 103 1.1 alnsn + (defined SLJIT_CONFIG_MIPS_32 && SLJIT_CONFIG_MIPS_32) \ 104 1.7 alnsn + (defined SLJIT_CONFIG_MIPS_64 && SLJIT_CONFIG_MIPS_64) \ 105 1.4 alnsn + (defined SLJIT_CONFIG_SPARC_32 && SLJIT_CONFIG_SPARC_32) \ 106 1.1 alnsn + (defined SLJIT_CONFIG_AUTO && SLJIT_CONFIG_AUTO) \ 107 1.1 alnsn + (defined SLJIT_CONFIG_UNSUPPORTED && SLJIT_CONFIG_UNSUPPORTED) >= 2 108 1.1 alnsn #error "Multiple architectures are selected" 109 1.1 alnsn #endif 110 1.1 alnsn 111 1.10 alnsn /********************************************************/ 112 1.10 alnsn /* Automatic CPU detection (requires compiler support). */ 113 1.10 alnsn /********************************************************/ 114 1.10 alnsn 115 1.1 alnsn #if (defined SLJIT_CONFIG_AUTO && SLJIT_CONFIG_AUTO) 116 1.1 alnsn 117 1.1 alnsn #ifndef _WIN32 118 1.1 alnsn 119 1.1 alnsn #if defined(__i386__) || defined(__i386) 120 1.1 alnsn #define SLJIT_CONFIG_X86_32 1 121 1.1 alnsn #elif defined(__x86_64__) 122 1.1 alnsn #define SLJIT_CONFIG_X86_64 1 123 1.1 alnsn #elif defined(__arm__) || defined(__ARM__) 124 1.1 alnsn #ifdef __thumb2__ 125 1.1 alnsn #define SLJIT_CONFIG_ARM_THUMB2 1 126 1.1 alnsn #elif defined(__ARM_ARCH_7__) || defined(__ARM_ARCH_7A__) || defined(__ARM_ARCH_7R__) 127 1.1 alnsn #define SLJIT_CONFIG_ARM_V7 1 128 1.1 alnsn #else 129 1.1 alnsn #define SLJIT_CONFIG_ARM_V5 1 130 1.1 alnsn #endif 131 1.7 alnsn #elif defined (__aarch64__) 132 1.7 alnsn #define SLJIT_CONFIG_ARM_64 1 133 1.1 alnsn #elif defined(__ppc64__) || defined(__powerpc64__) || defined(_ARCH_PPC64) || (defined(_POWER) && defined(__64BIT__)) 134 1.1 alnsn #define SLJIT_CONFIG_PPC_64 1 135 1.1 alnsn #elif defined(__ppc__) || defined(__powerpc__) || defined(_ARCH_PPC) || defined(_ARCH_PWR) || defined(_ARCH_PWR2) || defined(_POWER) 136 1.1 alnsn #define SLJIT_CONFIG_PPC_32 1 137 1.7 alnsn #elif defined(__mips__) && !defined(_LP64) 138 1.1 alnsn #define SLJIT_CONFIG_MIPS_32 1 139 1.7 alnsn #elif defined(__mips64) 140 1.7 alnsn #define SLJIT_CONFIG_MIPS_64 1 141 1.4 alnsn #elif defined(__sparc__) || defined(__sparc) 142 1.4 alnsn #define SLJIT_CONFIG_SPARC_32 1 143 1.7 alnsn #elif defined(__tilegx__) 144 1.7 alnsn #define SLJIT_CONFIG_TILEGX 1 145 1.1 alnsn #else 146 1.1 alnsn /* Unsupported architecture */ 147 1.1 alnsn #define SLJIT_CONFIG_UNSUPPORTED 1 148 1.1 alnsn #endif 149 1.1 alnsn 150 1.1 alnsn #else /* !_WIN32 */ 151 1.1 alnsn 152 1.1 alnsn #if defined(_M_X64) || defined(__x86_64__) 153 1.1 alnsn #define SLJIT_CONFIG_X86_64 1 154 1.1 alnsn #elif defined(_ARM_) 155 1.1 alnsn #define SLJIT_CONFIG_ARM_V5 1 156 1.1 alnsn #else 157 1.1 alnsn #define SLJIT_CONFIG_X86_32 1 158 1.1 alnsn #endif 159 1.1 alnsn 160 1.1 alnsn #endif /* !WIN32 */ 161 1.1 alnsn #endif /* SLJIT_CONFIG_AUTO */ 162 1.1 alnsn 163 1.1 alnsn #if (defined SLJIT_CONFIG_UNSUPPORTED && SLJIT_CONFIG_UNSUPPORTED) 164 1.1 alnsn #undef SLJIT_EXECUTABLE_ALLOCATOR 165 1.1 alnsn #endif 166 1.1 alnsn 167 1.10 alnsn /******************************/ 168 1.10 alnsn /* CPU family type detection. */ 169 1.10 alnsn /******************************/ 170 1.10 alnsn 171 1.10 alnsn #if (defined SLJIT_CONFIG_ARM_V5 && SLJIT_CONFIG_ARM_V5) || (defined SLJIT_CONFIG_ARM_V7 && SLJIT_CONFIG_ARM_V7) \ 172 1.10 alnsn || (defined SLJIT_CONFIG_ARM_THUMB2 && SLJIT_CONFIG_ARM_THUMB2) 173 1.10 alnsn #define SLJIT_CONFIG_ARM_32 1 174 1.10 alnsn #endif 175 1.10 alnsn 176 1.10 alnsn #if (defined SLJIT_CONFIG_X86_32 && SLJIT_CONFIG_X86_32) || (defined SLJIT_CONFIG_X86_64 && SLJIT_CONFIG_X86_64) 177 1.10 alnsn #define SLJIT_CONFIG_X86 1 178 1.10 alnsn #elif (defined SLJIT_CONFIG_ARM_32 && SLJIT_CONFIG_ARM_32) || (defined SLJIT_CONFIG_ARM_64 && SLJIT_CONFIG_ARM_64) 179 1.10 alnsn #define SLJIT_CONFIG_ARM 1 180 1.10 alnsn #elif (defined SLJIT_CONFIG_PPC_32 && SLJIT_CONFIG_PPC_32) || (defined SLJIT_CONFIG_PPC_64 && SLJIT_CONFIG_PPC_64) 181 1.10 alnsn #define SLJIT_CONFIG_PPC 1 182 1.10 alnsn #elif (defined SLJIT_CONFIG_MIPS_32 && SLJIT_CONFIG_MIPS_32) || (defined SLJIT_CONFIG_MIPS_64 && SLJIT_CONFIG_MIPS_64) 183 1.10 alnsn #define SLJIT_CONFIG_MIPS 1 184 1.10 alnsn #elif (defined SLJIT_CONFIG_SPARC_32 && SLJIT_CONFIG_SPARC_32) || (defined SLJIT_CONFIG_SPARC_64 && SLJIT_CONFIG_SPARC_64) 185 1.10 alnsn #define SLJIT_CONFIG_SPARC 1 186 1.10 alnsn #endif 187 1.10 alnsn 188 1.10 alnsn /**********************************/ 189 1.10 alnsn /* External function definitions. */ 190 1.10 alnsn /**********************************/ 191 1.10 alnsn 192 1.1 alnsn /* General macros: 193 1.1 alnsn Note: SLJIT is designed to be independent from them as possible. 194 1.1 alnsn 195 1.10 alnsn In release mode (SLJIT_DEBUG is not defined) only the following 196 1.10 alnsn external functions are needed: 197 1.1 alnsn */ 198 1.1 alnsn 199 1.1 alnsn #ifndef SLJIT_MALLOC 200 1.10 alnsn #define SLJIT_MALLOC(size, allocator_data) malloc(size) 201 1.1 alnsn #endif 202 1.1 alnsn 203 1.1 alnsn #ifndef SLJIT_FREE 204 1.10 alnsn #define SLJIT_FREE(ptr, allocator_data) free(ptr) 205 1.1 alnsn #endif 206 1.1 alnsn 207 1.11 alnsn #ifndef SLJIT_MEMCPY 208 1.11 alnsn #define SLJIT_MEMCPY(dest, src, len) memcpy(dest, src, len) 209 1.1 alnsn #endif 210 1.1 alnsn 211 1.1 alnsn #ifndef SLJIT_ZEROMEM 212 1.1 alnsn #define SLJIT_ZEROMEM(dest, len) memset(dest, 0, len) 213 1.1 alnsn #endif 214 1.1 alnsn 215 1.10 alnsn /***************************/ 216 1.10 alnsn /* Compiler helper macros. */ 217 1.10 alnsn /***************************/ 218 1.10 alnsn 219 1.1 alnsn #if !defined(SLJIT_LIKELY) && !defined(SLJIT_UNLIKELY) 220 1.1 alnsn 221 1.1 alnsn #if defined(__GNUC__) && (__GNUC__ >= 3) 222 1.1 alnsn #define SLJIT_LIKELY(x) __builtin_expect((x), 1) 223 1.1 alnsn #define SLJIT_UNLIKELY(x) __builtin_expect((x), 0) 224 1.1 alnsn #else 225 1.1 alnsn #define SLJIT_LIKELY(x) (x) 226 1.1 alnsn #define SLJIT_UNLIKELY(x) (x) 227 1.1 alnsn #endif 228 1.1 alnsn 229 1.1 alnsn #endif /* !defined(SLJIT_LIKELY) && !defined(SLJIT_UNLIKELY) */ 230 1.1 alnsn 231 1.1 alnsn #ifndef SLJIT_INLINE 232 1.7 alnsn /* Inline functions. Some old compilers do not support them. */ 233 1.7 alnsn #if defined(__SUNPRO_C) && __SUNPRO_C <= 0x510 234 1.7 alnsn #define SLJIT_INLINE 235 1.7 alnsn #else 236 1.1 alnsn #define SLJIT_INLINE __inline 237 1.1 alnsn #endif 238 1.7 alnsn #endif /* !SLJIT_INLINE */ 239 1.1 alnsn 240 1.10 alnsn #ifndef SLJIT_NOINLINE 241 1.10 alnsn /* Not inline functions. */ 242 1.10 alnsn #if defined(__GNUC__) 243 1.10 alnsn #define SLJIT_NOINLINE __attribute__ ((noinline)) 244 1.10 alnsn #else 245 1.10 alnsn #define SLJIT_NOINLINE 246 1.1 alnsn #endif 247 1.10 alnsn #endif /* !SLJIT_INLINE */ 248 1.1 alnsn 249 1.1 alnsn #ifndef SLJIT_UNUSED_ARG 250 1.1 alnsn /* Unused arguments. */ 251 1.1 alnsn #define SLJIT_UNUSED_ARG(arg) (void)arg 252 1.1 alnsn #endif 253 1.1 alnsn 254 1.10 alnsn /*********************************/ 255 1.10 alnsn /* Type of public API functions. */ 256 1.10 alnsn /*********************************/ 257 1.10 alnsn 258 1.1 alnsn #if (defined SLJIT_CONFIG_STATIC && SLJIT_CONFIG_STATIC) 259 1.1 alnsn /* Static ABI functions. For all-in-one programs. */ 260 1.1 alnsn 261 1.1 alnsn #if defined(__GNUC__) 262 1.1 alnsn /* Disable unused warnings in gcc. */ 263 1.1 alnsn #define SLJIT_API_FUNC_ATTRIBUTE static __attribute__((unused)) 264 1.1 alnsn #else 265 1.1 alnsn #define SLJIT_API_FUNC_ATTRIBUTE static 266 1.1 alnsn #endif 267 1.1 alnsn 268 1.1 alnsn #else 269 1.1 alnsn #define SLJIT_API_FUNC_ATTRIBUTE 270 1.1 alnsn #endif /* (defined SLJIT_CONFIG_STATIC && SLJIT_CONFIG_STATIC) */ 271 1.1 alnsn 272 1.10 alnsn /****************************/ 273 1.10 alnsn /* Instruction cache flush. */ 274 1.10 alnsn /****************************/ 275 1.10 alnsn 276 1.10 alnsn #if (!defined SLJIT_CACHE_FLUSH && defined __has_builtin) 277 1.10 alnsn #if __has_builtin(__builtin___clear_cache) 278 1.10 alnsn 279 1.10 alnsn #define SLJIT_CACHE_FLUSH(from, to) \ 280 1.10 alnsn __builtin___clear_cache((char*)from, (char*)to) 281 1.10 alnsn 282 1.10 alnsn #endif /* __has_builtin(__builtin___clear_cache) */ 283 1.10 alnsn #endif /* (!defined SLJIT_CACHE_FLUSH && defined __has_builtin) */ 284 1.10 alnsn 285 1.1 alnsn #ifndef SLJIT_CACHE_FLUSH 286 1.1 alnsn 287 1.10 alnsn #if (defined SLJIT_CONFIG_X86 && SLJIT_CONFIG_X86) 288 1.1 alnsn 289 1.1 alnsn /* Not required to implement on archs with unified caches. */ 290 1.1 alnsn #define SLJIT_CACHE_FLUSH(from, to) 291 1.1 alnsn 292 1.1 alnsn #elif defined __APPLE__ 293 1.1 alnsn 294 1.1 alnsn /* Supported by all macs since Mac OS 10.5. 295 1.1 alnsn However, it does not work on non-jailbroken iOS devices, 296 1.1 alnsn although the compilation is successful. */ 297 1.1 alnsn 298 1.1 alnsn #define SLJIT_CACHE_FLUSH(from, to) \ 299 1.1 alnsn sys_icache_invalidate((char*)(from), (char*)(to) - (char*)(from)) 300 1.1 alnsn 301 1.11 alnsn #elif (defined SLJIT_CONFIG_PPC && SLJIT_CONFIG_PPC) 302 1.11 alnsn 303 1.11 alnsn /* The __clear_cache() implementation of GCC is a dummy function on PowerPC. */ 304 1.11 alnsn #define SLJIT_CACHE_FLUSH(from, to) \ 305 1.11 alnsn ppc_cache_flush((from), (to)) 306 1.11 alnsn #define SLJIT_CACHE_FLUSH_OWN_IMPL 1 307 1.11 alnsn 308 1.10 alnsn #elif (defined(__GNUC__) && (__GNUC__ >= 5 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 3))) 309 1.10 alnsn 310 1.10 alnsn #define SLJIT_CACHE_FLUSH(from, to) \ 311 1.10 alnsn __builtin___clear_cache((char*)from, (char*)to) 312 1.10 alnsn 313 1.7 alnsn #elif defined __ANDROID__ 314 1.7 alnsn 315 1.7 alnsn /* Android lacks __clear_cache; instead, cacheflush should be used. */ 316 1.7 alnsn 317 1.7 alnsn #define SLJIT_CACHE_FLUSH(from, to) \ 318 1.7 alnsn cacheflush((long)(from), (long)(to), 0) 319 1.7 alnsn 320 1.4 alnsn #elif (defined SLJIT_CONFIG_SPARC_32 && SLJIT_CONFIG_SPARC_32) 321 1.4 alnsn 322 1.4 alnsn /* The __clear_cache() implementation of GCC is a dummy function on Sparc. */ 323 1.4 alnsn #define SLJIT_CACHE_FLUSH(from, to) \ 324 1.4 alnsn sparc_cache_flush((from), (to)) 325 1.10 alnsn #define SLJIT_CACHE_FLUSH_OWN_IMPL 1 326 1.4 alnsn 327 1.1 alnsn #else 328 1.1 alnsn 329 1.1 alnsn /* Calls __ARM_NR_cacheflush on ARM-Linux. */ 330 1.1 alnsn #define SLJIT_CACHE_FLUSH(from, to) \ 331 1.1 alnsn __clear_cache((char*)(from), (char*)(to)) 332 1.1 alnsn 333 1.1 alnsn #endif 334 1.1 alnsn 335 1.1 alnsn #endif /* !SLJIT_CACHE_FLUSH */ 336 1.1 alnsn 337 1.10 alnsn /******************************************************/ 338 1.10 alnsn /* Integer and floating point type definitions. */ 339 1.10 alnsn /******************************************************/ 340 1.10 alnsn 341 1.1 alnsn /* 8 bit byte type. */ 342 1.10 alnsn typedef unsigned char sljit_u8; 343 1.10 alnsn typedef signed char sljit_s8; 344 1.1 alnsn 345 1.1 alnsn /* 16 bit half-word type. */ 346 1.10 alnsn typedef unsigned short int sljit_u16; 347 1.10 alnsn typedef signed short int sljit_s16; 348 1.1 alnsn 349 1.1 alnsn /* 32 bit integer type. */ 350 1.10 alnsn typedef unsigned int sljit_u32; 351 1.10 alnsn typedef signed int sljit_s32; 352 1.1 alnsn 353 1.10 alnsn /* Machine word type. Enough for storing a pointer. 354 1.1 alnsn 32 bit for 32 bit machines. 355 1.1 alnsn 64 bit for 64 bit machines. */ 356 1.1 alnsn #if (defined SLJIT_CONFIG_UNSUPPORTED && SLJIT_CONFIG_UNSUPPORTED) 357 1.1 alnsn /* Just to have something. */ 358 1.1 alnsn #define SLJIT_WORD_SHIFT 0 359 1.1 alnsn typedef unsigned long int sljit_uw; 360 1.7 alnsn typedef long int sljit_sw; 361 1.7 alnsn #elif !(defined SLJIT_CONFIG_X86_64 && SLJIT_CONFIG_X86_64) \ 362 1.7 alnsn && !(defined SLJIT_CONFIG_ARM_64 && SLJIT_CONFIG_ARM_64) \ 363 1.7 alnsn && !(defined SLJIT_CONFIG_PPC_64 && SLJIT_CONFIG_PPC_64) \ 364 1.7 alnsn && !(defined SLJIT_CONFIG_MIPS_64 && SLJIT_CONFIG_MIPS_64) \ 365 1.7 alnsn && !(defined SLJIT_CONFIG_TILEGX && SLJIT_CONFIG_TILEGX) 366 1.1 alnsn #define SLJIT_32BIT_ARCHITECTURE 1 367 1.1 alnsn #define SLJIT_WORD_SHIFT 2 368 1.1 alnsn typedef unsigned int sljit_uw; 369 1.7 alnsn typedef int sljit_sw; 370 1.1 alnsn #else 371 1.1 alnsn #define SLJIT_64BIT_ARCHITECTURE 1 372 1.1 alnsn #define SLJIT_WORD_SHIFT 3 373 1.1 alnsn #ifdef _WIN32 374 1.1 alnsn typedef unsigned __int64 sljit_uw; 375 1.7 alnsn typedef __int64 sljit_sw; 376 1.1 alnsn #else 377 1.1 alnsn typedef unsigned long int sljit_uw; 378 1.7 alnsn typedef long int sljit_sw; 379 1.1 alnsn #endif 380 1.1 alnsn #endif 381 1.1 alnsn 382 1.7 alnsn typedef sljit_uw sljit_p; 383 1.7 alnsn 384 1.7 alnsn /* Floating point types. */ 385 1.10 alnsn typedef float sljit_f32; 386 1.10 alnsn typedef double sljit_f64; 387 1.7 alnsn 388 1.7 alnsn /* Shift for pointer sized data. */ 389 1.7 alnsn #define SLJIT_POINTER_SHIFT SLJIT_WORD_SHIFT 390 1.7 alnsn 391 1.7 alnsn /* Shift for double precision sized data. */ 392 1.10 alnsn #define SLJIT_F32_SHIFT 2 393 1.10 alnsn #define SLJIT_F64_SHIFT 3 394 1.1 alnsn 395 1.1 alnsn #ifndef SLJIT_W 396 1.1 alnsn 397 1.1 alnsn /* Defining long constants. */ 398 1.1 alnsn #if (defined SLJIT_64BIT_ARCHITECTURE && SLJIT_64BIT_ARCHITECTURE) 399 1.1 alnsn #define SLJIT_W(w) (w##ll) 400 1.1 alnsn #else 401 1.1 alnsn #define SLJIT_W(w) (w) 402 1.1 alnsn #endif 403 1.1 alnsn 404 1.1 alnsn #endif /* !SLJIT_W */ 405 1.1 alnsn 406 1.10 alnsn /*************************/ 407 1.10 alnsn /* Endianness detection. */ 408 1.10 alnsn /*************************/ 409 1.1 alnsn 410 1.1 alnsn #if !defined(SLJIT_BIG_ENDIAN) && !defined(SLJIT_LITTLE_ENDIAN) 411 1.1 alnsn 412 1.10 alnsn /* These macros are mostly useful for the applications. */ 413 1.4 alnsn #if (defined SLJIT_CONFIG_PPC_32 && SLJIT_CONFIG_PPC_32) \ 414 1.7 alnsn || (defined SLJIT_CONFIG_PPC_64 && SLJIT_CONFIG_PPC_64) 415 1.7 alnsn 416 1.7 alnsn #ifdef __LITTLE_ENDIAN__ 417 1.7 alnsn #define SLJIT_LITTLE_ENDIAN 1 418 1.7 alnsn #else 419 1.1 alnsn #define SLJIT_BIG_ENDIAN 1 420 1.7 alnsn #endif 421 1.1 alnsn 422 1.7 alnsn #elif (defined SLJIT_CONFIG_MIPS_32 && SLJIT_CONFIG_MIPS_32) \ 423 1.7 alnsn || (defined SLJIT_CONFIG_MIPS_64 && SLJIT_CONFIG_MIPS_64) 424 1.1 alnsn 425 1.1 alnsn #ifdef __MIPSEL__ 426 1.1 alnsn #define SLJIT_LITTLE_ENDIAN 1 427 1.1 alnsn #else 428 1.1 alnsn #define SLJIT_BIG_ENDIAN 1 429 1.1 alnsn #endif 430 1.1 alnsn 431 1.7 alnsn #elif (defined SLJIT_CONFIG_SPARC_32 && SLJIT_CONFIG_SPARC_32) 432 1.7 alnsn 433 1.7 alnsn #define SLJIT_BIG_ENDIAN 1 434 1.7 alnsn 435 1.1 alnsn #else 436 1.1 alnsn #define SLJIT_LITTLE_ENDIAN 1 437 1.1 alnsn #endif 438 1.1 alnsn 439 1.1 alnsn #endif /* !defined(SLJIT_BIG_ENDIAN) && !defined(SLJIT_LITTLE_ENDIAN) */ 440 1.1 alnsn 441 1.1 alnsn /* Sanity check. */ 442 1.1 alnsn #if (defined SLJIT_BIG_ENDIAN && SLJIT_BIG_ENDIAN) && (defined SLJIT_LITTLE_ENDIAN && SLJIT_LITTLE_ENDIAN) 443 1.1 alnsn #error "Exactly one endianness must be selected" 444 1.1 alnsn #endif 445 1.1 alnsn 446 1.1 alnsn #if !(defined SLJIT_BIG_ENDIAN && SLJIT_BIG_ENDIAN) && !(defined SLJIT_LITTLE_ENDIAN && SLJIT_LITTLE_ENDIAN) 447 1.1 alnsn #error "Exactly one endianness must be selected" 448 1.1 alnsn #endif 449 1.1 alnsn 450 1.10 alnsn #ifndef SLJIT_UNALIGNED 451 1.10 alnsn 452 1.10 alnsn #if (defined SLJIT_CONFIG_X86_32 && SLJIT_CONFIG_X86_32) \ 453 1.10 alnsn || (defined SLJIT_CONFIG_X86_64 && SLJIT_CONFIG_X86_64) \ 454 1.10 alnsn || (defined SLJIT_CONFIG_ARM_V7 && SLJIT_CONFIG_ARM_V7) \ 455 1.10 alnsn || (defined SLJIT_CONFIG_ARM_THUMB2 && SLJIT_CONFIG_ARM_THUMB2) \ 456 1.10 alnsn || (defined SLJIT_CONFIG_ARM_64 && SLJIT_CONFIG_ARM_64) \ 457 1.10 alnsn || (defined SLJIT_CONFIG_PPC_32 && SLJIT_CONFIG_PPC_32) \ 458 1.10 alnsn || (defined SLJIT_CONFIG_PPC_64 && SLJIT_CONFIG_PPC_64) 459 1.10 alnsn #define SLJIT_UNALIGNED 1 460 1.10 alnsn #endif 461 1.10 alnsn 462 1.10 alnsn #endif /* !SLJIT_UNALIGNED */ 463 1.10 alnsn 464 1.10 alnsn #if (defined SLJIT_CONFIG_X86_32 && SLJIT_CONFIG_X86_32) 465 1.10 alnsn /* Auto detect SSE2 support using CPUID. 466 1.10 alnsn On 64 bit x86 cpus, sse2 must be present. */ 467 1.10 alnsn #define SLJIT_DETECT_SSE2 1 468 1.10 alnsn #endif 469 1.10 alnsn 470 1.10 alnsn /*****************************************************************************************/ 471 1.10 alnsn /* Calling convention of functions generated by SLJIT or called from the generated code. */ 472 1.10 alnsn /*****************************************************************************************/ 473 1.10 alnsn 474 1.10 alnsn #ifndef SLJIT_CALL 475 1.10 alnsn 476 1.10 alnsn #if (defined SLJIT_USE_CDECL_CALLING_CONVENTION && SLJIT_USE_CDECL_CALLING_CONVENTION) 477 1.10 alnsn 478 1.10 alnsn /* Force cdecl. */ 479 1.10 alnsn #define SLJIT_CALL 480 1.10 alnsn 481 1.10 alnsn #elif (defined SLJIT_CONFIG_X86_32 && SLJIT_CONFIG_X86_32) 482 1.10 alnsn 483 1.10 alnsn #if defined(__GNUC__) && !defined(__APPLE__) 484 1.10 alnsn 485 1.10 alnsn #define SLJIT_CALL __attribute__ ((fastcall)) 486 1.10 alnsn #define SLJIT_X86_32_FASTCALL 1 487 1.10 alnsn 488 1.10 alnsn #elif defined(_MSC_VER) 489 1.10 alnsn 490 1.10 alnsn #define SLJIT_CALL __fastcall 491 1.10 alnsn #define SLJIT_X86_32_FASTCALL 1 492 1.10 alnsn 493 1.10 alnsn #elif defined(__BORLANDC__) 494 1.10 alnsn 495 1.10 alnsn #define SLJIT_CALL __msfastcall 496 1.10 alnsn #define SLJIT_X86_32_FASTCALL 1 497 1.10 alnsn 498 1.10 alnsn #else /* Unknown compiler. */ 499 1.10 alnsn 500 1.10 alnsn /* The cdecl attribute is the default. */ 501 1.10 alnsn #define SLJIT_CALL 502 1.10 alnsn 503 1.10 alnsn #endif 504 1.10 alnsn 505 1.10 alnsn #else /* Non x86-32 architectures. */ 506 1.10 alnsn 507 1.10 alnsn #define SLJIT_CALL 508 1.10 alnsn 509 1.10 alnsn #endif /* SLJIT_CONFIG_X86_32 */ 510 1.10 alnsn 511 1.10 alnsn #endif /* !SLJIT_CALL */ 512 1.10 alnsn 513 1.4 alnsn #ifndef SLJIT_INDIRECT_CALL 514 1.7 alnsn #if ((defined SLJIT_CONFIG_PPC_64 && SLJIT_CONFIG_PPC_64) && (defined SLJIT_BIG_ENDIAN && SLJIT_BIG_ENDIAN)) \ 515 1.7 alnsn || ((defined SLJIT_CONFIG_PPC_32 && SLJIT_CONFIG_PPC_32) && defined _AIX) 516 1.1 alnsn /* It seems certain ppc compilers use an indirect addressing for functions 517 1.1 alnsn which makes things complicated. */ 518 1.1 alnsn #define SLJIT_INDIRECT_CALL 1 519 1.1 alnsn #endif 520 1.4 alnsn #endif /* SLJIT_INDIRECT_CALL */ 521 1.4 alnsn 522 1.10 alnsn /* The offset which needs to be substracted from the return address to 523 1.10 alnsn determine the next executed instruction after return. */ 524 1.4 alnsn #ifndef SLJIT_RETURN_ADDRESS_OFFSET 525 1.4 alnsn #if (defined SLJIT_CONFIG_SPARC_32 && SLJIT_CONFIG_SPARC_32) 526 1.4 alnsn #define SLJIT_RETURN_ADDRESS_OFFSET 8 527 1.4 alnsn #else 528 1.4 alnsn #define SLJIT_RETURN_ADDRESS_OFFSET 0 529 1.4 alnsn #endif 530 1.4 alnsn #endif /* SLJIT_RETURN_ADDRESS_OFFSET */ 531 1.1 alnsn 532 1.10 alnsn /***************************************************/ 533 1.10 alnsn /* Functions of the built-in executable allocator. */ 534 1.10 alnsn /***************************************************/ 535 1.1 alnsn 536 1.10 alnsn #if (defined SLJIT_EXECUTABLE_ALLOCATOR && SLJIT_EXECUTABLE_ALLOCATOR) 537 1.10 alnsn SLJIT_API_FUNC_ATTRIBUTE void* sljit_malloc_exec(sljit_uw size); 538 1.10 alnsn SLJIT_API_FUNC_ATTRIBUTE void sljit_free_exec(void* ptr); 539 1.10 alnsn SLJIT_API_FUNC_ATTRIBUTE void sljit_free_unused_memory_exec(void); 540 1.10 alnsn #define SLJIT_MALLOC_EXEC(size) sljit_malloc_exec(size) 541 1.10 alnsn #define SLJIT_FREE_EXEC(ptr) sljit_free_exec(ptr) 542 1.11 alnsn 543 1.11 alnsn #if (defined SLJIT_PROT_EXECUTABLE_ALLOCATOR && SLJIT_PROT_EXECUTABLE_ALLOCATOR) 544 1.11 alnsn SLJIT_API_FUNC_ATTRIBUTE sljit_sw sljit_exec_offset(void* ptr); 545 1.11 alnsn #define SLJIT_EXEC_OFFSET(ptr) sljit_exec_offset(ptr) 546 1.11 alnsn #else 547 1.11 alnsn #define SLJIT_EXEC_OFFSET(ptr) 0 548 1.11 alnsn #endif 549 1.11 alnsn 550 1.10 alnsn #endif 551 1.10 alnsn 552 1.10 alnsn /**********************************************/ 553 1.10 alnsn /* Registers and locals offset determination. */ 554 1.10 alnsn /**********************************************/ 555 1.1 alnsn 556 1.1 alnsn #if (defined SLJIT_CONFIG_X86_32 && SLJIT_CONFIG_X86_32) 557 1.10 alnsn 558 1.11 alnsn #define SLJIT_NUMBER_OF_REGISTERS 12 559 1.11 alnsn #define SLJIT_NUMBER_OF_SAVED_REGISTERS 9 560 1.10 alnsn #if (defined SLJIT_X86_32_FASTCALL && SLJIT_X86_32_FASTCALL) 561 1.11 alnsn #define SLJIT_LOCALS_OFFSET_BASE (compiler->locals_offset) 562 1.10 alnsn #else 563 1.10 alnsn /* Maximum 3 arguments are passed on the stack, +1 for double alignment. */ 564 1.11 alnsn #define SLJIT_LOCALS_OFFSET_BASE (compiler->locals_offset) 565 1.10 alnsn #endif /* SLJIT_X86_32_FASTCALL */ 566 1.10 alnsn 567 1.10 alnsn #elif (defined SLJIT_CONFIG_X86_64 && SLJIT_CONFIG_X86_64) 568 1.10 alnsn 569 1.10 alnsn #ifndef _WIN64 570 1.10 alnsn #define SLJIT_NUMBER_OF_REGISTERS 12 571 1.10 alnsn #define SLJIT_NUMBER_OF_SAVED_REGISTERS 6 572 1.11 alnsn #define SLJIT_LOCALS_OFFSET_BASE 0 573 1.10 alnsn #else 574 1.10 alnsn #define SLJIT_NUMBER_OF_REGISTERS 12 575 1.10 alnsn #define SLJIT_NUMBER_OF_SAVED_REGISTERS 8 576 1.11 alnsn #define SLJIT_LOCALS_OFFSET_BASE (compiler->locals_offset) 577 1.10 alnsn #endif /* _WIN64 */ 578 1.10 alnsn 579 1.10 alnsn #elif (defined SLJIT_CONFIG_ARM_V5 && SLJIT_CONFIG_ARM_V5) || (defined SLJIT_CONFIG_ARM_V7 && SLJIT_CONFIG_ARM_V7) 580 1.10 alnsn 581 1.11 alnsn #define SLJIT_NUMBER_OF_REGISTERS 12 582 1.10 alnsn #define SLJIT_NUMBER_OF_SAVED_REGISTERS 8 583 1.10 alnsn #define SLJIT_LOCALS_OFFSET_BASE 0 584 1.10 alnsn 585 1.10 alnsn #elif (defined SLJIT_CONFIG_ARM_THUMB2 && SLJIT_CONFIG_ARM_THUMB2) 586 1.10 alnsn 587 1.11 alnsn #define SLJIT_NUMBER_OF_REGISTERS 12 588 1.11 alnsn #define SLJIT_NUMBER_OF_SAVED_REGISTERS 8 589 1.10 alnsn #define SLJIT_LOCALS_OFFSET_BASE 0 590 1.10 alnsn 591 1.10 alnsn #elif (defined SLJIT_CONFIG_ARM_64 && SLJIT_CONFIG_ARM_64) 592 1.10 alnsn 593 1.10 alnsn #define SLJIT_NUMBER_OF_REGISTERS 25 594 1.10 alnsn #define SLJIT_NUMBER_OF_SAVED_REGISTERS 10 595 1.10 alnsn #define SLJIT_LOCALS_OFFSET_BASE (2 * sizeof(sljit_sw)) 596 1.10 alnsn 597 1.10 alnsn #elif (defined SLJIT_CONFIG_PPC && SLJIT_CONFIG_PPC) 598 1.10 alnsn 599 1.10 alnsn #define SLJIT_NUMBER_OF_REGISTERS 22 600 1.10 alnsn #define SLJIT_NUMBER_OF_SAVED_REGISTERS 17 601 1.10 alnsn #if (defined SLJIT_CONFIG_PPC_64 && SLJIT_CONFIG_PPC_64) || (defined _AIX) 602 1.10 alnsn #define SLJIT_LOCALS_OFFSET_BASE ((6 + 8) * sizeof(sljit_sw)) 603 1.10 alnsn #elif (defined SLJIT_CONFIG_PPC_32 && SLJIT_CONFIG_PPC_32) 604 1.10 alnsn /* Add +1 for double alignment. */ 605 1.10 alnsn #define SLJIT_LOCALS_OFFSET_BASE ((3 + 1) * sizeof(sljit_sw)) 606 1.10 alnsn #else 607 1.10 alnsn #define SLJIT_LOCALS_OFFSET_BASE (3 * sizeof(sljit_sw)) 608 1.10 alnsn #endif /* SLJIT_CONFIG_PPC_64 || _AIX */ 609 1.10 alnsn 610 1.10 alnsn #elif (defined SLJIT_CONFIG_MIPS && SLJIT_CONFIG_MIPS) 611 1.10 alnsn 612 1.11 alnsn #define SLJIT_NUMBER_OF_REGISTERS 21 613 1.10 alnsn #define SLJIT_NUMBER_OF_SAVED_REGISTERS 8 614 1.10 alnsn #if (defined SLJIT_CONFIG_MIPS_32 && SLJIT_CONFIG_MIPS_32) 615 1.10 alnsn #define SLJIT_LOCALS_OFFSET_BASE (4 * sizeof(sljit_sw)) 616 1.10 alnsn #else 617 1.10 alnsn #define SLJIT_LOCALS_OFFSET_BASE 0 618 1.10 alnsn #endif 619 1.10 alnsn 620 1.10 alnsn #elif (defined SLJIT_CONFIG_SPARC && SLJIT_CONFIG_SPARC) 621 1.10 alnsn 622 1.10 alnsn #define SLJIT_NUMBER_OF_REGISTERS 18 623 1.10 alnsn #define SLJIT_NUMBER_OF_SAVED_REGISTERS 14 624 1.10 alnsn #if (defined SLJIT_CONFIG_SPARC_32 && SLJIT_CONFIG_SPARC_32) 625 1.10 alnsn /* Add +1 for double alignment. */ 626 1.10 alnsn #define SLJIT_LOCALS_OFFSET_BASE ((23 + 1) * sizeof(sljit_sw)) 627 1.1 alnsn #endif 628 1.1 alnsn 629 1.10 alnsn #elif (defined SLJIT_CONFIG_TILEGX && SLJIT_CONFIG_TILEGX) 630 1.1 alnsn 631 1.10 alnsn #define SLJIT_NUMBER_OF_REGISTERS 10 632 1.10 alnsn #define SLJIT_NUMBER_OF_SAVED_REGISTERS 5 633 1.10 alnsn #define SLJIT_LOCALS_OFFSET_BASE 0 634 1.1 alnsn 635 1.10 alnsn #elif (defined SLJIT_CONFIG_UNSUPPORTED && SLJIT_CONFIG_UNSUPPORTED) 636 1.10 alnsn 637 1.10 alnsn #define SLJIT_NUMBER_OF_REGISTERS 0 638 1.10 alnsn #define SLJIT_NUMBER_OF_SAVED_REGISTERS 0 639 1.10 alnsn #define SLJIT_LOCALS_OFFSET_BASE 0 640 1.1 alnsn 641 1.1 alnsn #endif 642 1.1 alnsn 643 1.10 alnsn #define SLJIT_LOCALS_OFFSET (SLJIT_LOCALS_OFFSET_BASE) 644 1.10 alnsn 645 1.10 alnsn #define SLJIT_NUMBER_OF_SCRATCH_REGISTERS \ 646 1.10 alnsn (SLJIT_NUMBER_OF_REGISTERS - SLJIT_NUMBER_OF_SAVED_REGISTERS) 647 1.1 alnsn 648 1.10 alnsn #define SLJIT_NUMBER_OF_FLOAT_REGISTERS 6 649 1.10 alnsn #if (defined SLJIT_CONFIG_X86_64 && SLJIT_CONFIG_X86_64) && (defined _WIN64) 650 1.10 alnsn #define SLJIT_NUMBER_OF_SAVED_FLOAT_REGISTERS 1 651 1.10 alnsn #else 652 1.10 alnsn #define SLJIT_NUMBER_OF_SAVED_FLOAT_REGISTERS 0 653 1.1 alnsn #endif 654 1.1 alnsn 655 1.10 alnsn #define SLJIT_NUMBER_OF_SCRATCH_FLOAT_REGISTERS \ 656 1.10 alnsn (SLJIT_NUMBER_OF_FLOAT_REGISTERS - SLJIT_NUMBER_OF_SAVED_FLOAT_REGISTERS) 657 1.10 alnsn 658 1.10 alnsn /*************************************/ 659 1.10 alnsn /* Debug and verbose related macros. */ 660 1.10 alnsn /*************************************/ 661 1.10 alnsn 662 1.7 alnsn #if (defined SLJIT_VERBOSE && SLJIT_VERBOSE) 663 1.3 alnsn #ifdef _KERNEL 664 1.3 alnsn #include <sys/systm.h> 665 1.3 alnsn #else 666 1.1 alnsn #include <stdio.h> 667 1.1 alnsn #endif 668 1.3 alnsn #endif 669 1.1 alnsn 670 1.1 alnsn #if (defined SLJIT_DEBUG && SLJIT_DEBUG) 671 1.1 alnsn 672 1.11 alnsn #if !defined(SLJIT_ASSERT) || !defined(SLJIT_UNREACHABLE) 673 1.7 alnsn 674 1.7 alnsn /* SLJIT_HALT_PROCESS must halt the process. */ 675 1.7 alnsn #ifndef SLJIT_HALT_PROCESS 676 1.11 alnsn #ifdef _KERNEL 677 1.11 alnsn #define SLJIT_HALT_PROCESS() \ 678 1.11 alnsn panic("sljit halt"); 679 1.11 alnsn #else 680 1.7 alnsn #include <stdlib.h> 681 1.7 alnsn 682 1.7 alnsn #define SLJIT_HALT_PROCESS() \ 683 1.7 alnsn abort(); 684 1.11 alnsn #endif 685 1.7 alnsn #endif /* !SLJIT_HALT_PROCESS */ 686 1.7 alnsn 687 1.11 alnsn #ifndef _KERNEL 688 1.7 alnsn #include <stdio.h> 689 1.11 alnsn #endif 690 1.7 alnsn 691 1.11 alnsn #endif /* !SLJIT_ASSERT || !SLJIT_UNREACHABLE */ 692 1.7 alnsn 693 1.1 alnsn /* Feel free to redefine these two macros. */ 694 1.1 alnsn #ifndef SLJIT_ASSERT 695 1.1 alnsn 696 1.5 alnsn #include <assert.h> 697 1.5 alnsn #include <stdlib.h> 698 1.1 alnsn 699 1.5 alnsn #define SLJIT_ASSERT(x) assert(x) 700 1.1 alnsn 701 1.1 alnsn #endif /* !SLJIT_ASSERT */ 702 1.1 alnsn 703 1.11 alnsn #ifndef SLJIT_UNREACHABLE 704 1.1 alnsn 705 1.11 alnsn #define SLJIT_UNREACHABLE() \ 706 1.1 alnsn do { \ 707 1.1 alnsn printf("Should never been reached " __FILE__ ":%d\n", __LINE__); \ 708 1.1 alnsn SLJIT_HALT_PROCESS(); \ 709 1.1 alnsn } while (0) 710 1.1 alnsn 711 1.11 alnsn #endif /* !SLJIT_UNREACHABLE */ 712 1.1 alnsn 713 1.1 alnsn #else /* (defined SLJIT_DEBUG && SLJIT_DEBUG) */ 714 1.1 alnsn 715 1.7 alnsn /* Forcing empty, but valid statements. */ 716 1.1 alnsn #undef SLJIT_ASSERT 717 1.11 alnsn #undef SLJIT_UNREACHABLE 718 1.1 alnsn 719 1.1 alnsn #define SLJIT_ASSERT(x) \ 720 1.1 alnsn do { } while (0) 721 1.11 alnsn #define SLJIT_UNREACHABLE() \ 722 1.1 alnsn do { } while (0) 723 1.1 alnsn 724 1.1 alnsn #endif /* (defined SLJIT_DEBUG && SLJIT_DEBUG) */ 725 1.1 alnsn 726 1.1 alnsn #ifndef SLJIT_COMPILE_ASSERT 727 1.1 alnsn 728 1.1 alnsn #define SLJIT_COMPILE_ASSERT(x, description) \ 729 1.11 alnsn switch(0) { case 0: case ((x) ? 1 : 0): break; } 730 1.1 alnsn 731 1.1 alnsn #endif /* !SLJIT_COMPILE_ASSERT */ 732 1.1 alnsn 733 1.1 alnsn #endif 734