issue #139 various bug fixes

lua54
Dibyendu Majumdar 6 years ago
parent 971b548f1b
commit 7c5b846a7b

@ -168,7 +168,8 @@ struct LuaLLVMTypes {
llvm::PointerType *pGCObjectT;
llvm::StructType *ValueT;
llvm::StructType *ValueGCT;
llvm::StructType *TValueGCT;
llvm::PointerType *pTValueGCT;
llvm::StructType *TValueT;
llvm::PointerType *pTValueT;
llvm::StructType *TStringT;
@ -294,7 +295,7 @@ struct LuaLLVMTypes {
std::array<llvm::Constant *, 256> kInt;
std::array<llvm::Constant *, 21> kluaInteger;
std::array<llvm::Constant *, 10> kByte;
std::array<llvm::Constant *, 256> kByte;
llvm::Constant *kFalse;
@ -394,8 +395,8 @@ class RaviJITState {
// all the IR in modules get released after compilation
// MCJIT is also likely to be removed at some time in
// future so we needed to migrate anyway
// We don't use ORC apis in earlier versions because
// the apis have changed over the releases so it
// We don't use ORC apis in earlier versions because
// the apis have changed over the releases so it
// is simpler to use them in 5.0 and above.
// The ORC usage here is heavily based upon the kaleidoscope
// sample, with some adjustments.
@ -434,7 +435,7 @@ class RaviJITState {
// Size level (LLVM PassManagerBuilder)
unsigned int size_level_ : 2;
// Verbosity
unsigned int verbosity_ : 3;
@ -445,7 +446,7 @@ class RaviJITState {
// Enable extra validation such as IR verification
// May slow down compilation
unsigned int validation_ : 1;
// Flag to control calls to collect
int gcstep_;
@ -458,7 +459,7 @@ class RaviJITState {
// Count of modules allocated
// Used to debug module deallocation
size_t allocated_modules_;
// flag to help avoid recursion
bool compiling_;
@ -507,9 +508,7 @@ class RaviJITState {
int get_validation() const { return validation_; }
void set_validation(bool value) { validation_ = value; }
int get_gcstep() const { return gcstep_; }
void set_gcstep(int value) {
gcstep_ = value > 0 ? value : gcstep_;
}
void set_gcstep(int value) { gcstep_ = value > 0 ? value : gcstep_; }
bool is_tracehook_enabled() const { return tracehook_enabled_; }
void set_tracehook_enabled(bool value) { tracehook_enabled_ = value; }
void incr_allocated_modules() { allocated_modules_++; }
@ -558,7 +557,7 @@ class RaviJITModule {
llvm::Module *module() const { return module_; }
llvm::ExecutionEngine *engine() const { return engine_; }
#else
// Note that this can return nullptr
// Note that this can return nullptr
llvm::Module *module() const { return module_.get(); }
#endif
RaviJITState *owner() const { return owner_; }
@ -903,9 +902,10 @@ class RaviCodeGenerator {
// emit code for (LClosure *)ci->func->value_.gc
llvm::Instruction *emit_gep_ci_func_value_gc_asLClosure(RaviFunctionDef *def);
llvm::Value *emit_gep(RaviFunctionDef *def, const char *name, llvm::Value *s,
int arg1);
llvm::Value *emit_gep(RaviFunctionDef *def, const char *name, llvm::Value *s,
int arg1, int arg2);
llvm::Value *emit_gep(RaviFunctionDef *def, const char *name, llvm::Value *s,
int arg1, int arg2, int arg3);
llvm::Value *emit_gep(RaviFunctionDef *def, const char *name,
@ -1262,7 +1262,8 @@ class RaviCodeGenerator {
void emit_SETUPVAL(RaviFunctionDef *def, int A, int B, int pc);
void emit_GC_barrier(RaviFunctionDef *def, llvm::Value *upval, llvm::Value *v);
void emit_GC_barrier(RaviFunctionDef *def, llvm::Value *upval,
llvm::Value *v);
void emit_SETUPVAL_Specific(RaviFunctionDef *def, int A, int B, int pc,
OpCode op, llvm::Function *f);

@ -372,6 +372,7 @@ LUA_API lua_State *lua_newstate (lua_Alloc f, void *ud) {
g->gcpause = LUAI_GCPAUSE;
g->gcstepmul = LUAI_GCMUL;
g->gcstepsize = LUAI_GCSTEPSIZE;
g->ravi_state = NULL;
for (i=0; i < LUA_NUMTAGS; i++) g->mt[i] = NULL;
raviV_initjit(L);
if (luaD_rawrunprotected(L, f_luaopen, NULL) != LUA_OK) {

@ -121,6 +121,13 @@ void RaviCodeGenerator::attach_branch_weights(RaviFunctionDef *def,
#endif
}
llvm::Value *RaviCodeGenerator::emit_gep(RaviFunctionDef *def, const char *name,
llvm::Value *s, int arg1) {
llvm::SmallVector<llvm::Value *, 1> values;
values.push_back(def->types->kInt[arg1]);
return def->builder->CreateInBoundsGEP(s, values, name);
}
llvm::Value *RaviCodeGenerator::emit_gep(RaviFunctionDef *def, const char *name,
llvm::Value *s, int arg1, int arg2) {
llvm::SmallVector<llvm::Value *, 2> values;
@ -397,7 +404,7 @@ llvm::Value *RaviCodeGenerator::emit_table_get_nodearray(RaviFunctionDef *def,
llvm::Value *RaviCodeGenerator::emit_table_get_keytype(RaviFunctionDef *def,
llvm::Value *node,
llvm::Value *index) {
llvm::Value *ktype_ptr = emit_gep(def, "keytype", node, index, 0, 2);
llvm::Value *ktype_ptr = emit_gep(def, "keytype", node, index, 2);
llvm::Instruction *ktype = def->builder->CreateLoad(ktype_ptr);
ktype->setMetadata(llvm::LLVMContext::MD_tbaa, def->types->tbaa_TValue_ttT);
return ktype;
@ -409,7 +416,7 @@ llvm::Value *RaviCodeGenerator::emit_table_get_keytype(RaviFunctionDef *def,
llvm::Value *RaviCodeGenerator::emit_table_get_strkey(RaviFunctionDef *def,
llvm::Value *node,
llvm::Value *index) {
llvm::Value *value_ptr = emit_gep(def, "keyvalue", node, index, 1, 4);
llvm::Value *value_ptr = emit_gep(def, "keyvalue", node, index, 4);
llvm::Value *sptr =
def->builder->CreateBitCast(value_ptr, def->types->ppTStringT);
llvm::Instruction *keyvalue = def->builder->CreateLoad(sptr);
@ -535,7 +542,7 @@ void RaviCodeGenerator::emit_store_type_(RaviFunctionDef *def,
type == LUA_TBOOLEAN || type == LUA_TNIL);
llvm::Value *desttype = emit_gep(def, "dest.tt", value, 0, 1);
llvm::Instruction *store =
def->builder->CreateStore(def->types->kInt[type], desttype);
def->builder->CreateStore(def->types->kByte[type], desttype);
store->setMetadata(llvm::LLVMContext::MD_tbaa, def->types->tbaa_TValue_ttT);
}
@ -551,14 +558,14 @@ llvm::Value *RaviCodeGenerator::emit_is_value_of_type(RaviFunctionDef *def,
llvm::Value *value_type,
LuaTypeCode lua_type,
const char *varname) {
return def->builder->CreateICmpEQ(value_type, def->types->kInt[int(lua_type)],
return def->builder->CreateICmpEQ(value_type, def->types->kByte[int(lua_type)],
varname);
}
llvm::Value *RaviCodeGenerator::emit_is_not_value_of_type(
RaviFunctionDef *def, llvm::Value *value_type, LuaTypeCode lua_type,
const char *varname) {
return def->builder->CreateICmpNE(value_type, def->types->kInt[int(lua_type)],
return def->builder->CreateICmpNE(value_type, def->types->kByte[int(lua_type)],
varname);
}
@ -567,9 +574,9 @@ llvm::Value *RaviCodeGenerator::emit_is_not_value_of_type_class(
RaviFunctionDef *def, llvm::Value *value_type, int lua_type,
const char *varname) {
llvm::Value *novariant_type =
def->builder->CreateAnd(value_type, def->types->kInt[0x0F]);
def->builder->CreateAnd(value_type, def->types->kByte[0x0F]);
return def->builder->CreateICmpNE(novariant_type,
def->types->kInt[int(lua_type)], varname);
def->types->kByte[int(lua_type)], varname);
}
llvm::Instruction *RaviCodeGenerator::emit_load_ravi_arraytype(
@ -720,28 +727,29 @@ void RaviCodeGenerator::emit_GC_barrier(RaviFunctionDef *def,
// is ra collectible?
llvm::Value *type = emit_load_type(def, ra);
llvm::Value *is_collectible =
def->builder->CreateAnd(type, def->types->kInt[BIT_ISCOLLECTABLE]);
def->builder->CreateAnd(type, def->types->kByte[BIT_ISCOLLECTABLE]);
llvm::Value *upval_marked_ptr = emit_gep(def, "o_marked_ptr", upval, 0, 2);
llvm::Value *upval_marked =
def->builder->CreateLoad(upval_marked_ptr, "o_marked");
llvm::Value *is_black = def->builder->CreateAnd(
upval_marked, def->types->kInt[bitmask(BLACKBIT)]);
upval_marked, def->types->kByte[bitmask(BLACKBIT)]);
llvm::Value *gcobj_ptr = emit_gep(def, "v_gcobj_ptr", ra, 0, 0, 0);
llvm::Value *valuegc = def->builder->CreateBitCast(ra, def->types->pTValueGCT, "value_gc");
llvm::Value *gcobj_ptr = emit_gep(def, "v_gcobj_ptr", valuegc, 0, 0);
llvm::Value *gcobj = def->builder->CreateLoad(gcobj_ptr, "v_gcobj");
llvm::Value *marked3_ptr = emit_gep(def, "marked3", gcobj, 0, 2);
llvm::Value *marked3 = def->builder->CreateLoad(marked3_ptr, "marked3");
llvm::Value *is_white =
def->builder->CreateAnd(marked3, def->types->kInt[WHITEBITS]);
def->builder->CreateAnd(marked3, def->types->kByte[WHITEBITS]);
llvm::Value *cmp1 = def->builder->CreateICmpNE(
is_collectible, def->types->kInt[0], "tobool1");
is_collectible, def->types->kByte[0], "tobool1");
llvm::Value *cmp2 =
def->builder->CreateICmpNE(is_black, def->types->kInt[0], "tobool2");
def->builder->CreateICmpNE(is_black, def->types->kByte[0], "tobool2");
llvm::Value *and1 = def->builder->CreateAnd(cmp1, cmp2);
llvm::Value *cmp3 =
def->builder->CreateICmpNE(is_white, def->types->kInt[0], "tobool3");
def->builder->CreateICmpNE(is_white, def->types->kByte[0], "tobool3");
llvm::Value *and2 = def->builder->CreateAnd(and1, cmp3);
llvm::BasicBlock *then =

@ -169,10 +169,11 @@ LuaLLVMTypes::LuaLLVMTypes(llvm::LLVMContext &context) : mdbuilder(context) {
ValueT->setBody(elements);
// Create a synonym type with gc member
ValueGCT = llvm::StructType::create(context, "union.ValueGC");
TValueGCT = llvm::StructType::create(context, "union.ValueGC");
elements.clear();
elements.push_back(pGCObjectT);
ValueGCT->setBody(elements);
TValueGCT->setBody(elements);
pTValueGCT = llvm::PointerType::get(TValueGCT, 0);
// struct TValue {
// union Value value_;

Loading…
Cancel
Save