add test for longjmp issue

pull/81/head
Dibyendu Majumdar 9 years ago
parent 14a116c50f
commit c70f5c2cb1

@ -14,16 +14,16 @@ include_directories(${LLVM_INCLUDE_DIRS})
add_definitions(${LLVM_DEFINITIONS})
if (MSVC)
set(CMAKE_C_FLAGS_DEBUG "/Od /D_DEBUG /MDd /Zi /RTC1")
set(CMAKE_C_FLAGS_RELEASE "/DNDEBUG /O2 /MD")
set(CMAKE_C_FLAGS_RELWITHDEBINFO "/D_DEBUG /O2 /MD /Zi")
set(CMAKE_C_FLAGS_MINSIZEREL "/DNDEBUG /O1 /MD")
set(CMAKE_C_FLAGS_DEBUG "/Od /D_DEBUG /MDd /Zi /RTC1 /EHsc")
set(CMAKE_C_FLAGS_RELEASE "/DNDEBUG /O2 /MD /EHsc")
set(CMAKE_C_FLAGS_RELWITHDEBINFO "/DNDEBUG /O2 /MD /Zi /EHsc")
set(CMAKE_C_FLAGS_MINSIZEREL "/DNDEBUG /O2 /MD /EHsc")
set(CMAKE_CXX_FLAGS "/EHsc")
set(CMAKE_CXX_FLAGS_DEBUG "/Od /D_DEBUG /MDd /Zi /RTC1")
set(CMAKE_CXX_FLAGS_RELEASE "/DNDEBUG /O2 /MD")
set(CMAKE_CXX_FLAGS_RELWITHDEBINFO "/DNDEBUG /O2 /MD /Zi")
set(CMAKE_CXX_FLAGS_MINSIZEREL "/DNDEBUG /O1 /MD")
set(CMAKE_CXX_FLAGS_DEBUG "/Od /D_DEBUG /MDd /Zi /RTC1 /EHsc")
set(CMAKE_CXX_FLAGS_RELEASE "/DNDEBUG /O2 /MD /EHsc")
set(CMAKE_CXX_FLAGS_RELWITHDEBINFO "/DNDEBUG /O2 /MD /Zi /EHsc")
set(CMAKE_CXX_FLAGS_MINSIZEREL "/DNDEBUG /O2 /MD /EHsc")
SET(CMAKE_EXE_LINKER_FLAGS_DEBUG "/DEBUG /STACK:10000000")
SET(CMAKE_EXE_LINKER_FLAGS_RELEASE "/RELEASE /INCREMENTAL:NO /STACK:10000000")

@ -34,6 +34,8 @@ LUAI_FUNC l_noret luaG_ordererror (lua_State *L, const TValue *p1,
const TValue *p2);
LUAI_FUNC l_noret luaG_runerror (lua_State *L, const char *fmt, ...);
LUAI_FUNC l_noret luaG_errormsg (lua_State *L);
LUAI_FUNC void luaG_runerror1(lua_State *L, const char *msg);
LUAI_FUNC void luaG_traceexec (lua_State *L);

