Annotation of embedaddon/pcre/sljit/sljitConfigInternal.h, revision 1.1.1.3

1.1       misho       1: /*
                      2:  *    Stack-less Just-In-Time compiler
                      3:  *
1.1.1.2   misho       4:  *    Copyright 2009-2012 Zoltan Herczeg (hzmester@freemail.hu). All rights reserved.
1.1       misho       5:  *
                      6:  * Redistribution and use in source and binary forms, with or without modification, are
                      7:  * permitted provided that the following conditions are met:
                      8:  *
                      9:  *   1. Redistributions of source code must retain the above copyright notice, this list of
                     10:  *      conditions and the following disclaimer.
                     11:  *
                     12:  *   2. Redistributions in binary form must reproduce the above copyright notice, this list
                     13:  *      of conditions and the following disclaimer in the documentation and/or other materials
                     14:  *      provided with the distribution.
                     15:  *
                     16:  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDER(S) AND CONTRIBUTORS ``AS IS'' AND ANY
                     17:  * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
                     18:  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT
                     19:  * SHALL THE COPYRIGHT HOLDER(S) OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
                     20:  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
                     21:  * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
                     22:  * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
                     23:  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
                     24:  * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
                     25:  */
                     26: 
                     27: #ifndef _SLJIT_CONFIG_INTERNAL_H_
                     28: #define _SLJIT_CONFIG_INTERNAL_H_
                     29: 
                     30: /*
1.1.1.2   misho      31:    SLJIT defines the following macros depending on the target architecture:
                     32: 
                     33:    Feature detection (boolean) macros:
1.1       misho      34:    SLJIT_32BIT_ARCHITECTURE : 32 bit architecture
                     35:    SLJIT_64BIT_ARCHITECTURE : 64 bit architecture
                     36:    SLJIT_WORD_SHIFT : the shift required to apply when accessing a sljit_w/sljit_uw array by index
                     37:    SLJIT_FLOAT_SHIFT : the shift required to apply when accessing a double array by index
                     38:    SLJIT_LITTLE_ENDIAN : little endian architecture
1.1.1.2   misho      39:    SLJIT_BIG_ENDIAN : big endian architecture
                     40:    SLJIT_UNALIGNED : allows unaligned memory accesses for non-fpu operations (only!)
                     41:    SLJIT_INDIRECT_CALL : see SLJIT_FUNC_OFFSET() for more information
                     42: 
                     43:    Types and useful macros:
                     44:    sljit_b, sljit_ub : signed and unsigned 8 bit byte
                     45:    sljit_h, sljit_uh : signed and unsigned 16 bit half-word (short) type
                     46:    sljit_i, sljit_ui : signed and unsigned 32 bit integer type
                     47:    sljit_w, sljit_uw : signed and unsigned machine word, enough to store a pointer (same as intptr_t)
                     48:    SLJIT_CALL : C calling convention define for both calling JIT form C and C callbacks for JIT
                     49:    SLJIT_W(number) : defining 64 bit constants on 64 bit architectures (compiler independent helper)
1.1       misho      50: */
                     51: 
                     52: #if !((defined SLJIT_CONFIG_X86_32 && SLJIT_CONFIG_X86_32) \
                     53:        || (defined SLJIT_CONFIG_X86_64 && SLJIT_CONFIG_X86_64) \
                     54:        || (defined SLJIT_CONFIG_ARM_V5 && SLJIT_CONFIG_ARM_V5) \
                     55:        || (defined SLJIT_CONFIG_ARM_V7 && SLJIT_CONFIG_ARM_V7) \
                     56:        || (defined SLJIT_CONFIG_ARM_THUMB2 && SLJIT_CONFIG_ARM_THUMB2) \
                     57:        || (defined SLJIT_CONFIG_PPC_32 && SLJIT_CONFIG_PPC_32) \
                     58:        || (defined SLJIT_CONFIG_PPC_64 && SLJIT_CONFIG_PPC_64) \
                     59:        || (defined SLJIT_CONFIG_MIPS_32 && SLJIT_CONFIG_MIPS_32) \
                     60:        || (defined SLJIT_CONFIG_AUTO && SLJIT_CONFIG_AUTO) \
                     61:        || (defined SLJIT_CONFIG_UNSUPPORTED && SLJIT_CONFIG_UNSUPPORTED))
                     62: #error "An architecture must be selected"
                     63: #endif
                     64: 
                     65: /* Sanity check. */
                     66: #if (defined SLJIT_CONFIG_X86_32 && SLJIT_CONFIG_X86_32) \
                     67:        + (defined SLJIT_CONFIG_X86_64 && SLJIT_CONFIG_X86_64) \
                     68:        + (defined SLJIT_CONFIG_ARM_V5 && SLJIT_CONFIG_ARM_V5) \
                     69:        + (defined SLJIT_CONFIG_ARM_V7 && SLJIT_CONFIG_ARM_V7) \
                     70:        + (defined SLJIT_CONFIG_ARM_THUMB2 && SLJIT_CONFIG_ARM_THUMB2) \
                     71:        + (defined SLJIT_CONFIG_PPC_32 && SLJIT_CONFIG_PPC_32) \
                     72:        + (defined SLJIT_CONFIG_PPC_64 && SLJIT_CONFIG_PPC_64) \
                     73:        + (defined SLJIT_CONFIG_MIPS_32 && SLJIT_CONFIG_MIPS_32) \
                     74:        + (defined SLJIT_CONFIG_AUTO && SLJIT_CONFIG_AUTO) \
                     75:        + (defined SLJIT_CONFIG_UNSUPPORTED && SLJIT_CONFIG_UNSUPPORTED) >= 2
                     76: #error "Multiple architectures are selected"
                     77: #endif
                     78: 
                     79: /* Auto select option (requires compiler support) */
                     80: #if (defined SLJIT_CONFIG_AUTO && SLJIT_CONFIG_AUTO)
                     81: 
                     82: #ifndef _WIN32
                     83: 
                     84: #if defined(__i386__) || defined(__i386)
                     85: #define SLJIT_CONFIG_X86_32 1
                     86: #elif defined(__x86_64__)
                     87: #define SLJIT_CONFIG_X86_64 1
                     88: #elif defined(__arm__) || defined(__ARM__)
                     89: #ifdef __thumb2__
                     90: #define SLJIT_CONFIG_ARM_THUMB2 1
                     91: #elif defined(__ARM_ARCH_7__) || defined(__ARM_ARCH_7A__) || defined(__ARM_ARCH_7R__)
                     92: #define SLJIT_CONFIG_ARM_V7 1
                     93: #else
                     94: #define SLJIT_CONFIG_ARM_V5 1
                     95: #endif
                     96: #elif defined(__ppc64__) || defined(__powerpc64__)
                     97: #define SLJIT_CONFIG_PPC_64 1
                     98: #elif defined(__ppc__) || defined(__powerpc__)
                     99: #define SLJIT_CONFIG_PPC_32 1
                    100: #elif defined(__mips__)
                    101: #define SLJIT_CONFIG_MIPS_32 1
                    102: #else
                    103: /* Unsupported architecture */
                    104: #define SLJIT_CONFIG_UNSUPPORTED 1
                    105: #endif
                    106: 
                    107: #else /* !_WIN32 */
                    108: 
                    109: #if defined(_M_X64) || defined(__x86_64__)
                    110: #define SLJIT_CONFIG_X86_64 1
                    111: #elif defined(_ARM_)
                    112: #define SLJIT_CONFIG_ARM_V5 1
                    113: #else
                    114: #define SLJIT_CONFIG_X86_32 1
                    115: #endif
                    116: 
                    117: #endif /* !WIN32 */
                    118: #endif /* SLJIT_CONFIG_AUTO */
                    119: 
                    120: #if (defined SLJIT_CONFIG_UNSUPPORTED && SLJIT_CONFIG_UNSUPPORTED)
                    121: #undef SLJIT_EXECUTABLE_ALLOCATOR
                    122: #endif
                    123: 
                    124: #if !(defined SLJIT_STD_MACROS_DEFINED && SLJIT_STD_MACROS_DEFINED)
                    125: 
                    126: /* These libraries are needed for the macros below. */
                    127: #include <stdlib.h>
                    128: #include <string.h>
                    129: 
                    130: #endif /* STD_MACROS_DEFINED */
                    131: 
                    132: /* General macros:
                    133:    Note: SLJIT is designed to be independent from them as possible.
                    134: 
                    135:    In release mode (SLJIT_DEBUG is not defined) only the following macros are needed:
                    136: */
                    137: 
                    138: #ifndef SLJIT_MALLOC
                    139: #define SLJIT_MALLOC(size) malloc(size)
                    140: #endif
                    141: 
                    142: #ifndef SLJIT_FREE
                    143: #define SLJIT_FREE(ptr) free(ptr)
                    144: #endif
                    145: 
                    146: #ifndef SLJIT_MEMMOVE
                    147: #define SLJIT_MEMMOVE(dest, src, len) memmove(dest, src, len)
                    148: #endif
                    149: 
                    150: #ifndef SLJIT_ZEROMEM
                    151: #define SLJIT_ZEROMEM(dest, len) memset(dest, 0, len)
                    152: #endif
                    153: 
                    154: #if !defined(SLJIT_LIKELY) && !defined(SLJIT_UNLIKELY)
                    155: 
                    156: #if defined(__GNUC__) && (__GNUC__ >= 3)
                    157: #define SLJIT_LIKELY(x)                __builtin_expect((x), 1)
                    158: #define SLJIT_UNLIKELY(x)      __builtin_expect((x), 0)
                    159: #else
                    160: #define SLJIT_LIKELY(x)                (x)
                    161: #define SLJIT_UNLIKELY(x)      (x)
                    162: #endif
                    163: 
                    164: #endif /* !defined(SLJIT_LIKELY) && !defined(SLJIT_UNLIKELY) */
                    165: 
                    166: #ifndef SLJIT_INLINE
                    167: /* Inline functions. */
                    168: #define SLJIT_INLINE __inline
                    169: #endif
                    170: 
                    171: #ifndef SLJIT_CONST
                    172: /* Const variables. */
                    173: #define SLJIT_CONST const
                    174: #endif
                    175: 
                    176: #ifndef SLJIT_UNUSED_ARG
                    177: /* Unused arguments. */
                    178: #define SLJIT_UNUSED_ARG(arg) (void)arg
                    179: #endif
                    180: 
                    181: #if (defined SLJIT_CONFIG_STATIC && SLJIT_CONFIG_STATIC)
                    182: /* Static ABI functions. For all-in-one programs. */
                    183: 
                    184: #if defined(__GNUC__)
                    185: /* Disable unused warnings in gcc. */
                    186: #define SLJIT_API_FUNC_ATTRIBUTE static __attribute__((unused))
                    187: #else
                    188: #define SLJIT_API_FUNC_ATTRIBUTE static
                    189: #endif
                    190: 
                    191: #else
                    192: #define SLJIT_API_FUNC_ATTRIBUTE
                    193: #endif /* (defined SLJIT_CONFIG_STATIC && SLJIT_CONFIG_STATIC) */
                    194: 
                    195: #ifndef SLJIT_CACHE_FLUSH
                    196: 
