fix tbaa metadata issue# 28

pull/81/head
Dibyendu Majumdar 9 years ago
parent d82bf96f16
commit 287a9c34fd

@ -9,6 +9,7 @@ void luaV_op_call(struct lua_State *L, struct LClosure *cl, struct TValue *ra, i
uv->v->tt_ = ra->tt_;
uv->v->value_.n = ra->value_.n;
int b1 = iscollectable(uv->v);
uv->u.value.tt_ = 1;
struct TValue *value = &uv->u.value;
int b2 = uv->v != value;
if (b1 && !b2)

@ -36,13 +36,20 @@ entry:
store i32 %1, i32* %tt_1, align 4, !tbaa !5
%n = bitcast %struct.TValue* %ra to double*
%3 = load double* %n, align 8, !tbaa !11
%4 = bitcast %struct.TValue* %2 to double*
store double %3, double* %4, align 8, !tbaa !11
%and = and i32 %1, 64
%value7 = getelementptr inbounds %struct.UpVal* %0, i32 0, i32 2, i32 0
%cmp = icmp ne %struct.TValue* %2, %value7
%4 = bitcast %struct.UpVal* %0 to double**
%5 = load double** %4, align 4, !tbaa !8
store double %3, double* %5, align 8, !tbaa !11
%6 = load %struct.TValue** %v, align 4, !tbaa !8
%tt_6 = getelementptr inbounds %struct.TValue* %6, i32 0, i32 1
%7 = load i32* %tt_6, align 4, !tbaa !5
%and = and i32 %7, 64
%value = getelementptr inbounds %struct.UpVal* %0, i32 0, i32 2, i32 0
%tt_7 = getelementptr inbounds %struct.UpVal* %0, i32 0, i32 2, i32 0, i32 1
store i32 1, i32* %tt_7, align 4, !tbaa !5
%8 = load %struct.TValue** %v, align 4, !tbaa !8
%cmp = icmp ne %struct.TValue* %8, %value
%tobool = icmp eq i32 %and, 0
%or.cond = or i1 %cmp, %tobool
%or.cond = or i1 %tobool, %cmp
br i1 %or.cond, label %if.end, label %if.then
if.then: ; preds = %entry

@ -240,9 +240,13 @@ struct LuaLLVMTypes {
llvm::MDBuilder mdbuilder;
llvm::MDNode *tbaa_root;
llvm::MDNode *tbaa_charT;
llvm::MDNode *tbaa_pcharT;
llvm::MDNode *tbaa_shortT;
llvm::MDNode *tbaa_pshortT;
llvm::MDNode *tbaa_intT;
llvm::MDNode *tbaa_pintT;
llvm::MDNode *tbaa_longlongT;
llvm::MDNode *tbaa_plonglongT;
llvm::MDNode *tbaa_pointerT;
llvm::MDNode *tbaa_ppointerT;
llvm::MDNode *tbaa_CallInfo_lT;
@ -261,6 +265,7 @@ struct LuaLLVMTypes {
llvm::MDNode *tbaa_Proto_sizepT;
llvm::MDNode *tbaa_TValueT;
llvm::MDNode *tbaa_TValue_nT;
llvm::MDNode *tbaa_TValue_hT;
llvm::MDNode *tbaa_TValue_ttT;
llvm::MDNode *tbaa_luaState_topT;
llvm::MDNode *tbaa_UpValT;
@ -530,6 +535,18 @@ public:
// Add extern declarations for Lua functions we need to call
void emit_extern_declarations(RaviFunctionDef *def);
// Store lua_Number or lua_Integer
llvm::Instruction *emit_store_local_n(RaviFunctionDef *def, llvm::Value *src, llvm::Value *dest);
// Load lua_Number or lua_Integer
llvm::Instruction *emit_load_local_n(RaviFunctionDef *def, llvm::Value *src);
// Store int
llvm::Instruction *emit_store_local_int(RaviFunctionDef *def, llvm::Value *src, llvm::Value *dest);
// Load int
llvm::Instruction *emit_load_local_int(RaviFunctionDef *def, llvm::Value *src);
// emit code for (LClosure *)ci->func->value_.gc
llvm::Value *emit_gep_ci_func_value_gc_asLClosure(RaviFunctionDef *def,
llvm::Value *ci);

@ -130,7 +130,7 @@ llvm::Instruction *RaviCodeGenerator::emit_load_reg_h(RaviFunctionDef *def,
llvm::Value *rb) {
llvm::Value *rb_h = def->builder->CreateBitCast(rb, def->types->ppTableT);
llvm::Instruction *h = def->builder->CreateLoad(rb_h);
h->setMetadata(llvm::LLVMContext::MD_tbaa, def->types->tbaa_ppointerT);
h->setMetadata(llvm::LLVMContext::MD_tbaa, def->types->tbaa_TValue_hT);
return h;
}
@ -221,6 +221,36 @@ RaviCodeGenerator::emit_load_ravi_arraylength(RaviFunctionDef *def,
return tt;
}
// Store lua_Number or lua_Integer
llvm::Instruction *RaviCodeGenerator::emit_store_local_n(RaviFunctionDef *def, llvm::Value *src, llvm::Value *dest) {
llvm::Instruction *ins = def->builder->CreateStore(src, dest);
ins->setMetadata(llvm::LLVMContext::MD_tbaa, def->types->tbaa_plonglongT);
return ins;
}
// Load lua_Number or lua_Integer
llvm::Instruction *RaviCodeGenerator::emit_load_local_n(RaviFunctionDef *def, llvm::Value *src) {
llvm::Instruction *ins = def->builder->CreateLoad(src);
ins->setMetadata(llvm::LLVMContext::MD_tbaa, def->types->tbaa_plonglongT);
return ins;
}
// Store int
llvm::Instruction *RaviCodeGenerator::emit_store_local_int(RaviFunctionDef *def, llvm::Value *src, llvm::Value *dest) {
llvm::Instruction *ins = def->builder->CreateStore(src, dest);
ins->setMetadata(llvm::LLVMContext::MD_tbaa, def->types->tbaa_pintT);
return ins;
}
// Load int
llvm::Instruction *RaviCodeGenerator::emit_load_local_int(RaviFunctionDef *def, llvm::Value *src) {
llvm::Instruction *ins = def->builder->CreateLoad(src);
ins->setMetadata(llvm::LLVMContext::MD_tbaa, def->types->tbaa_pintT);
return ins;
}
// emit code to obtain address of register or constant at location B
llvm::Value *RaviCodeGenerator::emit_gep_rkb(RaviFunctionDef *def,
llvm::Instruction *base_ptr,

@ -112,8 +112,7 @@ llvm::Value *RaviCodeGenerator::emit_boolean_testfalse(RaviFunctionDef *def,
def->builder->CreateCondBr(isnil, then_block, else_block);
def->builder->SetInsertPoint(then_block);
auto ins = def->builder->CreateStore(isnil, var);
ins->setMetadata(llvm::LLVMContext::MD_tbaa, def->types->tbaa_intT);
auto ins = emit_store_local_int(def, isnil, var);
def->builder->CreateBr(end_block);
def->f->getBasicBlockList().push_back(else_block);
@ -130,8 +129,7 @@ llvm::Value *RaviCodeGenerator::emit_boolean_testfalse(RaviFunctionDef *def,
// Test type == LUA_TBOOLEAN && bool value == 0
llvm::Value *andvalue = def->builder->CreateAnd(isbool, boolzero);
auto ins2 = def->builder->CreateStore(andvalue, var);
ins2->setMetadata(llvm::LLVMContext::MD_tbaa, def->types->tbaa_intT);
auto ins2 = emit_store_local_int(def, andvalue, var);
def->builder->CreateBr(end_block);
def->f->getBasicBlockList().push_back(end_block);
@ -139,13 +137,11 @@ llvm::Value *RaviCodeGenerator::emit_boolean_testfalse(RaviFunctionDef *def,
llvm::Value *result = nullptr;
if (donot) {
auto ins = def->builder->CreateLoad(var);
ins->setMetadata(llvm::LLVMContext::MD_tbaa, def->types->tbaa_intT);
auto ins = emit_load_local_int(def, var);
result = def->builder->CreateNot(ins);
}
else {
auto ins = def->builder->CreateLoad(var);
ins->setMetadata(llvm::LLVMContext::MD_tbaa, def->types->tbaa_intT);
auto ins = emit_load_local_int(def, var);
result = ins;
}

@ -169,9 +169,7 @@ void RaviCodeGenerator::emit_FORPREP2(RaviFunctionDef *def, llvm::Value *L_ci,
def->types->tbaa_longlongT);
// Get stopnow
llvm::Instruction *stopnow_val =
def->builder->CreateLoad(stopnow, "stopnow.value");
stopnow_val->setMetadata(llvm::LLVMContext::MD_tbaa, def->types->tbaa_intT);
llvm::Instruction *stopnow_val = emit_load_local_int(def, stopnow);
// Test if stopnow is 0
llvm::Value *stopnow_is_zero = def->builder->CreateICmpEQ(
@ -595,9 +593,7 @@ void RaviCodeGenerator::emit_FORPREP(RaviFunctionDef *def, llvm::Value *L_ci,
// lua_Integer initv = (stopnow ? 0 : ivalue(init));
// Get stopnow
llvm::Instruction *stopnow_val =
def->builder->CreateLoad(stopnow, "stopnow.value");
stopnow_val->setMetadata(llvm::LLVMContext::MD_tbaa, def->types->tbaa_intT);
llvm::Instruction *stopnow_val = emit_load_local_int(def, stopnow);
// Test if stopnow is 0
llvm::Value *stopnow_is_zero = def->builder->CreateICmpEQ(

@ -844,21 +844,34 @@ LuaLLVMTypes::LuaLLVMTypes(llvm::LLVMContext &context) : mdbuilder(context) {
// Do what Clang does
//!5 = metadata !{metadata !"Simple C/C++ TBAA"}
tbaa_root = mdbuilder.createTBAARoot("Simple C / C++ TBAA");
//!4 = metadata !{metadata !"omnipotent char", metadata !5, i64 0}
tbaa_charT =
mdbuilder.createTBAAScalarTypeNode("omnipotent char", tbaa_root, 0);
tbaa_pcharT =
mdbuilder.createTBAAStructTagNode(tbaa_charT, tbaa_charT, 0);
//!3 = metadata !{metadata !"any pointer", metadata !4, i64 0}
tbaa_pointerT =
mdbuilder.createTBAAScalarTypeNode("any pointer", tbaa_charT, 0);
tbaa_ppointerT =
mdbuilder.createTBAAStructTagNode(tbaa_pointerT, tbaa_pointerT, 0);
//!10 = metadata !{metadata !"short", metadata !4, i64 0}
tbaa_shortT = mdbuilder.createTBAAScalarTypeNode("short", tbaa_charT, 0);
tbaa_pshortT =
mdbuilder.createTBAAStructTagNode(tbaa_shortT, tbaa_shortT, 0);
//!11 = metadata !{metadata !"int", metadata !4, i64 0}
tbaa_intT = mdbuilder.createTBAAScalarTypeNode("int", tbaa_charT, 0);
tbaa_pintT =
mdbuilder.createTBAAStructTagNode(tbaa_intT, tbaa_intT, 0);
//!9 = metadata !{metadata !"long long", metadata !4, i64 0}
tbaa_longlongT =
mdbuilder.createTBAAScalarTypeNode("long long", tbaa_charT, 0);
tbaa_ppointerT =
mdbuilder.createTBAAStructTagNode(tbaa_pointerT, tbaa_pointerT, 0);
tbaa_plonglongT =
mdbuilder.createTBAAStructTagNode(tbaa_longlongT, tbaa_longlongT, 0);
//!14 = metadata !{metadata !"CallInfoL", metadata !3, i64 0, metadata !3, i64
// 4, metadata !9, i64 8}
@ -928,7 +941,7 @@ LuaLLVMTypes::LuaLLVMTypes(llvm::LLVMContext &context) : mdbuilder(context) {
tbaa_luaStateT = mdbuilder.createTBAAStructTypeNode("lua_State", nodes);
tbaa_luaState_ciT =
mdbuilder.createTBAAStructTagNode(tbaa_luaStateT, tbaa_CallInfoT, 16);
mdbuilder.createTBAAStructTagNode(tbaa_luaStateT, tbaa_pointerT, 16);
tbaa_luaState_ci_baseT =
mdbuilder.createTBAAStructTagNode(tbaa_CallInfoT, tbaa_pointerT, 16);
tbaa_CallInfo_funcT =
@ -1013,9 +1026,12 @@ LuaLLVMTypes::LuaLLVMTypes(llvm::LLVMContext &context) : mdbuilder(context) {
tbaa_TValue_nT =
mdbuilder.createTBAAStructTagNode(tbaa_TValueT, tbaa_longlongT, 0);
tbaa_TValue_hT =
mdbuilder.createTBAAStructTagNode(tbaa_TValueT, tbaa_pointerT, 0);
tbaa_TValue_ttT =
mdbuilder.createTBAAStructTagNode(tbaa_TValueT, tbaa_intT, 8);
tbaa_luaState_topT =
mdbuilder.createTBAAStructTagNode(tbaa_luaStateT, tbaa_pointerT, 8);
@ -1027,7 +1043,7 @@ LuaLLVMTypes::LuaLLVMTypes(llvm::LLVMContext &context) : mdbuilder(context) {
tbaa_UpVal_vT =
mdbuilder.createTBAAStructTagNode(tbaa_UpValT, tbaa_pointerT, 0);
tbaa_UpVal_valueT =
mdbuilder.createTBAAStructTagNode(tbaa_UpValT, tbaa_TValueT, 16);
mdbuilder.createTBAAStructTagNode(tbaa_UpValT, tbaa_intT, 16);
// RaviArray
nodes.clear();

Loading…
Cancel
Save