LLVM changed IRBuilder interface so need to adapt to the changes

pull/81/head
Dibyendu Majumdar 9 years ago
parent 3673805833
commit 05743889b2

@ -1,7 +1,7 @@
Ravi Programming Language
=========================
Ravi is an experimental derivative/dialect of Lua. Ravi is a Sanskrit word that means the Sun.
Ravi is an experimental derivative/dialect of `Lua 5.3 <http://www.lua.org/>`_, with limited optional static typing and an LLVM based JIT compiler. Ravi is a Sanskrit word that means the Sun.
Lua is perfect as a small embeddable dynamic language. So why a derivative? The reason is primarily to extend Lua with static typing for greater performance. However, at the same time maintain full compatibility with standard Lua.
@ -129,14 +129,14 @@ The build is CMake based. As of Feb 2015 LLVM is a dependency. LLVM 3.5.1, 3.6.0
Building LLVM on Windows
------------------------
I built LLVM 3.7.0 from source. I used the following sequence from the VS2013 command window::
I built LLVM 3.7.0 from source. I used the following sequence from the VS2015 command window::
cd \github\llvm
mkdir build
cd build
cmake -DCMAKE_INSTALL_PREFIX=c:\LLVM -DLLVM_TARGETS_TO_BUILD="X86" -G "Visual Studio 12 Win64" ..
cmake -DCMAKE_INSTALL_PREFIX=c:\LLVM37 -DLLVM_TARGETS_TO_BUILD="X86" -G "Visual Studio 14 Win64" ..
I then opened the generated solution in VS2013 and performed a INSTALL build from there.
I then opened the generated solution in VS2015 and performed a INSTALL build from there.
Note that if you perform a Release build of LLVM then you will also need to do a Release build of Ravi otherwise you will get link errors.
Building LLVM on Ubuntu
@ -158,14 +158,14 @@ Assuming that LLVM source has been extracted to ``$HOME/llvm-3.6.0.src`` I follo
Building Ravi
-------------
I am developing Ravi using Visual Studio 2013 Community Edition on Windows 8.1 64bit, gcc on Unbuntu 64-bit, and clang/Xcode on MAC OS X.
I am developing Ravi using Visual Studio 2015 Community Edition on Windows 8.1 64bit, gcc on Unbuntu 64-bit, and clang/Xcode on MAC OS X.
Assuming that LLVM has been installed as described above, then on Windows I invoke the cmake config as follows::
cd build
cmake -DLLVM_DIR=c:\LLVM\share\llvm\cmake -G "Visual Studio 12 Win64" ..
cmake -DLLVM_DIR=c:\LLVM37\share\llvm\cmake -G "Visual Studio 14 Win64" ..
I then open the solution in VS2013 and do a Debug build from there.
I then open the solution in VS2015 and do a build from there.
On Ubuntu I use::
@ -197,9 +197,9 @@ Also see section above on available API for dumping either Lua bytecode or LLVM
Work Plan
---------
* Feb-May 2015 - implement JIT compilation using LLVM
* June-Sep 2015 - testing and JIT compilation using libgccjit
* Oct 2015 - beta release
* Feb-June 2015 - implement JIT compilation using LLVM
* June-Nov 2015 - testing and create libraries
* Dec 2015 - beta release
License
-------

@ -549,6 +549,19 @@ public:
std::unique_ptr<RaviJITFunctionImpl>
create_function(llvm::IRBuilder<> &builder, RaviFunctionDef *def);
llvm::CallInst *CreateCall2(llvm::IRBuilder<> *builder, llvm::Value *func,
llvm::Value *arg1, llvm::Value *arg2);
llvm::CallInst *CreateCall3(llvm::IRBuilder<> *builder, llvm::Value *func,
llvm::Value *arg1, llvm::Value *arg2,
llvm::Value *arg3);
llvm::CallInst *CreateCall4(llvm::IRBuilder<> *builder, llvm::Value *func,
llvm::Value *arg1, llvm::Value *arg2,
llvm::Value *arg3, llvm::Value *arg4);
llvm::CallInst *CreateCall5(llvm::IRBuilder<> *builder, llvm::Value *func,
llvm::Value *arg1, llvm::Value *arg2,
llvm::Value *arg3, llvm::Value *arg4,
llvm::Value *arg5);
void emit_raise_lua_error(RaviFunctionDef *def, const char *str);
// Add extern declarations for Lua functions we need to call

@ -1,7 +1,7 @@
Ravi Programming Language
=========================
Ravi is an experimental derivative/dialect of Lua. Ravi is a Sanskrit word that means the Sun.
Ravi is an experimental derivative/dialect of `Lua 5.3 <http://www.lua.org/>`_, with limited optional static typing and an LLVM based JIT compiler. Ravi is a Sanskrit word that means the Sun.
Lua is perfect as a small embeddable dynamic language. So why a derivative? The reason is primarily to extend Lua with static typing for greater performance. However, at the same time maintain full compatibility with standard Lua.
@ -129,14 +129,14 @@ The build is CMake based. As of Feb 2015 LLVM is a dependency. LLVM 3.5.1, 3.6.0
Building LLVM on Windows
------------------------
I built LLVM 3.7.0 from source. I used the following sequence from the VS2013 command window::
I built LLVM 3.7.0 from source. I used the following sequence from the VS2015 command window::
cd \github\llvm
mkdir build
cd build
cmake -DCMAKE_INSTALL_PREFIX=c:\LLVM -DLLVM_TARGETS_TO_BUILD="X86" -G "Visual Studio 12 Win64" ..
cmake -DCMAKE_INSTALL_PREFIX=c:\LLVM37 -DLLVM_TARGETS_TO_BUILD="X86" -G "Visual Studio 14 Win64" ..
I then opened the generated solution in VS2013 and performed a INSTALL build from there.
I then opened the generated solution in VS2015 and performed a INSTALL build from there.
Note that if you perform a Release build of LLVM then you will also need to do a Release build of Ravi otherwise you will get link errors.
Building LLVM on Ubuntu
@ -158,14 +158,14 @@ Assuming that LLVM source has been extracted to ``$HOME/llvm-3.6.0.src`` I follo
Building Ravi
-------------
I am developing Ravi using Visual Studio 2013 Community Edition on Windows 8.1 64bit, gcc on Unbuntu 64-bit, and clang/Xcode on MAC OS X.
I am developing Ravi using Visual Studio 2015 Community Edition on Windows 8.1 64bit, gcc on Unbuntu 64-bit, and clang/Xcode on MAC OS X.
Assuming that LLVM has been installed as described above, then on Windows I invoke the cmake config as follows::
cd build
cmake -DLLVM_DIR=c:\LLVM\share\llvm\cmake -G "Visual Studio 12 Win64" ..
cmake -DLLVM_DIR=c:\LLVM37\share\llvm\cmake -G "Visual Studio 14 Win64" ..
I then open the solution in VS2013 and do a Debug build from there.
I then open the solution in VS2015 and do a build from there.
On Ubuntu I use::
@ -197,9 +197,9 @@ Also see section above on available API for dumping either Lua bytecode or LLVM
Work Plan
---------
* Feb-May 2015 - implement JIT compilation using LLVM
* June-Sep 2015 - testing and JIT compilation using libgccjit
* Oct 2015 - beta release
* Feb-June 2015 - implement JIT compilation using LLVM
* June-Nov 2015 - testing and create libraries
* Dec 2015 - beta release
License
-------