1.1.1.3 ! misho     197: #if (defined SLJIT_CONFIG_X86_32 && SLJIT_CONFIG_X86_32) || (defined SLJIT_CONFIG_X86_64 && SLJIT_CONFIG_X86_64)
        !           198: 
        !           199: /* Not required to implement on archs with unified caches. */
        !           200: #define SLJIT_CACHE_FLUSH(from, to)
        !           201: 
        !           202: #elif defined __APPLE__
        !           203: 
        !           204: /* Supported by all macs since Mac OS 10.5.
        !           205:    However, it does not work on non-jailbroken iOS devices,
        !           206:    although the compilation is successful. */
1.1       misho     207: 
                    208: #define SLJIT_CACHE_FLUSH(from, to) \
1.1.1.3 ! misho     209:        sys_icache_invalidate((char*)(from), (char*)(to) - (char*)(from))
1.1       misho     210: 
1.1.1.3 ! misho     211: #elif (defined SLJIT_CONFIG_PPC_32 && SLJIT_CONFIG_PPC_32) || (defined SLJIT_CONFIG_PPC_64 && SLJIT_CONFIG_PPC_64)
1.1       misho     212: 
1.1.1.3 ! misho     213: /* The __clear_cache() implementation of GCC is a dummy function on PowerPC. */
        !           214: #define SLJIT_CACHE_FLUSH(from, to) \
        !           215:        ppc_cache_flush((from), (to))