@ -321,7 +321,7 @@ public:
// Add declaration for an extern function that is not
// loaded dynamically - i.e., is part of the the executable
// and therefore not visible at runtime by name
virtual llvm::Constant *addExternFunction(llvm::FunctionType *type,
virtual llvm::Function *addExternFunction(llvm::FunctionType *type,
void *address,
const std::string &name);
@ -442,39 +442,39 @@ struct RaviFunctionDef {
llvm::IRBuilder<> *builder;
// Lua function declarations
llvm::Constant *luaD_poscallF;
llvm::Constant *luaD_precallF;
llvm::Constant *luaD_callF;
llvm::Constant *luaF_closeF;
llvm::Constant *luaG_runerrorF;
llvm::Constant *luaT_trybinTMF;
llvm::Constant *luaV_equalobjF;
llvm::Constant *luaV_lessthanF;
llvm::Constant *luaV_lessequalF;
llvm::Constant *luaV_forlimitF;
llvm::Constant *luaV_tonumberF;
llvm::Constant *luaV_tointegerF;
llvm::Constant *luaV_executeF;
llvm::Constant *luaV_gettableF;
llvm::Constant *luaV_settableF;
llvm::Constant *luaV_modF;
llvm::Constant *luaV_divF;
llvm::Constant *luaV_objlenF;
llvm::Constant *luaC_upvalbarrierF;
llvm::Function *luaD_poscallF;
llvm::Function *luaD_precallF;
llvm::Function *luaD_callF;
llvm::Function *luaF_closeF;
llvm::Function *luaG_runerrorF;
llvm::Function *luaT_trybinTMF;
llvm::Function *luaV_equalobjF;
llvm::Function *luaV_lessthanF;
llvm::Function *luaV_lessequalF;
llvm::Function *luaV_forlimitF;
llvm::Function *luaV_tonumberF;
llvm::Function *luaV_tointegerF;
llvm::Function *luaV_executeF;
llvm::Function *luaV_gettableF;
llvm::Function *luaV_settableF;
llvm::Function *luaV_modF;
llvm::Function *luaV_divF;
llvm::Function *luaV_objlenF;
llvm::Function *luaC_upvalbarrierF;
// Some cheats - these correspond to OPCODEs that
// are not inlined as of now
llvm::Constant *raviV_op_newarrayintF;
llvm::Constant *raviV_op_newarrayfloatF;
llvm::Constant *raviV_op_setlistF;
llvm::Constant *raviV_op_newtableF;
llvm::Constant *raviV_op_loadnilF;
llvm::Constant *raviV_op_concatF;
llvm::Constant *raviV_op_closureF;
llvm::Constant *raviV_op_varargF;
llvm::Constant *raviH_set_intF;
llvm::Constant *raviH_set_floatF;
llvm::Function *raviV_op_newarrayintF;
llvm::Function *raviV_op_newarrayfloatF;
llvm::Function *raviV_op_setlistF;
llvm::Function *raviV_op_newtableF;
llvm::Function *raviV_op_loadnilF;
llvm::Function *raviV_op_concatF;
llvm::Function *raviV_op_closureF;
llvm::Function *raviV_op_varargF;
llvm::Function *raviH_set_intF;
llvm::Function *raviH_set_floatF;
// standard C functions
llvm::Constant *printfFunc;
@ -531,6 +531,8 @@ public:
std::unique_ptr<RaviJITFunctionImpl>
create_function(llvm::IRBuilder<> &builder, RaviFunctionDef *def);
void emit_raise_lua_error(RaviFunctionDef *def, const char *str);
// Add extern declarations for Lua functions we need to call
void emit_extern_declarations(RaviFunctionDef *def);

@ -0,0 +1,22 @@
function x(t) return t; end
function f()
local tt: integer[] = {1}
local ss: number[] = { 55.5 }
tt = x(tt)
ss = x(ss)
end
assert(ravi.compile(x))
assert(ravi.compile(f))
ravi.dumpllvm(x)
ravi.dumpllvm(f)
assert(pcall(f))
function f()
local tt: integer[] = {1}
tt = x({})
end
ravi.dumplua(f)
assert(ravi.compile(f))
ravi.dumpllvm(f)
-- Following causes a misaligned stack exception
assert(not pcall(f))
print("test OK")

@ -0,0 +1,75 @@
; ModuleID = 'ravi_module_ravif2'
target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128"
target triple = "x86_64-pc-windows-msvc-elf"
%0 = type { %ravi.TValue*, i32*, i64 }
%ravi.lua_State = type { %ravi.GCObject*, i8, i8, i8, %ravi.TValue*, %ravi.global_State*, %ravi.CallInfo*, i32*, %ravi.TValue*, %ravi.TValue*, %ravi.UpVal*, %ravi.GCObject*, %ravi.lua_State*, %ravi.lua_longjmp*, %ravi.CallInfo, i8* (%ravi.lua_State*, %ravi.lua_Debug*)*, i64, i32, i32, i32, i16, i16, i8, i8 }
%ravi.global_State = type opaque
%ravi.TValue = type { %ravi.Value, i32 }
%ravi.Value = type { double }
%ravi.UpVal = type { %ravi.TValue*, i64, %ravi.TValue }
%ravi.GCObject = type { %ravi.GCObject*, i8, i8 }
%ravi.lua_longjmp = type opaque
%ravi.CallInfo = type { %ravi.TValue*, %ravi.TValue*, %ravi.CallInfo*, %ravi.CallInfo*, %0, i64, i16, i8, i8 }
%ravi.lua_Debug = type opaque
%ravi.LClosure = type { %ravi.GCObject*, i8, i8, i8, %ravi.GCObject*, %ravi.Proto*, [1 x %ravi.UpVal*] }
%ravi.Proto = type { %ravi.GCObject*, i8, i8, i8, i8, i8, i32, i32, i32, i32, i32, i32, i32, i32, %ravi.TValue*, i32*, %ravi.Proto**, i32*, %ravi.LocVar*, %ravi.Upvaldesc*, %ravi.LClosure*, %ravi.TString*, %ravi.GCObject*, %ravi.RaviJITProto }
%ravi.LocVar = type { %ravi.TString*, i32, i32, i32 }
%ravi.Upvaldesc = type { %ravi.TString*, i32, i8, i8 }
%ravi.TString = type { %ravi.GCObject*, i8, i8, i8, i32, i64, %ravi.TString* }
%ravi.RaviJITProto = type { i8, i8, i16, i8*, i32 (%ravi.lua_State*)* }
; Function Attrs: nounwind
define i32 @ravif2(%ravi.lua_State* %L) #0 {
entry:
%L_ci = getelementptr inbounds %ravi.lua_State* %L, i64 0, i32 6
%0 = load %ravi.CallInfo** %L_ci, align 8, !tbaa !0
%base = getelementptr inbounds %ravi.CallInfo* %0, i64 0, i32 4, i32 0
%1 = bitcast %ravi.CallInfo* %0 to %ravi.LClosure***
%2 = load %ravi.LClosure*** %1, align 8, !tbaa !7
%3 = load %ravi.LClosure** %2, align 8, !tbaa !8
%Proto = getelementptr inbounds %ravi.LClosure* %3, i64 0, i32 5
%4 = load %ravi.Proto** %Proto, align 8, !tbaa !9
%5 = load %ravi.TValue** %base, align 8, !tbaa !11
%6 = getelementptr inbounds %ravi.TValue* %5, i64 1
%L.top = getelementptr inbounds %ravi.lua_State* %L, i64 0, i32 4
store %ravi.TValue* %6, %ravi.TValue** %L.top, align 8, !tbaa !12
%sizep = getelementptr inbounds %ravi.Proto* %4, i64 0, i32 10
%7 = load i32* %sizep, align 4, !tbaa !15
%8 = icmp sgt i32 %7, 0
br i1 %8, label %if.then, label %if.else
if.then: ; preds = %entry
tail call void @luaF_close(%ravi.lua_State* %L, %ravi.TValue* %5)
br label %if.else
if.else: ; preds = %if.then, %entry
%9 = tail call i32 @luaD_poscall(%ravi.lua_State* %L, %ravi.TValue* %5)
ret i32 1
}
; Function Attrs: nounwind
declare i32 @luaD_poscall(%ravi.lua_State*, %ravi.TValue*) #0
; Function Attrs: nounwind
declare void @luaF_close(%ravi.lua_State*, %ravi.TValue*) #0
attributes #0 = { nounwind }
!0 = !{!"CallInfo", !1, i64 0, !1, i64 4, !1, i64 8, !1, i64 12, !4, i64 16, !5, i64 32, !6, i64 40, !2, i64 42, !2, i64 43}
!1 = !{!"any pointer", !2, i64 0}
!2 = !{!"omnipotent char", !3, i64 0}
!3 = !{!"Simple C / C++ TBAA"}
!4 = !{!"CallInfo_l", !1, i64 0, !1, i64 4, !5, i64 8}
!5 = !{!"long long", !2, i64 0}
!6 = !{!"short", !2, i64 0}
!7 = !{!0, !1, i64 0}
!8 = !{!1, !1, i64 0}
!9 = !{!10, !1, i64 12}
!10 = !{!"LClosure", !1, i64 0, !2, i64 4, !2, i64 5, !2, i64 6, !1, i64 8, !1, i64 12, !1, i64 16}
!11 = !{!0, !1, i64 16}
!12 = !{!13, !1, i64 8}
!13 = !{!"lua_State", !1, i64 0, !2, i64 4, !2, i64 5, !2, i64 6, !1, i64 8, !1, i64 12, !1, i64 16, !1, i64 20, !1, i64 24, !1, i64 28, !1, i64 32, !1, i64 36, !1, i64 40, !1, i64 44, !0, i64 48, !1, i64 92, !5, i64 96, !14, i64 104, !14, i64 108, !14, i64 112, !6, i64 114, !6, i64 116, !2, i64 118, !2, i64 119}
!14 = !{!"int", !2, i64 0}
!15 = !{!16, !14, i64 28}
!16 = !{!"Proto", !1, i64 0, !2, i64 4, !2, i64 5, !2, i64 6, !2, i64 7, !2, i64 8, !14, i64 12, !14, i64 16, !14, i64 20, !14, i64 24, !14, i64 28, !14, i64 32, !14, i64 36, !14, i64 40, !1, i64 44, !1, i64 48, !1, i64 52, !1, i64 56, !1, i64 60, !1, i64 64, !1, i64 68, !1, i64 72, !1, i64 76, !2, i64 80}

@ -0,0 +1,286 @@
; ModuleID = 'ravi_module_ravif3'
target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128"
target triple = "x86_64-pc-windows-msvc-elf"
%0 = type { %ravi.TValue*, i32*, i64 }
%ravi.lua_State = type { %ravi.GCObject*, i8, i8, i8, %ravi.TValue*, %ravi.global_State*, %ravi.CallInfo*, i32*, %ravi.TValue*, %ravi.TValue*, %ravi.UpVal*, %ravi.GCObject*, %ravi.lua_State*, %ravi.lua_longjmp*, %ravi.CallInfo, i8* (%ravi.lua_State*, %ravi.lua_Debug*)*, i64, i32, i32, i32, i16, i16, i8, i8 }
%ravi.global_State = type opaque
%ravi.TValue = type { %ravi.Value, i32 }
%ravi.Value = type { double }
%ravi.UpVal = type { %ravi.TValue*, i64, %ravi.TValue }
%ravi.GCObject = type { %ravi.GCObject*, i8, i8 }
%ravi.lua_longjmp = type opaque
%ravi.CallInfo = type { %ravi.TValue*, %ravi.TValue*, %ravi.CallInfo*, %ravi.CallInfo*, %0, i64, i16, i8, i8 }
%ravi.lua_Debug = type opaque
%ravi.LClosure = type { %ravi.GCObject*, i8, i8, i8, %ravi.GCObject*, %ravi.Proto*, [1 x %ravi.UpVal*] }
%ravi.Proto = type { %ravi.GCObject*, i8, i8, i8, i8, i8, i32, i32, i32, i32, i32, i32, i32, i32, %ravi.TValue*, i32*, %ravi.Proto**, i32*, %ravi.LocVar*, %ravi.Upvaldesc*, %ravi.LClosure*, %ravi.TString*, %ravi.GCObject*, %ravi.RaviJITProto }
%ravi.LocVar = type { %ravi.TString*, i32, i32, i32 }
%ravi.Upvaldesc = type { %ravi.TString*, i32, i8, i8 }
%ravi.TString = type { %ravi.GCObject*, i8, i8, i8, i32, i64, %ravi.TString* }
%ravi.RaviJITProto = type { i8, i8, i16, i8*, i32 (%ravi.lua_State*)* }
%ravi.Table = type { %ravi.GCObject*, i8, i8, i8, i8, i32, %ravi.TValue*, %ravi.Node*, %ravi.Node*, %ravi.Table*, %ravi.GCObject*, %ravi.RaviArray }
%ravi.Node = type { %ravi.TValue, %ravi.TKey }
%ravi.TKey = type { %ravi.Value, i32, i32 }
%ravi.RaviArray = type { i8*, i32, i32, i32 }
@0 = private unnamed_addr constant [19 x i8] c"integer[] expected\00"
@1 = private unnamed_addr constant [18 x i8] c"number[] expected\00"
; Function Attrs: nounwind
define i32 @ravif3(%ravi.lua_State* %L) #0 {
entry:
%L_ci = getelementptr inbounds %ravi.lua_State* %L, i64 0, i32 6
%0 = load %ravi.CallInfo** %L_ci, align 8, !tbaa !0
%base = getelementptr inbounds %ravi.CallInfo* %0, i64 0, i32 4, i32 0
%1 = bitcast %ravi.CallInfo* %0 to %ravi.LClosure***
%2 = load %ravi.LClosure*** %1, align 8, !tbaa !7
%3 = load %ravi.LClosure** %2, align 8, !tbaa !8
%Proto = getelementptr inbounds %ravi.LClosure* %3, i64 0, i32 5
%4 = load %ravi.Proto** %Proto, align 8, !tbaa !9
%k = getelementptr inbounds %ravi.Proto* %4, i64 0, i32 14
%5 = load %ravi.TValue** %k, align 8, !tbaa !11
%6 = load %ravi.TValue** %base, align 8, !tbaa !14
tail call void @raviV_op_newarrayint(%ravi.lua_State* %L, %ravi.CallInfo* %0, %ravi.TValue* %6)
%7 = load %ravi.TValue** %base, align 8, !tbaa !14
%srcvalue40 = bitcast %ravi.TValue* %5 to double*
%destvalue = getelementptr inbounds %ravi.TValue* %7, i64 1, i32 0, i32 0
%8 = load double* %srcvalue40, align 8, !tbaa !15
store double %8, double* %destvalue, align 8, !tbaa !15
%srctype = getelementptr inbounds %ravi.TValue* %5, i64 0, i32 1
%desttype = getelementptr inbounds %ravi.TValue* %7, i64 1, i32 1
%9 = load i32* %srctype, align 4, !tbaa !17
store i32 %9, i32* %desttype, align 4, !tbaa !17
tail call void @raviV_op_setlist(%ravi.lua_State* %L, %ravi.CallInfo* %0, %ravi.TValue* %7, i32 1, i32 1)
%10 = load %ravi.TValue** %base, align 8, !tbaa !14
%11 = getelementptr inbounds %ravi.TValue* %10, i64 1
tail call void @raviV_op_newarrayfloat(%ravi.lua_State* %L, %ravi.CallInfo* %0, %ravi.TValue* %11)
%12 = load %ravi.TValue** %base, align 8, !tbaa !14
%srcvalue1 = getelementptr inbounds %ravi.TValue* %5, i64 1, i32 0, i32 0
%destvalue2 = getelementptr inbounds %ravi.TValue* %12, i64 2, i32 0, i32 0
%13 = load double* %srcvalue1, align 8, !tbaa !15
store double %13, double* %destvalue2, align 8, !tbaa !15
%srctype3 = getelementptr inbounds %ravi.TValue* %5, i64 1, i32 1
%desttype4 = getelementptr inbounds %ravi.TValue* %12, i64 2, i32 1
%14 = load i32* %srctype3, align 4, !tbaa !17
store i32 %14, i32* %desttype4, align 4, !tbaa !17
%15 = getelementptr inbounds %ravi.TValue* %12, i64 1
tail call void @raviV_op_setlist(%ravi.lua_State* %L, %ravi.CallInfo* %0, %ravi.TValue* %15, i32 1, i32 1)
%16 = load %ravi.TValue** %base, align 8, !tbaa !14
%17 = getelementptr inbounds %ravi.TValue* %16, i64 2
%18 = getelementptr inbounds %ravi.TValue* %5, i64 2
%upvals = getelementptr inbounds %ravi.LClosure* %3, i64 0, i32 6, i64 0
%19 = load %ravi.UpVal** %upvals, align 8, !tbaa !8
%v41 = bitcast %ravi.UpVal* %19 to %ravi.TValue**
%20 = load %ravi.TValue** %v41, align 8, !tbaa !18
tail call void @luaV_gettable(%ravi.lua_State* %L, %ravi.TValue* %20, %ravi.TValue* %18, %ravi.TValue* %17)
%21 = load %ravi.TValue** %base, align 8, !tbaa !14
%srcvalue542 = bitcast %ravi.TValue* %21 to double*
%destvalue6 = getelementptr inbounds %ravi.TValue* %21, i64 3, i32 0, i32 0
%22 = load double* %srcvalue542, align 8, !tbaa !15
store double %22, double* %destvalue6, align 8, !tbaa !15
%srctype7 = getelementptr inbounds %ravi.TValue* %21, i64 0, i32 1
%desttype8 = getelementptr inbounds %ravi.TValue* %21, i64 3, i32 1
%23 = load i32* %srctype7, align 4, !tbaa !17
store i32 %23, i32* %desttype8, align 4, !tbaa !17
%24 = getelementptr inbounds %ravi.TValue* %21, i64 4
%L.top = getelementptr inbounds %ravi.lua_State* %L, i64 0, i32 4
store %ravi.TValue* %24, %ravi.TValue** %L.top, align 8, !tbaa !20
%25 = getelementptr inbounds %ravi.TValue* %21, i64 2
%26 = tail call i32 @luaD_precall(%ravi.lua_State* %L, %ravi.TValue* %25, i32 1)
switch i32 %26, label %op_call.done [
i32 0, label %if.lua.function
i32 1, label %if.C.function
]
if.lua.function: ; preds = %entry
tail call void @luaV_execute(%ravi.lua_State* %L)
br label %op_call.done
if.C.function: ; preds = %entry
%ci_top = getelementptr inbounds %ravi.CallInfo* %0, i64 0, i32 1
%27 = load %ravi.TValue** %ci_top, align 8, !tbaa !22
%sunkaddr = ptrtoint %ravi.lua_State* %L to i64
%sunkaddr43 = add i64 %sunkaddr, 16
%sunkaddr44 = inttoptr i64 %sunkaddr43 to %ravi.TValue**
store %ravi.TValue* %27, %ravi.TValue** %sunkaddr44, align 8, !tbaa !20
br label %op_call.done
op_call.done: ; preds = %entry, %if.C.function, %if.lua.function
%sunkaddr45 = ptrtoint %ravi.CallInfo* %0 to i64
%sunkaddr46 = add i64 %sunkaddr45, 32
%sunkaddr47 = inttoptr i64 %sunkaddr46 to %ravi.TValue**
%28 = load %ravi.TValue** %sunkaddr47, align 8, !tbaa !14
%29 = getelementptr inbounds %ravi.TValue* %28, i64 2
%value.tt.ptr = getelementptr inbounds %ravi.TValue* %28, i64 2, i32 1
%value.tt = load i32* %value.tt.ptr, align 4, !tbaa !17
%is.not.table = icmp eq i32 %value.tt, 69
br i1 %is.not.table, label %test.if.array, label %if.not.table
if.not.table: ; preds = %op_call.done, %test.if.array
tail call void @luaG_runerror(%ravi.lua_State* %L, i8* getelementptr inbounds ([19 x i8]* @0, i64 0, i64 0))
unreachable
test.if.array: ; preds = %op_call.done
%30 = bitcast %ravi.TValue* %29 to %ravi.Table**
%31 = load %ravi.Table** %30, align 8, !tbaa !23
%raviarray.type_ptr = getelementptr inbounds %ravi.Table* %31, i64 0, i32 11, i32 1
%raviarray.type = load i32* %raviarray.type_ptr, align 4, !tbaa !24
%is.array.type = icmp eq i32 %raviarray.type, 3
br i1 %is.array.type, label %done, label %if.not.table
done: ; preds = %test.if.array
%32 = ptrtoint %ravi.Table* %31 to i64
%33 = bitcast %ravi.TValue* %28 to i64*
store i64 %32, i64* %33, align 8, !tbaa !15
%desttype12 = getelementptr inbounds %ravi.TValue* %28, i64 0, i32 1
store i32 69, i32* %desttype12, align 4, !tbaa !17
%sunkaddr48 = ptrtoint %ravi.LClosure* %3 to i64
%sunkaddr49 = add i64 %sunkaddr48, 32
%sunkaddr50 = inttoptr i64 %sunkaddr49 to %ravi.UpVal**
%34 = load %ravi.UpVal** %sunkaddr50, align 8, !tbaa !8
%v1451 = bitcast %ravi.UpVal* %34 to %ravi.TValue**
%35 = load %ravi.TValue** %v1451, align 8, !tbaa !18
tail call void @luaV_gettable(%ravi.lua_State* %L, %ravi.TValue* %35, %ravi.TValue* %18, %ravi.TValue* %29)
%sunkaddr52 = ptrtoint %ravi.CallInfo* %0 to i64
%sunkaddr53 = add i64 %sunkaddr52, 32
%sunkaddr54 = inttoptr i64 %sunkaddr53 to %ravi.TValue**
%36 = load %ravi.TValue** %sunkaddr54, align 8, !tbaa !14
%srcvalue15 = getelementptr inbounds %ravi.TValue* %36, i64 1, i32 0, i32 0
%destvalue16 = getelementptr inbounds %ravi.TValue* %36, i64 3, i32 0, i32 0
%37 = load double* %srcvalue15, align 8, !tbaa !15
store double %37, double* %destvalue16, align 8, !tbaa !15
%srctype17 = getelementptr inbounds %ravi.TValue* %36, i64 1, i32 1
%desttype18 = getelementptr inbounds %ravi.TValue* %36, i64 3, i32 1
%38 = load i32* %srctype17, align 4, !tbaa !17
store i32 %38, i32* %desttype18, align 4, !tbaa !17
%39 = getelementptr inbounds %ravi.TValue* %36, i64 4
%sunkaddr55 = ptrtoint %ravi.lua_State* %L to i64
%sunkaddr56 = add i64 %sunkaddr55, 16
%sunkaddr57 = inttoptr i64 %sunkaddr56 to %ravi.TValue**
store %ravi.TValue* %39, %ravi.TValue** %sunkaddr57, align 8, !tbaa !20
%40 = getelementptr inbounds %ravi.TValue* %36, i64 2
%41 = tail call i32 @luaD_precall(%ravi.lua_State* %L, %ravi.TValue* %40, i32 1)
switch i32 %41, label %op_call.done25 [
i32 0, label %if.lua.function20
i32 1, label %if.C.function22
]
if.lua.function20: ; preds = %done
tail call void @luaV_execute(%ravi.lua_State* %L)
br label %op_call.done25
if.C.function22: ; preds = %done
%ci_top23 = getelementptr inbounds %ravi.CallInfo* %0, i64 0, i32 1
%42 = load %ravi.TValue** %ci_top23, align 8, !tbaa !22
%sunkaddr58 = ptrtoint %ravi.lua_State* %L to i64
%sunkaddr59 = add i64 %sunkaddr58, 16
%sunkaddr60 = inttoptr i64 %sunkaddr59 to %ravi.TValue**
store %ravi.TValue* %42, %ravi.TValue** %sunkaddr60, align 8, !tbaa !20
br label %op_call.done25
op_call.done25: ; preds = %done, %if.C.function22, %if.lua.function20
%sunkaddr61 = ptrtoint %ravi.CallInfo* %0 to i64
%sunkaddr62 = add i64 %sunkaddr61, 32
%sunkaddr63 = inttoptr i64 %sunkaddr62 to %ravi.TValue**
%43 = load %ravi.TValue** %sunkaddr63, align 8, !tbaa !14
%value.tt.ptr26 = getelementptr inbounds %ravi.TValue* %43, i64 2, i32 1
%value.tt27 = load i32* %value.tt.ptr26, align 4, !tbaa !17
%is.not.table28 = icmp eq i32 %value.tt27, 69
br i1 %is.not.table28, label %test.if.array30, label %if.not.table29
if.not.table29: ; preds = %op_call.done25, %test.if.array30
tail call void @luaG_runerror(%ravi.lua_State* %L, i8* getelementptr inbounds ([18 x i8]* @1, i64 0, i64 0))
unreachable
test.if.array30: ; preds = %op_call.done25
%44 = getelementptr inbounds %ravi.TValue* %43, i64 2
%45 = bitcast %ravi.TValue* %44 to %ravi.Table**
%46 = load %ravi.Table** %45, align 8, !tbaa !23
%raviarray.type_ptr31 = getelementptr inbounds %ravi.Table* %46, i64 0, i32 11, i32 1
%raviarray.type32 = load i32* %raviarray.type_ptr31, align 4, !tbaa !24
%is.array.type33 = icmp eq i32 %raviarray.type32, 4
br i1 %is.array.type33, label %done34, label %if.not.table29
done34: ; preds = %test.if.array30
%47 = ptrtoint %ravi.Table* %46 to i64
%destvalue36 = getelementptr inbounds %ravi.TValue* %43, i64 1, i32 0, i32 0
%48 = bitcast double* %destvalue36 to i64*
store i64 %47, i64* %48, align 8, !tbaa !15
%desttype38 = getelementptr inbounds %ravi.TValue* %43, i64 1, i32 1
store i32 69, i32* %desttype38, align 4, !tbaa !17
%sunkaddr64 = ptrtoint %ravi.lua_State* %L to i64
%sunkaddr65 = add i64 %sunkaddr64, 16
%sunkaddr66 = inttoptr i64 %sunkaddr65 to %ravi.TValue**
store %ravi.TValue* %43, %ravi.TValue** %sunkaddr66, align 8, !tbaa !20
%sizep = getelementptr inbounds %ravi.Proto* %4, i64 0, i32 10
%49 = load i32* %sizep, align 4, !tbaa !27
%50 = icmp sgt i32 %49, 0
br i1 %50, label %if.then, label %if.else
if.then: ; preds = %done34
tail call void @luaF_close(%ravi.lua_State* %L, %ravi.TValue* %43)
br label %if.else
if.else: ; preds = %if.then, %done34
%51 = tail call i32 @luaD_poscall(%ravi.lua_State* %L, %ravi.TValue* %43)
ret i32 1
}
; Function Attrs: nounwind
declare i32 @luaD_poscall(%ravi.lua_State*, %ravi.TValue*) #0
; Function Attrs: nounwind
declare i32 @luaD_precall(%ravi.lua_State*, %ravi.TValue*, i32) #0
; Function Attrs: nounwind
declare void @luaF_close(%ravi.lua_State*, %ravi.TValue*) #0
; Function Attrs: noreturn nounwind
declare void @luaG_runerror(%ravi.lua_State*, i8*) #1
; Function Attrs: nounwind
declare void @luaV_execute(%ravi.lua_State*) #0
; Function Attrs: nounwind
declare void @luaV_gettable(%ravi.lua_State*, %ravi.TValue*, %ravi.TValue*, %ravi.TValue*) #0
; Function Attrs: nounwind
declare void @raviV_op_newarrayint(%ravi.lua_State*, %ravi.CallInfo*, %ravi.TValue*) #0
; Function Attrs: nounwind
declare void @raviV_op_newarrayfloat(%ravi.lua_State*, %ravi.CallInfo*, %ravi.TValue*) #0
; Function Attrs: nounwind
declare void @raviV_op_setlist(%ravi.lua_State*, %ravi.CallInfo*, %ravi.TValue*, i32, i32) #0
attributes #0 = { nounwind }
attributes #1 = { noreturn nounwind }
!0 = !{!"CallInfo", !1, i64 0, !1, i64 4, !1, i64 8, !1, i64 12, !4, i64 16, !5, i64 32, !6, i64 40, !2, i64 42, !2, i64 43}
!1 = !{!"any pointer", !2, i64 0}
!2 = !{!"omnipotent char", !3, i64 0}
!3 = !{!"Simple C / C++ TBAA"}
!4 = !{!"CallInfo_l", !1, i64 0, !1, i64 4, !5, i64 8}
!5 = !{!"long long", !2, i64 0}
!6 = !{!"short", !2, i64 0}
!7 = !{!0, !1, i64 0}
!8 = !{!1, !1, i64 0}
!9 = !{!10, !1, i64 12}
!10 = !{!"LClosure", !1, i64 0, !2, i64 4, !2, i64 5, !2, i64 6, !1, i64 8, !1, i64 12, !1, i64 16}
!11 = !{!12, !1, i64 44}
!12 = !{!"Proto", !1, i64 0, !2, i64 4, !2, i64 5, !2, i64 6, !2, i64 7, !2, i64 8, !13, i64 12, !13, i64 16, !13, i64 20, !13, i64 24, !13, i64 28, !13, i64 32, !13, i64 36, !13, i64 40, !1, i64 44, !1, i64 48, !1, i64 52, !1, i64 56, !1, i64 60, !1, i64 64, !1, i64 68, !1, i64 72, !1, i64 76, !2, i64 80}
!13 = !{!"int", !2, i64 0}
!14 = !{!0, !1, i64 16}
!15 = !{!16, !5, i64 0}
!16 = !{!"TValue", !5, i64 0, !13, i64 8}
!17 = !{!16, !13, i64 8}
!18 = !{!19, !1, i64 0}
!19 = !{!"UpVal", !1, i64 0, !5, i64 8, !16, i64 16}
!20 = !{!21, !1, i64 8}
!21 = !{!"lua_State", !1, i64 0, !2, i64 4, !2, i64 5, !2, i64 6, !1, i64 8, !1, i64 12, !1, i64 16, !1, i64 20, !1, i64 24, !1, i64 28, !1, i64 32, !1, i64 36, !1, i64 40, !1, i64 44, !0, i64 48, !1, i64 92, !5, i64 96, !13, i64 104, !13, i64 108, !13, i64 112, !6, i64 114, !6, i64 116, !2, i64 118, !2, i64 119}
!22 = !{!0, !1, i64 4}
!23 = !{!16, !1, i64 0}
!24 = !{!25, !2, i64 36}
!25 = !{!"Table", !1, i64 0, !2, i64 4, !2, i64 5, !2, i64 6, !2, i64 7, !13, i64 8, !1, i64 12, !1, i64 16, !1, i64 20, !1, i64 24, !1, i64 28, !26, i64 32}
!26 = !{!"RaviArray", !1, i64 0, !2, i64 4, !13, i64 8, !13, i64 12}
!27 = !{!12, !13, i64 28}

