1*22dc650dSSadaf Ebrahimi /* 2*22dc650dSSadaf Ebrahimi * Stack-less Just-In-Time compiler 3*22dc650dSSadaf Ebrahimi * 4*22dc650dSSadaf Ebrahimi * Copyright Zoltan Herczeg ([email protected]). All rights reserved. 5*22dc650dSSadaf Ebrahimi * 6*22dc650dSSadaf Ebrahimi * Redistribution and use in source and binary forms, with or without modification, are 7*22dc650dSSadaf Ebrahimi * permitted provided that the following conditions are met: 8*22dc650dSSadaf Ebrahimi * 9*22dc650dSSadaf Ebrahimi * 1. Redistributions of source code must retain the above copyright notice, this list of 10*22dc650dSSadaf Ebrahimi * conditions and the following disclaimer. 11*22dc650dSSadaf Ebrahimi * 12*22dc650dSSadaf Ebrahimi * 2. Redistributions in binary form must reproduce the above copyright notice, this list 13*22dc650dSSadaf Ebrahimi * of conditions and the following disclaimer in the documentation and/or other materials 14*22dc650dSSadaf Ebrahimi * provided with the distribution. 15*22dc650dSSadaf Ebrahimi * 16*22dc650dSSadaf Ebrahimi * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDER(S) AND CONTRIBUTORS ``AS IS'' AND ANY 17*22dc650dSSadaf Ebrahimi * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 18*22dc650dSSadaf Ebrahimi * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT 19*22dc650dSSadaf Ebrahimi * SHALL THE COPYRIGHT HOLDER(S) OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, 20*22dc650dSSadaf Ebrahimi * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED 21*22dc650dSSadaf Ebrahimi * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR 22*22dc650dSSadaf Ebrahimi * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 23*22dc650dSSadaf Ebrahimi * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN 24*22dc650dSSadaf Ebrahimi * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 25*22dc650dSSadaf Ebrahimi */ 26*22dc650dSSadaf Ebrahimi 27*22dc650dSSadaf Ebrahimi #ifndef SLJIT_CONFIG_H_ 28*22dc650dSSadaf Ebrahimi #define SLJIT_CONFIG_H_ 29*22dc650dSSadaf Ebrahimi 30*22dc650dSSadaf Ebrahimi #ifdef __cplusplus 31*22dc650dSSadaf Ebrahimi extern "C" { 32*22dc650dSSadaf Ebrahimi #endif 33*22dc650dSSadaf Ebrahimi 34*22dc650dSSadaf Ebrahimi /* 35*22dc650dSSadaf Ebrahimi This file contains the basic configuration options for the SLJIT compiler 36*22dc650dSSadaf Ebrahimi and their default values. These options can be overridden in the 37*22dc650dSSadaf Ebrahimi sljitConfigPre.h header file when SLJIT_HAVE_CONFIG_PRE is set to a 38*22dc650dSSadaf Ebrahimi non-zero value. 39*22dc650dSSadaf Ebrahimi */ 40*22dc650dSSadaf Ebrahimi 41*22dc650dSSadaf Ebrahimi /* --------------------------------------------------------------------- */ 42*22dc650dSSadaf Ebrahimi /* Utilities */ 43*22dc650dSSadaf Ebrahimi /* --------------------------------------------------------------------- */ 44*22dc650dSSadaf Ebrahimi 45*22dc650dSSadaf Ebrahimi /* Implements a stack like data structure (by using mmap / VirtualAlloc */ 46*22dc650dSSadaf Ebrahimi /* or a custom allocator). */ 47*22dc650dSSadaf Ebrahimi #ifndef SLJIT_UTIL_STACK 48*22dc650dSSadaf Ebrahimi /* Enabled by default */ 49*22dc650dSSadaf Ebrahimi #define SLJIT_UTIL_STACK 1 50*22dc650dSSadaf Ebrahimi #endif 51*22dc650dSSadaf Ebrahimi 52*22dc650dSSadaf Ebrahimi /* Uses user provided allocator to allocate the stack (see SLJIT_UTIL_STACK) */ 53*22dc650dSSadaf Ebrahimi #ifndef SLJIT_UTIL_SIMPLE_STACK_ALLOCATION 54*22dc650dSSadaf Ebrahimi /* Disabled by default */ 55*22dc650dSSadaf Ebrahimi #define SLJIT_UTIL_SIMPLE_STACK_ALLOCATION 0 56*22dc650dSSadaf Ebrahimi #endif 57*22dc650dSSadaf Ebrahimi 58*22dc650dSSadaf Ebrahimi /* Single threaded application. Does not require any locks. */ 59*22dc650dSSadaf Ebrahimi #ifndef SLJIT_SINGLE_THREADED 60*22dc650dSSadaf Ebrahimi /* Disabled by default. */ 61*22dc650dSSadaf Ebrahimi #define SLJIT_SINGLE_THREADED 0 62*22dc650dSSadaf Ebrahimi #endif 63*22dc650dSSadaf Ebrahimi 64*22dc650dSSadaf Ebrahimi /* --------------------------------------------------------------------- */ 65*22dc650dSSadaf Ebrahimi /* Configuration */ 66*22dc650dSSadaf Ebrahimi /* --------------------------------------------------------------------- */ 67*22dc650dSSadaf Ebrahimi 68*22dc650dSSadaf Ebrahimi /* If SLJIT_STD_MACROS_DEFINED is not defined, the application should 69*22dc650dSSadaf Ebrahimi define SLJIT_MALLOC, SLJIT_FREE, SLJIT_MEMCPY, and NULL. */ 70*22dc650dSSadaf Ebrahimi #ifndef SLJIT_STD_MACROS_DEFINED 71*22dc650dSSadaf Ebrahimi /* Disabled by default. */ 72*22dc650dSSadaf Ebrahimi #define SLJIT_STD_MACROS_DEFINED 0 73*22dc650dSSadaf Ebrahimi #endif 74*22dc650dSSadaf Ebrahimi 75*22dc650dSSadaf Ebrahimi /* Executable code allocation: 76*22dc650dSSadaf Ebrahimi If SLJIT_EXECUTABLE_ALLOCATOR is not defined, the application should 77*22dc650dSSadaf Ebrahimi define SLJIT_MALLOC_EXEC and SLJIT_FREE_EXEC. 78*22dc650dSSadaf Ebrahimi Optionally, depending on the implementation used for the allocator, 79*22dc650dSSadaf Ebrahimi SLJIT_EXEC_OFFSET and SLJIT_UPDATE_WX_FLAGS might also be needed. */ 80*22dc650dSSadaf Ebrahimi #ifndef SLJIT_EXECUTABLE_ALLOCATOR 81*22dc650dSSadaf Ebrahimi /* Enabled by default. */ 82*22dc650dSSadaf Ebrahimi #define SLJIT_EXECUTABLE_ALLOCATOR 1 83*22dc650dSSadaf Ebrahimi 84*22dc650dSSadaf Ebrahimi /* When SLJIT_PROT_EXECUTABLE_ALLOCATOR is enabled SLJIT uses 85*22dc650dSSadaf Ebrahimi an allocator which does not set writable and executable 86*22dc650dSSadaf Ebrahimi permission flags at the same time. 87*22dc650dSSadaf Ebrahimi Instead, it creates a shared memory segment (usually backed by a file) 88*22dc650dSSadaf Ebrahimi and maps it twice, with different permissions, depending on the use 89*22dc650dSSadaf Ebrahimi case. 90*22dc650dSSadaf Ebrahimi The trade-off is increased use of virtual memory, incompatibility with 91*22dc650dSSadaf Ebrahimi fork(), and some possible additional security risks by the use of 92*22dc650dSSadaf Ebrahimi publicly accessible files for the generated code. */ 93*22dc650dSSadaf Ebrahimi #ifndef SLJIT_PROT_EXECUTABLE_ALLOCATOR 94*22dc650dSSadaf Ebrahimi /* Disabled by default. */ 95*22dc650dSSadaf Ebrahimi #define SLJIT_PROT_EXECUTABLE_ALLOCATOR 0 96*22dc650dSSadaf Ebrahimi #endif 97*22dc650dSSadaf Ebrahimi 98*22dc650dSSadaf Ebrahimi /* When SLJIT_WX_EXECUTABLE_ALLOCATOR is enabled SLJIT uses an 99*22dc650dSSadaf Ebrahimi allocator which does not set writable and executable permission 100*22dc650dSSadaf Ebrahimi flags at the same time. 101*22dc650dSSadaf Ebrahimi Instead, it creates a new independent map on each invocation and 102*22dc650dSSadaf Ebrahimi switches permissions at the underlying pages as needed. 103*22dc650dSSadaf Ebrahimi The trade-off is increased memory use and degraded performance. */ 104*22dc650dSSadaf Ebrahimi #ifndef SLJIT_WX_EXECUTABLE_ALLOCATOR 105*22dc650dSSadaf Ebrahimi /* Disabled by default. */ 106*22dc650dSSadaf Ebrahimi #define SLJIT_WX_EXECUTABLE_ALLOCATOR 0 107*22dc650dSSadaf Ebrahimi #endif 108*22dc650dSSadaf Ebrahimi 109*22dc650dSSadaf Ebrahimi #endif /* !SLJIT_EXECUTABLE_ALLOCATOR */ 110*22dc650dSSadaf Ebrahimi 111*22dc650dSSadaf Ebrahimi /* Return with error when an invalid argument is passed. */ 112*22dc650dSSadaf Ebrahimi #ifndef SLJIT_ARGUMENT_CHECKS 113*22dc650dSSadaf Ebrahimi /* Disabled by default */ 114*22dc650dSSadaf Ebrahimi #define SLJIT_ARGUMENT_CHECKS 0 115*22dc650dSSadaf Ebrahimi #endif 116*22dc650dSSadaf Ebrahimi 117*22dc650dSSadaf Ebrahimi /* Debug checks (assertions, etc.). */ 118*22dc650dSSadaf Ebrahimi #ifndef SLJIT_DEBUG 119*22dc650dSSadaf Ebrahimi /* Enabled by default */ 120*22dc650dSSadaf Ebrahimi #define SLJIT_DEBUG 1 121*22dc650dSSadaf Ebrahimi #endif 122*22dc650dSSadaf Ebrahimi 123*22dc650dSSadaf Ebrahimi /* Verbose operations. */ 124*22dc650dSSadaf Ebrahimi #ifndef SLJIT_VERBOSE 125*22dc650dSSadaf Ebrahimi /* Enabled by default */ 126*22dc650dSSadaf Ebrahimi #define SLJIT_VERBOSE 1 127*22dc650dSSadaf Ebrahimi #endif 128*22dc650dSSadaf Ebrahimi 129*22dc650dSSadaf Ebrahimi /* 130*22dc650dSSadaf Ebrahimi SLJIT_IS_FPU_AVAILABLE 131*22dc650dSSadaf Ebrahimi The availability of the FPU can be controlled by SLJIT_IS_FPU_AVAILABLE. 132*22dc650dSSadaf Ebrahimi zero value - FPU is NOT present. 133*22dc650dSSadaf Ebrahimi nonzero value - FPU is present. 134*22dc650dSSadaf Ebrahimi */ 135*22dc650dSSadaf Ebrahimi 136*22dc650dSSadaf Ebrahimi /* For further configurations, see the beginning of sljitConfigInternal.h */ 137*22dc650dSSadaf Ebrahimi 138*22dc650dSSadaf Ebrahimi #ifdef __cplusplus 139*22dc650dSSadaf Ebrahimi } /* extern "C" */ 140*22dc650dSSadaf Ebrahimi #endif 141*22dc650dSSadaf Ebrahimi 142*22dc650dSSadaf Ebrahimi #endif /* SLJIT_CONFIG_H_ */ 143