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

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: 
                    197: #if (defined SLJIT_CONFIG_PPC_32 && SLJIT_CONFIG_PPC_32) || (defined SLJIT_CONFIG_PPC_64 && SLJIT_CONFIG_PPC_64)
                    198: 
                    199: /* The __clear_cache() implementation of GCC is a dummy function on PowerPC. */
                    200: #define SLJIT_CACHE_FLUSH(from, to) \
                    201:        ppc_cache_flush((from), (to))
                    202: 
                    203: #elif (defined SLJIT_CONFIG_X86_32 && SLJIT_CONFIG_X86_32) || (defined SLJIT_CONFIG_X86_64 && SLJIT_CONFIG_X86_64)
                    204: 
                    205: /* Not required to implement on archs with unified caches. */
                    206: #define SLJIT_CACHE_FLUSH(from, to)
                    207: 
                    208: #else
                    209: 
                    210: /* Calls __ARM_NR_cacheflush on ARM-Linux. */
                    211: #define SLJIT_CACHE_FLUSH(from, to) \
                    212:        __clear_cache((char*)(from), (char*)(to))
                    213: 
                    214: #endif
                    215: 
                    216: #endif /* !SLJIT_CACHE_FLUSH */
                    217: 
                    218: /* 8 bit byte type. */
                    219: typedef unsigned char sljit_ub;
                    220: typedef signed char sljit_b;
                    221: 
                    222: /* 16 bit half-word type. */
                    223: typedef unsigned short int sljit_uh;
                    224: typedef signed short int sljit_h;
                    225: 
                    226: /* 32 bit integer type. */
                    227: typedef unsigned int sljit_ui;
                    228: typedef signed int sljit_i;
                    229: 
                    230: /* Machine word type. Can encapsulate a pointer.
                    231:      32 bit for 32 bit machines.
                    232:      64 bit for 64 bit machines. */
1.1.1.2 ! misho     233: #if (defined SLJIT_CONFIG_UNSUPPORTED && SLJIT_CONFIG_UNSUPPORTED)
        !           234: /* Just to have something. */
        !           235: #define SLJIT_WORD_SHIFT 0
        !           236: typedef unsigned long int sljit_uw;
        !           237: typedef long int sljit_w;
        !           238: #elif !(defined SLJIT_CONFIG_X86_64 && SLJIT_CONFIG_X86_64) && !(defined SLJIT_CONFIG_PPC_64 && SLJIT_CONFIG_PPC_64)
