Annotation of win32/pcre/sljit/sljitConfigInternal.h, revision 1.1

1.1     ! misha       1: /*
        !             2:  *    Stack-less Just-In-Time compiler
        !             3:  *
        !             4:  *    Copyright 2009-2012 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 macros depending on the target architecture:
        !            32: 
        !            33:    Feature detection (boolean) macros:
        !            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
        !            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)
        !            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. */
        !           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)
        !           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

E-mail: