issue #139 work in progress

lua54
Dibyendu Majumdar 6 years ago
parent 157bc43162
commit 971b548f1b

@ -2,5 +2,5 @@ mkdir llvm64d
cd llvm64d
rem cmake -DCMAKE_INSTALL_PREFIX=c:\ravi64llvmd -G "Visual Studio 14 Win64" -DLLVM_JIT=ON -DLLVM_DIR=c:\LLVM37debug\share\llvm\cmake ..
rem cmake -DSTATIC_BUILD=ON -DCMAKE_BUILD_TYPE=Debug -DCMAKE_INSTALL_PREFIX=c:\d\ravi64llvmd -G "Visual Studio 15 2017 Win64" -DLLVM_JIT=ON -DEMBEDDED_DMRC=ON -DLLVM_DIR=c:\d\LLVM39D64\lib\cmake\llvm ..
cmake -DCMAKE_INSTALL_PREFIX=c:\ravi -G "Visual Studio 15 2017 Win64" -DLLVM_JIT=ON -DLLVM_DIR=c:\d\LLVM5_64D\lib\cmake\llvm ..
cmake -DCMAKE_INSTALL_PREFIX=c:\ravi -G "Visual Studio 15 2017 Win64" -DSTATIC_BUILD=ON -DCMAKE_BUILD_TYPE=Debug -DLLVM_JIT=ON -DLLVM_DIR=c:\d\LLVM5_64D\lib\cmake\llvm ..
cd ..

@ -1,7 +1,7 @@
#include "lua_hdr.h"
extern int printf(const char *, ...);
extern void luaC_upvalbarrier_ (struct lua_State *L, struct UpVal *uv);
extern void luaC_upvalbarrier_ (struct lua_State *L, struct GCObject *o, struct GCObject *v);
void luaV_op_call(struct lua_State *L, struct LClosure *cl, struct TValue *ra, int b, int c) {
struct UpVal *uv = cl->upvals[b];
@ -10,5 +10,5 @@ void luaV_op_call(struct lua_State *L, struct LClosure *cl, struct TValue *ra, i
int uv_isblack = isblack(uv);
int rav_iswhite = iswhite(gcvalue(ra));
if (ra_iscollectable && uv_isblack && rav_iswhite)
luaC_upvalbarrier_(L,uv);
luaC_upvalbarrier_(L,(struct GCObject *)uv, ra->value_.gc);
}

@ -46,18 +46,19 @@ entry:
%tobool6 = icmp ne i8 %4, 0
%or.cond = and i1 %tobool, %tobool6
%tobool8 = icmp ne i8 %7, 0
%or.cond9 = and i1 %or.cond, %tobool8
br i1 %or.cond9, label %if.then, label %if.end
%or.cond11 = and i1 %or.cond, %tobool8
br i1 %or.cond11, label %if.then, label %if.end
if.then: ; preds = %entry
tail call void @luaC_upvalbarrier_(%struct.lua_State* %L, %struct.UpVal* %0) #2
%8 = bitcast %struct.UpVal* %0 to %struct.GCObject*
tail call void @luaC_upvalbarrier_(%struct.lua_State* %L, %struct.GCObject* %8, %struct.GCObject* %5) #2
br label %if.end
if.end: ; preds = %if.then, %entry
ret void
}
declare void @luaC_upvalbarrier_(%struct.lua_State*, %struct.UpVal*) local_unnamed_addr #1
declare void @luaC_upvalbarrier_(%struct.lua_State*, %struct.GCObject*, %struct.GCObject*) local_unnamed_addr #1
attributes #0 = { nounwind "correctly-rounded-divide-sqrt-fp-math"="false" "disable-tail-calls"="false" "less-precise-fpmad"="false" "no-frame-pointer-elim"="false" "no-infs-fp-math"="false" "no-jump-tables"="false" "no-nans-fp-math"="false" "no-signed-zeros-fp-math"="false" "no-trapping-math"="false" "stack-protector-buffer-size"="8" "target-features"="+mmx,+sse,+sse2,+x87" "unsafe-fp-math"="false" "use-soft-float"="false" }
attributes #1 = { "correctly-rounded-divide-sqrt-fp-math"="false" "disable-tail-calls"="false" "less-precise-fpmad"="false" "no-frame-pointer-elim"="false" "no-infs-fp-math"="false" "no-nans-fp-math"="false" "no-signed-zeros-fp-math"="false" "no-trapping-math"="false" "stack-protector-buffer-size"="8" "target-features"="+mmx,+sse,+sse2,+x87" "unsafe-fp-math"="false" "use-soft-float"="false" }

@ -425,8 +425,7 @@ llvm::Value *RaviCodeGenerator::emit_table_get_value(RaviFunctionDef *def,
llvm::Value *index) {
llvm::Value *value = emit_gep(def, "nodeval", node, index, 0);
// We need to cast it to TValue *
llvm::Value *ptr =
def->builder->CreateBitCast(value, def->types->pTValueT);
llvm::Value *ptr = def->builder->CreateBitCast(value, def->types->pTValueT);
return ptr;
}
@ -711,46 +710,52 @@ llvm::Value *RaviCodeGenerator::emit_ci_is_Lua(RaviFunctionDef *def,
// FIXME below is broken
void RaviCodeGenerator::emit_GC_barrier(RaviFunctionDef *def,
llvm::Value *upval,
llvm::Value *ra) {
//Goal is to generate:
//int ra_iscollectable = iscollectable(ra);
//int uv_isblack = isblack(uv);
//int rav_iswhite = iswhite(gcvalue(ra));
//if (ra_iscollectable && uv_isblack && rav_iswhite)
// luaC_barrier_(L, uv, ra);
// is ra collectible?
llvm::Value *upval, llvm::Value *ra) {
// int ra_iscollectable = iscollectable(ra);
// int uv_isblack = isblack(uv);
// int rav_iswhite = iswhite(gcvalue(ra));
// if (ra_iscollectable && uv_isblack && rav_iswhite)
// luaC_barrier_(L, (GCObject *)uv, ra->value_.gc);
// 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->kInt[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)]);
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)]);
llvm::Value *gcobj_ptr = emit_gep(def, "v_gcobj_ptr", ra, 0, 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]);
llvm::Value *is_white =
def->builder->CreateAnd(marked3, def->types->kInt[WHITEBITS]);
llvm::Value *cmp1 = def->builder->CreateICmpNE(is_collectible, def->types->kInt[0], "tobool1");
llvm::Value *cmp2 = def->builder->CreateICmpNE(is_black, def->types->kInt[0], "tobool2");
llvm::Value *cmp1 = def->builder->CreateICmpNE(
is_collectible, def->types->kInt[0], "tobool1");
llvm::Value *cmp2 =
def->builder->CreateICmpNE(is_black, def->types->kInt[0], "tobool2");
llvm::Value *and1 = def->builder->CreateAnd(cmp1, cmp2);
llvm::Value *cmp3 = def->builder->CreateICmpNE(is_white, def->types->kInt[0], "tobool3");
llvm::Value *cmp3 =
def->builder->CreateICmpNE(is_white, def->types->kInt[0], "tobool3");
llvm::Value *and2 = def->builder->CreateAnd(and1, cmp3);
llvm::BasicBlock *then =
llvm::BasicBlock::Create(def->jitState->context(), "if.then", def->f);
llvm::BasicBlock::Create(def->jitState->context(), "if.then", def->f);
llvm::BasicBlock *end =
llvm::BasicBlock::Create(def->jitState->context(), "if.end");
llvm::BasicBlock::Create(def->jitState->context(), "if.end");
def->builder->CreateCondBr(and2, then, end);
def->builder->SetInsertPoint(then);
// FIXME
CreateCall3(def->builder, def->luaC_barrierF, def->L, def->builder->CreateBitCast(upval, def->types->pGCObjectT), gcobj_ptr);
CreateCall3(def->builder, def->luaC_barrierF, def->L,
def->builder->CreateBitCast(upval, def->types->pGCObjectT),
gcobj);
def->builder->CreateBr(end);
def->f->getBasicBlockList().push_back(end);
@ -1140,8 +1145,8 @@ void RaviCodeGenerator::emit_extern_declarations(RaviFunctionDef *def) {
def->types->luaV_objlenT, reinterpret_cast<void *>(&luaV_objlen),
"luaV_objlen");
def->luaC_barrierF = def->raviF->addExternFunction(
def->types->luaC_barrierT,
reinterpret_cast<void *>(&luaC_barrier_), "luaC_barrier_");
def->types->luaC_barrierT, reinterpret_cast<void *>(&luaC_barrier_),
"luaC_barrier_");
def->raviV_op_concatF = def->raviF->addExternFunction(
def->types->raviV_op_concatT, reinterpret_cast<void *>(&raviV_op_concat),
"raviV_op_concat");

Loading…
Cancel
Save