1.1       misho     239: #define SLJIT_32BIT_ARCHITECTURE 1
                    240: #define SLJIT_WORD_SHIFT 2
                    241: typedef unsigned int sljit_uw;
                    242: typedef int sljit_w;
                    243: #else
                    244: #define SLJIT_64BIT_ARCHITECTURE 1
                    245: #define SLJIT_WORD_SHIFT 3
                    246: #ifdef _WIN32
                    247: typedef unsigned __int64 sljit_uw;
                    248: typedef __int64 sljit_w;
                    249: #else
                    250: typedef unsigned long int sljit_uw;
                    251: typedef long int sljit_w;
                    252: #endif
                    253: #endif
                    254: 
                    255: /* Double precision. */
                    256: #define SLJIT_FLOAT_SHIFT 3
                    257: 
                    258: #ifndef SLJIT_W
                    259: 
                    260: /* Defining long constants. */
                    261: #if (defined SLJIT_64BIT_ARCHITECTURE && SLJIT_64BIT_ARCHITECTURE)
                    262: #define SLJIT_W(w)     (w##ll)
                    263: #else
                    264: #define SLJIT_W(w)     (w)
                    265: #endif
                    266: 
                    267: #endif /* !SLJIT_W */
                    268: 
                    269: #ifndef SLJIT_CALL
                    270: 
                    271: /* ABI (Application Binary Interface) types. */
                    272: #if (defined SLJIT_CONFIG_X86_32 && SLJIT_CONFIG_X86_32)
                    273: 
                    274: #if defined(__GNUC__)
                    275: 
                    276: #define SLJIT_CALL __attribute__ ((fastcall))
                    277: #define SLJIT_X86_32_FASTCALL 1
                    278: 
                    279: #elif defined(_WIN32)
                    280: 
                    281: #ifdef __BORLANDC__
                    282: #define SLJIT_CALL __msfastcall
                    283: #else /* __BORLANDC__ */
                    284: #define SLJIT_CALL __fastcall
                    285: #endif /* __BORLANDC__ */
                    286: #define SLJIT_X86_32_FASTCALL 1
                    287: 
                    288: #else /* defined(_WIN32) */
                    289: #define SLJIT_CALL __stdcall
                    290: #endif
                    291: 
                    292: #else /* Other architectures. */
                    293: 
                    294: #define SLJIT_CALL
                    295: 
                    296: #endif /* SLJIT_CONFIG_X86_32 */
                    297: 
                    298: #endif /* !SLJIT_CALL */
                    299: 
                    300: #if !defined(SLJIT_BIG_ENDIAN) && !defined(SLJIT_LITTLE_ENDIAN)
                    301: 
                    302: /* These macros are useful for the application. */
                    303: #if (defined SLJIT_CONFIG_PPC_32 && SLJIT_CONFIG_PPC_32) || (defined SLJIT_CONFIG_PPC_64 && SLJIT_CONFIG_PPC_64)
                    304: #define SLJIT_BIG_ENDIAN 1
                    305: 
                    306: #elif (defined SLJIT_CONFIG_MIPS_32 && SLJIT_CONFIG_MIPS_32)
                    307: 
                    308: #ifdef __MIPSEL__
                    309: #define SLJIT_LITTLE_ENDIAN 1
                    310: #else
                    311: #define SLJIT_BIG_ENDIAN 1
                    312: #endif
                    313: 
                    314: #else
                    315: #define SLJIT_LITTLE_ENDIAN 1
                    316: #endif
                    317: 
                    318: #endif /* !defined(SLJIT_BIG_ENDIAN) && !defined(SLJIT_LITTLE_ENDIAN) */
                    319: 
                    320: /* Sanity check. */
                    321: #if (defined SLJIT_BIG_ENDIAN && SLJIT_BIG_ENDIAN) && (defined SLJIT_LITTLE_ENDIAN && SLJIT_LITTLE_ENDIAN)
                    322: #error "Exactly one endianness must be selected"
                    323: #endif
                    324: 
                    325: #if !(defined SLJIT_BIG_ENDIAN && SLJIT_BIG_ENDIAN) && !(defined SLJIT_LITTLE_ENDIAN && SLJIT_LITTLE_ENDIAN)
                    326: #error "Exactly one endianness must be selected"
                    327: #endif
                    328: 
                    329: #if (defined SLJIT_CONFIG_PPC_64 && SLJIT_CONFIG_PPC_64)
                    330: /* It seems ppc64 compilers use an indirect addressing for functions.
                    331:    It makes things really complicated. */
                    332: #define SLJIT_INDIRECT_CALL 1
                    333: #endif
                    334: 
                    335: #ifndef SLJIT_SSE2
                    336: 
                    337: #if (defined SLJIT_CONFIG_X86_32 && SLJIT_CONFIG_X86_32) || (defined SLJIT_CONFIG_X86_64 && SLJIT_CONFIG_X86_64)
                    338: /* Turn on SSE2 support on x86 (operating on doubles).
                    339:    (Better performance than legacy fpu instructions). */
                    340: #define SLJIT_SSE2 1
                    341: 
                    342: #if (defined SLJIT_CONFIG_X86_32 && SLJIT_CONFIG_X86_32)
                    343: /* Auto detect SSE2 support using CPUID.
                    344:    On 64 bit x86 cpus, sse2 must be present. */
                    345: #define SLJIT_SSE2_AUTO 1
                    346: #endif
                    347: 
                    348: #endif /* (defined SLJIT_CONFIG_X86_32 && SLJIT_CONFIG_X86_32) || (defined SLJIT_CONFIG_X86_64 && SLJIT_CONFIG_X86_64) */
                    349: 
                    350: #endif /* !SLJIT_SSE2 */
                    351: 
                    352: #ifndef SLJIT_UNALIGNED
                    353: 
                    354: #if (defined SLJIT_CONFIG_X86_32 && SLJIT_CONFIG_X86_32) \
                    355:        || (defined SLJIT_CONFIG_X86_64 && SLJIT_CONFIG_X86_64) \
                    356:        || (defined SLJIT_CONFIG_ARM_V7 && SLJIT_CONFIG_ARM_V7) \
                    357:        || (defined SLJIT_CONFIG_ARM_THUMB2 && SLJIT_CONFIG_ARM_THUMB2) \
                    358:        || (defined SLJIT_CONFIG_PPC_32 && SLJIT_CONFIG_PPC_32) \
                    359:        || (defined SLJIT_CONFIG_PPC_64 && SLJIT_CONFIG_PPC_64)
                    360: #define SLJIT_UNALIGNED 1
                    361: #endif
                    362: 
                    363: #endif /* !SLJIT_UNALIGNED */
                    364: 
                    365: #if (defined SLJIT_EXECUTABLE_ALLOCATOR && SLJIT_EXECUTABLE_ALLOCATOR)
                    366: SLJIT_API_FUNC_ATTRIBUTE void* sljit_malloc_exec(sljit_uw size);
                    367: SLJIT_API_FUNC_ATTRIBUTE void sljit_free_exec(void* ptr);
                    368: #define SLJIT_MALLOC_EXEC(size) sljit_malloc_exec(size)
                    369: #define SLJIT_FREE_EXEC(ptr) sljit_free_exec(ptr)
                    370: #endif
                    371: 
                    372: #if (defined SLJIT_DEBUG && SLJIT_DEBUG) || (defined SLJIT_VERBOSE && SLJIT_VERBOSE)
                    373: #include <stdio.h>
                    374: #endif
                    375: 
                    376: #if (defined SLJIT_DEBUG && SLJIT_DEBUG)
                    377: 
                    378: /* Feel free to redefine these two macros. */
                    379: #ifndef SLJIT_ASSERT
                    380: 
                    381: #define SLJIT_HALT_PROCESS() \
                    382:        *((int*)0) = 0
                    383: 
                    384: #define SLJIT_ASSERT(x) \
                    385:        do { \
                    386:                if (SLJIT_UNLIKELY(!(x))) { \
                    387:                        printf("Assertion failed at " __FILE__ ":%d\n", __LINE__); \
                    388:                        SLJIT_HALT_PROCESS(); \
                    389:                } \
                    390:        } while (0)
                    391: 
                    392: #endif /* !SLJIT_ASSERT */
                    393: 
                    394: #ifndef SLJIT_ASSERT_STOP
                    395: 
                    396: #define SLJIT_ASSERT_STOP() \
                    397:        do { \
                    398:                printf("Should never been reached " __FILE__ ":%d\n", __LINE__); \
                    399:                SLJIT_HALT_PROCESS(); \
                    400:        } while (0)
                    401: 
                    402: #endif /* !SLJIT_ASSERT_STOP */
                    403: 
                    404: #else /* (defined SLJIT_DEBUG && SLJIT_DEBUG) */
                    405: 
                    406: #undef SLJIT_ASSERT
                    407: #undef SLJIT_ASSERT_STOP
                    408: 
                    409: #define SLJIT_ASSERT(x) \
                    410:        do { } while (0)
                    411: #define SLJIT_ASSERT_STOP() \
                    412:        do { } while (0)
                    413: 
                    414: #endif /* (defined SLJIT_DEBUG && SLJIT_DEBUG) */
                    415: 
                    416: #ifndef SLJIT_COMPILE_ASSERT
                    417: 
                    418: /* Should be improved eventually. */
                    419: #define SLJIT_COMPILE_ASSERT(x, description) \
                    420:        SLJIT_ASSERT(x)
                    421: 
                    422: #endif /* !SLJIT_COMPILE_ASSERT */
                    423: 
                    424: #endif

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