Merge branch 'master' into ravi-distro

ravi-distro
Dibyendu Majumdar 4 years ago
commit cd851e3414

@ -1,9 +1,5 @@
cmake_minimum_required(VERSION 3.10)
project(Ravi VERSION 1.0.4)
enable_language(CXX)
enable_language(C)
enable_testing()
cmake_minimum_required(VERSION 3.12)
project(Ravi VERSION 1.0.4 LANGUAGES C CXX)
# Get access to CMake helpers
set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${CMAKE_SOURCE_DIR}/cmake")
@ -48,28 +44,66 @@ else ()
message(STATUS "DYNAMIC library build enabled")
set(LIBRAVI_BUILD_TYPE SHARED)
endif ()
message(STATUS "Computed goto ${COMPUTED_GOTO}")
if (COMPUTED_GOTO AND MSVC)
message(WARNING "Computed goto is not available with MSVC")
endif ()
include_directories("${PROJECT_SOURCE_DIR}/include")
# define the Lua core source files
set(RAVI_AST_SOURCES src/ravi_ast_parse.c src/ravi_ast_print.c src/ravi_ast_typecheck.c)
set(LUA_CORE_SRCS src/lapi.c src/lcode.c src/lctype.c src/ldebug.c src/ldo.c src/ldump.c
src/lfunc.c src/lgc.c src/llex.c src/lmem.c src/lobject.c src/lopcodes.c
src/lparser.c src/lstate.c src/lstring.c src/ltable.c src/ltm.c src/lundump.c
src/lvm.c src/lzio.c src/ravijit.cpp src/ltests.c src/ravi_profile.c
src/ravi_ast_parse.c src/ravi_ast_print.c src/ravi_ast_typecheck.c src/ravi_membuf.c
src/ravi_jitshared.c src/bit.c src/ravi_alloc.c)
src/lvm.c src/lzio.c src/ravi_jit.c src/ltests.c src/ravi_profile.c
src/ravi_membuf.c src/ravi_jitshared.c src/bit.c src/ravi_alloc.c
${RAVI_AST_SOURCES})
# define the Lua library source files
set(LUA_LIB_SRCS src/lauxlib.c src/lbaselib.c src/lbitlib.c src/lcorolib.c src/ldblib.c src/liolib.c
src/lmathlib.c src/loslib.c src/ltablib.c src/lstrlib.c src/loadlib.c src/linit.c src/lutf8lib.c)
set(LUA_HEADERS include/lua.h include/luaconf.h include/lualib.h include/lauxlib.h)
# LLVM code gen
set(LLVM_JIT_SRCS src/ravi_llvmjit.cpp src/ravi_llvmtypes.cpp
src/ravi_llvmcodegen.cpp src/ravi_llvmforprep.cpp src/ravi_llvmcomp.cpp
src/ravi_llvmreturn.cpp src/ravi_llvmload.cpp src/ravi_llvmforloop.cpp
src/ravi_llvmarith1.cpp src/ravi_llvmcall.cpp src/ravi_llvmtable.cpp
src/ravi_llvmarith2.cpp src/ravi_llvmtforcall.cpp src/ravi_llvmrest.cpp)
# MIR sources
set(MIR_HEADERS mir/mir.h mir/mir-gen.h mir/mir-varr.h mir/mir-dlist.h mir/mir-htab.h
mir/mir-hash.h mir/mir-bitmap.h)
set(MIR_SRCS mir/mir.c mir/mir-gen.c)
set(C2MIR_SRCS mir/c2mir/c2mir.c)
# OMR code gen
set(OMR_JIT_SRCS src/ravi_omrjit.c src/ravi_omrjitapi.c)
# MIR code gen
set(MIR_JIT_SRCS src/ravi_mirjit.c)
set(NO_JIT_SRCS src/ravi_nojit.c)
# 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)
# dmrC Optional sources
set(RAVI_C_SYMBOL_PARSER src/ravi_dmrc_parsesymbols.c)
set(DMR_C_SRCS_OPT 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)
set(DMR_C_HEADERS_OPT dmr_c/src/char.h dmr_c/src/expression.h dmr_c/src/flow.h dmr_c/src/ident-list.h
dmr_c/src/linearize.h dmr_c/src/lib.h dmr_c/src/parse.h dmr_c/src/scope.h dmr_c/src/symbol.h
dmr_c/src/target.h dmr_c/src/token.h dmr_c/src/walksymbol.h)
set(LUA_CMD_SRCS src/lua.c)
file(GLOB RAVI_HEADERS "${PROJECT_SOURCE_DIR}/include/*.h")
if (COMPUTED_GOTO AND NOT MSVC)
if (CMAKE_C_COMPILER_ID MATCHES "Clang")
if (CMAKE_C_COMPILER_ID MATCHES "Clang" OR CMAKE_C_COMPILER_ID MATCHES "AppleClang")
set_source_files_properties(src/lvm.c PROPERTIES COMPILE_FLAGS -DRAVI_USE_COMPUTED_GOTO)
elseif (CMAKE_C_COMPILER_ID MATCHES "GNU")
set_source_files_properties(src/lvm.c PROPERTIES COMPILE_FLAGS "-fno-crossjumping -fno-gcse -DRAVI_USE_COMPUTED_GOTO")
endif ()
endif ()
# define the Lua library source files
set(LUA_LIB_SRCS src/lauxlib.c src/lbaselib.c src/lbitlib.c src/lcorolib.c src/ldblib.c src/liolib.c
src/lmathlib.c src/loslib.c src/ltablib.c src/lstrlib.c src/loadlib.c src/linit.c src/lutf8lib.c)
set(LUA_HEADERS include/lua.h include/luaconf.h include/lualib.h include/lauxlib.h)
set(EMBEDDED_DMRC ON)
if (LLVM_JIT)
find_package(LLVM REQUIRED CONFIG)
message(STATUS "Found LLVM ${LLVM_PACKAGE_VERSION}")
@ -78,11 +112,7 @@ if (LLVM_JIT)
message(STATUS "LLVM Definitions ${LLVM_DEFINITIONS}")
message(STATUS "LLVMJIT enabled")
set(LLVM_JIT_SRCS src/ravi_llvmjit.cpp src/ravi_llvmtypes.cpp
src/ravi_llvmcodegen.cpp src/ravi_llvmforprep.cpp src/ravi_llvmcomp.cpp
src/ravi_llvmreturn.cpp src/ravi_llvmload.cpp src/ravi_llvmforloop.cpp
src/ravi_llvmarith1.cpp src/ravi_llvmcall.cpp src/ravi_llvmtable.cpp
src/ravi_llvmarith2.cpp src/ravi_llvmtforcall.cpp src/ravi_llvmrest.cpp)
set(JIT_SRCS ${LLVM_JIT_SRCS})
if (NOT MSVC)
set_source_files_properties(${LLVM_JIT_SRCS} PROPERTIES
COMPILE_FLAGS "-fno-rtti -fno-exceptions ${LLVM_DEFINITIONS}")
@ -92,93 +122,6 @@ if (LLVM_JIT)
APPEND
PROPERTY INCLUDE_DIRECTORIES ${LLVM_INCLUDE_DIRS}
)
elseif (OMR_JIT)
find_package(OMRJIT REQUIRED)
message(STATUS "OMRJIT enabled")
set(OMR_JIT_SRCS src/ravi_omrjit.c src/ravi_omrjitapi.c)
elseif (MIR_JIT)
include(cmake/mir.cmake)
message(STATUS "MIRJIT enabled")
set(MIR_JIT_SRCS src/ravi_mirjit.c)
else ()
set(NO_JIT_SRCS src/ravi_nojit.c)
endif ()
message(STATUS "Computed goto ${COMPUTED_GOTO}")
if (COMPUTED_GOTO AND MSVC)
message(WARNING "Computed goto is not available with MSVC")
endif ()
file(GLOB RAVI_HEADERS "${PROJECT_SOURCE_DIR}/include/*.h")
# Misc setup
if (MSVC OR APPLE)
source_group("Ravi Headers" FILES ${RAVI_HEADERS})
source_group("Ravi Source Files" FILES ${LUA_CORE_SRCS} ${LUA_LIB_SRCS}
${LLVM_JIT_SRCS})
if (APPLE)
set(EXTRA_LIBRARIES m readline)
endif ()
elseif (NOT WIN32)
# On Linux we need to link libdl to get access to
# functions like dlopen()
# ubsan can be added to get -fsanitize=undefined
set(EXTRA_LIBRARIES m dl readline)
endif ()
# 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
)
# dmrC Optional sources
set(DMR_C_SRCS_OPT
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_OPT
dmr_c/src/char.h
dmr_c/src/expression.h
dmr_c/src/flow.h
dmr_c/src/ident-list.h
dmr_c/src/linearize.h
dmr_c/src/lib.h
dmr_c/src/parse.h
dmr_c/src/scope.h
dmr_c/src/symbol.h
dmr_c/src/target.h
dmr_c/src/token.h
dmr_c/src/walksymbol.h
)
set(EMBEDDED_DMRC ON)
if (LLVM_JIT)
set(DMR_C_JIT_SRCS
dmr_c/llvm-backend/sparse-llvm.c
)
@ -186,19 +129,27 @@ if (LLVM_JIT)
dmr_c/llvm-backend/dmr_c.h
)
set(DMR_C_HEADERS ${DMR_C_HEADERS_OPT} ${DMR_C_HEADERS_COMMON})
set(DMR_C_SRCS ${DMR_C_SRCS_OPT} ${DMR_C_SRCS_COMMON})
set(DMR_C_SRCS ${DMR_C_SRCS_OPT} ${DMR_C_SRCS_COMMON} ${RAVI_C_SYMBOL_PARSER})
set_property(SOURCE ${DMR_C_JIT_SRCS} src/ravi_llvmcodegen.cpp src/ravi_dmrc_parsesymbols.c
set_property(SOURCE ${DMR_C_JIT_SRCS} src/ravi_llvmcodegen.cpp ${RAVI_C_SYMBOL_PARSER}
APPEND
PROPERTY INCLUDE_DIRECTORIES "${PROJECT_SOURCE_DIR}/dmr_c/llvm-backend")
set_property(SOURCE ${DMR_C_SRCS} ${DMR_C_JIT_SRCS} src/ravi_ast_parse.c src/ravi_ast_print.c src/ravi_ast_typecheck.c
set_property(SOURCE ${DMR_C_SRCS} ${DMR_C_JIT_SRCS} ${RAVI_AST_SOURCES}
APPEND
PROPERTY INCLUDE_DIRECTORIES "${PROJECT_SOURCE_DIR}/dmr_c/src")
set_property(
SOURCE src/ravi_dmrc_parsesymbols.c ${DMR_C_JIT_SRCS}
SOURCE ${RAVI_C_SYMBOL_PARSER} ${DMR_C_JIT_SRCS}
APPEND
PROPERTY INCLUDE_DIRECTORIES ${LLVM_INCLUDE_DIRS})
# FIXME get rid of this dependency
set_property(
SOURCE ${LUA_CMD_SRCS}
APPEND
PROPERTY INCLUDE_DIRECTORIES ${LLVM_INCLUDE_DIRS})
elseif (OMR_JIT)
find_package(OMRJIT REQUIRED)
message(STATUS "OMRJIT enabled")
set(JIT_SRCS ${OMR_JIT_SRCS})
set(DMR_C_JIT_SRCS
dmr_c/omrjit-backend/sparse-omrjit.c
)
@ -206,15 +157,15 @@ elseif (OMR_JIT)
dmr_c/omrjit-backend/dmr_c.h
)
set(DMR_C_HEADERS ${DMR_C_HEADERS_OPT} ${DMR_C_HEADERS_COMMON})
set(DMR_C_SRCS ${DMR_C_SRCS_OPT} ${DMR_C_SRCS_COMMON})
set(DMR_C_SRCS ${DMR_C_SRCS_OPT} ${DMR_C_SRCS_COMMON} ${RAVI_C_SYMBOL_PARSER})
set_property(SOURCE ${DMR_C_JIT_SRCS} src/ravi_dmrc_parsesymbols.c ${OMR_JIT_SRCS}
set_property(SOURCE ${DMR_C_JIT_SRCS} ${RAVI_C_SYMBOL_PARSER} ${OMR_JIT_SRCS}
APPEND
PROPERTY INCLUDE_DIRECTORIES "${PROJECT_SOURCE_DIR}/dmr_c/omrjit-backend")
set_property(SOURCE ${DMR_C_SRCS} ${DMR_C_JIT_SRCS} src/ravi_ast_parse.c src/ravi_ast_print.c src/ravi_ast_typecheck.c
set_property(SOURCE ${DMR_C_SRCS} ${DMR_C_JIT_SRCS} ${RAVI_AST_SOURCES}
APPEND
PROPERTY INCLUDE_DIRECTORIES "${PROJECT_SOURCE_DIR}/dmr_c/src")
set_property(SOURCE ${DMR_C_JIT_SRCS} ${OMR_JIT_SRCS} src/ravi_dmrc_parsesymbols.c
set_property(SOURCE ${DMR_C_JIT_SRCS} ${OMR_JIT_SRCS} ${RAVI_C_SYMBOL_PARSER}
APPEND
PROPERTY INCLUDE_DIRECTORIES "${OMRJIT_INCLUDE_DIRS}"
)
@ -224,15 +175,21 @@ else ()
set(DMR_C_SRCS ${DMR_C_SRCS_COMMON})
set(EMBEDDED_DMRC OFF)
set_property(SOURCE ${DMR_C_SRCS_COMMON} src/ravi_ast_parse.c src/ravi_ast_print.c src/ravi_ast_typecheck.c
set_property(SOURCE ${DMR_C_SRCS_COMMON} ${RAVI_AST_SOURCES}
APPEND
PROPERTY INCLUDE_DIRECTORIES "${PROJECT_SOURCE_DIR}/dmr_c/src")
if (MIR_JIT)
message(STATUS "MIRJIT enabled")
set(JIT_SRCS ${MIR_SRCS} ${C2MIR_SRCS} ${MIR_JIT_SRCS})
set_property(SOURCE ${MIR_SRCS} ${C2MIR_SRCS} ${MIR_JIT_SRCS}
APPEND
PROPERTY INCLUDE_DIRECTORIES "${CMAKE_SOURCE_DIR}/mir;${CMAKE_SOURCE_DIR}/mir/c2mir"
)
PROPERTY INCLUDE_DIRECTORIES "${CMAKE_SOURCE_DIR}/mir;${CMAKE_SOURCE_DIR}/mir/c2mir")
set_property(SOURCE ${MIR_SRCS} ${C2MIR_SRCS} ${MIR_JIT_SRCS}
APPEND
PROPERTY COMPILE_DEFINITIONS "x86_64;MIR_IO;MIR_SCAN")
else()
set(JIT_SRCS ${NO_JIT_SRCS})
endif ()
endif ()
@ -253,6 +210,20 @@ endif ()
if (MSVC OR APPLE)
source_group("dmrC Headers" FILES ${DMR_C_HEADERS} ${DMR_C_JIT_HEADERS})
source_group("dmrC Source Files" FILES ${DMR_C_SRCS} ${DMR_C_JIT_SRCS})
source_group("Ravi Headers" FILES ${RAVI_HEADERS})
source_group("Ravi Source Files" FILES ${LUA_CORE_SRCS} ${LUA_LIB_SRCS} ${JIT_SRCS})
endif ()
# Misc setup
if (MSVC OR APPLE)
if (APPLE)
set(EXTRA_LIBRARIES m readline)
endif ()
elseif (NOT WIN32)
# On Linux we need to link libdl to get access to
# functions like dlopen()
# ubsan can be added to get -fsanitize=undefined
set(EXTRA_LIBRARIES m dl readline)
endif ()
# Enable minimal required LLVM components so that the
@ -312,46 +283,22 @@ if (LLVM_JIT)
message(STATUS "LLVM_LIBS ${LLVM_LIBS}")
endif ()
# Name library differently based on JIT backend
if (LLVM_JIT)
set(LIBRAVI_NAME libravillvm)
elseif (OMR_JIT)
set(LIBRAVI_NAME libravilomr)
elseif (MIR_JIT)
set(LIBRAVI_NAME libravi)
else ()
set(LIBRAVI_NAME libravinojit)
endif ()
set(LIBRAVI_NAME libravi)
#Main library
add_library(${LIBRAVI_NAME} ${LIBRAVI_BUILD_TYPE}
${RAVI_HEADERS}
${LUA_LIB_SRCS}
${LUA_CORE_SRCS}
${LLVM_JIT_SRCS}
${OMR_JIT_SRCS}
${MIR_JIT_SRCS}
${NO_JIT_SRCS}
${JIT_SRCS}
${DMR_C_HEADERS}
${DMR_C_SRCS}
${DMR_C_JIT_SRCS}
${MIR_HEADERS}
${MIR_SRCS}
${C2MIR_SRCS}
)
${DMR_C_JIT_SRCS})
target_link_libraries(${LIBRAVI_NAME} ${EXTRA_LIBRARIES} ${LLVM_LIBS} ${OMRJIT_LIBRARIES} ${MIRJIT_LIBRARIES})
# Main Ravi executable
add_executable(ravi src/lua.c)
add_executable(ravi ${LUA_CMD_SRCS})
target_link_libraries(ravi ${LIBRAVI_NAME})
if (LLVM_JIT)
# FIXME get rid of this dependency
set_property(
SOURCE src/lua.c
APPEND
PROPERTY INCLUDE_DIRECTORIES ${LLVM_INCLUDE_DIRS})
endif ()
# Sources that are needed for a static NOJIT basic library
set(NOJIT_RAVI_SRCS
@ -361,7 +308,7 @@ set(NOJIT_RAVI_SRCS
${DMR_C_HEADERS}
${DMR_C_SRCS}
${DMR_C_JIT_SRCS}
src/ravi_nojit.c)
${NO_JIT_SRCS})
set(RAVI_STATICEXEC_TARGET ravi_s)
# We always build a static library without JIT so that
@ -375,7 +322,7 @@ target_link_libraries(libravinojit_static ${EXTRA_LIBRARIES})
# This is sometimes useful in other projects that just need a Lua commandline
# but do not care about the shared library
add_executable(${RAVI_STATICEXEC_TARGET}
src/lua.c)
${LUA_CMD_SRCS})
target_link_libraries(ravi_s libravinojit_static)
if (NOT LTESTS)
@ -460,9 +407,6 @@ add_executable(testravidebug
vscode-debugger/src/protocol.c)
target_link_libraries(testravidebug libravinojit_static)
add_test(TestRaviDebug testravidebug)
configure_file(lua-config.cmake.in lua-config.cmake @ONLY)
if (WIN32)

@ -1,26 +0,0 @@
set(TARGET x86_64)
set(MIR_HEADERS
mir/mir.h
mir/mir-gen.h
mir/mir-varr.h
mir/mir-dlist.h
mir/mir-htab.h
mir/mir-hash.h
mir/mir-bitmap.h
)
set(MIR_SRCS
mir/mir.c
mir/mir-gen.c
)
set(C2MIR_SRCS
mir/c2mir/c2mir.c
)
set_property(SOURCE ${MIR_SRCS} ${C2MIR_SRCS}
APPEND
PROPERTY COMPILE_DEFINITIONS "${TARGET};MIR_IO;MIR_SCAN"
#PROPERTY INCLUDE_DIRECTORIES "${CMAKE_SOURCE_DIR}/mir;${CMAKE_SOURCE_DIR}/mir/c2mir"
)

@ -627,35 +627,17 @@ LUA_API void ravi_writestringerror(lua_State *L, const char *fmt, const char *p)
LUA_API void ravi_set_debugger_data(lua_State *L, void *data);
LUA_API void *ravi_get_debugger_data(lua_State *L);
/*
** Experimental (wip) implementation of new
** parser and code generator
*/
LUA_API int (ravi_build_ast_from_buffer) (lua_State *L, lua_Reader reader, void *dt,
const char *chunkname, const char *mode);
/////////////////////////////////////////////////////////////////////////////
/*
Bunch of useful functions for debugging
*/
struct lua_TValue;
struct Proto;
LUA_API void ravi_dump_value(lua_State *L, const struct lua_TValue *v);
LUA_API void ravi_dump_stack(lua_State *L, const char *s);
LUA_API void ravi_dump_stacktop(lua_State *L, const char *s);
LUA_API void ravi_debug_trace(lua_State *L, int opCode, int pc);
LUA_API void ravi_print_function(const struct Proto *f, int full);
/* Dumps the ravi Bytecode to stdout */
LUA_API void ravi_dump_function(lua_State *L);
/* Returns a table of lines containing Ravi bytecode */
LUA_API int ravi_list_code(lua_State *L);
/* Returns a table with various system limits */
LUA_API int ravi_get_limits(lua_State *L);
/* Following are for debugging purposes only */
LUAI_DDEC int ravi_parser_debug;
LUA_API void ravi_set_debuglevel(int level);
#define RAVI_DEBUG_STACK(p) if ((ravi_parser_debug & 8) != 0) {p;} else {}
#define RAVI_BYTECODE_PROFILING_ENABLED 0

@ -52,7 +52,7 @@ LUAMOD_API int (luaopen_package) (lua_State *L);
/** RAVI change start **/
#define LUA_RAVILIBNAME "ravi"
LUAMOD_API int (raviopen_llvmjit)(lua_State *L);
LUAMOD_API int (raviopen_jit)(lua_State *L);
#define LUA_ASTLIBNAME "ast"
LUAMOD_API int (raviopen_ast_library)(lua_State *L);

@ -162,5 +162,6 @@ LUAI_FUNC void raviV_settable_i(lua_State *L, const TValue *t, TValue *key, StkI
LUAI_FUNC void raviV_op_totype(lua_State *L, TValue *ra, TValue *rb);
LUAI_FUNC int raviV_check_usertype(lua_State *L, TString *name, const TValue *o);
LUAI_FUNC void raviV_op_defer(lua_State *L, TValue *ra);
LUAI_FUNC void raviV_debug_trace(lua_State *L, int opCode, int pc);
#endif

@ -27,6 +27,10 @@
extern "C" {
#endif
/**
* Definition of the API that all JIT backends must implement.
*/
struct lua_State;
struct Proto;
typedef struct ravi_compile_options_t ravi_compile_options_t;
@ -43,7 +47,6 @@ int raviV_compile(struct lua_State *L, struct Proto *p,
/* Compile an array of functions */
int raviV_compile_n(struct lua_State *L, struct Proto *p[], int n,
ravi_compile_options_t *options);
int raviV_iscompiled(struct lua_State *L, struct Proto *p);
/* Free the JIT structures associated with the prototype */
void raviV_freeproto(struct lua_State *L, struct Proto *p);
@ -79,10 +82,6 @@ int raviV_getminexeccount(struct lua_State *L);
/* Enable IR / codegen validations */
void raviV_setvalidation(struct lua_State *L, int enabled);
int raviV_getvalidation(struct lua_State *L);
/* Enable calls to GCSTEP */
void raviV_setgcstep(struct lua_State *L, int value);
int raviV_getgcstep(struct lua_State *L);
/* Enable or disable trace hook */
void raviV_settraceenabled(struct lua_State *L, int enabled);

@ -27,7 +27,7 @@
#ifdef USE_LLVM
#include "ravi_llvm.h"
#include "ravijit.h"
#include "ravi_jit.h"
#include <array>
#include <atomic>
@ -293,9 +293,11 @@ struct LuaLLVMTypes {
llvm::FunctionType *raviH_set_intT;
llvm::FunctionType *raviH_set_floatT;
#if 0
llvm::FunctionType *ravi_dump_valueT;
llvm::FunctionType *ravi_dump_stackT;
llvm::FunctionType *ravi_dump_stacktopT;
#endif
llvm::FunctionType *ravi_debug_traceT;
std::array<llvm::Constant *, 256> kInt;
@ -486,9 +488,6 @@ class RaviJITState {
unsigned int use_dmrc_ : 1;
// Flag to control calls to collect
int gcstep_;
// min code size for compilation
int min_code_size_;
@ -576,8 +575,6 @@ class RaviJITState {
void set_minexeccount(int value) { min_exec_count_ = value > 0 ? value : min_exec_count_; }
int get_validation() const { return validation_; }
void set_validation(bool value) { validation_ = value; }
int get_gcstep() const { return gcstep_; }
void set_gcstep(int value) { gcstep_ = value > 0 ? value : gcstep_; }
bool is_tracehook_enabled() const { return tracehook_enabled_; }
void set_tracehook_enabled(bool value) { tracehook_enabled_ = value; }
void incr_allocated_modules() { allocated_modules_++; }
@ -839,9 +836,12 @@ struct RaviFunctionDef {
llvm::Function *raviH_set_intF;
llvm::Function *raviH_set_floatF;
#if 0
// DEBUG routines
llvm::Function *ravi_dump_valueF;
llvm::Function *ravi_dump_stackF;
llvm::Function *ravi_dump_stacktopF;
#endif
llvm::Function *ravi_debug_traceF;
// standard C functions
@ -1143,8 +1143,10 @@ class RaviCodeGenerator {
void debug_printf4(RaviFunctionDef *def, const char *str, llvm::Value *arg1, llvm::Value *arg2, llvm::Value *arg3,
llvm::Value *arg4);
#if 0
void emit_dump_stack(RaviFunctionDef *def, const char *str);
void emit_dump_stacktop(RaviFunctionDef *def, const char *str);
#endif
bool emit_debug_trace(RaviFunctionDef *def, int opCode, int pc);
// Look for Lua bytecodes that are jump targets and allocate

@ -1820,6 +1820,8 @@ static void new_std_macro (c2m_ctx_t c2m_ctx, const char *id_str) {
}
static void init_macros (c2m_ctx_t c2m_ctx) {
VARR (token_t) * params;
VARR_CREATE (macro_t, macros, 2048);
HTAB_CREATE (macro_t, macro_tab, 2048, macro_hash, macro_eq);
/* Standard macros : */
@ -1827,6 +1829,10 @@ static void init_macros (c2m_ctx_t c2m_ctx) {
new_std_macro (c2m_ctx, "__TIME__");
new_std_macro (c2m_ctx, "__FILE__");
new_std_macro (c2m_ctx, "__LINE__");
VARR_CREATE (token_t, params, 1);
VARR_PUSH (token_t, params, new_id_token (c2m_ctx, no_pos, "$"));
if (!options->pedantic_p)
new_macro (c2m_ctx, new_id_token (c2m_ctx, no_pos, "__has_include"), params, NULL);
}
static macro_t new_macro (c2m_ctx_t c2m_ctx, token_t id, VARR (token_t) * params,
@ -1938,12 +1944,12 @@ static void pre_finish (c2m_ctx_t c2m_ctx) {
free (c2m_ctx->pre_ctx);
}
static void add_include_stream (c2m_ctx_t c2m_ctx, const char *fname) {
static void add_include_stream (c2m_ctx_t c2m_ctx, const char *fname, pos_t err_pos) {
FILE *f;
assert (fname != NULL);
if ((f = fopen (fname, "r")) == NULL) {
if (options->message_file != NULL) fprintf (stderr, "error in opening file %s\n", fname);
if (options->message_file != NULL) error (c2m_ctx, err_pos, "error in opening file %s", fname);
longjmp (c2m_ctx->env, 1); // ???
}
add_stream (c2m_ctx, f, fname, NULL);
@ -2071,8 +2077,10 @@ static void define (c2m_ctx_t c2m_ctx) {
}
} else if (m->replacement == NULL) {
error (c2m_ctx, id->pos, "standard macro %s redefinition", name);
} else if (!params_eq_p (m->params, params) || !replacement_eq_p (m->replacement, repl)) {
error (c2m_ctx, id->pos, "different macro redefinition of %s", name);
} else {
if (!params_eq_p (m->params, params) || !replacement_eq_p (m->replacement, repl))
error (c2m_ctx, id->pos, "different macro redefinition of %s", name);
VARR_DESTROY (token_t, repl);
}
}
@ -2646,9 +2654,24 @@ static void processing (c2m_ctx_t c2m_ctx, int ignore_directive_p);
static struct val eval_expr (c2m_ctx_t c2m_ctx, VARR (token_t) * buffer, token_t if_token);
static const char *get_header_name (c2m_ctx_t c2m_ctx, VARR (token_t) * buffer, pos_t err_pos) {
int i;
transform_to_header (c2m_ctx, buffer);
i = 0;
if (VARR_LENGTH (token_t, buffer) != 0 && VARR_GET (token_t, buffer, 0)->code == ' ') i++;
if (i != VARR_LENGTH (token_t, buffer) - 1
|| (VARR_GET (token_t, buffer, i)->code != T_STR
&& VARR_GET (token_t, buffer, i)->code != T_HEADER)) {
error (c2m_ctx, err_pos, "wrong #include");
return NULL;
}
return get_include_fname (c2m_ctx, VARR_GET (token_t, buffer, i));
}
static void process_directive (c2m_ctx_t c2m_ctx) {
token_t t, t1;
int i, true_p;
int true_p;
VARR (token_t) * temp_buffer;
pos_t pos;
struct macro macro;
@ -2760,24 +2783,16 @@ static void process_directive (c2m_ctx_t c2m_ctx) {
processing (c2m_ctx, TRUE);
no_out_p = FALSE;
move_tokens (temp_buffer, output_buffer);
transform_to_header (c2m_ctx, temp_buffer);
i = 0;
if (VARR_LENGTH (token_t, temp_buffer) != 0
&& VARR_GET (token_t, temp_buffer, 0)->code == ' ')
i++;
if (i != VARR_LENGTH (token_t, temp_buffer) - 1
|| (VARR_GET (token_t, temp_buffer, i)->code != T_STR
&& VARR_GET (token_t, temp_buffer, i)->code != T_HEADER)) {
if ((name = get_header_name (c2m_ctx, temp_buffer, t->pos)) == NULL) {
error (c2m_ctx, t->pos, "wrong #include");
goto ret;
}
name = get_include_fname (c2m_ctx, VARR_GET (token_t, temp_buffer, i));
}
if (VARR_LENGTH (stream_t, streams) >= max_nested_includes + 1) {
error (c2m_ctx, t->pos, "more %d include levels", VARR_LENGTH (stream_t, streams) - 1);
goto ret;
}
add_include_stream (c2m_ctx, name);
add_include_stream (c2m_ctx, name, t->pos);
} else if (strcmp (t->repr, "line") == 0) {
skip_nl (c2m_ctx, NULL, temp_buffer);
unget_next_pptoken (c2m_ctx, new_token (c2m_ctx, t->pos, "", T_EOP, N_IGNORE));
@ -3043,7 +3058,12 @@ static struct val eval_expr (c2m_ctx_t c2m_ctx, VARR (token_t) * expr_buffer, to
VARR_PUSH (token_t, temp_buffer, t);
}
no_out_p = TRUE;
tree = parse_pre_expr (c2m_ctx, temp_buffer);
if (VARR_LENGTH (token_t, temp_buffer) != 0) {
tree = parse_pre_expr (c2m_ctx, temp_buffer);
} else {
error (c2m_ctx, if_token->pos, "empty preprocessor expression");
tree = NULL;
}
no_out_p = FALSE;
VARR_DESTROY (token_t, temp_buffer);
if (tree == NULL) {
@ -3194,6 +3214,30 @@ static struct val eval (c2m_ctx_t c2m_ctx, node_t tree) {
return res;
}
static macro_call_t try_param_macro_call (c2m_ctx_t c2m_ctx, macro_t m, token_t macro_id) {
macro_call_t mc;
token_t t1 = get_next_pptoken (c2m_ctx), t2 = NULL;
if (t1->code == T_EOR) {
pop_macro_call (c2m_ctx);
t1 = get_next_pptoken (c2m_ctx);
}
if (t1->code == ' ' || t1->code == '\n') {
t2 = t1;
t1 = get_next_pptoken (c2m_ctx);
}
if (t1->code != '(') { /* no args: it is not a macro call */
unget_next_pptoken (c2m_ctx, t1);
if (t2 != NULL) unget_next_pptoken (c2m_ctx, t2);
out_token (c2m_ctx, macro_id);
return NULL;
}
mc = new_macro_call (m, macro_id->pos);
find_args (c2m_ctx, mc);
VARR_PUSH (macro_call_t, macro_call_stack, mc);
return mc;
}
static void processing (c2m_ctx_t c2m_ctx, int ignore_directive_p) {
token_t t, t1, t2;
struct macro macro_struct;
@ -3282,6 +3326,31 @@ static void processing (c2m_ctx_t c2m_ctx, int ignore_directive_p) {
t = new_node_token (c2m_ctx, t->pos, time_str_repr, T_STR,
new_str_node (c2m_ctx, N_STR, uniq_cstr (c2m_ctx, time_str), t->pos));
out_token (c2m_ctx, t);
} else if (strcmp (t->repr, "__has_include") == 0) {
int res;
VARR (token_t) * arg;
const char *name;
FILE *f;
if ((mc = try_param_macro_call (c2m_ctx, m, t)) != NULL) {
unget_next_pptoken (c2m_ctx, new_token (c2m_ctx, t->pos, "", T_EOR, N_IGNORE));
if (VARR_LENGTH (token_arr_t, mc->args) != 1) {
res = 0;
} else {
arg = VARR_LAST (token_arr_t, mc->args);
if ((name = get_header_name (c2m_ctx, arg, t->pos)) != NULL) {
res = ((f = fopen (name, "r")) != NULL && !fclose (f)) ? 1 : 0;
} else {
error (c2m_ctx, t->pos, "wrong arg of predefined __has_include");
res = 0;
}
}
m->ignore_p = TRUE;
unget_next_pptoken (c2m_ctx,
new_node_token (c2m_ctx, t->pos,
uniq_cstr (c2m_ctx, res ? "1" : "0").s, T_NUMBER,
new_i_node (c2m_ctx, res, t->pos)));
}
} else {
assert (FALSE);
}
@ -3302,26 +3371,7 @@ static void processing (c2m_ctx_t c2m_ctx, int ignore_directive_p) {
copy_and_push_back (c2m_ctx, do_concat (c2m_ctx, mc->repl_buffer), mc->pos);
m->ignore_p = TRUE;
VARR_PUSH (macro_call_t, macro_call_stack, mc);
} else { /* macro with parameters */
t2 = NULL;
t1 = get_next_pptoken (c2m_ctx);
if (t1->code == T_EOR) {
pop_macro_call (c2m_ctx);
t1 = get_next_pptoken (c2m_ctx);
}
if (t1->code == ' ' || t1->code == '\n') {
t2 = t1;
t1 = get_next_pptoken (c2m_ctx);
}
if (t1->code != '(') { /* no args: it is not a macro call */
unget_next_pptoken (c2m_ctx, t1);
if (t2 != NULL) unget_next_pptoken (c2m_ctx, t2);
out_token (c2m_ctx, t);
continue;
}
mc = new_macro_call (m, t->pos);
find_args (c2m_ctx, mc);
VARR_PUSH (macro_call_t, macro_call_stack, mc);
} else if ((mc = try_param_macro_call (c2m_ctx, m, t)) != NULL) { /* macro with parameters */
process_replacement (c2m_ctx, mc);
}
}
@ -9293,6 +9343,8 @@ static void emit_insn_opt (MIR_context_t ctx, MIR_insn_t insn) {
MIR_insn_op_mode (ctx, tail, 0, &out_p);
if (out_p) {
tail->ops[0] = insn->ops[0];
MIR_append_insn (ctx, curr_func, insn);
MIR_remove_insn (ctx, curr_func, insn);
return;
}
}
@ -12015,6 +12067,7 @@ static void print_node (MIR_context_t ctx, FILE *f, node_t n, int indent, int at
static void init_include_dirs (MIR_context_t ctx) {
c2m_ctx_t c2m_ctx = *c2m_ctx_loc (ctx);
const char *str;
int added_p = FALSE;
VARR_CREATE (char_ptr_t, headers, 0);
VARR_CREATE (char_ptr_t, system_headers, 0);
@ -12038,14 +12091,22 @@ static void init_include_dirs (MIR_context_t ctx) {
}
#if defined(__APPLE__) || defined(__unix__)
VARR_PUSH (char_ptr_t, system_headers, "/usr/local/include");
#endif
#ifdef ADDITIONAL_INCLUDE_PATH
if (ADDITIONAL_INCLUDE_PATH[0] != 0) {
added_p = TRUE;
VARR_PUSH (char_ptr_t, system_headers, ADDITIONAL_INCLUDE_PATH);
}
#endif
#if defined(__APPLE__)
VARR_PUSH (char_ptr_t, system_headers,
"/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/"
"MacOSX.sdk/usr/include");
if (!added_p)
VARR_PUSH (char_ptr_t, system_headers,
"/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include");
#endif
#if defined(__linux__) && defined(__x86_64__)
VARR_PUSH (char_ptr_t, system_headers, "/usr/include/x86_64-linux-gnu");
#endif
#if defined(__APPLE__) || defined(__unix__)
VARR_PUSH (char_ptr_t, system_headers, "/usr/include");
#endif
VARR_PUSH (char_ptr_t, system_headers, NULL);

@ -579,6 +579,10 @@ static void delete_bb (MIR_context_t ctx, bb_t bb) {
delete_edge (e);
}
DLIST_REMOVE (bb_t, curr_cfg->bbs, bb);
bitmap_destroy (bb->in);
bitmap_destroy (bb->out);
bitmap_destroy (bb->gen);
bitmap_destroy (bb->kill);
free (bb);
}
@ -696,6 +700,18 @@ static void build_loop_tree (MIR_context_t ctx) {
}
}
static void destroy_loop_tree (MIR_context_t ctx, loop_node_t root) {
struct gen_ctx *gen_ctx = *gen_ctx_loc (ctx);
loop_node_t node, next;
if (root->bb == NULL)
for (node = DLIST_HEAD (loop_node_t, root->children); node != NULL; node = next) {
next = DLIST_NEXT (loop_node_t, node);
destroy_loop_tree (ctx, node);
}
free (root);
}
static void update_min_max_reg (MIR_context_t ctx, MIR_reg_t reg) {
struct gen_ctx *gen_ctx = *gen_ctx_loc (ctx);
@ -976,10 +992,6 @@ static void destroy_func_cfg (MIR_context_t ctx) {
}
for (bb = DLIST_HEAD (bb_t, curr_cfg->bbs); bb != NULL; bb = next_bb) {
next_bb = DLIST_NEXT (bb_t, bb);
bitmap_destroy (bb->in);
bitmap_destroy (bb->out);
bitmap_destroy (bb->gen);
bitmap_destroy (bb->kill);
delete_bb (ctx, bb);
}
for (mv = DLIST_HEAD (mv_t, curr_cfg->used_moves); mv != NULL; mv = next_mv) {
@ -3933,7 +3945,7 @@ static int combine_substitute (MIR_context_t ctx, bb_insn_t bb_insn) {
if (!hreg_refs_addr[hr].def_p) continue;
gen_assert (!hreg_refs_addr[hr].del_p);
def_insn = hreg_refs_addr[hr].insn;
if (obsolete_op_p (ctx, def_insn->ops[1], hreg_refs_addr[hr].insn_num))
if (def_insn->nops > 1 && obsolete_op_p (ctx, def_insn->ops[1], hreg_refs_addr[hr].insn_num))
continue; /* hr0 = ... hr1 ...; ...; hr1 = ...; ...; insn */
insn_hr_change_p = FALSE;
for (i = 0; i < nops; i++) { /* Change all hr occurences: */
@ -4593,6 +4605,7 @@ void *MIR_gen (MIR_context_t ctx, MIR_item_t func_item) {
#endif
_MIR_redirect_thunk (ctx, func_item->addr, func_item->u.func->call_addr);
destroy_func_live_ranges (ctx);
destroy_loop_tree (ctx, curr_cfg->root_loop_node);
destroy_func_cfg (ctx);
#if MIR_GEN_DEBUG
if (debug_file != NULL)

@ -841,7 +841,7 @@ static code_t call_insn_execute (MIR_context_t ctx, code_t pc, MIR_val_t *bp, co
static void OPTIMIZE eval (MIR_context_t ctx, func_desc_t func_desc, MIR_val_t *bp,
MIR_val_t *results) {
struct interp_ctx *interp_ctx = ctx->interp_ctx;
code_t pc, ops, code = func_desc->code;
code_t pc, ops, code;
#if MIR_INTERP_TRACE
MIR_full_insn_code_t trace_insn_code;
@ -927,6 +927,7 @@ static void OPTIMIZE eval (MIR_context_t ctx, func_desc_t func_desc, MIR_val_t *
END_INSN; \
}
code = func_desc->code;
pc = code;
#if DIRECT_THREADED_DISPATCH

@ -141,7 +141,7 @@ struct insn_desc {
unsigned op_modes[4];
};
#define OUTPUT_FLAG (1 << 31)
#define OUTPUT_FLAG (1 << 30)
static const struct insn_desc insn_descs[] = {
{MIR_MOV, "mov", {MIR_OP_INT | OUTPUT_FLAG, MIR_OP_INT, MIR_OP_BOUND}},
@ -631,8 +631,87 @@ MIR_context_t MIR_init (void) {
return ctx;
}
void MIR_remove_insn (MIR_context_t ctx, MIR_item_t func_item, MIR_insn_t insn) {
mir_assert (func_item != NULL);
if (func_item->item_type != MIR_func_item)
(*error_func) (MIR_wrong_param_value_error, "MIR_remove_insn: wrong func item");
DLIST_REMOVE (MIR_insn_t, func_item->u.func->insns, insn);
free (insn);
}
static void remove_func_insns (MIR_context_t ctx, MIR_item_t func_item,
DLIST (MIR_insn_t) * insns) {
MIR_insn_t insn;
mir_assert (func_item->item_type == MIR_func_item);
while ((insn = DLIST_HEAD (MIR_insn_t, *insns)) != NULL) {
MIR_remove_insn (ctx, func_item, insn);
}
}
static void remove_item (MIR_context_t ctx, MIR_item_t item) {
MIR_module_t module = item->module;
switch (item->item_type) {
case MIR_func_item:
remove_func_insns (ctx, item, &item->u.func->insns);
remove_func_insns (ctx, item, &item->u.func->original_insns);
VARR_DESTROY (MIR_var_t, item->u.func->vars);
free (item->u.func);
break;
case MIR_proto_item:
VARR_DESTROY (MIR_var_t, item->u.proto->args);
free (item->u.proto);
break;
case MIR_import_item:
case MIR_export_item:
case MIR_forward_item: break;
case MIR_data_item:
if (item->addr != NULL && item->section_head_p) free (item->addr);
free (item->u.data);
break;
case MIR_ref_data_item:
if (item->addr != NULL && item->section_head_p) free (item->addr);
free (item->u.ref_data);
break;
case MIR_expr_data_item:
if (item->addr != NULL && item->section_head_p) free (item->addr);
free (item->u.expr_data);
break;
case MIR_bss_item:
if (item->addr != NULL && item->section_head_p) free (item->addr);
free (item->u.bss);
break;
default: mir_assert (FALSE);
}
if (item->data != NULL) free (item->data);
free (item);
}
static void remove_module (MIR_context_t ctx, MIR_module_t module, int free_module_p) {
MIR_item_t item;
while ((item = DLIST_HEAD (MIR_item_t, module->items)) != NULL) {
DLIST_REMOVE (MIR_item_t, module->items, item);
remove_item (ctx, item);
}
if (module->data != NULL) free (module->data);
if (free_module_p) free (module);
}
static void remove_all_modules (MIR_context_t ctx) {
MIR_module_t module;
while ((module = DLIST_HEAD (MIR_module_t, all_modules)) != NULL) {
DLIST_REMOVE (MIR_module_t, all_modules, module);
remove_module (ctx, module, TRUE);
}
remove_module (ctx, &environment_module, FALSE);
}
void MIR_finish (MIR_context_t ctx) {
interp_finish (ctx);
remove_all_modules (ctx);
HTAB_DESTROY (MIR_item_t, module_item_tab);
VARR_DESTROY (MIR_module_t, modules_to_link);
#if !MIR_NO_SCAN
@ -811,6 +890,7 @@ static MIR_item_t create_item (MIR_context_t ctx, MIR_item_type_t item_type,
item->item_type = item_type;
item->ref_def = NULL;
item->export_p = FALSE;
item->section_head_p = FALSE;
item->addr = NULL;
return item;
}
@ -1372,6 +1452,7 @@ static MIR_item_t load_bss_data_section (MIR_context_t ctx, MIR_item_t item, int
(*error_func) (MIR_alloc_error, "Not enough memory to allocate data/bss %s",
name == NULL ? "" : name);
}
item->section_head_p = TRUE;
}
/* Set up section memory: */
for (last_item = item, curr_item = item, addr = item->addr;
@ -1983,14 +2064,6 @@ void MIR_insert_insn_before (MIR_context_t ctx, MIR_item_t func_item, MIR_insn_t
DLIST_INSERT_BEFORE (MIR_insn_t, func_item->u.func->insns, before, insn);
}
void MIR_remove_insn (MIR_context_t ctx, MIR_item_t func_item, MIR_insn_t insn) {
mir_assert (func_item != NULL);
if (func_item->item_type != MIR_func_item)
(*error_func) (MIR_wrong_param_value_error, "MIR_remove_insn: wrong func item");
DLIST_REMOVE (MIR_insn_t, func_item->u.func->insns, insn);
free (insn);
}
static void store_labels_for_duplication (MIR_context_t ctx, MIR_insn_t insn, MIR_insn_t new_insn) {
if (MIR_branch_code_p (insn->code) || insn->code == MIR_SWITCH) {
VARR_PUSH (MIR_insn_t, temp_insns2, new_insn);

@ -337,6 +337,8 @@ struct MIR_item {
item, imported definition or proto object */
void *addr;
char export_p; /* true for export items (only func items) */
/* defined for data-bss after loading. True if it is a start of allocated section */
char section_head_p;
union {
MIR_func_t func;
MIR_proto_t proto;

@ -13,10 +13,35 @@ The following Lua sources have been enhanced for Ravi.
* ltable.c - enhancements for Ravi array types
* lapi.c - enhancements for Ravi array types
The new Ravi Parser and Code Generator implementation is in:
* ravi_ast_parse.c - contains the parser that builds AST
* ravi_ast_print.c - contains utilities for printing out the AST
* ravi_ast_typecheck.c - contains the type checking phase of the parser
Ravi also uses Doug Lea's malloc implementation. The implementation is in:
* ravi_alloc.c - Doug Lea's malloc implementation, adapted for Ravi.
## JIT Implementations
* ravi_jit.c - Ravi JIT API definition
Some backends use C as the intermediate language. The common C code generator is in:
* ravi_jitshared.c - this is the C code generator for a given Ravi / Lua function
The MIR JIT implementation is in:
* ravi_mirjit.c - defines the driver functions. The MIR backend has its own C preprocessor, parser and code generator.
The OMR JIT driver is in:
* ravi_omrjit.c - defines the driver functions. The OMR JIT backend uses the dmrC project as the C preprocessor, parser and code generator.
The LLVM JIT implementation is in following sources:
* ravijit.cpp - basic LLVM infrastructure and Ravi API definition
* ravi_llvmtypes.cpp - contains LLVM type definitions for Lua objects
* ravi_llvmtypes.cpp - contains LLVM type definitions for Lua objects
* ravi_llvmcodegen.cpp - LLVM JIT compiler - main driver for compiling Lua bytecodes into LLVM IR
* ravi_llvmload.cpp - implements OP_LOADK and OP_MOVE, and related operations, also OP_LOADBOOL
* ravi_llvmcomp.cpp - implements OP_EQ, OP_LT, OP_LE, OP_TEST and OP_TESTSET.
@ -29,26 +54,5 @@ The LLVM JIT implementation is in following sources:
* ravi_llvmcall.cpp - implements OP_CALL, OP_JMP
* ravi_llvmtable.cpp - implements OP_GETTABLE, OP_SETTABLE and various other table operations, OP_SELF, and also upvalue operations
* ravi_llvmrest.cpp - OP_CLOSURE, OP_VARARG, OP_CONCAT
* ravi_llvmjit.cpp - Main classes that manage JIT at runtime
Apart from LLVM backend, we also have MIR and OMR JIT backends.
These backends use C as the intermediate language. The common C code generator is in:
* ravi_jitshared.c - this is the C code generator for a given Ravi / Lua function
The MIR JIT implementation is in:
* ravi_mirjit.c - defines the driver functions. The MIR backend has its own C preprocessor, parser and code generator.
The OMR JIT driver is in:
* ravi_omrjit.c - defines the driver functions. The OMR JIT backend uses the dmrC project as the C preprocessor, parser and code generator.
The new Ravi Parser and Code Generator implementation is in:
* ravi_ast_parse.c - contains the parser that builds AST
* ravi_ast_print.c - contains utilities for printing out the AST
* ravi_ast_typecheck.c - contains the type checking phase of the parser
Ravi also uses Doug Lea's malloc implementation. The implementation is in:
* ravi_alloc.c - Doug Lea's malloc implementation, adapted for Ravi.

@ -37,7 +37,7 @@
#include "lundump.h"
#include "lvm.h"
#include "lzio.h"
#include "ravijit.h"
#include "ravi_jit.h"
#include "ravi_jitshared.h"

@ -27,7 +27,7 @@
#include "lobject.h"
#include "lstate.h"
#include "ravijit.h"
#include "ravi_jit.h"
CClosure *luaF_newCclosure (lua_State *L, int n) {
GCObject *o = luaC_newobj(L, LUA_TCCL, sizeCclosure(n));

@ -51,7 +51,7 @@ static const luaL_Reg loadedlibs[] = {
{LUA_MATHLIBNAME, luaopen_math},
{LUA_UTF8LIBNAME, luaopen_utf8},
{LUA_DBLIBNAME, luaopen_debug},
{LUA_RAVILIBNAME, raviopen_llvmjit},
{LUA_RAVILIBNAME, raviopen_jit},
#if USE_DMR_C
{ "dmrc", raviopen_dmrcluaapi },
#endif

@ -26,6 +26,7 @@
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
#include <ravi_membuf.h>
/* ORDER OP */
@ -254,7 +255,7 @@ LUAI_DDEF const lu_byte luaP_opmodes[NUM_OPCODES] = {
,opmode(0, 1, OpArgN, OpArgN, iABC) /* OP_RAVI_TOTAB A R(A) := check_table(R(A)) */
,opmode(0, 1, OpArgN, OpArgN, iABC) /* OP_RAVI_TOSTRING */
,opmode(0, 1, OpArgN, OpArgN, iABC) /* OP_RAVI_TOCLOSURE */
,opmode(0, 1, OpArgK, OpArgN, iABx) /* OP_RAVI_TOTYPE */
,opmode(0, 1, OpArgK, OpArgN, iABx) /* OP_RAVI_TOTYPE */
,opmode(0, 1, OpArgR, OpArgN, iABC) /* OP_RAVI_MOVEI A B R(A) := tointeger(R(B)) */
,opmode(0, 1, OpArgR, OpArgN, iABC) /* OP_RAVI_MOVEF A B R(A) := tonumber(R(B)) */
@ -349,66 +350,66 @@ const char* raviP_instruction_to_str(char *buf, size_t n, Instruction i) {
return buf;
}
static void PrintString(const TString* ts)
static void PrintString(membuff_t *mb, const TString* ts)
{
const char* s=getstr(ts);
size_t i,n=tsslen(ts);
printf("%c",'"');
membuff_add_fstring(mb, "%c",'"');
for (i=0; i<n; i++)
{
int c=(int)(unsigned char)s[i];
switch (c)
{
case '"': printf("\\\""); break;
case '\\': printf("\\\\"); break;
case '\a': printf("\\a"); break;
case '\b': printf("\\b"); break;
case '\f': printf("\\f"); break;
case '\n': printf("\\n"); break;
case '\r': printf("\\r"); break;
case '\t': printf("\\t"); break;
case '\v': printf("\\v"); break;
case '"': membuff_add_string(mb, "\\\""); break;
case '\\': membuff_add_string(mb, "\\\\"); break;
case '\a': membuff_add_string(mb, "\\a"); break;
case '\b': membuff_add_string(mb, "\\b"); break;
case '\f': membuff_add_string(mb, "\\f"); break;
case '\n': membuff_add_string(mb, "\\n"); break;
case '\r': membuff_add_string(mb, "\\r"); break;
case '\t': membuff_add_string(mb, "\\t"); break;
case '\v': membuff_add_string(mb, "\\v"); break;
default: if (isprint(c))
printf("%c",c);
membuff_add_fstring(mb, "%c",c);
else
printf("\\%03d",c);
membuff_add_fstring(mb, "\\%03d",c);
}
}
printf("%c",'"');
membuff_add_fstring(mb, "%c",'"');
}
static void PrintConstant(const Proto* f, int i)
static void PrintConstant(membuff_t *mb, const Proto* f, int i)
{
const TValue* o=&f->k[i];
switch (ttype(o))
{
case LUA_TNIL:
printf("nil");
membuff_add_fstring(mb, "nil");
break;
case LUA_TBOOLEAN:
printf(bvalue(o) ? "true" : "false");
membuff_add_fstring(mb, bvalue(o) ? "true" : "false");
break;
case LUA_TNUMFLT:
{
char buff[100];
sprintf(buff,LUA_NUMBER_FMT,fltvalue(o));
printf("%s",buff);
if (buff[strspn(buff,"-0123456789")]=='\0') printf(".0");
membuff_add_fstring(mb, "%s",buff);
if (buff[strspn(buff,"-0123456789")]=='\0') membuff_add_string(mb, ".0");
break;
}
case LUA_TNUMINT:
printf(LUA_INTEGER_FMT,ivalue(o));
membuff_add_fstring(mb, LUA_INTEGER_FMT,ivalue(o));
break;
case LUA_TSHRSTR: case LUA_TLNGSTR:
PrintString(tsvalue(o));
PrintString(mb, tsvalue(o));
break;
default: /* cannot happen */
printf("? type=%d",ttype(o));
membuff_add_fstring(mb, "? type=%d",ttype(o));
break;
}
}
static void PrintCode(const Proto* f)
static void PrintCode(membuff_t *mb, const Proto* f)
{
const Instruction* code=f->code;
int pc,n=f->sizecode;
@ -423,32 +424,32 @@ static void PrintCode(const Proto* f)
int bx=GETARG_Bx(i);
int sbx=GETARG_sBx(i);
int line=getfuncline(f,pc);
printf("\t%d\t",pc+1);
if (line>0) printf("[%d]\t",line); else printf("[-]\t");
printf("%-9s\t",luaP_opnames[o]);
membuff_add_fstring(mb, "\t%d\t",pc+1);
if (line>0) membuff_add_fstring(mb, "[%d]\t",line); else membuff_add_fstring(mb, "[-]\t");
membuff_add_fstring(mb, "%-9s\t",luaP_opnames[o]);
switch (getOpMode(o))
{
case iABC:
printf("%d",a);
if (getBMode(o)!=OpArgN) printf(" %d", (getBMode(o) == OpArgK && ISK(b)) ? (MYK(INDEXK(b))) : b);
if (getCMode(o)!=OpArgN) printf(" %d", (getCMode(o) == OpArgK && ISK(c)) ? (MYK(INDEXK(c))) : c);
membuff_add_fstring(mb, "%d",a);
if (getBMode(o)!=OpArgN) membuff_add_fstring(mb, " %d", (getBMode(o) == OpArgK && ISK(b)) ? (MYK(INDEXK(b))) : b);
if (getCMode(o)!=OpArgN) membuff_add_fstring(mb, " %d", (getCMode(o) == OpArgK && ISK(c)) ? (MYK(INDEXK(c))) : c);
break;
case iABx:
printf("%d",a);
if (getBMode(o)==OpArgK) printf(" %d",MYK(bx));
if (getBMode(o)==OpArgU) printf(" %d",bx);
membuff_add_fstring(mb, "%d",a);
if (getBMode(o)==OpArgK) membuff_add_fstring(mb, " %d",MYK(bx));
if (getBMode(o)==OpArgU) membuff_add_fstring(mb, " %d",bx);
break;
case iAsBx:
printf("%d %d",a,sbx);
membuff_add_fstring(mb, "%d %d",a,sbx);
break;
case iAx:
printf("%d",MYK(ax));
membuff_add_fstring(mb, "%d",MYK(ax));
break;
}
switch (o)
{
case OP_LOADK:
printf("\t; "); PrintConstant(f,bx);
membuff_add_fstring(mb, "\t; "); PrintConstant(mb, f,bx);
break;
case OP_GETUPVAL:
case OP_RAVI_SETUPVALI:
@ -457,17 +458,17 @@ static void PrintCode(const Proto* f)
case OP_RAVI_SETUPVAL_FARRAY:
case OP_RAVI_SETUPVALT:
case OP_SETUPVAL:
printf("\t; %s",UPVALNAME(b));
membuff_add_fstring(mb, "\t; %s",UPVALNAME(b));
break;
case OP_RAVI_GETTABUP_SK:
case OP_GETTABUP:
printf("\t; %s",UPVALNAME(b));
if (ISK(c)) { printf(" "); PrintConstant(f,INDEXK(c)); }
membuff_add_fstring(mb, "\t; %s",UPVALNAME(b));
if (ISK(c)) { membuff_add_string(mb, " "); PrintConstant(mb, f,INDEXK(c)); }
break;
case OP_SETTABUP:
printf("\t; %s",UPVALNAME(a));
if (ISK(b)) { printf(" "); PrintConstant(f,INDEXK(b)); }
if (ISK(c)) { printf(" "); PrintConstant(f,INDEXK(c)); }
membuff_add_fstring(mb, "\t; %s",UPVALNAME(a));
if (ISK(b)) { membuff_add_string(mb, " "); PrintConstant(mb, f,INDEXK(b)); }
if (ISK(c)) { membuff_add_string(mb, " "); PrintConstant(mb, f,INDEXK(c)); }
break;
case OP_GETTABLE:
case OP_RAVI_GETI:
@ -478,7 +479,7 @@ static void PrintCode(const Proto* f)
case OP_RAVI_GETFIELD:
case OP_RAVI_TABLE_SELF_SK:
case OP_RAVI_SELF_SK:
if (ISK(c)) { printf("\t; "); PrintConstant(f,INDEXK(c)); }
if (ISK(c)) { membuff_add_fstring(mb, "\t; "); PrintConstant(mb, f,INDEXK(c)); }
break;
case OP_SETTABLE:
case OP_RAVI_SETI:
@ -529,10 +530,10 @@ static void PrintCode(const Proto* f)
case OP_RAVI_LE_FF:
if (ISK(b) || ISK(c))
{
printf("\t; ");
if (ISK(b)) PrintConstant(f,INDEXK(b)); else printf("-");
printf(" ");
if (ISK(c)) PrintConstant(f,INDEXK(c)); else printf("-");
membuff_add_fstring(mb, "\t; ");
if (ISK(b)) PrintConstant(mb, f,INDEXK(b)); else membuff_add_fstring(mb, "-");
membuff_add_string(mb, " ");
if (ISK(c)) PrintConstant(mb, f,INDEXK(c)); else membuff_add_fstring(mb, "-");
}
break;
case OP_JMP:
@ -543,28 +544,28 @@ static void PrintCode(const Proto* f)
case OP_RAVI_FORPREP_IP:
case OP_RAVI_FORPREP_I1:
case OP_TFORLOOP:
printf("\t; to %d",sbx+pc+2);
membuff_add_fstring(mb, "\t; to %d",sbx+pc+2);
break;
case OP_CLOSURE:
printf("\t; %p",VOID(f->p[bx]));
membuff_add_fstring(mb, "\t; %p",VOID(f->p[bx]));
break;
case OP_SETLIST:
if (c==0) printf("\t; %d",(int)code[++pc]); else printf("\t; %d",c);
if (c==0) membuff_add_fstring(mb, "\t; %d",(int)code[++pc]); else membuff_add_fstring(mb, "\t; %d",c);
break;
case OP_EXTRAARG:
printf("\t; "); PrintConstant(f,ax);
membuff_add_fstring(mb, "\t; "); PrintConstant(mb, f,ax);
break;
default:
break;
}
printf("\n");
membuff_add_fstring(mb, "\n");
}
}
#define SS(x) ((x==1)?"":"s")
#define S(x) (int)(x),SS(x)
static void PrintHeader(const Proto* f)
static void PrintHeader(membuff_t *mb, const Proto* f)
{
const char* s=f->source ? getstr(f->source) : "=?";
if (*s=='@' || *s=='=')
@ -573,51 +574,51 @@ static void PrintHeader(const Proto* f)
s="(bstring)";
else
s="(string)";
printf("\n%s <%s:%d,%d> (%d instruction%s at %p)\n",
membuff_add_fstring(mb, "\n%s <%s:%d,%d> (%d instruction%s at %p)\n",
(f->linedefined==0)?"main":"function",s,
f->linedefined,f->lastlinedefined,
S(f->sizecode),VOID(f));
printf("%d%s param%s, %d slot%s, %d upvalue%s, ",
membuff_add_fstring(mb, "%d%s param%s, %d slot%s, %d upvalue%s, ",
(int)(f->numparams),f->is_vararg?"+":"",SS(f->numparams),
S(f->maxstacksize),S(f->sizeupvalues));
printf("%d local%s, %d constant%s, %d function%s\n",
membuff_add_fstring(mb, "%d local%s, %d constant%s, %d function%s\n",
S(f->sizelocvars),S(f->sizek),S(f->sizep));
}
static void PrintDebug(const Proto* f)
static void PrintDebug(membuff_t *mb, const Proto* f)
{
int i,n;
n=f->sizek;
printf("constants (%d) for %p:\n",n,VOID(f));
membuff_add_fstring(mb, "constants (%d) for %p:\n",n,VOID(f));
for (i=0; i<n; i++)
{
printf("\t%d\t",i+1);
PrintConstant(f,i);
printf("\n");
membuff_add_fstring(mb, "\t%d\t",i+1);
PrintConstant(mb, f,i);
membuff_add_fstring(mb, "\n");
}
n=f->sizelocvars;
printf("locals (%d) for %p:\n",n,VOID(f));
membuff_add_fstring(mb, "locals (%d) for %p:\n",n,VOID(f));
for (i=0; i<n; i++)
{
printf("\t%d\t%s\t%d\t%d\n",
membuff_add_fstring(mb, "\t%d\t%s\t%d\t%d\n",
i,getstr(f->locvars[i].varname),f->locvars[i].startpc+1,f->locvars[i].endpc+1);
}
n=f->sizeupvalues;
printf("upvalues (%d) for %p:\n",n,VOID(f));
membuff_add_fstring(mb, "upvalues (%d) for %p:\n",n,VOID(f));
for (i=0; i<n; i++)
{
printf("\t%d\t%s\t%d\t%d\n",
membuff_add_fstring(mb, "\t%d\t%s\t%d\t%d\n",
i,UPVALNAME(i),f->upvalues[i].instack,f->upvalues[i].idx);
}
}
void ravi_print_function(const Proto* f, int full)
static void ravi_print_function(membuff_t *mb, const Proto* f, int full)
{
int i, n = f->sizep;
PrintHeader(f);
PrintCode(f);
if (full) PrintDebug(f);
for (i = 0; i<n; i++) ravi_print_function(f->p[i], full);
PrintHeader(mb, f);
PrintCode(mb, f);
if (full) PrintDebug(mb, f);
for (i = 0; i<n; i++) ravi_print_function(mb, f->p[i], full);
}
#define toproto(L,i) getproto(L->top+(i))
@ -625,8 +626,13 @@ void ravi_print_function(const Proto* f, int full)
void ravi_dump_function(lua_State *L)
{
Proto* f;
membuff_t mb;
membuff_init(&mb, 4096);
f = toproto(L, -1);
ravi_print_function(f, 1);
ravi_print_function(&mb, f, 1);
ravi_writestring(L, mb.buf, strlen(mb.buf));
membuff_free(&mb);
}
static void setnameval(lua_State *L, const char *name, int val) {

@ -28,7 +28,7 @@
#include "ltable.h"
#include "ltm.h"
#include "ravijit.h"
#include "ravi_jit.h"
#include "ravi_profile.h"
#include "ravi_alloc.h"

@ -2637,20 +2637,20 @@ void ravi_dump_stacktop(lua_State *L, const char *s) {
** enabled; the function needs to update the savedpc and
** call luaG_traceexec() if necessary
*/
void ravi_debug_trace(lua_State *L, int opCode, int pc) {
RAVI_DEBUG_STACK(
char buf[100]; CallInfo *ci = L->ci;
int funcpos = (int)(ci->func - L->stack);
int top = (int)(L->top - L->stack);
int ci_top = (int)(ci->top - L->stack);
int base = (int)(ci->u.l.base - L->stack); raviP_instruction_to_str(
buf, sizeof buf, clvalue(L->ci->func)->l.p->code[pc]);
printf(
"Stack dump %s (%s) function %d, pc=%d, L->top = %d, ci->top = %d\n",
luaP_opnames[opCode], buf, funcpos, pc, (top - base),
(ci_top - base));
lua_assert(L->ci->u.l.base <= L->top &&
L->top < L->stack + L->stacksize);)
void raviV_debug_trace(lua_State *L, int opCode, int pc) {
// RAVI_DEBUG_STACK(
// char buf[100]; CallInfo *ci = L->ci;
// int funcpos = (int)(ci->func - L->stack);
// int top = (int)(L->top - L->stack);
// int ci_top = (int)(ci->top - L->stack);
// int base = (int)(ci->u.l.base - L->stack); raviP_instruction_to_str(
// buf, sizeof buf, clvalue(L->ci->func)->l.p->code[pc]);
// printf(
// "Stack dump %s (%s) function %d, pc=%d, L->top = %d, ci->top = %d\n",
// luaP_opnames[opCode], buf, funcpos, pc, (top - base),
// (ci_top - base));
// lua_assert(L->ci->u.l.base <= L->top &&
// L->top < L->stack + L->stacksize);)
// Updates the savedpc pointer in the call frame
// The savedpc is unimportant for the JIT but it is relied upon

@ -20,7 +20,7 @@
* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
******************************************************************************/
#include <ravijit.h>
#include <ravi_jit.h>
#include <ravi_jitshared.h>
#ifdef __cplusplus
@ -46,7 +46,7 @@ static int ravi_is_compiled(lua_State *L) {
luaL_argcheck(L, lua_isfunction(L, 1) && !lua_iscfunction(L, 1), 1,
"argument must be a Lua function");
void *p = (void *)lua_topointer(L, 1);
LClosure *l = reinterpret_cast<LClosure *>(p);
LClosure *l = (LClosure *)(p);
lua_pushboolean(L, l->p->ravi_jit.jit_status == RAVI_JIT_COMPILED);
return 1;
}
@ -78,7 +78,7 @@ static int ravi_compile_n(lua_State *L) {
if (n < MAX_COMPILES && lua_isfunction(L, -1) &&
!lua_iscfunction(L, -1)) {
void *p = (void *)lua_topointer(L, -1);
LClosure *l = reinterpret_cast<LClosure *>(p);
LClosure *l = (LClosure *)(p);
if (!l->p->ravi_jit.jit_function) functions[n++] = l->p;
}
lua_pop(L, 1); // pop value, but keep key
@ -88,7 +88,7 @@ static int ravi_compile_n(lua_State *L) {
luaL_argcheck(L, lua_isfunction(L, 1) && !lua_iscfunction(L, 1), 1,
"argument must be a Lua function");
void *p = (void *)lua_topointer(L, 1);
LClosure *l = reinterpret_cast<LClosure *>(p);
LClosure *l = (LClosure *)(p);
functions[n++] = l->p;
}
ravi_compile_options_t options = {0, 0, 0, RAVI_CODEGEN_NONE};
@ -128,7 +128,7 @@ static int ravi_dump_ir(lua_State *L) {
luaL_argcheck(L, lua_isfunction(L, 1) && !lua_iscfunction(L, 1), 1,
"argument must be a Lua function");
void *p = (void *)lua_topointer(L, 1);
LClosure *l = reinterpret_cast<LClosure *>(p);
LClosure *l = (LClosure *)(p);
raviV_dumpIR(L, l->p);
return 0;
}
@ -141,7 +141,7 @@ static int ravi_dump_asm(lua_State *L) {
luaL_argcheck(L, lua_isfunction(L, 1) && !lua_iscfunction(L, 1), 1,
"argument must be a Lua function");
void *p = (void *)lua_topointer(L, 1);
LClosure *l = reinterpret_cast<LClosure *>(p);
LClosure *l = (LClosure *)(p);
raviV_dumpASM(L, l->p);
return 0;
}
@ -208,18 +208,6 @@ static int ravi_validation(lua_State *L) {
return 1;
}
// Set GC step when JIT compiling
static int ravi_gcstep(lua_State *L) {
int n = lua_gettop(L);
int oldvalue = raviV_getgcstep(L);
if (n == 1) {
int value = lua_tointeger(L, 1);
raviV_setgcstep(L, value);
}
lua_pushboolean(L, oldvalue);
return 1;
}
// Turn on/off the trace hook
static int ravi_traceenable(lua_State *L) {
int n = lua_gettop(L);
@ -263,7 +251,6 @@ static const luaL_Reg ravilib[] = {{"iscompiled", ravi_is_compiled},
{"sizelevel", ravi_sizelevel},
{"verbosity", ravi_verbosity},
{"validation", ravi_validation},
{"gcstep", ravi_gcstep},
{"tracehook", ravi_traceenable},
{"listcode", ravi_listcode},
{"limits", ravi_get_limits},
@ -271,7 +258,7 @@ static const luaL_Reg ravilib[] = {{"iscompiled", ravi_is_compiled},
#include <math.h>
LUAMOD_API int raviopen_llvmjit(lua_State *L) {
LUAMOD_API int raviopen_jit(lua_State *L) {
luaL_newlib(L, ravilib);
/* faster calls some maths functions */
ravi_pushcfastcall(L, NULL, RAVI_TFCF_EXP);

@ -20,7 +20,7 @@
* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
******************************************************************************/
#include <ravijit.h>
#include <ravi_jit.h>
#include <ravi_llvmcodegen.h>
#include <ravi_jitshared.h>
#include <dmr_c.h>
@ -948,6 +948,7 @@ std::unique_ptr<RaviJITFunction> RaviCodeGenerator::create_function(
return func;
}
#if 0
void RaviCodeGenerator::emit_dump_stack(RaviFunctionDef *def, const char *str) {
CreateCall2(def->builder, def->ravi_dump_stackF, def->L,
def->builder->CreateGlobalStringPtr(str));
@ -958,6 +959,7 @@ void RaviCodeGenerator::emit_dump_stacktop(RaviFunctionDef *def,
CreateCall2(def->builder, def->ravi_dump_stacktopF, def->L,
def->builder->CreateGlobalStringPtr(str));
}
#endif
// Emit a call to ravi_debug_trace() function.
// This function will set savedpc and also invoke
@ -1206,6 +1208,8 @@ void RaviCodeGenerator::emit_extern_declarations(RaviFunctionDef *def) {
def->types->raviV_op_deferT, reinterpret_cast<void *>(&raviV_op_defer),
"raviV_op_defer");
#if 0
// DEBUG routines
def->ravi_dump_valueF = def->raviF->addExternFunction(
def->types->ravi_dump_valueT, reinterpret_cast<void *>(&ravi_dump_value),
"ravi_dump_value");
@ -1215,9 +1219,10 @@ void RaviCodeGenerator::emit_extern_declarations(RaviFunctionDef *def) {
def->ravi_dump_stacktopF = def->raviF->addExternFunction(
def->types->ravi_dump_stacktopT,
reinterpret_cast<void *>(&ravi_dump_stacktop), "ravi_dump_stacktop");
#endif
def->ravi_debug_traceF = def->raviF->addExternFunction(
def->types->ravi_debug_traceT,
reinterpret_cast<void *>(&ravi_debug_trace), "ravi_debug_trace");
reinterpret_cast<void *>(&raviV_debug_trace), "raviV_debug_trace");
// Create printf declaration
std::vector<llvm::Type *> args;

@ -21,7 +21,6 @@
* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
******************************************************************************/
#include <ravi_llvmcodegen.h>
#include <ravijit.h>
// Important to include the C++ header files (ravi_llvmcodegen.h) before following
// (ravi_jitshared.h) as the Lua headers define macros that mess with C++ headers
#include <ravi_jitshared.h>
@ -184,7 +183,6 @@ RaviJITState::RaviJITState()
tracehook_enabled_(false),
validation_(false),
use_dmrc_(false),
gcstep_(300),
min_code_size_(150),
min_exec_count_(50),
allocated_modules_(0),
@ -1014,18 +1012,6 @@ int raviV_getvalidation(lua_State *L) {
return G->ravi_state->jit->get_validation();
}
void raviV_setgcstep(lua_State *L, int value) {
global_State *G = G(L);
if (!G->ravi_state)
return;
G->ravi_state->jit->set_gcstep(value);
}
int raviV_getgcstep(lua_State *L) {
global_State *G = G(L);
if (!G->ravi_state)
return 0;
return G->ravi_state->jit->get_gcstep();
}
// Turn on/off the JIT compiler
void raviV_settraceenabled(lua_State *L, int value) {

@ -1002,6 +1002,8 @@ LuaLLVMTypes::LuaLLVMTypes(llvm::LLVMContext &context) : mdbuilder(context) {
raviH_set_floatT =
llvm::FunctionType::get(llvm::Type::getVoidTy(context), elements, false);
#if 0
// DEBUG tools
elements.clear();
elements.push_back(plua_StateT);
elements.push_back(pTValueT);
@ -1016,6 +1018,7 @@ LuaLLVMTypes::LuaLLVMTypes(llvm::LLVMContext &context) : mdbuilder(context) {
ravi_dump_stacktopT =
llvm::FunctionType::get(llvm::Type::getVoidTy(context), elements, false);
#endif
elements.clear();
elements.push_back(plua_StateT);
elements.push_back(C_intT);

@ -22,7 +22,7 @@
******************************************************************************/
#include <ravi_mirjit.h>
#include <ravijit.h>
#include <ravi_jit.h>
#include <stddef.h>
#include <assert.h>
@ -171,7 +171,6 @@ static LuaFunc Lua_functions[] = {
{ "lua_rawsetp", lua_rawsetp },
{ "lua_setmetatable", lua_setmetatable },
{ "lua_setuservalue", lua_setuservalue },
{ "ravi_dump_value", ravi_dump_value },
{ NULL, NULL }
};
@ -319,15 +318,6 @@ int raviV_getverbosity(lua_State *L) {
return G->ravi_state->verbosity_;
}
void raviV_setgcstep(lua_State *L, int value) {
(void)L;
(void)value;
}
int raviV_getgcstep(lua_State *L) {
(void)L;
return 0;
}
// Turn on/off the JIT compiler
void raviV_settraceenabled(lua_State *L, int value) {
(void)L;

@ -21,7 +21,7 @@
* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
******************************************************************************/
#include <ravijit.h>
#include <ravi_jit.h>
#include <ravi_jitshared.h>
int raviV_compile(struct lua_State *L, struct Proto *p,
@ -144,15 +144,6 @@ int raviV_getverbosity(lua_State *L) {
return 0;
}
void raviV_setgcstep(struct lua_State *L, int value) {
(void)L;
(void)value;
}
int raviV_getgcstep(struct lua_State *L) {
(void)L;
return 0;
}
void raviV_setvalidation(struct lua_State *L, int value) {
(void)L;
(void)value;

@ -22,7 +22,7 @@
******************************************************************************/
#include <ravi_omrjit.h>
#include <ravijit.h>
#include <ravi_jit.h>
#include <stddef.h>
#include <assert.h>
@ -453,15 +453,6 @@ int raviV_getverbosity(lua_State *L) {
return G->ravi_state->verbosity_;
}
void raviV_setgcstep(lua_State *L, int value) {
(void)L;
(void)value;
}
int raviV_getgcstep(lua_State *L) {
(void)L;
return 0;
}
// Turn on/off the JIT compiler
void raviV_settraceenabled(lua_State *L, int value) {
(void)L;

@ -1,5 +1,5 @@
#include <ravi_omrjit.h>
#include <ravijit.h>
#include <ravi_jit.h>
#include <stddef.h>
#include <assert.h>

Loading…
Cancel
Save