@ -0,0 +1,192 @@
; ModuleID = 'ravi_module_ravif4'
target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128"
target triple = "x86_64-pc-windows-msvc-elf"
%0 = type { %ravi.TValue*, i32*, i64 }
%ravi.lua_State = type { %ravi.GCObject*, i8, i8, i8, %ravi.TValue*, %ravi.global_State*, %ravi.CallInfo*, i32*, %ravi.TValue*, %ravi.TValue*, %ravi.UpVal*, %ravi.GCObject*, %ravi.lua_State*, %ravi.lua_longjmp*, %ravi.CallInfo, i8* (%ravi.lua_State*, %ravi.lua_Debug*)*, i64, i32, i32, i32, i16, i16, i8, i8 }
%ravi.global_State = type opaque
%ravi.TValue = type { %ravi.Value, i32 }
%ravi.Value = type { double }
%ravi.UpVal = type { %ravi.TValue*, i64, %ravi.TValue }
%ravi.GCObject = type { %ravi.GCObject*, i8, i8 }
%ravi.lua_longjmp = type opaque
%ravi.CallInfo = type { %ravi.TValue*, %ravi.TValue*, %ravi.CallInfo*, %ravi.CallInfo*, %0, i64, i16, i8, i8 }
%ravi.lua_Debug = type opaque
%ravi.LClosure = type { %ravi.GCObject*, i8, i8, i8, %ravi.GCObject*, %ravi.Proto*, [1 x %ravi.UpVal*] }
%ravi.Proto = type { %ravi.GCObject*, i8, i8, i8, i8, i8, i32, i32, i32, i32, i32, i32, i32, i32, %ravi.TValue*, i32*, %ravi.Proto**, i32*, %ravi.LocVar*, %ravi.Upvaldesc*, %ravi.LClosure*, %ravi.TString*, %ravi.GCObject*, %ravi.RaviJITProto }
%ravi.LocVar = type { %ravi.TString*, i32, i32, i32 }
%ravi.Upvaldesc = type { %ravi.TString*, i32, i8, i8 }
%ravi.TString = type { %ravi.GCObject*, i8, i8, i8, i32, i64, %ravi.TString* }
%ravi.RaviJITProto = type { i8, i8, i16, i8*, i32 (%ravi.lua_State*)* }
%ravi.Table = type { %ravi.GCObject*, i8, i8, i8, i8, i32, %ravi.TValue*, %ravi.Node*, %ravi.Node*, %ravi.Table*, %ravi.GCObject*, %ravi.RaviArray }
%ravi.Node = type { %ravi.TValue, %ravi.TKey }
%ravi.TKey = type { %ravi.Value, i32, i32 }
%ravi.RaviArray = type { i8*, i32, i32, i32 }
@0 = private unnamed_addr constant [19 x i8] c"integer[] expected\00"
; Function Attrs: nounwind
define i32 @ravif4(%ravi.lua_State* %L) #0 {
entry:
%L_ci = getelementptr inbounds %ravi.lua_State* %L, i64 0, i32 6
%0 = load %ravi.CallInfo** %L_ci, align 8, !tbaa !0
%base = getelementptr inbounds %ravi.CallInfo* %0, i64 0, i32 4, i32 0
%1 = bitcast %ravi.CallInfo* %0 to %ravi.LClosure***
%2 = load %ravi.LClosure*** %1, align 8, !tbaa !7
%3 = load %ravi.LClosure** %2, align 8, !tbaa !8
%Proto = getelementptr inbounds %ravi.LClosure* %3, i64 0, i32 5
%4 = load %ravi.Proto** %Proto, align 8, !tbaa !9
%k = getelementptr inbounds %ravi.Proto* %4, i64 0, i32 14
%5 = load %ravi.TValue** %k, align 8, !tbaa !11
%6 = load %ravi.TValue** %base, align 8, !tbaa !14
tail call void @raviV_op_newarrayint(%ravi.lua_State* %L, %ravi.CallInfo* %0, %ravi.TValue* %6)
%7 = load %ravi.TValue** %base, align 8, !tbaa !14
%srcvalue6 = bitcast %ravi.TValue* %5 to double*
%destvalue = getelementptr inbounds %ravi.TValue* %7, i64 1, i32 0, i32 0
%8 = load double* %srcvalue6, align 8, !tbaa !15
store double %8, double* %destvalue, align 8, !tbaa !15
%srctype = getelementptr inbounds %ravi.TValue* %5, i64 0, i32 1
%desttype = getelementptr inbounds %ravi.TValue* %7, i64 1, i32 1
%9 = load i32* %srctype, align 4, !tbaa !17
store i32 %9, i32* %desttype, align 4, !tbaa !17
tail call void @raviV_op_setlist(%ravi.lua_State* %L, %ravi.CallInfo* %0, %ravi.TValue* %7, i32 1, i32 1)
%10 = load %ravi.TValue** %base, align 8, !tbaa !14
%11 = getelementptr inbounds %ravi.TValue* %10, i64 1
%12 = getelementptr inbounds %ravi.TValue* %5, i64 1
%upvals = getelementptr inbounds %ravi.LClosure* %3, i64 0, i32 6, i64 0
%13 = load %ravi.UpVal** %upvals, align 8, !tbaa !8
%v7 = bitcast %ravi.UpVal* %13 to %ravi.TValue**
%14 = load %ravi.TValue** %v7, align 8, !tbaa !18
tail call void @luaV_gettable(%ravi.lua_State* %L, %ravi.TValue* %14, %ravi.TValue* %12, %ravi.TValue* %11)
%15 = load %ravi.TValue** %base, align 8, !tbaa !14
%16 = getelementptr inbounds %ravi.TValue* %15, i64 2
tail call void @raviV_op_newtable(%ravi.lua_State* %L, %ravi.CallInfo* %0, %ravi.TValue* %16, i32 0, i32 0)
%17 = load %ravi.TValue** %base, align 8, !tbaa !14
%18 = getelementptr inbounds %ravi.TValue* %17, i64 3
%L.top = getelementptr inbounds %ravi.lua_State* %L, i64 0, i32 4
store %ravi.TValue* %18, %ravi.TValue** %L.top, align 8, !tbaa !20
%19 = getelementptr inbounds %ravi.TValue* %17, i64 1
%20 = tail call i32 @luaD_precall(%ravi.lua_State* %L, %ravi.TValue* %19, i32 1)
switch i32 %20, label %op_call.done [
i32 0, label %if.lua.function
i32 1, label %if.C.function
]
if.lua.function: ; preds = %entry
tail call void @luaV_execute(%ravi.lua_State* %L)
br label %op_call.done
if.C.function: ; preds = %entry
%ci_top = getelementptr inbounds %ravi.CallInfo* %0, i64 0, i32 1
%21 = load %ravi.TValue** %ci_top, align 8, !tbaa !22
%sunkaddr = ptrtoint %ravi.lua_State* %L to i64
%sunkaddr8 = add i64 %sunkaddr, 16
%sunkaddr9 = inttoptr i64 %sunkaddr8 to %ravi.TValue**
store %ravi.TValue* %21, %ravi.TValue** %sunkaddr9, align 8, !tbaa !20
br label %op_call.done
op_call.done: ; preds = %entry, %if.C.function, %if.lua.function
%sunkaddr10 = ptrtoint %ravi.CallInfo* %0 to i64
%sunkaddr11 = add i64 %sunkaddr10, 32
%sunkaddr12 = inttoptr i64 %sunkaddr11 to %ravi.TValue**
%22 = load %ravi.TValue** %sunkaddr12, align 8, !tbaa !14
%value.tt.ptr = getelementptr inbounds %ravi.TValue* %22, i64 1, i32 1
%value.tt = load i32* %value.tt.ptr, align 4, !tbaa !17
%is.not.table = icmp eq i32 %value.tt, 69
br i1 %is.not.table, label %test.if.array, label %if.not.table
if.not.table: ; preds = %op_call.done, %test.if.array
tail call void @luaG_runerror(%ravi.lua_State* %L, i8* getelementptr inbounds ([19 x i8]* @0, i64 0, i64 0))
unreachable
test.if.array: ; preds = %op_call.done
%23 = getelementptr inbounds %ravi.TValue* %22, i64 1
%24 = bitcast %ravi.TValue* %23 to %ravi.Table**
%25 = load %ravi.Table** %24, align 8, !tbaa !23
%raviarray.type_ptr = getelementptr inbounds %ravi.Table* %25, i64 0, i32 11, i32 1
%raviarray.type = load i32* %raviarray.type_ptr, align 4, !tbaa !24
%is.array.type = icmp eq i32 %raviarray.type, 3
br i1 %is.array.type, label %done, label %if.not.table
done: ; preds = %test.if.array
%26 = ptrtoint %ravi.Table* %25 to i64
%27 = bitcast %ravi.TValue* %22 to i64*
store i64 %26, i64* %27, align 8, !tbaa !15
%desttype4 = getelementptr inbounds %ravi.TValue* %22, i64 0, i32 1
store i32 69, i32* %desttype4, align 4, !tbaa !17
%sunkaddr13 = ptrtoint %ravi.lua_State* %L to i64
%sunkaddr14 = add i64 %sunkaddr13, 16
%sunkaddr15 = inttoptr i64 %sunkaddr14 to %ravi.TValue**
store %ravi.TValue* %22, %ravi.TValue** %sunkaddr15, align 8, !tbaa !20
%sizep = getelementptr inbounds %ravi.Proto* %4, i64 0, i32 10
%28 = load i32* %sizep, align 4, !tbaa !27
%29 = icmp sgt i32 %28, 0
br i1 %29, label %if.then, label %if.else
if.then: ; preds = %done
tail call void @luaF_close(%ravi.lua_State* %L, %ravi.TValue* %22)
br label %if.else
if.else: ; preds = %if.then, %done
%30 = tail call i32 @luaD_poscall(%ravi.lua_State* %L, %ravi.TValue* %22)
ret i32 1
}
; Function Attrs: nounwind
declare i32 @luaD_poscall(%ravi.lua_State*, %ravi.TValue*) #0
; Function Attrs: nounwind
declare i32 @luaD_precall(%ravi.lua_State*, %ravi.TValue*, i32) #0
; Function Attrs: nounwind
declare void @luaF_close(%ravi.lua_State*, %ravi.TValue*) #0
; Function Attrs: noreturn nounwind
declare void @luaG_runerror(%ravi.lua_State*, i8*) #1
; Function Attrs: nounwind
declare void @luaV_execute(%ravi.lua_State*) #0
; Function Attrs: nounwind
declare void @luaV_gettable(%ravi.lua_State*, %ravi.TValue*, %ravi.TValue*, %ravi.TValue*) #0
; Function Attrs: nounwind
declare void @raviV_op_newarrayint(%ravi.lua_State*, %ravi.CallInfo*, %ravi.TValue*) #0
; Function Attrs: nounwind
declare void @raviV_op_newtable(%ravi.lua_State*, %ravi.CallInfo*, %ravi.TValue*, i32, i32) #0
; Function Attrs: nounwind
declare void @raviV_op_setlist(%ravi.lua_State*, %ravi.CallInfo*, %ravi.TValue*, i32, i32) #0
attributes #0 = { nounwind }
attributes #1 = { noreturn nounwind }
!0 = !{!"CallInfo", !1, i64 0, !1, i64 4, !1, i64 8, !1, i64 12, !4, i64 16, !5, i64 32, !6, i64 40, !2, i64 42, !2, i64 43}
!1 = !{!"any pointer", !2, i64 0}
!2 = !{!"omnipotent char", !3, i64 0}
!3 = !{!"Simple C / C++ TBAA"}
!4 = !{!"CallInfo_l", !1, i64 0, !1, i64 4, !5, i64 8}
!5 = !{!"long long", !2, i64 0}
!6 = !{!"short", !2, i64 0}
!7 = !{!0, !1, i64 0}
!8 = !{!1, !1, i64 0}
!9 = !{!10, !1, i64 12}
!10 = !{!"LClosure", !1, i64 0, !2, i64 4, !2, i64 5, !2, i64 6, !1, i64 8, !1, i64 12, !1, i64 16}
!11 = !{!12, !1, i64 44}
!12 = !{!"Proto", !1, i64 0, !2, i64 4, !2, i64 5, !2, i64 6, !2, i64 7, !2, i64 8, !13, i64 12, !13, i64 16, !13, i64 20, !13, i64 24, !13, i64 28, !13, i64 32, !13, i64 36, !13, i64 40, !1, i64 44, !1, i64 48, !1, i64 52, !1, i64 56, !1, i64 60, !1, i64 64, !1, i64 68, !1, i64 72, !1, i64 76, !2, i64 80}
!13 = !{!"int", !2, i64 0}
!14 = !{!0, !1, i64 16}
!15 = !{!16, !5, i64 0}
!16 = !{!"TValue", !5, i64 0, !13, i64 8}
!17 = !{!16, !13, i64 8}
!18 = !{!19, !1, i64 0}
!19 = !{!"UpVal", !1, i64 0, !5, i64 8, !16, i64 16}
!20 = !{!21, !1, i64 8}
!21 = !{!"lua_State", !1, i64 0, !2, i64 4, !2, i64 5, !2, i64 6, !1, i64 8, !1, i64 12, !1, i64 16, !1, i64 20, !1, i64 24, !1, i64 28, !1, i64 32, !1, i64 36, !1, i64 40, !1, i64 44, !0, i64 48, !1, i64 92, !5, i64 96, !13, i64 104, !13, i64 108, !13, i64 112, !6, i64 114, !6, i64 116, !2, i64 118, !2, i64 119}
!22 = !{!0, !1, i64 4}
!23 = !{!16, !1, i64 0}
!24 = !{!25, !2, i64 36}
!25 = !{!"Table", !1, i64 0, !2, i64 4, !2, i64 5, !2, i64 6, !2, i64 7, !13, i64 8, !1, i64 12, !1, i64 16, !1, i64 20, !1, i64 24, !1, i64 28, !26, i64 32}
!26 = !{!"RaviArray", !1, i64 0, !2, i64 4, !13, i64 8, !13, i64 12}
!27 = !{!12, !13, i64 28}