@ -127,7 +127,7 @@ void RaviCodeGenerator::emit_ARITH(RaviFunctionDef *def, llvm::Value *L_ci,
// Call luaV_tonumber_()
llvm::Value *rb_isnum =
def->builder->CreateCall2(def->luaV_tonumberF, rb, nb);
CreateCall2(def->builder, def->luaV_tonumberF, rb, nb);
cmp1 =
def->builder->CreateICmpEQ(rb_isnum, def->types->kInt[1], "rb.float.ok");
@ -165,7 +165,7 @@ void RaviCodeGenerator::emit_ARITH(RaviFunctionDef *def, llvm::Value *L_ci,
// Call luaV_tonumber_()
llvm::Value *rc_isnum =
def->builder->CreateCall2(def->luaV_tonumberF, rc, nc);
CreateCall2(def->builder, def->luaV_tonumberF, rc, nc);
cmp1 =
def->builder->CreateICmpEQ(rc_isnum, def->types->kInt[1], "rc.float.ok");
@ -216,8 +216,8 @@ void RaviCodeGenerator::emit_ARITH(RaviFunctionDef *def, llvm::Value *L_ci,
def->f->getBasicBlockList().push_back(try_meta);
def->builder->SetInsertPoint(try_meta);
def->builder->CreateCall5(def->luaT_trybinTMF, def->L, rb, rc, ra,
def->types->kInt[tms]);
CreateCall5(def->builder, def->luaT_trybinTMF, def->L, rb, rc, ra,
def->types->kInt[tms]);
def->builder->CreateBr(done_block);
def->f->getBasicBlockList().push_back(done_block);
@ -281,7 +281,7 @@ void RaviCodeGenerator::emit_MOD(RaviFunctionDef *def, llvm::Value *L_ci,
llvm::Instruction *rhs = emit_load_reg_i(def, rc);
llvm::Value *result =
def->builder->CreateCall3(def->luaV_modF, def->L, lhs, rhs);
CreateCall3(def->builder, def->luaV_modF, def->L, lhs, rhs);
emit_store_reg_i(def, result, ra);
emit_store_type(def, ra, LUA_TNUMINT);
@ -311,7 +311,7 @@ void RaviCodeGenerator::emit_MOD(RaviFunctionDef *def, llvm::Value *L_ci,
// Call luaV_tonumber_()
llvm::Value *rb_isnum =
def->builder->CreateCall2(def->luaV_tonumberF, rb, nb);
CreateCall2(def->builder, def->luaV_tonumberF, rb, nb);
cmp1 =
def->builder->CreateICmpEQ(rb_isnum, def->types->kInt[1], "rb.float.ok");
@ -349,7 +349,7 @@ void RaviCodeGenerator::emit_MOD(RaviFunctionDef *def, llvm::Value *L_ci,
// Call luaV_tonumber_()
llvm::Value *rc_isnum =
def->builder->CreateCall2(def->luaV_tonumberF, rc, nc);
CreateCall2(def->builder, def->luaV_tonumberF, rc, nc);
cmp1 =
def->builder->CreateICmpEQ(rc_isnum, def->types->kInt[1], "rc.float.ok");
@ -372,7 +372,7 @@ void RaviCodeGenerator::emit_MOD(RaviFunctionDef *def, llvm::Value *L_ci,
lhs = emit_load_local_n(def, nb);
rhs = emit_load_local_n(def, nc);
llvm::Value *fmod_result = def->builder->CreateCall2(def->fmodFunc, lhs, rhs);
llvm::Value *fmod_result = CreateCall2(def->builder, def->fmodFunc, lhs, rhs);
// if ((m)*(b) < 0) (m) += (b);
llvm::Value *mb = def->builder->CreateFMul(fmod_result, rhs);
@ -414,8 +414,8 @@ void RaviCodeGenerator::emit_MOD(RaviFunctionDef *def, llvm::Value *L_ci,
def->f->getBasicBlockList().push_back(try_meta);
def->builder->SetInsertPoint(try_meta);
def->builder->CreateCall5(def->luaT_trybinTMF, def->L, rb, rc, ra,
def->types->kInt[TM_MOD]);
CreateCall5(def->builder, def->luaT_trybinTMF, def->L, rb, rc, ra,
def->types->kInt[TM_MOD]);
def->builder->CreateBr(done_block);
def->f->getBasicBlockList().push_back(done_block);
@ -477,7 +477,7 @@ void RaviCodeGenerator::emit_IDIV(RaviFunctionDef *def, llvm::Value *L_ci,
llvm::Instruction *rhs = emit_load_reg_i(def, rc);
llvm::Value *result =
def->builder->CreateCall3(def->luaV_divF, def->L, lhs, rhs);
CreateCall3(def->builder, def->luaV_divF, def->L, lhs, rhs);
emit_store_reg_i(def, result, ra);
emit_store_type(def, ra, LUA_TNUMINT);
@ -507,7 +507,7 @@ void RaviCodeGenerator::emit_IDIV(RaviFunctionDef *def, llvm::Value *L_ci,
// Call luaV_tonumber_()
llvm::Value *rb_isnum =
def->builder->CreateCall2(def->luaV_tonumberF, rb, nb);
CreateCall2(def->builder, def->luaV_tonumberF, rb, nb);
cmp1 =
def->builder->CreateICmpEQ(rb_isnum, def->types->kInt[1], "rb.float.ok");
@ -545,7 +545,7 @@ void RaviCodeGenerator::emit_IDIV(RaviFunctionDef *def, llvm::Value *L_ci,
// Call luaV_tonumber_()
llvm::Value *rc_isnum =
def->builder->CreateCall2(def->luaV_tonumberF, rc, nc);
CreateCall2(def->builder, def->luaV_tonumberF, rc, nc);
cmp1 =
def->builder->CreateICmpEQ(rc_isnum, def->types->kInt[1], "rc.float.ok");
@ -580,8 +580,8 @@ void RaviCodeGenerator::emit_IDIV(RaviFunctionDef *def, llvm::Value *L_ci,
def->f->getBasicBlockList().push_back(try_meta);
def->builder->SetInsertPoint(try_meta);
def->builder->CreateCall5(def->luaT_trybinTMF, def->L, rb, rc, ra,
def->types->kInt[TM_MOD]);
CreateCall5(def->builder, def->luaT_trybinTMF, def->L, rb, rc, ra,
def->types->kInt[TM_MOD]);
def->builder->CreateBr(done_block);
def->f->getBasicBlockList().push_back(done_block);
@ -639,7 +639,7 @@ void RaviCodeGenerator::emit_POW(RaviFunctionDef *def, llvm::Value *L_ci,
// Call luaV_tonumber_()
llvm::Value *rb_isnum =
def->builder->CreateCall2(def->luaV_tonumberF, rb, nb);
CreateCall2(def->builder, def->luaV_tonumberF, rb, nb);
cmp1 =
def->builder->CreateICmpEQ(rb_isnum, def->types->kInt[1], "rb.float.ok");
@ -677,7 +677,7 @@ void RaviCodeGenerator::emit_POW(RaviFunctionDef *def, llvm::Value *L_ci,
// Call luaV_tonumber_()
llvm::Value *rc_isnum =
def->builder->CreateCall2(def->luaV_tonumberF, rc, nc);
CreateCall2(def->builder, def->luaV_tonumberF, rc, nc);
cmp1 =
def->builder->CreateICmpEQ(rc_isnum, def->types->kInt[1], "rc.float.ok");
@ -700,7 +700,7 @@ void RaviCodeGenerator::emit_POW(RaviFunctionDef *def, llvm::Value *L_ci,
llvm::Instruction *lhs = emit_load_local_n(def, nb);
llvm::Instruction *rhs = emit_load_local_n(def, nc);
llvm::Value *pow_result = def->builder->CreateCall2(def->powFunc, lhs, rhs);
llvm::Value *pow_result = CreateCall2(def->builder, def->powFunc, lhs, rhs);
emit_store_reg_n(def, pow_result, ra);
emit_store_type(def, ra, LUA_TNUMFLT);
@ -711,8 +711,8 @@ void RaviCodeGenerator::emit_POW(RaviFunctionDef *def, llvm::Value *L_ci,
def->f->getBasicBlockList().push_back(try_meta);
def->builder->SetInsertPoint(try_meta);
def->builder->CreateCall5(def->luaT_trybinTMF, def->L, rb, rc, ra,
def->types->kInt[TM_POW]);
CreateCall5(def->builder, def->luaT_trybinTMF, def->L, rb, rc, ra,
def->types->kInt[TM_POW]);
def->builder->CreateBr(done_block);
def->f->getBasicBlockList().push_back(done_block);
@ -776,8 +776,8 @@ void RaviCodeGenerator::emit_UNM(RaviFunctionDef *def, llvm::Value *L_ci,
def->builder->SetInsertPoint(else_block);
// Is RB a float?
cmp1 = def->builder->CreateICmpEQ(
rb_type, def->types->kInt[LUA_TNUMFLT], "rb.is.float");
cmp1 = def->builder->CreateICmpEQ(rb_type, def->types->kInt[LUA_TNUMFLT],
"rb.is.float");
llvm::BasicBlock *convert_rb =
llvm::BasicBlock::Create(def->jitState->context(), "convert.rb");
@ -793,7 +793,7 @@ void RaviCodeGenerator::emit_UNM(RaviFunctionDef *def, llvm::Value *L_ci,
// Call luaV_tonumber_()
llvm::Value *rb_isnum =
def->builder->CreateCall2(def->luaV_tonumberF, rb, nb);
CreateCall2(def->builder, def->luaV_tonumberF, rb, nb);
cmp1 =
def->builder->CreateICmpEQ(rb_isnum, def->types->kInt[1], "rb.float.ok");
@ -826,8 +826,8 @@ void RaviCodeGenerator::emit_UNM(RaviFunctionDef *def, llvm::Value *L_ci,
def->f->getBasicBlockList().push_back(try_meta);
def->builder->SetInsertPoint(try_meta);
def->builder->CreateCall5(def->luaT_trybinTMF, def->L, rb, rb, ra,
def->types->kInt[TM_UNM]);
CreateCall5(def->builder, def->luaT_trybinTMF, def->L, rb, rb, ra,
def->types->kInt[TM_UNM]);
def->builder->CreateBr(done_block);
def->f->getBasicBlockList().push_back(done_block);

@ -47,7 +47,7 @@ void RaviCodeGenerator::emit_JMP(RaviFunctionDef *def, int A, int j) {
// base + a - 1
llvm::Value *val = emit_gep_ra(def, base, A - 1);
// Call luaF_close
def->builder->CreateCall2(def->luaF_closeF, def->L, val);
CreateCall2(def->builder, def->luaF_closeF, def->L, val);
}
def->builder->CreateBr(def->jmp_targets[j].jmp1);
@ -89,9 +89,9 @@ void RaviCodeGenerator::emit_CALL(RaviFunctionDef *def, llvm::Value *L_ci,
// int c = luaD_precall(L, ra, nresults); /* C or JITed function? */
llvm::Value *ra = emit_gep_ra(def, base_ptr, A);
llvm::Value *precall_result = def->builder->CreateCall3(
def->luaD_precallF, def->L, ra,
llvm::ConstantInt::get(def->types->C_intT, nresults));
llvm::Value *precall_result =
CreateCall3(def->builder, def->luaD_precallF, def->L, ra,
llvm::ConstantInt::get(def->types->C_intT, nresults));
llvm::Value *precall_bool =
def->builder->CreateICmpEQ(precall_result, def->types->kInt[0]);

@ -39,6 +39,54 @@ const char *RaviCodeGenerator::unique_function_name() {
return temp_;
}
llvm::CallInst *RaviCodeGenerator::CreateCall2(llvm::IRBuilder<> *builder,
llvm::Value *func,
llvm::Value *arg1,
llvm::Value *arg2) {
llvm::SmallVector<llvm::Value *, 2> values;
values.push_back(arg1);
values.push_back(arg2);
return builder->CreateCall(func, values);
}
llvm::CallInst *RaviCodeGenerator::CreateCall3(llvm::IRBuilder<> *builder,
llvm::Value *func,
llvm::Value *arg1,
llvm::Value *arg2,
llvm::Value *arg3) {
llvm::SmallVector<llvm::Value *, 2> values;
values.push_back(arg1);
values.push_back(arg2);
values.push_back(arg3);
return builder->CreateCall(func, values);
}
llvm::CallInst *
RaviCodeGenerator::CreateCall4(llvm::IRBuilder<> *builder, llvm::Value *func,
llvm::Value *arg1, llvm::Value *arg2,
llvm::Value *arg3, llvm::Value *arg4) {
llvm::SmallVector<llvm::Value *, 2> values;
values.push_back(arg1);
values.push_back(arg2);
values.push_back(arg3);
values.push_back(arg4);
return builder->CreateCall(func, values);
}
llvm::CallInst *
RaviCodeGenerator::CreateCall5(llvm::IRBuilder<> *builder, llvm::Value *func,
llvm::Value *arg1, llvm::Value *arg2,
llvm::Value *arg3, llvm::Value *arg4,
llvm::Value *arg5) {
llvm::SmallVector<llvm::Value *, 2> values;
values.push_back(arg1);
values.push_back(arg2);
values.push_back(arg3);
values.push_back(arg4);
values.push_back(arg5);
return builder->CreateCall(func, values);
}
llvm::Value *RaviCodeGenerator::emit_gep(RaviFunctionDef *def, const char *name,
llvm::Value *s, int arg1, int arg2) {
llvm::SmallVector<llvm::Value *, 2> values;
@ -464,8 +512,8 @@ RaviCodeGenerator::create_function(llvm::IRBuilder<> &builder,
void RaviCodeGenerator::emit_raise_lua_error(RaviFunctionDef *def,
const char *str) {
def->builder->CreateCall2(def->luaG_runerrorF, def->L,
def->builder->CreateGlobalStringPtr(str));
CreateCall2(def->builder, def->luaG_runerrorF, def->L,
def->builder->CreateGlobalStringPtr(str));
}
void RaviCodeGenerator::emit_extern_declarations(RaviFunctionDef *def) {
@ -684,7 +732,8 @@ RaviCodeGenerator::emit_gep_upval_value(RaviFunctionDef *def,
return emit_gep(def, "value", pupval, 0, 2);
}
void RaviCodeGenerator::compile(lua_State *L, Proto *p, bool doDump, bool doVerify) {
void RaviCodeGenerator::compile(lua_State *L, Proto *p, bool doDump,
bool doVerify) {
if (p->ravi_jit.jit_status != 0 || !canCompile(p))
return;

@ -50,7 +50,7 @@ void RaviCodeGenerator::emit_EQ(RaviFunctionDef *def, llvm::Value *L_ci,
// Call luaV_equalobj with register B and C
llvm::Value *result =
def->builder->CreateCall3(callee, def->L, lhs_ptr, rhs_ptr);
CreateCall3(def->builder, callee, def->L, lhs_ptr, rhs_ptr);
// Test if result is equal to operand A
llvm::Value *result_eq_A = def->builder->CreateICmpEQ(
result, llvm::ConstantInt::get(def->types->C_intT, A));
@ -76,7 +76,7 @@ void RaviCodeGenerator::emit_EQ(RaviFunctionDef *def, llvm::Value *L_ci,
jA == 1 ? base_ptr : emit_array_get(def, base_ptr, jA - 1);
// Call luaF_close
def->builder->CreateCall2(def->luaF_closeF, def->L, val);
CreateCall2(def->builder, def->luaF_closeF, def->L, val);
}
// Do the jump
def->builder->CreateBr(def->jmp_targets[j].jmp1);
@ -135,8 +135,7 @@ llvm::Value *RaviCodeGenerator::emit_boolean_testfalse(RaviFunctionDef *def,
if (donot) {
auto ins = emit_load_local_int(def, var);
result = def->builder->CreateNot(ins);
}
else {
} else {
auto ins = emit_load_local_int(def, var);
result = ins;
}
@ -183,7 +182,7 @@ void RaviCodeGenerator::emit_TEST(RaviFunctionDef *def, llvm::Value *L_ci,
jA == 1 ? base_ptr : emit_array_get(def, base_ptr, jA - 1);
// Call luaF_close
def->builder->CreateCall2(def->luaF_closeF, def->L, val);
CreateCall2(def->builder, def->luaF_closeF, def->L, val);
}
// Do the jump
def->builder->CreateBr(def->jmp_targets[j].jmp1);
@ -195,7 +194,7 @@ void RaviCodeGenerator::emit_TEST(RaviFunctionDef *def, llvm::Value *L_ci,
}
void RaviCodeGenerator::emit_NOT(RaviFunctionDef *def, llvm::Value *L_ci,
llvm::Value *proto, int A, int B) {
llvm::Value *proto, int A, int B) {
// case OP_NOT: {
// TValue *rb = RB(i);
// int res = l_isfalse(rb); /* next assignment may change this value */
@ -257,7 +256,7 @@ void RaviCodeGenerator::emit_TESTSET(RaviFunctionDef *def, llvm::Value *L_ci,
jA == 1 ? base_ptr : emit_array_get(def, base_ptr, jA - 1);
// Call luaF_close
def->builder->CreateCall2(def->luaF_closeF, def->L, val);
CreateCall2(def->builder, def->luaF_closeF, def->L, val);
}
// Do the jump
def->builder->CreateBr(def->jmp_targets[j].jmp1);

@ -115,8 +115,8 @@ void RaviCodeGenerator::emit_FORPREP2(RaviFunctionDef *def, llvm::Value *L_ci,
// Call forlimit()
llvm::Value *forlimit_ret =
def->builder->CreateCall4(def->luaV_forlimitF, plimit,
forloop_target.ilimit, pstep_ivalue, stopnow);
CreateCall4(def->builder, def->luaV_forlimitF, plimit,
forloop_target.ilimit, pstep_ivalue, stopnow);
// Is init->tt == LUA_TNUMINT && pstep->tt == LUA_TNUMINT
llvm::Value *and1 =
@ -200,7 +200,7 @@ void RaviCodeGenerator::emit_FORPREP2(RaviFunctionDef *def, llvm::Value *L_ci,
def->builder->CreateStore(
llvm::BlockAddress::get(def->f, forloop_target.jmp1),
forloop_target.forloop_branch);
def->builder->CreateBr(b3);
def->f->getBasicBlockList().push_back(b2);
@ -227,7 +227,7 @@ void RaviCodeGenerator::emit_FORPREP2(RaviFunctionDef *def, llvm::Value *L_ci,
// ************ PLIMIT - Convert plimit to float
llvm::Instruction *plimit_tt = emit_load_type(def, plimit);
// Test if already a float
cmp1 = def->builder->CreateICmpEQ(plimit_tt, def->types->kInt[LUA_TNUMFLT],
"limit.is.float");
@ -251,8 +251,8 @@ void RaviCodeGenerator::emit_FORPREP2(RaviFunctionDef *def, llvm::Value *L_ci,
def->f->getBasicBlockList().push_back(else1_plimit_elsenum);
def->builder->SetInsertPoint(else1_plimit_elsenum);
// Call luaV_tonumber_()
llvm::Value *plimit_isnum = def->builder->CreateCall2(
def->luaV_tonumberF, plimit, forloop_target.flimit);
llvm::Value *plimit_isnum = CreateCall2(def->builder, def->luaV_tonumberF,
plimit, forloop_target.flimit);
llvm::Value *plimit_isnum_bool = def->builder->CreateICmpEQ(
plimit_isnum, def->types->kInt[0], "limit.float.ok");
@ -298,8 +298,8 @@ void RaviCodeGenerator::emit_FORPREP2(RaviFunctionDef *def, llvm::Value *L_ci,
def->builder->SetInsertPoint(else1_pstep_elsenum);
// call luaV_tonumber_()
llvm::Value *pstep_isnum = def->builder->CreateCall2(
def->luaV_tonumberF, pstep, forloop_target.fstep);
llvm::Value *pstep_isnum = CreateCall2(def->builder, def->luaV_tonumberF,
pstep, forloop_target.fstep);
llvm::Value *pstep_isnum_bool = def->builder->CreateICmpEQ(
pstep_isnum, def->types->kInt[0], "step.float.ok");
llvm::BasicBlock *else1_pstep_tonum_elsenum = llvm::BasicBlock::Create(
@ -344,7 +344,7 @@ void RaviCodeGenerator::emit_FORPREP2(RaviFunctionDef *def, llvm::Value *L_ci,
// Call luaV_tonumber_()
llvm::Value *pinit_isnum =
def->builder->CreateCall2(def->luaV_tonumberF, init, forloop_target.fidx);
CreateCall2(def->builder, def->luaV_tonumberF, init, forloop_target.fidx);
llvm::Value *pinit_isnum_bool = def->builder->CreateICmpEQ(
pinit_isnum, def->types->kInt[0], "init.float.ok");
llvm::BasicBlock *else1_pinit_tonum_elsenum = llvm::BasicBlock::Create(
@ -360,10 +360,8 @@ void RaviCodeGenerator::emit_FORPREP2(RaviFunctionDef *def, llvm::Value *L_ci,
// Conversion OK so we are nearly done
def->f->getBasicBlockList().push_back(else1_pdone);
def->builder->SetInsertPoint(else1_pdone);
llvm::Instruction *ninit_load =
emit_load_local_n(def, forloop_target.fidx);
llvm::Instruction *nstep_load =
emit_load_local_n(def, forloop_target.fstep);
llvm::Instruction *ninit_load = emit_load_local_n(def, forloop_target.fidx);
llvm::Instruction *nstep_load = emit_load_local_n(def, forloop_target.fstep);
// setfltvalue(init, luai_numsub(L, ninit, nstep));
llvm::Value *init_n =
@ -475,8 +473,8 @@ void RaviCodeGenerator::emit_FORPREP(RaviFunctionDef *def, llvm::Value *L_ci,
llvm::Instruction *pstep_ivalue = emit_load_reg_i(def, pstep);
// Call forlimit()
llvm::Value *forlimit_ret = def->builder->CreateCall4(
def->luaV_forlimitF, plimit, ilimit, pstep_ivalue, stopnow);
llvm::Value *forlimit_ret = CreateCall4(
def->builder, def->luaV_forlimitF, plimit, ilimit, pstep_ivalue, stopnow);
// init->tt_ == LUA_TNUMINT && pstep->tt_ == LUA_TNUMINT
llvm::Value *and1 =
@ -579,7 +577,7 @@ void RaviCodeGenerator::emit_FORPREP(RaviFunctionDef *def, llvm::Value *L_ci,
def->builder->SetInsertPoint(else1_plimit_elsenum);
// Call luaV_tonumber_()
llvm::Value *plimit_isnum =
def->builder->CreateCall2(def->luaV_tonumberF, plimit, nlimit);
CreateCall2(def->builder, def->luaV_tonumberF, plimit, nlimit);
llvm::Value *plimit_isnum_bool = def->builder->CreateICmpEQ(
plimit_isnum, def->types->kInt[0], "limit.float.ok");
@ -630,7 +628,7 @@ void RaviCodeGenerator::emit_FORPREP(RaviFunctionDef *def, llvm::Value *L_ci,
// call luaV_tonumber_()
llvm::Value *pstep_isnum =
def->builder->CreateCall2(def->luaV_tonumberF, pstep, nstep);
CreateCall2(def->builder, def->luaV_tonumberF, pstep, nstep);
llvm::Value *pstep_isnum_bool = def->builder->CreateICmpEQ(
pstep_isnum, def->types->kInt[0], "step.float.ok");
llvm::BasicBlock *else1_pstep_tonum_elsenum = llvm::BasicBlock::Create(
@ -680,7 +678,7 @@ void RaviCodeGenerator::emit_FORPREP(RaviFunctionDef *def, llvm::Value *L_ci,
// Call luaV_tonumber_()
llvm::Value *pinit_isnum =
def->builder->CreateCall2(def->luaV_tonumberF, init, ninit);
CreateCall2(def->builder, def->luaV_tonumberF, init, ninit);
llvm::Value *pinit_isnum_bool = def->builder->CreateICmpEQ(
pinit_isnum, def->types->kInt[0], "init.float.ok");
llvm::BasicBlock *else1_pinit_tonum_elsenum = llvm::BasicBlock::Create(

@ -27,9 +27,9 @@ namespace ravi {
// R(A+1), ..., R(A+B) := nil
void RaviCodeGenerator::emit_LOADNIL(RaviFunctionDef *def, llvm::Value *L_ci,
llvm::Value *proto, int A, int B) {
def->builder->CreateCall3(def->raviV_op_loadnilF, def->ci_val,
llvm::ConstantInt::get(def->types->C_intT, A),
llvm::ConstantInt::get(def->types->C_intT, B));
CreateCall3(def->builder, def->raviV_op_loadnilF, def->ci_val,
llvm::ConstantInt::get(def->types->C_intT, A),
llvm::ConstantInt::get(def->types->C_intT, B));
}
// R(A) := tonumber(0)
@ -141,7 +141,7 @@ void RaviCodeGenerator::emit_MOVEI(RaviFunctionDef *def, llvm::Value *L_ci,
// Call luaV_tointeger_()
llvm::Value *var_isint =
def->builder->CreateCall2(def->luaV_tointegerF, src, var);
CreateCall2(def->builder, def->luaV_tointegerF, src, var);
llvm::Value *tobool = def->builder->CreateICmpEQ(
var_isint, def->types->kInt[0], "int.conversion.failed");
@ -213,7 +213,7 @@ void RaviCodeGenerator::emit_MOVEF(RaviFunctionDef *def, llvm::Value *L_ci,
// Call luaV_tonumber()
llvm::Value *var_isflt =
def->builder->CreateCall2(def->luaV_tonumberF, src, var);
CreateCall2(def->builder, def->luaV_tonumberF, src, var);
llvm::Value *tobool = def->builder->CreateICmpEQ(
var_isflt, def->types->kInt[0], "float.conversion.failed");
@ -273,7 +273,7 @@ void RaviCodeGenerator::emit_TOINT(RaviFunctionDef *def, llvm::Value *L_ci,
// Call luaV_tointeger_()
llvm::Value *var_isint =
def->builder->CreateCall2(def->luaV_tointegerF, src, var);
CreateCall2(def->builder, def->luaV_tointegerF, src, var);
llvm::Value *tobool = def->builder->CreateICmpEQ(
var_isint, def->types->kInt[0], "int.conversion.failed");
@ -338,7 +338,7 @@ void RaviCodeGenerator::emit_TOFLT(RaviFunctionDef *def, llvm::Value *L_ci,
// Call luaV_tonumber()
llvm::Value *var_isflt =
def->builder->CreateCall2(def->luaV_tonumberF, src, var);
CreateCall2(def->builder, def->luaV_tonumberF, src, var);
llvm::Value *tobool = def->builder->CreateICmpEQ(
var_isflt, def->types->kInt[0], "float.conversion.failed");

@ -26,25 +26,23 @@ namespace ravi {
void RaviCodeGenerator::emit_CONCAT(RaviFunctionDef *def, llvm::Value *L_ci,
llvm::Value *proto, int A, int B, int C) {
def->builder->CreateCall5(def->raviV_op_concatF, def->L, def->ci_val,
llvm::ConstantInt::get(def->types->C_intT, A),
llvm::ConstantInt::get(def->types->C_intT, B),
llvm::ConstantInt::get(def->types->C_intT, C));
CreateCall5(def->builder, def->raviV_op_concatF, def->L, def->ci_val,
llvm::ConstantInt::get(def->types->C_intT, A),
llvm::ConstantInt::get(def->types->C_intT, B),
llvm::ConstantInt::get(def->types->C_intT, C));
}
void RaviCodeGenerator::emit_CLOSURE(RaviFunctionDef *def, llvm::Value *L_ci,
llvm::Value *proto, int A, int Bx) {
def->builder->CreateCall5(def->raviV_op_closureF, def->L, def->ci_val,
def->p_LClosure,
llvm::ConstantInt::get(def->types->C_intT, A),
llvm::ConstantInt::get(def->types->C_intT, Bx));
CreateCall5(def->builder, def->raviV_op_closureF, def->L, def->ci_val,
def->p_LClosure, llvm::ConstantInt::get(def->types->C_intT, A),
llvm::ConstantInt::get(def->types->C_intT, Bx));
}
void RaviCodeGenerator::emit_VARARG(RaviFunctionDef *def, llvm::Value *L_ci,
llvm::Value *proto, int A, int B) {
def->builder->CreateCall5(def->raviV_op_varargF, def->L, def->ci_val,
def->p_LClosure,
llvm::ConstantInt::get(def->types->C_intT, A),
llvm::ConstantInt::get(def->types->C_intT, B));
CreateCall5(def->builder, def->raviV_op_varargF, def->L, def->ci_val,
def->p_LClosure, llvm::ConstantInt::get(def->types->C_intT, A),
llvm::ConstantInt::get(def->types->C_intT, B));
}
}

@ -58,7 +58,6 @@ void RaviCodeGenerator::emit_RETURN(RaviFunctionDef *def, llvm::Value *L_ci,
// Load pointer to base
llvm::Instruction *base_ptr = emit_load_base(def);
// Get pointer to register A
llvm::Value *ra_ptr = emit_gep_ra(def, base_ptr, A);
@ -82,18 +81,19 @@ void RaviCodeGenerator::emit_RETURN(RaviFunctionDef *def, llvm::Value *L_ci,
def->builder->SetInsertPoint(then_block);
// Call luaF_close
def->builder->CreateCall2(def->luaF_closeF, def->L, base_ptr);
CreateCall2(def->builder, def->luaF_closeF, def->L, base_ptr);
def->builder->CreateBr(else_block);
def->f->getBasicBlockList().push_back(else_block);
def->builder->SetInsertPoint(else_block);
//* b = luaD_poscall(L, ra);
def->builder->CreateCall2(def->luaD_poscallF, def->L, ra_ptr);
CreateCall2(def->builder, def->luaD_poscallF, def->L, ra_ptr);
//llvm::Value *msg1 =
// llvm::Value *msg1 =
// def->builder->CreateGlobalString("Returning from compiled function\n");
//def->builder->CreateCall(def->printfFunc, emit_gep(def, "msg", msg1, 0, 0));
// def->builder->CreateCall(def->printfFunc, emit_gep(def, "msg", msg1, 0,
// 0));
def->builder->CreateRet(def->types->kInt[1]);
}

@ -36,7 +36,7 @@ void RaviCodeGenerator::emit_SELF(RaviFunctionDef *def, llvm::Value *L_ci,
emit_assign(def, ra1, rb);
llvm::Value *ra = emit_gep_ra(def, base_ptr, A);
llvm::Value *rc = emit_gep_rkb(def, base_ptr, C);
def->builder->CreateCall4(def->luaV_gettableF, def->L, rb, rc, ra);
CreateCall4(def->builder, def->luaV_gettableF, def->L, rb, rc, ra);
}
// R(A) := length of R(B)
@ -46,7 +46,7 @@ void RaviCodeGenerator::emit_LEN(RaviFunctionDef *def, llvm::Value *L_ci,
llvm::Instruction *base_ptr = emit_load_base(def);
llvm::Value *ra = emit_gep_ra(def, base_ptr, A);
llvm::Value *rb = emit_gep_ra(def, base_ptr, B);
def->builder->CreateCall3(def->luaV_objlenF, def->L, ra, rb);
CreateCall3(def->builder, def->luaV_objlenF, def->L, ra, rb);
}
// R(A)[RK(B)] := RK(C)
@ -57,7 +57,7 @@ void RaviCodeGenerator::emit_SETTABLE(RaviFunctionDef *def, llvm::Value *L_ci,
llvm::Value *ra = emit_gep_ra(def, base_ptr, A);
llvm::Value *rb = emit_gep_rkb(def, base_ptr, B);
llvm::Value *rc = emit_gep_rkb(def, base_ptr, C);
def->builder->CreateCall4(def->luaV_settableF, def->L, ra, rb, rc);
CreateCall4(def->builder, def->luaV_settableF, def->L, ra, rb, rc);
}
// R(A) := R(B)[RK(C)]
@ -68,7 +68,7 @@ void RaviCodeGenerator::emit_GETTABLE(RaviFunctionDef *def, llvm::Value *L_ci,
llvm::Value *ra = emit_gep_ra(def, base_ptr, A);
llvm::Value *rb = emit_gep_ra(def, base_ptr, B);
llvm::Value *rc = emit_gep_rkb(def, base_ptr, C);
def->builder->CreateCall4(def->luaV_gettableF, def->L, rb, rc, ra);
CreateCall4(def->builder, def->luaV_gettableF, def->L, rb, rc, ra);
}
void RaviCodeGenerator::emit_GETTABLE_AF(RaviFunctionDef *def,
@ -97,8 +97,7 @@ void RaviCodeGenerator::emit_GETTABLE_AF(RaviFunctionDef *def,
llvm::Instruction *t = emit_load_reg_h(def, rb);
llvm::Instruction *data = emit_load_reg_h_floatarray(def, t);
llvm::Instruction *len = emit_load_ravi_arraylength(def, t);
llvm::Value *ukey =
def->builder->CreateTrunc(key, def->types->C_intT);
llvm::Value *ukey = def->builder->CreateTrunc(key, def->types->C_intT);
llvm::Value *cmp = def->builder->CreateICmpULT(ukey, len);
llvm::BasicBlock *then_block =
@ -155,8 +154,7 @@ void RaviCodeGenerator::emit_GETTABLE_AI(RaviFunctionDef *def,
llvm::Instruction *t = emit_load_reg_h(def, rb);
llvm::Instruction *data = emit_load_reg_h_intarray(def, t);
llvm::Instruction *len = emit_load_ravi_arraylength(def, t);
llvm::Value *ukey =
def->builder->CreateTrunc(key, def->types->C_intT);
llvm::Value *ukey = def->builder->CreateTrunc(key, def->types->C_intT);
llvm::Value *cmp = def->builder->CreateICmpULT(ukey, len);
llvm::BasicBlock *then_block =
@ -215,8 +213,7 @@ void RaviCodeGenerator::emit_SETTABLE_AI(RaviFunctionDef *def,
llvm::Instruction *t = emit_load_reg_h(def, ra);
llvm::Instruction *data = emit_load_reg_h_intarray(def, t);
llvm::Instruction *len = emit_load_ravi_arraylength(def, t);
llvm::Value *ukey =
def->builder->CreateTrunc(key, def->types->C_intT);
llvm::Value *ukey = def->builder->CreateTrunc(key, def->types->C_intT);
llvm::Value *cmp = def->builder->CreateICmpULT(ukey, len);
llvm::BasicBlock *then_block =
@ -237,7 +234,7 @@ void RaviCodeGenerator::emit_SETTABLE_AI(RaviFunctionDef *def,
def->f->getBasicBlockList().push_back(else_block);
def->builder->SetInsertPoint(else_block);
def->builder->CreateCall4(def->raviH_set_intF, def->L, t, ukey, value);
CreateCall4(def->builder, def->raviH_set_intF, def->L, t, ukey, value);
def->builder->CreateBr(end_block);
def->f->getBasicBlockList().push_back(end_block);
@ -320,8 +317,7 @@ void RaviCodeGenerator::emit_SETTABLE_AF(RaviFunctionDef *def,
llvm::Instruction *t = emit_load_reg_h(def, ra);
llvm::Instruction *data = emit_load_reg_h_floatarray(def, t);
llvm::Instruction *len = emit_load_ravi_arraylength(def, t);
llvm::Value *ukey =
def->builder->CreateTrunc(key, def->types->C_intT);
llvm::Value *ukey = def->builder->CreateTrunc(key, def->types->C_intT);
cmp = def->builder->CreateICmpULT(ukey, len);
llvm::BasicBlock *then_block =
@ -342,7 +338,7 @@ void RaviCodeGenerator::emit_SETTABLE_AF(RaviFunctionDef *def,
def->f->getBasicBlockList().push_back(else_block);
def->builder->SetInsertPoint(else_block);
def->builder->CreateCall4(def->raviH_set_floatF, def->L, t, ukey, load_nc);
CreateCall4(def->builder, def->raviH_set_floatF, def->L, t, ukey, load_nc);
def->builder->CreateBr(end_block);
def->f->getBasicBlockList().push_back(end_block);
@ -396,7 +392,7 @@ void RaviCodeGenerator::emit_SETUPVAL(RaviFunctionDef *def, llvm::Value *L_ci,
def->builder->CreateCondBr(orcond, end, then);
def->builder->SetInsertPoint(then);
def->builder->CreateCall2(def->luaC_upvalbarrierF, def->L, upval);
CreateCall2(def->builder, def->luaC_upvalbarrierF, def->L, upval);
def->builder->CreateBr(end);
def->f->getBasicBlockList().push_back(end);
@ -415,7 +411,7 @@ void RaviCodeGenerator::emit_GETTABUP(RaviFunctionDef *def, llvm::Value *L_ci,
llvm::Value *upval_ptr = emit_gep_upvals(def, def->p_LClosure, B);
llvm::Instruction *upval = emit_load_pupval(def, upval_ptr);
llvm::Value *v = emit_load_upval_v(def, upval);
def->builder->CreateCall4(def->luaV_gettableF, def->L, v, rc, ra);
CreateCall4(def->builder, def->luaV_gettableF, def->L, v, rc, ra);
}
// UpValue[A][RK(B)] := RK(C)
@ -432,7 +428,7 @@ void RaviCodeGenerator::emit_SETTABUP(RaviFunctionDef *def, llvm::Value *L_ci,
llvm::Value *upval_ptr = emit_gep_upvals(def, def->p_LClosure, A);
llvm::Instruction *upval = emit_load_pupval(def, upval_ptr);
llvm::Value *v = emit_load_upval_v(def, upval);
def->builder->CreateCall4(def->luaV_settableF, def->L, v, rb, rc);
CreateCall4(def->builder, def->luaV_settableF, def->L, v, rb, rc);
}
void RaviCodeGenerator::emit_NEWARRAYINT(RaviFunctionDef *def,
@ -440,8 +436,8 @@ void RaviCodeGenerator::emit_NEWARRAYINT(RaviFunctionDef *def,
int A) {
llvm::Instruction *base_ptr = emit_load_base(def);
llvm::Value *ra = emit_gep_ra(def, base_ptr, A);
def->builder->CreateCall3(def->raviV_op_newarrayintF, def->L, def->ci_val,
ra);
CreateCall3(def->builder, def->raviV_op_newarrayintF, def->L, def->ci_val,
ra);
}
void RaviCodeGenerator::emit_NEWARRAYFLOAT(RaviFunctionDef *def,
@ -449,8 +445,8 @@ void RaviCodeGenerator::emit_NEWARRAYFLOAT(RaviFunctionDef *def,
llvm::Value *proto, int A) {
llvm::Instruction *base_ptr = emit_load_base(def);
llvm::Value *ra = emit_gep_ra(def, base_ptr, A);
def->builder->CreateCall3(def->raviV_op_newarrayfloatF, def->L, def->ci_val,
ra);
CreateCall3(def->builder, def->raviV_op_newarrayfloatF, def->L, def->ci_val,
ra);
}
void RaviCodeGenerator::emit_NEWTABLE(RaviFunctionDef *def, llvm::Value *L_ci,
@ -467,16 +463,16 @@ void RaviCodeGenerator::emit_NEWTABLE(RaviFunctionDef *def, llvm::Value *L_ci,
llvm::Instruction *base_ptr = emit_load_base(def);
llvm::Value *ra = emit_gep_ra(def, base_ptr, A);
def->builder->CreateCall5(def->raviV_op_newtableF, def->L, def->ci_val, ra,
def->types->kInt[B], def->types->kInt[C]);
CreateCall5(def->builder, def->raviV_op_newtableF, def->L, def->ci_val, ra,
def->types->kInt[B], def->types->kInt[C]);
}
void RaviCodeGenerator::emit_SETLIST(RaviFunctionDef *def, llvm::Value *L_ci,
llvm::Value *proto, int A, int B, int C) {
llvm::Instruction *base_ptr = emit_load_base(def);
llvm::Value *ra = emit_gep_ra(def, base_ptr, A);
def->builder->CreateCall5(def->raviV_op_setlistF, def->L, def->ci_val, ra,
def->types->kInt[B], def->types->kInt[C]);
CreateCall5(def->builder, def->raviV_op_setlistF, def->L, def->ci_val, ra,
def->types->kInt[B], def->types->kInt[C]);
}
llvm::Instruction *RaviCodeGenerator::emit_TOARRAY(RaviFunctionDef *def,

@ -68,8 +68,8 @@ void RaviCodeGenerator::emit_TFORCALL(RaviFunctionDef *def, llvm::Value *L_ci,
emit_set_L_top_toreg(def, base_ptr, A + 6);
// Protect(luaD_call(L, cb, GETARG_C(i), 1));
def->builder->CreateCall4(def->luaD_callF, def->L, cb, def->types->kInt[C],
def->types->kInt[1]);
CreateCall4(def->builder, def->luaD_callF, def->L, cb, def->types->kInt[C],
def->types->kInt[1]);
// reload base
base_ptr = emit_load_base(def);
// L->top = ci->top;

Loading…
Cancel
Save