still debugging the bug related to L->top

pull/81/head
Dibyendu Majumdar 9 years ago
parent 6b06004c44
commit c833336108

@ -500,6 +500,7 @@ LUA_API lua_Number *ravi_get_number_array_rawdata(lua_State *l, int idx);
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);
struct Proto;
LUA_API void ravi_print_function(const struct Proto *f, int full);
LUA_API void ravi_dump_function(lua_State *L);

@ -250,6 +250,7 @@ struct LuaLLVMTypes {
llvm::FunctionType *ravi_dump_valueT;
llvm::FunctionType *ravi_dump_stackT;
llvm::FunctionType *ravi_dump_stacktopT;
std::array<llvm::Constant *, 256> kInt;
std::array<llvm::Constant *, 21> kluaInteger;
@ -282,6 +283,7 @@ struct LuaLLVMTypes {
llvm::MDNode *tbaa_CallInfo_funcT;
llvm::MDNode *tbaa_CallInfo_func_LClosureT;
llvm::MDNode *tbaa_CallInfo_topT;
llvm::MDNode *tbaa_CallInfo_jitstatusT;
llvm::MDNode *tbaa_LClosureT;
llvm::MDNode *tbaa_LClosure_pT;
llvm::MDNode *tbaa_LClosure_upvalsT;
@ -523,6 +525,7 @@ struct RaviFunctionDef {
llvm::Function *ravi_dump_valueF;
llvm::Function *ravi_dump_stackF;
llvm::Function *ravi_dump_stacktopF;
// standard C functions
llvm::Constant *printfFunc;
@ -664,6 +667,8 @@ public:
// emit code to obtain address of constant at locatiion B
llvm::Value *emit_gep_constant(RaviFunctionDef *def, int B);
llvm::Value *emit_is_jit_call(RaviFunctionDef *def);
// obtain address of L->top
llvm::Value *emit_gep_L_top(RaviFunctionDef *def);
@ -781,6 +786,8 @@ public:
llvm::Value *arg2, llvm::Value *arg3, llvm::Value *arg4);
void emit_dump_stack(RaviFunctionDef *def, const char *str);
void emit_dump_stacktop(RaviFunctionDef *def, const char *str);
// Look for Lua bytecodes that are jump targets and allocate
// a BasicBlock for each such target in def->jump_targets.

@ -368,7 +368,6 @@ int luaD_precall (lua_State *L, StkId func, int nresults) {
ci->callstatus = CIST_LUA;
ci->jitstatus = 0;
L->top = ci->top;
//printf("luaD_precall set L->top to %d\n", (int)(L->top - L->stack));
if (L->hookmask & LUA_MASKCALL)
callhook(L, ci);
if (L == G(L)->mainthread && p->ravi_jit.jit_status == RAVI_JIT_NOT_COMPILED) {

@ -91,10 +91,8 @@ void luaT_callTM (lua_State *L, const TValue *f, const TValue *p1,
setobj2s(L, L->top++, p2); /* 2nd argument */
if (!hasres) /* no result? 'p3' is third argument */
setobj2s(L, L->top++, p3); /* 3rd argument */
//ravi_dump_stack(L, "luaT_callM before function call");
/* metamethod may yield only when called from Lua code */
luaD_call(L, L->top - (4 - hasres), hasres, isLua(L->ci));
//ravi_dump_stack(L, "luaT_callM after function call");
if (hasres) { /* if has result, move it to its place */
p3 = restorestack(L, result);
setobjs2s(L, p3, --L->top);

@ -279,9 +279,7 @@ void luaV_settable (lua_State *L, const TValue *t, TValue *key, StkId val) {
luaG_typeerror(L, t, "index");
/* try the metamethod */
if (ttisfunction(tm)) {
//ravi_dump_stack(L, "luaV_settable before meta");
luaT_callTM(L, tm, t, key, val, 0);
//ravi_dump_stack(L, "luaV_settable after meta");
return;
}
t = tm; /* else repeat assignment over 'tm' */
@ -823,7 +821,6 @@ void luaV_execute (lua_State *L) {
TValue *k;
StkId base;
newframe: /* reentry point when frame changes (call/return) */
//printf("luaV_execute L->top = %d at function entry\n", (int)(L->top - L->stack));
DEBUG_STACK(ravi_dump_stack(L, "On function entry");)
lua_assert(ci == L->ci);
cl = clLvalue(ci->func);
@ -1139,8 +1136,8 @@ newframe: /* reentry point when frame changes (call/return) */
int nresults = GETARG_C(i) - 1;
if (b != 0) {
L->top = ra + b; /* else previous instruction set top */
//printf("luaV_execute OP_CALL set L->top to %d before luaD_precall\n", (int)(L->top - L->stack));
}
//ravi_dump_stacktop(L, "OP_CALL before function call");
int c_or_compiled = luaD_precall(L, ra, nresults);
if (c_or_compiled) { /* C or Lua JITed function? */
/* RAVI change - if the Lua function was JIT compiled then luaD_precall() returns 2
@ -1148,14 +1145,15 @@ newframe: /* reentry point when frame changes (call/return) */
*/
if (c_or_compiled == 1 && nresults >= 0) {
L->top = ci->top; /* adjust results */
//printf("luaV_execute OP_CALL set L->top to %d after luaD_precall\n", (int)(L->top - L->stack));
}
base = ci->u.l.base;
//ravi_dump_stacktop(L, "OP_CALL after function call");
}
else { /* Lua function */
ci = L->ci;
ci->callstatus |= CIST_REENTRY;
lua_assert(!ci->jitstatus);
//ravi_dump_stacktop(L, "OP_CALL after function call");
goto newframe; /* restart luaV_execute over new Lua function */
}
} break;
@ -1195,10 +1193,11 @@ newframe: /* reentry point when frame changes (call/return) */
if (cl->p->sizep > 0) luaF_close(L, base);
b = luaD_poscall(L, ra, (b != 0 ? b - 1 : L->top - ra));
if (!(ci->callstatus & CIST_REENTRY)) /* 'ci' still the called one */ {
/* FIXME - it is not clear what the invariants are
for L->top
*/
if (b && L->ci->jitstatus) {
L->top = L->ci->top;
// printf("luaV_execute OP_RETURN set L->top to %d\n", (int)(L->top - L->stack));
// printf("luaV_execute OP_RETURN b = %d, !CIST_REENTRY, caller is JIT %d\n", b, (int) L->ci->jitstatus);
L->top = L->ci->top;
}
return; /* external invocation: return */
}
@ -1206,7 +1205,6 @@ newframe: /* reentry point when frame changes (call/return) */
ci = L->ci;
if (b) {
L->top = ci->top;
// printf("luaV_execute OP_RETURN set L->top to %d\n", (int)(L->top - L->stack));
}
lua_assert(isLua(ci));
lua_assert(GET_OPCODE(*((ci)->u.l.savedpc - 1)) == OP_CALL);
@ -1757,6 +1755,15 @@ void ravi_dump_stack(lua_State *L, const char *s) {
printf("\n");
}
void ravi_dump_stacktop(lua_State *L, const char *s) {
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);
printf("Stack dump %s function %d L->top = %d, ci->top = %d\n", s, funcpos,
top, ci_top);
}
void raviV_op_newarrayint(lua_State *L, CallInfo *ci, TValue *ra) {
Table *t = raviH_new(L, RAVI_TARRAYINT);
sethvalue(L, ra, t);

@ -76,11 +76,8 @@ void RaviCodeGenerator::emit_ADDII(RaviFunctionDef *def, int A, int B, int C) {
llvm::Value *ra = emit_gep_register(def, A);
llvm::Value *rb = emit_load_register_or_constant_i(def, B);
llvm::Value *rc = emit_load_register_or_constant_i(def, C);
//debug_printf1(def, "ADDII rb = %lld\n", rb);
//debug_printf1(def, "ADDII rc = %lld\n", rc);
llvm::Value *result = def->builder->CreateAdd(rb, rc, "", false, true);
emit_store_reg_i_withtype(def, result, ra);
//CreateCall2(def->builder, def->ravi_dump_valueF, def->L, ra);
}
// R(A) := RK(B) - RK(C), float-float
@ -153,11 +150,8 @@ void RaviCodeGenerator::emit_MULII(RaviFunctionDef *def, int A, int B, int C) {
llvm::Value *ra = emit_gep_register(def, A);
llvm::Value *rb = emit_load_register_or_constant_i(def, B);
llvm::Value *rc = emit_load_register_or_constant_i(def, C);
//debug_printf1(def, "MULII rb = %lld\n", rb);
//debug_printf1(def, "MULII rc = %lld\n", rc);
llvm::Value *result = def->builder->CreateMul(rb, rc, "", false, true);
emit_store_reg_i_withtype(def, result, ra);
//CreateCall2(def->builder, def->ravi_dump_valueF, def->L, ra);
}
// R(A) := RK(B) / RK(C), float/float

@ -82,6 +82,7 @@ void RaviCodeGenerator::emit_CALL(RaviFunctionDef *def, int A, int B, int C) {
//emit_dump_stack(def, "POST L->top = register");
}
//emit_dump_stacktop(def, "JIT OP_CALL before function call");
// luaD_precall() returns following
// 1 - C function called, results to be adjusted
// 2 - JITed Lua function called, no action
@ -129,5 +130,7 @@ void RaviCodeGenerator::emit_CALL(RaviFunctionDef *def, int A, int B, int C) {
def->builder->CreateBr(end_block);
def->f->getBasicBlockList().push_back(end_block);
def->builder->SetInsertPoint(end_block);
//emit_dump_stacktop(def, "JIT OP_CALL after function call");
}
}

@ -417,6 +417,19 @@ RaviCodeGenerator::emit_gep_register_or_constant(RaviFunctionDef *def, int B) {
return rb;
}
// Test if ci->jistatus is true
llvm::Value *RaviCodeGenerator::emit_is_jit_call(RaviFunctionDef *def) {
// Get pointer to ci->jitstatus
llvm::Value *ci_jitstatus_ptr = emit_gep(def, "ci_jit_status_ptr", def->ci_val, 0, 8);
// Load ci->top
llvm::Instruction *ci_jitstatus = def->builder->CreateLoad(ci_jitstatus_ptr);
ci_jitstatus->setMetadata(llvm::LLVMContext::MD_tbaa,
def->types->tbaa_CallInfo_jitstatusT);
return def->builder->CreateICmpNE(ci_jitstatus, llvm::ConstantInt::get(def->types->lu_byteT, 0), "jit_call");
}
// L->top = ci->top
void RaviCodeGenerator::emit_refresh_L_top(RaviFunctionDef *def) {
// Get pointer to ci->top
@ -733,6 +746,11 @@ void RaviCodeGenerator::emit_dump_stack(RaviFunctionDef *def, const char *str) {
def->builder->CreateGlobalStringPtr(str));
}
void RaviCodeGenerator::emit_dump_stacktop(RaviFunctionDef *def, const char *str) {
CreateCall2(def->builder, def->ravi_dump_stacktopF, def->L,
def->builder->CreateGlobalStringPtr(str));
}
void RaviCodeGenerator::emit_raise_lua_error(RaviFunctionDef *def,
const char *str) {
CreateCall2(def->builder, def->luaG_runerrorF, def->L,
@ -873,6 +891,9 @@ void RaviCodeGenerator::emit_extern_declarations(RaviFunctionDef *def) {
def->ravi_dump_stackF = def->raviF->addExternFunction(
def->types->ravi_dump_stackT, reinterpret_cast<void *>(&ravi_dump_stack),
"ravi_dump_stack");
def->ravi_dump_stacktopF = def->raviF->addExternFunction(
def->types->ravi_dump_stacktopT, reinterpret_cast<void *>(&ravi_dump_stacktop),
"ravi_dump_stacktop");
// Create printf declaration
std::vector<llvm::Type *> args;
@ -1071,11 +1092,6 @@ void RaviCodeGenerator::compile(lua_State *L, Proto *p, ravi_compile_options_t *
//emit_dump_stack(def, "Function entry-->");
// llvm::Value *msg1 =
// def->builder->CreateGlobalString("In compiled function\n");
// def->builder->CreateCall(def->printfFunc, emit_gep(def, "msg", msg1, 0,
// 0));
const Instruction *code = p->code;
int pc, n = p->sizecode;
for (pc = 0; pc < n; pc++) {

@ -437,7 +437,6 @@ void RaviCodeGenerator::emit_iFORLOOP(RaviFunctionDef *def, int A, int pc,
// setivalue(ra + 3, idx); /* ...and external index */
idx_int_value = emit_load_local_n(def, idx_int_ptr);
emit_store_reg_i_withtype(def, idx_int_value, rvar);
//CreateCall2(def->builder, def->ravi_dump_valueF, def->L, rvar);
// ci->u.l.savedpc += GETARG_sBx(i); /* jump back */
def->builder->CreateBr(def->jmp_targets[pc].jmp1);

@ -89,19 +89,24 @@ void RaviCodeGenerator::emit_RETURN(RaviFunctionDef *def, int A, int B) {
//llvm::Value *b =
CreateCall3(def->builder, def->luaD_poscallF, def->L, ra_ptr, nresults);
//llvm::Value *b_is_zero =
// def->builder->CreateICmpEQ(b, def->types->kInt[0]);
//llvm::Value *b_not_zero =
// def->builder->CreateICmpNE(b, def->types->kInt[0]);
//llvm::Value *is_jit_caller = emit_is_jit_call(def);
// b != 0 && L->ci->jitstatus
//llvm::Value *b_not_zero_and_jit_caller = def->builder->CreateAnd(b_not_zero, is_jit_caller, "b_not_zero_and_jit_caller");
//llvm::BasicBlock *then_block1 = llvm::BasicBlock::Create(
// def->jitState->context(), "if.poscall.returned.nonzero");
//llvm::BasicBlock *else_block1 =
// llvm::BasicBlock::Create(def->jitState->context(), "if.poscall.returned.zero");
//def->builder->CreateCondBr(b_is_zero, else_block1, then_block1);
//def->builder->CreateCondBr(b_not_zero_and_jit_caller, then_block1, else_block1);
//def->f->getBasicBlockList().push_back(then_block1);
//def->builder->SetInsertPoint(then_block1);
// emit_refresh_L_top(def);
// L->top = L->ci->top
//emit_refresh_L_top(def);
//def->builder->CreateBr(else_block1);

@ -55,7 +55,6 @@ void RaviCodeGenerator::emit_SETTABLE(RaviFunctionDef *def, int A, int B,
llvm::Value *ra = emit_gep_register(def, A);
llvm::Value *rb = emit_gep_register_or_constant(def, B);
llvm::Value *rc = emit_gep_register_or_constant(def, C);
//CreateCall2(def->builder, def->ravi_dump_valueF, def->L, rb);
CreateCall4(def->builder, def->luaV_settableF, def->L, ra, rb, rc);
}

@ -889,6 +889,8 @@ LuaLLVMTypes::LuaLLVMTypes(llvm::LLVMContext &context) : mdbuilder(context) {
elements.push_back(C_pcharT);
ravi_dump_stackT =
llvm::FunctionType::get(llvm::Type::getVoidTy(context), elements, false);
ravi_dump_stacktopT =
llvm::FunctionType::get(llvm::Type::getVoidTy(context), elements, false);
for (int j = 0; j < kInt.size(); j++)
@ -1017,6 +1019,9 @@ LuaLLVMTypes::LuaLLVMTypes(llvm::LLVMContext &context) : mdbuilder(context) {
mdbuilder.createTBAAStructTagNode(tbaa_pointerT, tbaa_pointerT, 0);
tbaa_CallInfo_topT =
mdbuilder.createTBAAStructTagNode(tbaa_CallInfoT, tbaa_pointerT, 4);
tbaa_CallInfo_jitstatusT =
mdbuilder.createTBAAStructTagNode(tbaa_CallInfoT, tbaa_charT, 43);
//!20 = metadata !{metadata !"Proto",
// metadata !3, i64 0, metadata !4, i64 4, metadata !4, i64 5,

Loading…
Cancel
Save