issue #15 if emit_debug_trace() has been called then we can avoid setting savedpc again

pull/81/head
Dibyendu Majumdar 9 years ago
parent 8ba985dba2
commit 3c9ed08585

@ -813,7 +813,7 @@ public:
void emit_dump_stack(RaviFunctionDef *def, const char *str);
void emit_dump_stacktop(RaviFunctionDef *def, const char *str);
void emit_debug_trace(RaviFunctionDef *def, int opCode, int pc);
bool emit_debug_trace(RaviFunctionDef *def, int opCode, int pc);
// Look for Lua bytecodes that are jump targets and allocate
// a BasicBlock for each such target in def->jump_targets.

@ -293,7 +293,7 @@ void RaviCodeGenerator::emit_bitwise_shiftl(RaviFunctionDef *def,
void RaviCodeGenerator::emit_BITWISE_SHIFT_OP(RaviFunctionDef *def, OpCode op,
int A, int B, int C, int pc) {
emit_debug_trace(def, op, pc);
bool traced = emit_debug_trace(def, op, pc);
emit_load_base(def);
llvm::Value *ra = emit_gep_register(def, A);
@ -315,12 +315,12 @@ void RaviCodeGenerator::emit_BITWISE_SHIFT_OP(RaviFunctionDef *def, OpCode op,
// 'savedpc'
switch (op) {
case OP_SHL:
emit_update_savedpc(def, pc);
if (!traced) emit_update_savedpc(def, pc);
case OP_RAVI_SHL_II:
CreateCall4(def->builder, def->raviV_op_shlF, def->L, ra, rb, rc);
break;
case OP_SHR:
emit_update_savedpc(def, pc);
if (!traced) emit_update_savedpc(def, pc);
case OP_RAVI_SHR_II:
CreateCall4(def->builder, def->raviV_op_shrF, def->L, ra, rb, rc);
break;

@ -46,7 +46,7 @@ void RaviCodeGenerator::emit_ARITH(RaviFunctionDef *def, int A, int B, int C,
llvm::Value *nb = TmpB.CreateAlloca(def->types->lua_NumberT, nullptr, "nb");
llvm::Value *nc = TmpB.CreateAlloca(def->types->lua_NumberT, nullptr, "nc");
emit_debug_trace(def, op, pc);
bool traced = emit_debug_trace(def, op, pc);
emit_load_base(def);
llvm::Value *ra = emit_gep_register(def, A);
llvm::Value *rb = emit_gep_register_or_constant(def, B);
@ -213,7 +213,8 @@ void RaviCodeGenerator::emit_ARITH(RaviFunctionDef *def, int A, int B, int C,
def->f->getBasicBlockList().push_back(try_meta);
def->builder->SetInsertPoint(try_meta);
emit_update_savedpc(def, pc);
// Before invoking metamethod set savedpc
if (!traced) emit_update_savedpc(def, pc);
CreateCall5(def->builder, def->luaT_trybinTMF, def->L, rb, rc, ra,
def->types->kInt[tms]);
def->builder->CreateBr(done_block);
@ -244,7 +245,7 @@ void RaviCodeGenerator::emit_MOD(RaviFunctionDef *def, int A, int B, int C,
llvm::Value *nb = TmpB.CreateAlloca(def->types->lua_NumberT, nullptr, "nb");
llvm::Value *nc = TmpB.CreateAlloca(def->types->lua_NumberT, nullptr, "nc");
emit_debug_trace(def, OP_MOD, pc);
bool traced = emit_debug_trace(def, OP_MOD, pc);
emit_load_base(def);
llvm::Value *ra = emit_gep_register(def, A);
llvm::Value *rb = emit_gep_register_or_constant(def, B);
@ -409,7 +410,8 @@ void RaviCodeGenerator::emit_MOD(RaviFunctionDef *def, int A, int B, int C,
def->f->getBasicBlockList().push_back(try_meta);
def->builder->SetInsertPoint(try_meta);
emit_update_savedpc(def, pc);
// before invoking metamethod set savedpc
if (!traced) emit_update_savedpc(def, pc);
CreateCall5(def->builder, def->luaT_trybinTMF, def->L, rb, rc, ra,
def->types->kInt[TM_MOD]);
def->builder->CreateBr(done_block);
@ -438,7 +440,7 @@ void RaviCodeGenerator::emit_IDIV(RaviFunctionDef *def, int A, int B, int C,
llvm::Value *nb = TmpB.CreateAlloca(def->types->lua_NumberT, nullptr, "nb");
llvm::Value *nc = TmpB.CreateAlloca(def->types->lua_NumberT, nullptr, "nc");
emit_debug_trace(def, OP_IDIV, pc);
bool traced = emit_debug_trace(def, OP_IDIV, pc);
emit_load_base(def);
llvm::Value *ra = emit_gep_register(def, A);
llvm::Value *rb = emit_gep_register_or_constant(def, B);
@ -573,7 +575,8 @@ void RaviCodeGenerator::emit_IDIV(RaviFunctionDef *def, int A, int B, int C,
def->f->getBasicBlockList().push_back(try_meta);
def->builder->SetInsertPoint(try_meta);
emit_update_savedpc(def, pc);
// before invoking metamethod set savedpc
if (!traced) emit_update_savedpc(def, pc);
CreateCall5(def->builder, def->luaT_trybinTMF, def->L, rb, rc, ra,
def->types->kInt[TM_IDIV]);
def->builder->CreateBr(done_block);
@ -598,7 +601,7 @@ void RaviCodeGenerator::emit_POW(RaviFunctionDef *def, int A, int B, int C,
llvm::Value *nb = TmpB.CreateAlloca(def->types->lua_NumberT, nullptr, "nb");
llvm::Value *nc = TmpB.CreateAlloca(def->types->lua_NumberT, nullptr, "nc");
emit_debug_trace(def, OP_POW, pc);
bool traced = emit_debug_trace(def, OP_POW, pc);
emit_load_base(def);
llvm::Value *ra = emit_gep_register(def, A);
llvm::Value *rb = emit_gep_register_or_constant(def, B);
@ -704,7 +707,8 @@ void RaviCodeGenerator::emit_POW(RaviFunctionDef *def, int A, int B, int C,
def->f->getBasicBlockList().push_back(try_meta);
def->builder->SetInsertPoint(try_meta);
emit_update_savedpc(def, pc);
// Before invoking metamethod set savedpc
if (!traced) emit_update_savedpc(def, pc);
CreateCall5(def->builder, def->luaT_trybinTMF, def->L, rb, rc, ra,
def->types->kInt[TM_POW]);
def->builder->CreateBr(done_block);
@ -731,7 +735,7 @@ void RaviCodeGenerator::emit_UNM(RaviFunctionDef *def, int A, int B, int pc) {
llvm::IRBuilder<> TmpB(def->entry, def->entry->begin());
llvm::Value *nb = TmpB.CreateAlloca(def->types->lua_NumberT, nullptr, "nb");
emit_debug_trace(def, OP_UNM, pc);
bool traced = emit_debug_trace(def, OP_UNM, pc);
emit_load_base(def);
llvm::Value *ra = emit_gep_register(def, A);
llvm::Value *rb = emit_gep_register_or_constant(def, B);
@ -817,7 +821,8 @@ void RaviCodeGenerator::emit_UNM(RaviFunctionDef *def, int A, int B, int pc) {
def->f->getBasicBlockList().push_back(try_meta);
def->builder->SetInsertPoint(try_meta);
emit_update_savedpc(def, pc);
// before invoking metamethod set savedpc
if (!traced) emit_update_savedpc(def, pc);
CreateCall5(def->builder, def->luaT_trybinTMF, def->L, rb, rb, ra,
def->types->kInt[TM_UNM]);
def->builder->CreateBr(done_block);

@ -86,8 +86,9 @@ void RaviCodeGenerator::emit_CALL(RaviFunctionDef *def, int A, int B, int C,
// int b = luaV_execute(L);
// if (b) L->top = ci->top;
// }
emit_debug_trace(def, OP_CALL, pc);
emit_update_savedpc(def, pc);
bool traced = emit_debug_trace(def, OP_CALL, pc);
// Set savedpc before the call
if (!traced) emit_update_savedpc(def, pc);
emit_load_base(def);
// int nresults = c - 1;

@ -810,13 +810,18 @@ void RaviCodeGenerator::emit_dump_stacktop(RaviFunctionDef *def,
def->builder->CreateGlobalStringPtr(str));
}
void RaviCodeGenerator::emit_debug_trace(RaviFunctionDef *def, int opCode,
// Emit a call to ravi_debug_trace() function.
// This function will set savedpc and also invoke
// "line" hook if defined
bool RaviCodeGenerator::emit_debug_trace(RaviFunctionDef *def, int opCode,
int pc) {
if (def->jitState->is_tracehook_enabled()) {
CreateCall3(def->builder, def->ravi_debug_traceF, def->L,
llvm::ConstantInt::get(def->types->C_intT, opCode),
llvm::ConstantInt::get(def->types->C_intT, pc));
return true;
}
return false;
}
void RaviCodeGenerator::emit_raise_lua_error(RaviFunctionDef *def,

@ -40,7 +40,7 @@ void RaviCodeGenerator::emit_EQ(RaviFunctionDef *def, int A, int B, int C,
// )
// } break;
emit_debug_trace(def, opCode, pc);
bool traced = emit_debug_trace(def, opCode, pc);
// Load pointer to base
emit_load_base(def);
@ -102,7 +102,8 @@ void RaviCodeGenerator::emit_EQ(RaviFunctionDef *def, int A, int B, int C,
} break;
default:
emit_update_savedpc(def, pc);
// As below may invoke metamethod we need to set savedpc
if (!traced) emit_update_savedpc(def, pc);
// Call luaV_equalobj with register B and C
result = CreateCall3(def->builder, callee, def->L, regB, regC);
}

@ -26,8 +26,9 @@ namespace ravi {
void RaviCodeGenerator::emit_CONCAT(RaviFunctionDef *def, int A, int B, int C,
int pc) {
emit_debug_trace(def, OP_CONCAT, pc);
emit_update_savedpc(def, pc);
bool traced = emit_debug_trace(def, OP_CONCAT, pc);
// below may invoke metamethod so we need to set savedpc
if (!traced) emit_update_savedpc(def, pc);
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),

@ -30,8 +30,9 @@ void RaviCodeGenerator::emit_SELF(RaviFunctionDef *def, int A, int B, int C,
// StkId rb = RB(i);
// setobjs2s(L, ra + 1, rb);
// Protect(luaV_gettable(L, rb, RKC(i), ra));
emit_debug_trace(def, OP_SELF, pc);
emit_update_savedpc(def, pc);
bool traced = emit_debug_trace(def, OP_SELF, pc);
// Below may invoke metamethod so we set savedpc
if (!traced) emit_update_savedpc(def, pc);
emit_load_base(def);
llvm::Value *rb = emit_gep_register(def, B);
llvm::Value *ra1 = emit_gep_register(def, A + 1);
@ -44,8 +45,9 @@ void RaviCodeGenerator::emit_SELF(RaviFunctionDef *def, int A, int B, int C,
// R(A) := length of R(B)
void RaviCodeGenerator::emit_LEN(RaviFunctionDef *def, int A, int B, int pc) {
// Protect(luaV_objlen(L, ra, RB(i)));
emit_debug_trace(def, OP_LEN, pc);
emit_update_savedpc(def, pc);
bool traced = emit_debug_trace(def, OP_LEN, pc);
// Below may invoke metamethod so we set savedpc
if (!traced) emit_update_savedpc(def, pc);
emit_load_base(def);
llvm::Value *ra = emit_gep_register(def, A);
llvm::Value *rb = emit_gep_register(def, B);
@ -56,8 +58,9 @@ void RaviCodeGenerator::emit_LEN(RaviFunctionDef *def, int A, int B, int pc) {
void RaviCodeGenerator::emit_SETTABLE(RaviFunctionDef *def, int A, int B, int C,
int pc) {
// Protect(luaV_settable(L, ra, RKB(i), RKC(i)));
emit_debug_trace(def, OP_SETTABLE, pc);
emit_update_savedpc(def, pc);
bool traced = emit_debug_trace(def, OP_SETTABLE, pc);
// Below may invoke metamethod so we set savedpc
if (!traced) emit_update_savedpc(def, pc);
emit_load_base(def);
llvm::Value *ra = emit_gep_register(def, A);
llvm::Value *rb = emit_gep_register_or_constant(def, B);
@ -69,8 +72,9 @@ void RaviCodeGenerator::emit_SETTABLE(RaviFunctionDef *def, int A, int B, int C,
void RaviCodeGenerator::emit_GETTABLE(RaviFunctionDef *def, int A, int B, int C,
int pc) {
// Protect(luaV_gettable(L, RB(i), RKC(i), ra));
emit_debug_trace(def, OP_GETTABLE, pc);
emit_update_savedpc(def, pc);
bool traced = emit_debug_trace(def, OP_GETTABLE, pc);
// Below may invoke metamethod so we set savedpc
if (!traced) emit_update_savedpc(def, pc);
emit_load_base(def);
llvm::Value *ra = emit_gep_register(def, A);
llvm::Value *rb = emit_gep_register(def, B);
@ -392,8 +396,9 @@ void RaviCodeGenerator::emit_GETTABUP(RaviFunctionDef *def, int A, int B, int C,
int pc) {
// int b = GETARG_B(i);
// Protect(luaV_gettable(L, cl->upvals[b]->v, RKC(i), ra));
emit_debug_trace(def, OP_GETTABUP, pc);
emit_update_savedpc(def, pc);
bool traced = emit_debug_trace(def, OP_GETTABUP, pc);
// Below may invoke metamethod so we set savedpc
if (!traced) emit_update_savedpc(def, pc);
emit_load_base(def);
llvm::Value *ra = emit_gep_register(def, A);
llvm::Value *rc = emit_gep_register_or_constant(def, C);
@ -411,8 +416,8 @@ void RaviCodeGenerator::emit_SETTABUP(RaviFunctionDef *def, int A, int B, int C,
// int a = GETARG_A(i);
// Protect(luaV_settable(L, cl->upvals[a]->v, RKB(i), RKC(i)));
emit_debug_trace(def, OP_SETTABUP, pc);
emit_update_savedpc(def, pc);
bool traced = emit_debug_trace(def, OP_SETTABUP, pc);
if (!traced) emit_update_savedpc(def, pc);
emit_load_base(def);
llvm::Value *rb = emit_gep_register_or_constant(def, B);
llvm::Value *rc = emit_gep_register_or_constant(def, C);

@ -48,8 +48,9 @@ void RaviCodeGenerator::emit_TFORCALL(RaviFunctionDef *def, int A, int B, int C,
// }
// } break;
emit_debug_trace(def, OP_TFORCALL, pc);
emit_update_savedpc(def, pc);
bool traced = emit_debug_trace(def, OP_TFORCALL, pc);
// Below may invoke metamethod so we set savedpc
if (!traced)emit_update_savedpc(def, pc);
// Load pointer to base
emit_load_base(def);

Loading…
Cancel
Save