1.1       misho     216: 
                    217: #else
                    218: 
                    219: /* Calls __ARM_NR_cacheflush on ARM-Linux. */
                    220: #define SLJIT_CACHE_FLUSH(from, to) \
                    221:        __clear_cache((char*)(from), (char*)(to))
                    222: 
                    223: #endif
                    224: 
                    225: #endif /* !SLJIT_CACHE_FLUSH */
                    226: 
                    227: /* 8 bit byte type. */
                    228: typedef unsigned char sljit_ub;
                    229: typedef signed char sljit_b;
                    230: 
                    231: /* 16 bit half-word type. */
                    232: typedef unsigned short int sljit_uh;
                    233: typedef signed short int sljit_h;
                    234: 
                    235: /* 32 bit integer type. */
                    236: typedef unsigned int sljit_ui;
                    237: typedef signed int sljit_i;
                    238: 
                    239: /* Machine word type. Can encapsulate a pointer.
                    240:      32 bit for 32 bit machines.
                    241:      64 bit for 64 bit machines. */
1.1.1.2   misho     242: #if (defined SLJIT_CONFIG_UNSUPPORTED && SLJIT_CONFIG_UNSUPPORTED)
                    243: /* Just to have something. */
                    244: #define SLJIT_WORD_SHIFT 0
                    245: typedef unsigned long int sljit_uw;
                    246: typedef long int sljit_w;
                    247: #elif !(defined SLJIT_CONFIG_X86_64 && SLJIT_CONFIG_X86_64) && !(defined SLJIT_CONFIG_PPC_64 && SLJIT_CONFIG_PPC_64)