@ -614,6 +614,9 @@ l_noret luaG_runerror (lua_State *L, const char *fmt, ...) {
luaG_errormsg(L);
}
void luaG_runerror1(lua_State *L, const char *msg) {
luaG_runerror(L, msg);
}
void luaG_traceexec (lua_State *L) {
CallInfo *ci = L->ci;

@ -462,6 +462,10 @@ RaviCodeGenerator::create_function(llvm::IRBuilder<> &builder,
return func;
}
void RaviCodeGenerator::emit_raise_lua_error(RaviFunctionDef *def, const char *str) {
def->builder->CreateCall2(def->luaG_runerrorF, def->L, def->builder->CreateGlobalStringPtr(str));
}
void RaviCodeGenerator::emit_extern_declarations(RaviFunctionDef *def) {
// Add extern declarations for Lua functions that we need to call
@ -483,6 +487,7 @@ void RaviCodeGenerator::emit_extern_declarations(RaviFunctionDef *def) {
def->luaG_runerrorF = def->raviF->addExternFunction(
def->types->luaG_runerrorT, reinterpret_cast<void *>(&luaG_runerror),
"luaG_runerror");
def->luaG_runerrorF->setDoesNotReturn();
def->luaV_equalobjF = def->raviF->addExternFunction(
def->types->luaV_equalobjT, reinterpret_cast<void *>(&luaV_equalobj),
"luaV_equalobj");

@ -264,10 +264,7 @@ void RaviCodeGenerator::emit_FORPREP2(RaviFunctionDef *def, llvm::Value *L_ci,
// Conversion failed, so raise error
def->builder->SetInsertPoint(else1_plimit_tonum_elsenum);
llvm::Value *errmsg1 =
def->builder->CreateGlobalString("'for' limit must be a number");
def->builder->CreateCall2(def->luaG_runerrorF, def->L,
emit_gep(def, "", errmsg1, 0, 0));
emit_raise_lua_error(def, "'for' limit must be a number");
def->builder->CreateBr(else1_pstep);
// Conversion OK
@ -312,9 +309,7 @@ void RaviCodeGenerator::emit_FORPREP2(RaviFunctionDef *def, llvm::Value *L_ci,
// If conversion failed raise error
def->builder->SetInsertPoint(else1_pstep_tonum_elsenum);
errmsg1 = def->builder->CreateGlobalString("'for' step must be a number");
def->builder->CreateCall2(def->luaG_runerrorF, def->L,
emit_gep(def, "", errmsg1, 0, 0));
emit_raise_lua_error(def, "'for' step must be a number");
def->builder->CreateBr(else1_pinit);
// Conversion okay so update pstep
@ -359,10 +354,7 @@ void RaviCodeGenerator::emit_FORPREP2(RaviFunctionDef *def, llvm::Value *L_ci,
// Conversion failed so raise error
def->builder->SetInsertPoint(else1_pinit_tonum_elsenum);
errmsg1 =
def->builder->CreateGlobalString("'for' initial value must be a number");
def->builder->CreateCall2(def->luaG_runerrorF, def->L,
emit_gep(def, "", errmsg1, 0, 0));
emit_raise_lua_error(def, "'for' initial value must be a number");
def->builder->CreateBr(else1_pdone);
// Conversion OK so we are nearly done
@ -599,10 +591,7 @@ void RaviCodeGenerator::emit_FORPREP(RaviFunctionDef *def, llvm::Value *L_ci,
// Conversion failed, so raise error
def->builder->SetInsertPoint(else1_plimit_tonum_elsenum);
llvm::Value *errmsg1 =
def->builder->CreateGlobalString("'for' limit must be a number");
def->builder->CreateCall2(def->luaG_runerrorF, def->L,
emit_gep(def, "", errmsg1, 0, 0));
emit_raise_lua_error(def, "'for' limit must be a number");
def->builder->CreateBr(else1_pstep);
// Conversion OK
@ -651,9 +640,7 @@ void RaviCodeGenerator::emit_FORPREP(RaviFunctionDef *def, llvm::Value *L_ci,
// If conversion failed raise error
def->builder->SetInsertPoint(else1_pstep_tonum_elsenum);
errmsg1 = def->builder->CreateGlobalString("'for' step must be a number");
def->builder->CreateCall2(def->luaG_runerrorF, def->L,
emit_gep(def, "", errmsg1, 0, 0));
emit_raise_lua_error(def, "'for' step must be a number");
def->builder->CreateBr(else1_pinit);
// Conversion okay so update pstep
@ -703,10 +690,7 @@ void RaviCodeGenerator::emit_FORPREP(RaviFunctionDef *def, llvm::Value *L_ci,
// Conversion failed so raise error
def->builder->SetInsertPoint(else1_pinit_tonum_elsenum);
errmsg1 =
def->builder->CreateGlobalString("'for' initial value must be a number");
def->builder->CreateCall2(def->luaG_runerrorF, def->L,
emit_gep(def, "", errmsg1, 0, 0));
emit_raise_lua_error(def, "'for' initial value must be a number");
def->builder->CreateBr(else1_pdone);
// Conversion OK so we are nearly done

@ -152,9 +152,7 @@ void RaviCodeGenerator::emit_MOVEI(RaviFunctionDef *def, llvm::Value *L_ci,
// Conversion failed, so raise error
def->builder->SetInsertPoint(else2);
llvm::Value *errmsg1 = def->builder->CreateGlobalString("integer expected");
def->builder->CreateCall2(def->luaG_runerrorF, def->L,
emit_gep(def, "", errmsg1, 0, 0));
emit_raise_lua_error(def, "integer expected");
def->builder->CreateBr(end1);
// Conversion OK
@ -226,9 +224,7 @@ void RaviCodeGenerator::emit_MOVEF(RaviFunctionDef *def, llvm::Value *L_ci,
// Conversion failed, so raise error
def->builder->SetInsertPoint(else2);
llvm::Value *errmsg1 = def->builder->CreateGlobalString("number expected");
def->builder->CreateCall2(def->luaG_runerrorF, def->L,
emit_gep(def, "", errmsg1, 0, 0));
emit_raise_lua_error(def, "number expected");
def->builder->CreateBr(end1);
// Conversion OK
@ -290,9 +286,7 @@ void RaviCodeGenerator::emit_TOINT(RaviFunctionDef *def, llvm::Value *L_ci,
def->builder->SetInsertPoint(then2);
// Conversion failed, so raise error
llvm::Value *errmsg1 = def->builder->CreateGlobalString("integer expected");
def->builder->CreateCall2(def->luaG_runerrorF, def->L,
emit_gep(def, "", errmsg1, 0, 0));
emit_raise_lua_error(def, "integer expected");
def->builder->CreateBr(else2);
// Conversion OK
@ -357,9 +351,7 @@ void RaviCodeGenerator::emit_TOFLT(RaviFunctionDef *def, llvm::Value *L_ci,
def->builder->SetInsertPoint(then2);
// Conversion failed, so raise error
llvm::Value *errmsg1 = def->builder->CreateGlobalString("number expected");
def->builder->CreateCall2(def->luaG_runerrorF, def->L,
emit_gep(def, "", errmsg1, 0, 0));
emit_raise_lua_error(def, "number expected");
def->builder->CreateBr(else2);
// Conversion OK

@ -121,10 +121,7 @@ void RaviCodeGenerator::emit_GETTABLE_AF(RaviFunctionDef *def,
def->f->getBasicBlockList().push_back(else_block);
def->builder->SetInsertPoint(else_block);
llvm::Value *errmsg1 =
def->builder->CreateGlobalString("array out of bounds");
def->builder->CreateCall2(def->luaG_runerrorF, def->L,
emit_gep(def, "out_of_bounds_msg", errmsg1, 0, 0));
emit_raise_lua_error(def, "array out of bounds");
def->builder->CreateBr(end_block);
def->f->getBasicBlockList().push_back(end_block);
@ -182,10 +179,7 @@ void RaviCodeGenerator::emit_GETTABLE_AI(RaviFunctionDef *def,
def->f->getBasicBlockList().push_back(else_block);
def->builder->SetInsertPoint(else_block);
llvm::Value *errmsg1 =
def->builder->CreateGlobalString("array out of bounds");
def->builder->CreateCall2(def->luaG_runerrorF, def->L,
emit_gep(def, "out_of_bounds_msg", errmsg1, 0, 0));
emit_raise_lua_error(def, "array out of bounds");
def->builder->CreateBr(end_block);
def->f->getBasicBlockList().push_back(end_block);
@ -516,9 +510,7 @@ llvm::Instruction *RaviCodeGenerator::emit_TOARRAY(RaviFunctionDef *def,
def->builder->SetInsertPoint(raise_error);
// Conversion failed, so raise error
llvm::Value *errmsg1 = def->builder->CreateGlobalString(errmsg);
def->builder->CreateCall2(def->luaG_runerrorF, def->L,
emit_gep(def, "", errmsg1, 0, 0));
emit_raise_lua_error(def, errmsg);
def->builder->CreateBr(done);
def->f->getBasicBlockList().push_back(else1);

@ -726,7 +726,7 @@ LuaLLVMTypes::LuaLLVMTypes(llvm::LLVMContext &context) : mdbuilder(context) {
elements.push_back(plua_StateT);
elements.push_back(C_pcharT);
luaG_runerrorT =
llvm::FunctionType::get(llvm::Type::getVoidTy(context), elements, true);
llvm::FunctionType::get(llvm::Type::getVoidTy(context), elements, false);
elements.clear();
elements.push_back(pTValueT);

@ -117,6 +117,18 @@ RaviJITFunctionImpl::RaviJITFunctionImpl(
#endif
function_ = llvm::Function::Create(type, linkage, name, module_);
// function_->addFnAttr(llvm::Attribute::StackProtectReq);
#if defined(_WIN32)
// For some reason on Windows we get inaligned stack
// error when calling longjmp - following appears to help in at
// least one test case
//llvm::AttrBuilder attr;
//attr.addStackAlignmentAttr(16);
//function_->addAttributes(
// llvm::AttributeSet::FunctionIndex,
// llvm::AttributeSet::get(owner_->context(),
// llvm::AttributeSet::FunctionIndex, attr));
#endif
std::string errStr;
#if LLVM_VERSION_MINOR > 5
// LLVM 3.6.0 change
@ -217,6 +229,8 @@ void *RaviJITFunctionImpl::compile() {
std::unique_ptr<llvm::PassManager> MPM(new llvm::PassManager());
#if LLVM_VERSION_MINOR > 5
MPM->add(new llvm::DataLayoutPass());
#else
MPM->add(new llvm::DataLayoutPass(*engine_->getDataLayout()));
#endif
pmb.populateModulePassManager(*MPM);
MPM->run(*module_);
@ -238,11 +252,12 @@ void *RaviJITFunctionImpl::compile() {
return ptr_;
}
llvm::Constant *
llvm::Function *
RaviJITFunctionImpl::addExternFunction(llvm::FunctionType *type, void *address,
const std::string &name) {
llvm::Function *f = llvm::Function::Create(
type, llvm::Function::ExternalLinkage, name, module_);
f->setDoesNotThrow();
// We should have been able to call
// engine_->addGlobalMapping() but this doesn't work
// See http://lists.cs.uiuc.edu/pipermail/llvmdev/2014-April/071856.html
@ -312,9 +327,9 @@ int raviV_compile(struct lua_State *L, struct Proto *p, int manual_request) {
return 0;
}
#if 0
if (G->ravi_state->jit->is_auto() || manual_request)
bool doCompile = (G->ravi_state->jit->is_auto() || (bool)manual_request);
#else
bool doCompile = manual_request != 0;
bool doCompile = (bool)manual_request;
if (!doCompile && G->ravi_state->jit->is_auto()) {
if (p->ravi_jit.jit_flags != 0) /* loop */
doCompile = true;
@ -327,9 +342,11 @@ int raviV_compile(struct lua_State *L, struct Proto *p, int manual_request) {
doCompile = true;
}
}
if (doCompile)
#endif
G->ravi_state->code_generator->compile(L, p);
//if (manual_request)
// printf("do compile %d\n", (int)doCompile);
if (doCompile)
G->ravi_state->code_generator->compile(L, p);
return p->ravi_jit.jit_status == 2;
}

Loading…
Cancel
Save