Annotation of embedaddon/pcre/sljit/sljitConfigInternal.h, revision 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>