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

1.1       misho       1: /*
                      2:  *    Stack-less Just-In-Time compiler
                      3:  *
                      4:  *    Copyright 2009-2010 Zoltan Herczeg (hzmester@freemail.hu). All rights reserved.
                      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: /*
                     31:    SLJIT defines the following variables itself depending on the configuration:
                     32:    sljit_b, sljit_ub : signed and unsigned 8 bit byte
                     33:    sljit_h, sljit_uh : signed and unsigned 16 bit half-word (short) type
                     34:    sljit_i, sljit_ui : signed and unsigned 32 bit integer type
                     35:    sljit_w, sljit_uw : signed and unsigned machine word, enough to store a pointer (same as intptr_t)
                     36:    SLJIT_CALL : C calling convention for both calling JIT and C callbacks from JIT
                     37:    SLJIT_32BIT_ARCHITECTURE : 32 bit architecture
                     38:    SLJIT_64BIT_ARCHITECTURE : 64 bit architecture
                     39:    SLJIT_WORD_SHIFT : the shift required to apply when accessing a sljit_w/sljit_uw array by index
                     40:    SLJIT_FLOAT_SHIFT : the shift required to apply when accessing a double array by index
                     41:    SLJIT_BIG_ENDIAN : big endian architecture
                     42:    SLJIT_LITTLE_ENDIAN : little endian architecture
                     43:    SLJIT_INDIRECT_CALL : see SLJIT_FUNC_OFFSET()
                     44:    SLJIT_W : for defining 64 bit constants on 64 bit architectures (compiler workaround)
                     45:    SLJIT_UNALIGNED : allows unaligned memory accesses for integer arithmetic (only!)
                     46: */
                     47: 
                     48: #if !((defined SLJIT_CONFIG_X86_32 && SLJIT_CONFIG_X86_32) \
                     49:        || (defined SLJIT_CONFIG_X86_64 && SLJIT_CONFIG_X86_64) \
                     50:        || (defined SLJIT_CONFIG_ARM_V5 && SLJIT_CONFIG_ARM_V5) \
                     51:        || (defined SLJIT_CONFIG_ARM_V7 && SLJIT_CONFIG_ARM_V7) \
                     52:        || (defined SLJIT_CONFIG_ARM_THUMB2 && SLJIT_CONFIG_ARM_THUMB2) \
                     53:        || (defined SLJIT_CONFIG_PPC_32 && SLJIT_CONFIG_PPC_32) \
                     54:        || (defined SLJIT_CONFIG_PPC_64 && SLJIT_CONFIG_PPC_64) \
                     55:        || (defined SLJIT_CONFIG_MIPS_32 && SLJIT_CONFIG_MIPS_32) \
                     56:        || (defined SLJIT_CONFIG_AUTO && SLJIT_CONFIG_AUTO) \
                     57:        || (defined SLJIT_CONFIG_UNSUPPORTED && SLJIT_CONFIG_UNSUPPORTED))
                     58: #error "An architecture must be selected"
                     59: #endif
                     60: 
                     61: /* Sanity check. */
                     62: #if (defined SLJIT_CONFIG_X86_32 && SLJIT_CONFIG_X86_32) \
                     63:        + (defined SLJIT_CONFIG_X86_64 && SLJIT_CONFIG_X86_64) \
                     64:        + (defined SLJIT_CONFIG_ARM_V5 && SLJIT_CONFIG_ARM_V5) \
                     65:        + (defined SLJIT_CONFIG_ARM_V7 && SLJIT_CONFIG_ARM_V7) \
                     66:        + (defined SLJIT_CONFIG_ARM_THUMB2 && SLJIT_CONFIG_ARM_THUMB2) \
                     67:        + (defined SLJIT_CONFIG_PPC_32 && SLJIT_CONFIG_PPC_32) \
                     68:        + (defined SLJIT_CONFIG_PPC_64 && SLJIT_CONFIG_PPC_64) \
                     69:        + (defined SLJIT_CONFIG_MIPS_32 && SLJIT_CONFIG_MIPS_32) \
                     70:        + (defined SLJIT_CONFIG_AUTO && SLJIT_CONFIG_AUTO) \
                     71:        + (defined SLJIT_CONFIG_UNSUPPORTED && SLJIT_CONFIG_UNSUPPORTED) >= 2
                     72: #error "Multiple architectures are selected"
                     73: #endif
                     74: 
                     75: /* Auto select option (requires compiler support) */
                     76: #if (defined SLJIT_CONFIG_AUTO && SLJIT_CONFIG_AUTO)
                     77: 
                     78: #ifndef _WIN32
                     79: 
                     80: #if defined(__i386__) || defined(__i386)
                     81: #define SLJIT_CONFIG_X86_32 1
                     82: #elif defined(__x86_64__)
                     83: #define SLJIT_CONFIG_X86_64 1
                     84: #elif defined(__arm__) || defined(__ARM__)
                     85: #ifdef __thumb2__
                     86: #define SLJIT_CONFIG_ARM_THUMB2 1
                     87: #elif defined(__ARM_ARCH_7__) || defined(__ARM_ARCH_7A__) || defined(__ARM_ARCH_7R__)
                     88: #define SLJIT_CONFIG_ARM_V7 1
                     89: #else
                     90: #define SLJIT_CONFIG_ARM_V5 1
                     91: #endif
                     92: #elif defined(__ppc64__) || defined(__powerpc64__)
                     93: #define SLJIT_CONFIG_PPC_64 1
                     94: #elif defined(__ppc__) || defined(__powerpc__)
                     95: #define SLJIT_CONFIG_PPC_32 1
                     96: #elif defined(__mips__)
                     97: #define SLJIT_CONFIG_MIPS_32 1
                     98: #else
                     99: /* Unsupported architecture */
                    100: #define SLJIT_CONFIG_UNSUPPORTED 1
                    101: #endif
                    102: 
                    103: #else /* !_WIN32 */
                    104: 
                    105: #if defined(_M_X64) || defined(__x86_64__)
                    106: #define SLJIT_CONFIG_X86_64 1
                    107: #elif defined(_ARM_)
                    108: #define SLJIT_CONFIG_ARM_V5 1
                    109: #else
                    110: #define SLJIT_CONFIG_X86_32 1
                    111: #endif
                    112: 
                    113: #endif /* !WIN32 */
                    114: #endif /* SLJIT_CONFIG_AUTO */
                    115: 
                    116: #if (defined SLJIT_CONFIG_UNSUPPORTED && SLJIT_CONFIG_UNSUPPORTED)
                    117: #undef SLJIT_EXECUTABLE_ALLOCATOR
                    118: #endif
                    119: 
                    120: #if !(defined SLJIT_STD_MACROS_DEFINED && SLJIT_STD_MACROS_DEFINED)
                    121: 
                    122: /* These libraries are needed for the macros below. */
                    123: #include <stdlib.h>
                    124: #include <string.h>
                    125: 
                    126: #endif /* STD_MACROS_DEFINED */
                    127: 
                    128: /* General macros:
                    129:    Note: SLJIT is designed to be independent from them as possible.
                    130: 
                    131:    In release mode (SLJIT_DEBUG is not defined) only the following macros are needed:
                    132: */
                    133: 
                    134: #ifndef SLJIT_MALLOC
                    135: #define SLJIT_MALLOC(size) malloc(size)
                    136: #endif
                    137: 
                    138: #ifndef SLJIT_FREE
                    139: #define SLJIT_FREE(ptr) free(ptr)
                    140: #endif
                    141: 
                    142: #ifndef SLJIT_MEMMOVE
                    143: #define SLJIT_MEMMOVE(dest, src, len) memmove(dest, src, len)
                    144: #endif
                    145: 
                    146: #ifndef SLJIT_ZEROMEM
                    147: #define SLJIT_ZEROMEM(dest, len) memset(dest, 0, len)
                    148: #endif
                    149: 
                    150: #if !defined(SLJIT_LIKELY) && !defined(SLJIT_UNLIKELY)
                    151: 
                    152: #if defined(__GNUC__) && (__GNUC__ >= 3)
                    153: #define SLJIT_LIKELY(x)                __builtin_expect((x), 1)
                    154: #define SLJIT_UNLIKELY(x)      __builtin_expect((x), 0)
                    155: #else
                    156: #define SLJIT_LIKELY(x)                (x)
                    157: #define SLJIT_UNLIKELY(x)      (x)
                    158: #endif
                    159: 
                    160: #endif /* !defined(SLJIT_LIKELY) && !defined(SLJIT_UNLIKELY) */
                    161: 
                    162: #ifndef SLJIT_INLINE
                    163: /* Inline functions. */
                    164: #define SLJIT_INLINE __inline
                    165: #endif
                    166: 
                    167: #ifndef SLJIT_CONST
                    168: /* Const variables. */
                    169: #define SLJIT_CONST const
                    170: #endif
                    171: 
                    172: #ifndef SLJIT_UNUSED_ARG
                    173: /* Unused arguments. */
                    174: #define SLJIT_UNUSED_ARG(arg) (void)arg
                    175: #endif
                    176: 
                    177: #if (defined SLJIT_CONFIG_STATIC && SLJIT_CONFIG_STATIC)
                    178: /* Static ABI functions. For all-in-one programs. */
                    179: 
                    180: #if defined(__GNUC__)
                    181: /* Disable unused warnings in gcc. */
                    182: #define SLJIT_API_FUNC_ATTRIBUTE static __attribute__((unused))
                    183: #else
                    184: #define SLJIT_API_FUNC_ATTRIBUTE static
                    185: #endif
                    186: 
                    187: #else
                    188: #define SLJIT_API_FUNC_ATTRIBUTE
                    189: #endif /* (defined SLJIT_CONFIG_STATIC && SLJIT_CONFIG_STATIC) */
                    190: 
                    191: #ifndef SLJIT_CACHE_FLUSH
                    192: 
                    193: #if (defined SLJIT_CONFIG_PPC_32 && SLJIT_CONFIG_PPC_32) || (defined SLJIT_CONFIG_PPC_64 && SLJIT_CONFIG_PPC_64)
                    194: 
                    195: /* The __clear_cache() implementation of GCC is a dummy function on PowerPC. */
                    196: #define SLJIT_CACHE_FLUSH(from, to) \
                    197:        ppc_cache_flush((from), (to))
                    198: 
                    199: #elif (defined SLJIT_CONFIG_X86_32 && SLJIT_CONFIG_X86_32) || (defined SLJIT_CONFIG_X86_64 && SLJIT_CONFIG_X86_64)
                    200: 
                    201: /* Not required to implement on archs with unified caches. */
                    202: #define SLJIT_CACHE_FLUSH(from, to)
                    203: 
                    204: #else
                    205: 
                    206: /* Calls __ARM_NR_cacheflush on ARM-Linux. */
                    207: #define SLJIT_CACHE_FLUSH(from, to) \
                    208:        __clear_cache((char*)(from), (char*)(to))
                    209: 
                    210: #endif
                    211: 
                    212: #endif /* !SLJIT_CACHE_FLUSH */
                    213: 
                    214: /* 8 bit byte type. */
                    215: typedef unsigned char sljit_ub;
                    216: typedef signed char sljit_b;
                    217: 
                    218: /* 16 bit half-word type. */
                    219: typedef unsigned short int sljit_uh;
                    220: typedef signed short int sljit_h;
                    221: 
                    222: /* 32 bit integer type. */
                    223: typedef unsigned int sljit_ui;
                    224: typedef signed int sljit_i;
                    225: 
                    226: /* Machine word type. Can encapsulate a pointer.
                    227:      32 bit for 32 bit machines.
                    228:      64 bit for 64 bit machines. */
                    229: #if !(defined SLJIT_CONFIG_X86_64 && SLJIT_CONFIG_X86_64) && !(defined SLJIT_CONFIG_PPC_64 && SLJIT_CONFIG_PPC_64)
                    230: #define SLJIT_32BIT_ARCHITECTURE 1
                    231: #define SLJIT_WORD_SHIFT 2
                    232: typedef unsigned int sljit_uw;
                    233: typedef int sljit_w;
                    234: #else
                    235: #define SLJIT_64BIT_ARCHITECTURE 1
                    236: #define SLJIT_WORD_SHIFT 3
                    237: #ifdef _WIN32
                    238: typedef unsigned __int64 sljit_uw;
                    239: typedef __int64 sljit_w;
                    240: #else
                    241: typedef unsigned long int sljit_uw;
                    242: typedef long int sljit_w;
                    243: #endif
                    244: #endif
                    245: 
                    246: /* Double precision. */
                    247: #define SLJIT_FLOAT_SHIFT 3
                    248: 
                    249: #ifndef SLJIT_W
                    250: 
                    251: /* Defining long constants. */
                    252: #if (defined SLJIT_64BIT_ARCHITECTURE && SLJIT_64BIT_ARCHITECTURE)
                    253: #define SLJIT_W(w)     (w##ll)
                    254: #else
                    255: #define SLJIT_W(w)     (w)
                    256: #endif
                    257: 
                    258: #endif /* !SLJIT_W */
                    259: 
                    260: #ifndef SLJIT_CALL
                    261: 
                    262: /* ABI (Application Binary Interface) types. */
                    263: #if (defined SLJIT_CONFIG_X86_32 && SLJIT_CONFIG_X86_32)
                    264: 
                    265: #if defined(__GNUC__)
                    266: 
                    267: #define SLJIT_CALL __attribute__ ((fastcall))
                    268: #define SLJIT_X86_32_FASTCALL 1
                    269: 
                    270: #elif defined(_WIN32)
                    271: 
                    272: #ifdef __BORLANDC__
                    273: #define SLJIT_CALL __msfastcall
                    274: #else /* __BORLANDC__ */
                    275: #define SLJIT_CALL __fastcall
                    276: #endif /* __BORLANDC__ */
                    277: #define SLJIT_X86_32_FASTCALL 1
                    278: 
                    279: #else /* defined(_WIN32) */
                    280: #define SLJIT_CALL __stdcall
                    281: #endif
                    282: 
                    283: #else /* Other architectures. */
                    284: 
                    285: #define SLJIT_CALL
                    286: 
                    287: #endif /* SLJIT_CONFIG_X86_32 */
                    288: 
                    289: #endif /* !SLJIT_CALL */
                    290: 
                    291: #if !defined(SLJIT_BIG_ENDIAN) && !defined(SLJIT_LITTLE_ENDIAN)
                    292: 
                    293: /* These macros are useful for the application. */
                    294: #if (defined SLJIT_CONFIG_PPC_32 && SLJIT_CONFIG_PPC_32) || (defined SLJIT_CONFIG_PPC_64 && SLJIT_CONFIG_PPC_64)
                    295: #define SLJIT_BIG_ENDIAN 1
                    296: 
                    297: #elif (defined SLJIT_CONFIG_MIPS_32 && SLJIT_CONFIG_MIPS_32)
                    298: 
                    299: #ifdef __MIPSEL__
                    300: #define SLJIT_LITTLE_ENDIAN 1
                    301: #else
                    302: #define SLJIT_BIG_ENDIAN 1
                    303: #endif
                    304: 
                    305: #else
                    306: #define SLJIT_LITTLE_ENDIAN 1
                    307: #endif
                    308: 
                    309: #endif /* !defined(SLJIT_BIG_ENDIAN) && !defined(SLJIT_LITTLE_ENDIAN) */
                    310: 
                    311: /* Sanity check. */
                    312: #if (defined SLJIT_BIG_ENDIAN && SLJIT_BIG_ENDIAN) && (defined SLJIT_LITTLE_ENDIAN && SLJIT_LITTLE_ENDIAN)
                    313: #error "Exactly one endianness must be selected"
                    314: #endif
                    315: 
                    316: #if !(defined SLJIT_BIG_ENDIAN && SLJIT_BIG_ENDIAN) && !(defined SLJIT_LITTLE_ENDIAN && SLJIT_LITTLE_ENDIAN)
                    317: #error "Exactly one endianness must be selected"
                    318: #endif
                    319: 
                    320: #if (defined SLJIT_CONFIG_PPC_64 && SLJIT_CONFIG_PPC_64)
                    321: /* It seems ppc64 compilers use an indirect addressing for functions.
                    322:    It makes things really complicated. */
                    323: #define SLJIT_INDIRECT_CALL 1
                    324: #endif
                    325: 
                    326: #ifndef SLJIT_SSE2
                    327: 
                    328: #if (defined SLJIT_CONFIG_X86_32 && SLJIT_CONFIG_X86_32) || (defined SLJIT_CONFIG_X86_64 && SLJIT_CONFIG_X86_64)
                    329: /* Turn on SSE2 support on x86 (operating on doubles).
                    330:    (Better performance than legacy fpu instructions). */
                    331: #define SLJIT_SSE2 1
                    332: 
                    333: #if (defined SLJIT_CONFIG_X86_32 && SLJIT_CONFIG_X86_32)
                    334: /* Auto detect SSE2 support using CPUID.
                    335:    On 64 bit x86 cpus, sse2 must be present. */
                    336: #define SLJIT_SSE2_AUTO 1
                    337: #endif
                    338: 
                    339: #endif /* (defined SLJIT_CONFIG_X86_32 && SLJIT_CONFIG_X86_32) || (defined SLJIT_CONFIG_X86_64 && SLJIT_CONFIG_X86_64) */
                    340: 
                    341: #endif /* !SLJIT_SSE2 */
                    342: 
                    343: #ifndef SLJIT_UNALIGNED
                    344: 
                    345: #if (defined SLJIT_CONFIG_X86_32 && SLJIT_CONFIG_X86_32) \
                    346:        || (defined SLJIT_CONFIG_X86_64 && SLJIT_CONFIG_X86_64) \
                    347:        || (defined SLJIT_CONFIG_ARM_V7 && SLJIT_CONFIG_ARM_V7) \
                    348:        || (defined SLJIT_CONFIG_ARM_THUMB2 && SLJIT_CONFIG_ARM_THUMB2) \
                    349:        || (defined SLJIT_CONFIG_PPC_32 && SLJIT_CONFIG_PPC_32) \
                    350:        || (defined SLJIT_CONFIG_PPC_64 && SLJIT_CONFIG_PPC_64)
                    351: #define SLJIT_UNALIGNED 1
                    352: #endif
                    353: 
                    354: #endif /* !SLJIT_UNALIGNED */
                    355: 
                    356: #if (defined SLJIT_EXECUTABLE_ALLOCATOR && SLJIT_EXECUTABLE_ALLOCATOR)
                    357: SLJIT_API_FUNC_ATTRIBUTE void* sljit_malloc_exec(sljit_uw size);
                    358: SLJIT_API_FUNC_ATTRIBUTE void sljit_free_exec(void* ptr);
                    359: #define SLJIT_MALLOC_EXEC(size) sljit_malloc_exec(size)
                    360: #define SLJIT_FREE_EXEC(ptr) sljit_free_exec(ptr)
                    361: #endif
                    362: 
                    363: #if (defined SLJIT_DEBUG && SLJIT_DEBUG) || (defined SLJIT_VERBOSE && SLJIT_VERBOSE)
                    364: #include <stdio.h>
                    365: #endif
                    366: 
                    367: #if (defined SLJIT_DEBUG && SLJIT_DEBUG)
                    368: 
                    369: /* Feel free to redefine these two macros. */
                    370: #ifndef SLJIT_ASSERT
                    371: 
                    372: #define SLJIT_HALT_PROCESS() \
                    373:        *((int*)0) = 0
                    374: 
                    375: #define SLJIT_ASSERT(x) \
                    376:        do { \
                    377:                if (SLJIT_UNLIKELY(!(x))) { \
                    378:                        printf("Assertion failed at " __FILE__ ":%d\n", __LINE__); \
                    379:                        SLJIT_HALT_PROCESS(); \
                    380:                } \
                    381:        } while (0)
                    382: 
                    383: #endif /* !SLJIT_ASSERT */
                    384: 
                    385: #ifndef SLJIT_ASSERT_STOP
                    386: 
                    387: #define SLJIT_ASSERT_STOP() \
                    388:        do { \
                    389:                printf("Should never been reached " __FILE__ ":%d\n", __LINE__); \
                    390:                SLJIT_HALT_PROCESS(); \
                    391:        } while (0)
                    392: 
                    393: #endif /* !SLJIT_ASSERT_STOP */
                    394: 
                    395: #else /* (defined SLJIT_DEBUG && SLJIT_DEBUG) */
                    396: 
                    397: #undef SLJIT_ASSERT
                    398: #undef SLJIT_ASSERT_STOP
                    399: 
                    400: #define SLJIT_ASSERT(x) \
                    401:        do { } while (0)
                    402: #define SLJIT_ASSERT_STOP() \
                    403:        do { } while (0)
                    404: 
                    405: #endif /* (defined SLJIT_DEBUG && SLJIT_DEBUG) */
                    406: 
                    407: #ifndef SLJIT_COMPILE_ASSERT
                    408: 
                    409: /* Should be improved eventually. */
                    410: #define SLJIT_COMPILE_ASSERT(x, description) \
                    411:        SLJIT_ASSERT(x)
                    412: 
                    413: #endif /* !SLJIT_COMPILE_ASSERT */
                    414: 
                    415: #endif

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