1.1       misho     248: #define SLJIT_32BIT_ARCHITECTURE 1
                    249: #define SLJIT_WORD_SHIFT 2
                    250: typedef unsigned int sljit_uw;
                    251: typedef int sljit_w;
                    252: #else
                    253: #define SLJIT_64BIT_ARCHITECTURE 1
                    254: #define SLJIT_WORD_SHIFT 3
                    255: #ifdef _WIN32
                    256: typedef unsigned __int64 sljit_uw;
                    257: typedef __int64 sljit_w;
                    258: #else
                    259: typedef unsigned long int sljit_uw;
                    260: typedef long int sljit_w;
                    261: #endif
                    262: #endif
                    263: 
                    264: /* Double precision. */
                    265: #define SLJIT_FLOAT_SHIFT 3
                    266: 
                    267: #ifndef SLJIT_W
                    268: 
                    269: /* Defining long constants. */
                    270: #if (defined SLJIT_64BIT_ARCHITECTURE && SLJIT_64BIT_ARCHITECTURE)
                    271: #define SLJIT_W(w)     (w##ll)
                    272: #else
                    273: #define SLJIT_W(w)     (w)
                    274: #endif
                    275: 
                    276: #endif /* !SLJIT_W */
                    277: 
                    278: #ifndef SLJIT_CALL
                    279: 
                    280: /* ABI (Application Binary Interface) types. */
                    281: #if (defined SLJIT_CONFIG_X86_32 && SLJIT_CONFIG_X86_32)
                    282: 
                    283: #if defined(__GNUC__)
                    284: 
                    285: #define SLJIT_CALL __attribute__ ((fastcall))
                    286: #define SLJIT_X86_32_FASTCALL 1
                    287: 
                    288: #elif defined(_WIN32)
                    289: 
                    290: #ifdef __BORLANDC__
                    291: #define SLJIT_CALL __msfastcall
                    292: #else /* __BORLANDC__ */
                    293: #define SLJIT_CALL __fastcall
                    294: #endif /* __BORLANDC__ */
                    295: #define SLJIT_X86_32_FASTCALL 1
                    296: 
                    297: #else /* defined(_WIN32) */
                    298: #define SLJIT_CALL __stdcall
                    299: #endif
                    300: 
                    301: #else /* Other architectures. */
                    302: 
                    303: #define SLJIT_CALL
                    304: 
                    305: #endif /* SLJIT_CONFIG_X86_32 */
                    306: 
                    307: #endif /* !SLJIT_CALL */
                    308: 
                    309: #if !defined(SLJIT_BIG_ENDIAN) && !defined(SLJIT_LITTLE_ENDIAN)
                    310: 
                    311: /* These macros are useful for the application. */
                    312: #if (defined SLJIT_CONFIG_PPC_32 && SLJIT_CONFIG_PPC_32) || (defined SLJIT_CONFIG_PPC_64 && SLJIT_CONFIG_PPC_64)
                    313: #define SLJIT_BIG_ENDIAN 1
                    314: 
                    315: #elif (defined SLJIT_CONFIG_MIPS_32 && SLJIT_CONFIG_MIPS_32)
                    316: 
                    317: #ifdef __MIPSEL__
                    318: #define SLJIT_LITTLE_ENDIAN 1
                    319: #else
                    320: #define SLJIT_BIG_ENDIAN 1
                    321: #endif
                    322: 
                    323: #else
                    324: #define SLJIT_LITTLE_ENDIAN 1
                    325: #endif
                    326: 
                    327: #endif /* !defined(SLJIT_BIG_ENDIAN) && !defined(SLJIT_LITTLE_ENDIAN) */
                    328: 
                    329: /* Sanity check. */
                    330: #if (defined SLJIT_BIG_ENDIAN && SLJIT_BIG_ENDIAN) && (defined SLJIT_LITTLE_ENDIAN && SLJIT_LITTLE_ENDIAN)
                    331: #error "Exactly one endianness must be selected"
                    332: #endif
                    333: 
                    334: #if !(defined SLJIT_BIG_ENDIAN && SLJIT_BIG_ENDIAN) && !(defined SLJIT_LITTLE_ENDIAN && SLJIT_LITTLE_ENDIAN)
                    335: #error "Exactly one endianness must be selected"
                    336: #endif
                    337: 
                    338: #if (defined SLJIT_CONFIG_PPC_64 && SLJIT_CONFIG_PPC_64)
                    339: /* It seems ppc64 compilers use an indirect addressing for functions.
                    340:    It makes things really complicated. */
                    341: #define SLJIT_INDIRECT_CALL 1
                    342: #endif
                    343: 
                    344: #ifndef SLJIT_SSE2
                    345: 
                    346: #if (defined SLJIT_CONFIG_X86_32 && SLJIT_CONFIG_X86_32) || (defined SLJIT_CONFIG_X86_64 && SLJIT_CONFIG_X86_64)
