diff --git a/CMakeLists.txt b/CMakeLists.txt index 64a25ce..7c3189c 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -32,6 +32,9 @@ if (MIR_JIT) if (MSVC OR WIN32) message(FATAL_ERROR "MIR_JIT is not supported when using MSVC and/or WIN32") endif() + if (NOT (CMAKE_SYSTEM_PROCESSOR MATCHES "(x86)|(X86)|(amd64)|(AMD64)")) + message(FATAL_ERROR "MIR_JIT is only supported on X86-64 platforms") + endif() set(LLVM_JIT OFF) set(OMR_JIT OFF) set(STATIC_BUILD ON) @@ -120,11 +123,11 @@ elseif ((CMAKE_C_COMPILER_ID MATCHES "GNU" OR CMAKE_C_COMPILER_ID MATCHES "Clang # set(SANITIZER_FLAGS "-fsanitize=address") set(LUA_COMPAT_FLAGS "-DLUA_COMPAT_5_2 -DLUA_COMPAT_5_1") set(CMAKE_C_FLAGS "-std=c99 -DNDEBUG -O2 -fomit-frame-pointer -Wall -Wextra -Winline ${LUA_COMPAT_FLAGS} ${OS_FLAGS}") - set(CMAKE_C_FLAGS_DEBUG "${SANITIZER_FLAGS} -fno-omit-frame-pointer -std=c99 -O0 -g3 -Wall -Wextra ${LUA_COMPAT_FLAGS} ${OS_FLAGS}") + set(CMAKE_C_FLAGS_DEBUG "${SANITIZER_FLAGS} -UNDEBUG -fno-omit-frame-pointer -std=c99 -O0 -g3 -Wall -Wextra ${LUA_COMPAT_FLAGS} ${OS_FLAGS}") set(CMAKE_C_FLAGS_RELEASE "-std=c99 -DNDEBUG -O2 -fomit-frame-pointer -Wall -Wextra -Winline ${LUA_COMPAT_FLAGS} ${OS_FLAGS}") set(CMAKE_C_FLAGS_RELWITHDEBINFO "${SANITIZER_FLAGS} -DNDEBUG -std=c99 -O2 -g3 -Wall -Wextra ${LUA_COMPAT_FLAGS} ${OS_FLAGS}") set(CMAKE_CXX_FLAGS "-fno-rtti -O2 -fomit-frame-pointer -Wall -Wno-sign-compare -Winline -std=c++11 -fno-exceptions ${LUA_COMPAT_FLAGS} ${OS_FLAGS}") - set(CMAKE_CXX_FLAGS_DEBUG "${SANITIZER_FLAGS} -fno-omit-frame-pointer -fno-rtti -O0 -g3 -Wall -Wno-sign-compare -std=c++11 -fno-exceptions ${LUA_COMPAT_FLAGS} ${OS_FLAGS}") + set(CMAKE_CXX_FLAGS_DEBUG "${SANITIZER_FLAGS} -UNDEBUG -fno-omit-frame-pointer -fno-rtti -O0 -g3 -Wall -Wno-sign-compare -std=c++11 -fno-exceptions ${LUA_COMPAT_FLAGS} ${OS_FLAGS}") set(CMAKE_CXX_FLAGS_RELEASE "-fno-rtti -DNDEBUG -O2 -fomit-frame-pointer -Wall -Wno-sign-compare -Winline -std=c++11 -fno-exceptions ${LUA_COMPAT_FLAGS} ${OS_FLAGS}") set(CMAKE_CXX_FLAGS_RELWITHDEBINFO "${SANITIZER_FLAGS} -DNDEBUG -fno-rtti -O2 -g3 -Wall -Wno-sign-compare -std=c++11 -fno-exceptions ${LUA_COMPAT_FLAGS} ${OS_FLAGS}") elseif (APPLE) @@ -253,8 +256,40 @@ endif () message(STATUS "GCC_BASE_DIR : " ${GCC_BASE}) message(STATUS "MULTIARCH_TRIPLET : " ${MULTIARCH_TRIPLET}) -set(DMR_C_HEADERS +# Common stuff we need even if we don't use dmrC. +set(DMR_C_HEADERS_COMMON dmr_c/src/allocate.h + dmr_c/src/port.h + dmr_c/src/ptrlist.h + ) + +set(DMR_C_SRCS_COMMON + dmr_c/src/allocate.c + dmr_c/src/ptrlist.c + ) + +set(DMR_C_SRCS_ + dmr_c/src/builtin.c + dmr_c/src/char.c + dmr_c/src/expression.c + dmr_c/src/evaluate.c + dmr_c/src/expand.c + dmr_c/src/inline.c + dmr_c/src/lib.c + dmr_c/src/linearize.c + dmr_c/src/liveness.c + dmr_c/src/parse.c + dmr_c/src/target.c + dmr_c/src/tokenize.c + dmr_c/src/pre-process.c + dmr_c/src/scope.c + dmr_c/src/show-parse.c + dmr_c/src/symbol.c + dmr_c/src/walksymbol.c + src/ravi_dmrc_parsesymbols.c + ) + +set(DMR_C_HEADERS_ dmr_c/src/char.h dmr_c/src/expression.h dmr_c/src/flow.h @@ -262,8 +297,6 @@ set(DMR_C_HEADERS dmr_c/src/linearize.h dmr_c/src/lib.h dmr_c/src/parse.h - dmr_c/src/port.h - dmr_c/src/ptrlist.h dmr_c/src/scope.h dmr_c/src/symbol.h dmr_c/src/target.h @@ -271,7 +304,7 @@ set(DMR_C_HEADERS dmr_c/src/walksymbol.h ) -set(DMR_C_SRCS +set(DMR_C_SRCS_ dmr_c/src/allocate.c dmr_c/src/builtin.c dmr_c/src/char.c @@ -302,6 +335,8 @@ if (LLVM_JIT) dmr_c/llvm-backend/dmr_c.h ) include_directories("${PROJECT_SOURCE_DIR}/dmr_c/llvm-backend") + set(DMR_C_HEADERS ${DMR_C_HEADERS_} ${DMR_C_HEADERS_COMMON}) + set(DMR_C_SRCS ${DMR_C_SRCS_} ${DMR_C_SRCS_COMMON}) elseif (OMR_JIT) set(DMR_C_JIT_SRCS dmr_c/omrjit-backend/sparse-omrjit.c @@ -310,11 +345,11 @@ elseif (OMR_JIT) dmr_c/omrjit-backend/dmr_c.h ) include_directories("${PROJECT_SOURCE_DIR}/dmr_c/omrjit-backend") -else () - set(DMR_C_JIT_HEADERS - dmr_c/null-backend/dmr_c.h - ) - include_directories("${PROJECT_SOURCE_DIR}/dmr_c/null-backend") + set(DMR_C_HEADERS ${DMR_C_HEADERS_} ${DMR_C_HEADERS_COMMON}) + set(DMR_C_SRCS ${DMR_C_SRCS_} ${DMR_C_SRCS_COMMON}) +else() + set(DMR_C_HEADERS ${DMR_C_HEADERS_COMMON}) + set(DMR_C_SRCS ${DMR_C_SRCS_COMMON}) endif () if (MSVC OR APPLE) diff --git a/include/ravi_mirjit.h b/include/ravi_mirjit.h index 5e39019..e752beb 100644 --- a/include/ravi_mirjit.h +++ b/include/ravi_mirjit.h @@ -49,6 +49,7 @@ #ifdef USE_MIRJIT #include "c2mir.h" +#include "mir-gen.h" struct ravi_State { MIR_context_t jit; @@ -62,6 +63,7 @@ struct ravi_State { unsigned int compiling_; /* flag to help avoid recursion */ int min_code_size_; /* min code size for compilation */ int min_exec_count_; /* min execution count for compilation */ + struct c2mir_options options; /* MIR options */ }; #ifdef __cplusplus diff --git a/src/linit.c b/src/linit.c index d5a24f3..18cd455 100644 --- a/src/linit.c +++ b/src/linit.c @@ -55,7 +55,7 @@ static const luaL_Reg loadedlibs[] = { //#ifdef USE_LLVM // {LUA_LLVMLIBNAME, raviopen_llvmluaapi}, //#endif - { "dmrc", raviopen_dmrcluaapi }, +// { "dmrc", raviopen_dmrcluaapi }, #if defined(LUA_COMPAT_BITLIB) {LUA_BITLIBNAME, luaopen_bit32}, #endif diff --git a/src/ravi_mirjit.c b/src/ravi_mirjit.c index 2348920..5f26359 100644 --- a/src/ravi_mirjit.c +++ b/src/ravi_mirjit.c @@ -346,27 +346,23 @@ static void* import_resolver(const char *name) { return NULL; } -/* MIR driver */ -#include "mir-gen.h" - -static size_t curr_char; -static const char *code; -static struct c2mir_options options; +/* FIXME */ +/* For now we have to use some static variables + due to limitations of the MIR api */ +static size_t Current_char; /* position of current character */ +static const char *Source_code; /* points to buffer containing source Source_code */ static int t_getc (void) { - int c = code[curr_char]; + int c = Source_code[Current_char]; if (c == 0) c = EOF; else - curr_char++; + Current_char++; return c; } -static int other_option_func (int i, int argc, char *argv[], void *data) { - return i; -} - +/* Searches within a Module for a function by name */ static MIR_item_t find_function(MIR_module_t module, const char *func_name) { MIR_item_t func, main_func = NULL; for (func = DLIST_HEAD (MIR_item_t, module->items); func != NULL; @@ -377,21 +373,27 @@ static MIR_item_t find_function(MIR_module_t module, const char *func_name) { return main_func; } -void *MIR_compile_C_module(MIR_context_t ctx, const char *inputbuffer, const char *func_name, void *(Import_resolver_func)(const char *name)) +void *MIR_compile_C_module( + struct c2mir_options *options, + MIR_context_t ctx, + const char *inputbuffer, /* Code to be compiled */ + const char *func_name, /* Name of the function, must be unique */ + void *(Import_resolver_func)(const char *name)) /* Resolve external symbols */ { int n = 0; int ret_code = 0; int (*fun_addr) (void *) = NULL; MIR_module_t module = NULL; c2mir_init(ctx); - code = inputbuffer; - curr_char = 0; - options.module_num++; - options.message_file = stderr; - if (!c2mir_compile(ctx, &options, t_getc, func_name, NULL)) { + Source_code = inputbuffer; + Current_char = 0; + options->module_num++; + options->message_file = stderr; + if (!c2mir_compile(ctx, options, t_getc, func_name, NULL)) { ret_code = 1; } else { + /* The module just compiled will be at the end of the list */ module = DLIST_TAIL (MIR_module_t, *MIR_get_module_list (ctx)); } if (ret_code == 0 && !module) { @@ -469,7 +471,7 @@ int raviV_compile(struct lua_State *L, struct Proto *p, ravi_compile_options_t * ravi_writestring(L, buf.buf, strlen(buf.buf)); ravi_writeline(L); } - fp = MIR_compile_C_module(G->ravi_state->jit, buf.buf, fname, import_resolver); + fp = MIR_compile_C_module(&G->ravi_state->options, G->ravi_state->jit, buf.buf, fname, import_resolver); if (!fp) { p->ravi_jit.jit_status = RAVI_JIT_CANT_COMPILE; }