1.1.1.3 ! misho     347: /* Turn on SSE2 support on x86. */
1.1       misho     348: #define SLJIT_SSE2 1
                    349: 
                    350: #if (defined SLJIT_CONFIG_X86_32 && SLJIT_CONFIG_X86_32)
                    351: /* Auto detect SSE2 support using CPUID.
                    352:    On 64 bit x86 cpus, sse2 must be present. */
1.1.1.3 ! misho     353: #define SLJIT_DETECT_SSE2 1
1.1       misho     354: #endif
                    355: 
                    356: #endif /* (defined SLJIT_CONFIG_X86_32 && SLJIT_CONFIG_X86_32) || (defined SLJIT_CONFIG_X86_64 && SLJIT_CONFIG_X86_64) */
                    357: 
                    358: #endif /* !SLJIT_SSE2 */
                    359: 
                    360: #ifndef SLJIT_UNALIGNED
                    361: 
                    362: #if (defined SLJIT_CONFIG_X86_32 && SLJIT_CONFIG_X86_32) \
                    363:        || (defined SLJIT_CONFIG_X86_64 && SLJIT_CONFIG_X86_64) \
                    364:        || (defined SLJIT_CONFIG_ARM_V7 && SLJIT_CONFIG_ARM_V7) \
                    365:        || (defined SLJIT_CONFIG_ARM_THUMB2 && SLJIT_CONFIG_ARM_THUMB2) \
                    366:        || (defined SLJIT_CONFIG_PPC_32 && SLJIT_CONFIG_PPC_32) \
                    367:        || (defined SLJIT_CONFIG_PPC_64 && SLJIT_CONFIG_PPC_64)
                    368: #define SLJIT_UNALIGNED 1
                    369: #endif
                    370: 
                    371: #endif /* !SLJIT_UNALIGNED */
                    372: 
                    373: #if (defined SLJIT_EXECUTABLE_ALLOCATOR && SLJIT_EXECUTABLE_ALLOCATOR)
                    374: SLJIT_API_FUNC_ATTRIBUTE void* sljit_malloc_exec(sljit_uw size);
                    375: SLJIT_API_FUNC_ATTRIBUTE void sljit_free_exec(void* ptr);
                    376: #define SLJIT_MALLOC_EXEC(size) sljit_malloc_exec(size)
                    377: #define SLJIT_FREE_EXEC(ptr) sljit_free_exec(ptr)
                    378: #endif
                    379: 
                    380: #if (defined SLJIT_DEBUG && SLJIT_DEBUG) || (defined SLJIT_VERBOSE && SLJIT_VERBOSE)
                    381: #include <stdio.h>
                    382: #endif
                    383: 
                    384: #if (defined SLJIT_DEBUG && SLJIT_DEBUG)
                    385: 
                    386: /* Feel free to redefine these two macros. */
                    387: #ifndef SLJIT_ASSERT
                    388: 
                    389: #define SLJIT_HALT_PROCESS() \
                    390:        *((int*)0) = 0
                    391: 
                    392: #define SLJIT_ASSERT(x) \
                    393:        do { \
                    394:                if (SLJIT_UNLIKELY(!(x))) { \
                    395:                        printf("Assertion failed at " __FILE__ ":%d\n", __LINE__); \
                    396:                        SLJIT_HALT_PROCESS(); \
                    397:                } \
                    398:        } while (0)
                    399: 
                    400: #endif /* !SLJIT_ASSERT */
                    401: 
                    402: #ifndef SLJIT_ASSERT_STOP
                    403: 
                    404: #define SLJIT_ASSERT_STOP() \
                    405:        do { \
                    406:                printf("Should never been reached " __FILE__ ":%d\n", __LINE__); \
                    407:                SLJIT_HALT_PROCESS(); \
                    408:        } while (0)
                    409: 
                    410: #endif /* !SLJIT_ASSERT_STOP */
                    411: 
                    412: #else /* (defined SLJIT_DEBUG && SLJIT_DEBUG) */
                    413: 
                    414: #undef SLJIT_ASSERT
                    415: #undef SLJIT_ASSERT_STOP
                    416: 
                    417: #define SLJIT_ASSERT(x) \
                    418:        do { } while (0)
                    419: #define SLJIT_ASSERT_STOP() \
                    420:        do { } while (0)
                    421: 
                    422: #endif /* (defined SLJIT_DEBUG && SLJIT_DEBUG) */
                    423: 
                    424: #ifndef SLJIT_COMPILE_ASSERT
                    425: 
                    426: /* Should be improved eventually. */
                    427: #define SLJIT_COMPILE_ASSERT(x, description) \
                    428:        SLJIT_ASSERT(x)
                    429: 
                    430: #endif /* !SLJIT_COMPILE_ASSERT */
                    431: 
                    432: #endif

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>