experiment with noninline add, sub, mul, div ops

gccjit-ravi534
Dibyendu Majumdar 8 years ago
parent a8bc74e0b3
commit 9e7408a944

@ -134,6 +134,10 @@ LUAI_FUNC void raviV_op_setupvalai(lua_State *L, LClosure *cl, TValue *ra, int b
LUAI_FUNC void raviV_op_setupvalaf(lua_State *L, LClosure *cl, TValue *ra, int b);
LUAI_FUNC void raviV_op_setupvalt(lua_State *L, LClosure *cl, TValue *ra, int b);
LUAI_FUNC void raviV_op_setupval(lua_State *L, LClosure *cl, TValue *ra, int b);
LUAI_FUNC void raviV_op_add(lua_State *L, TValue *ra, TValue *rb, TValue *rc);
LUAI_FUNC void raviV_op_sub(lua_State *L, TValue *ra, TValue *rb, TValue *rc);
LUAI_FUNC void raviV_op_mul(lua_State *L, TValue *ra, TValue *rb, TValue *rc);
LUAI_FUNC void raviV_op_div(lua_State *L, TValue *ra, TValue *rb, TValue *rc);
LUAI_FUNC void raviV_op_shl(lua_State *L, TValue *ra, TValue *rb, TValue *rc);
LUAI_FUNC void raviV_op_shr(lua_State *L, TValue *ra, TValue *rb, TValue *rc);
LUAI_FUNC void raviV_op_bor(lua_State *L, TValue *ra, TValue *rb, TValue *rc);

@ -265,6 +265,10 @@ struct LuaLLVMTypes {
llvm::FunctionType *raviV_op_concatT;
llvm::FunctionType *raviV_op_closureT;
llvm::FunctionType *raviV_op_varargT;
llvm::FunctionType *raviV_op_addT;
llvm::FunctionType *raviV_op_subT;
llvm::FunctionType *raviV_op_mulT;
llvm::FunctionType *raviV_op_divT;
llvm::FunctionType *raviV_op_shrT;
llvm::FunctionType *raviV_op_shlT;
llvm::FunctionType *raviV_op_borT;
@ -640,6 +644,10 @@ struct RaviFunctionDef {
llvm::Function *raviV_op_concatF;
llvm::Function *raviV_op_closureF;
llvm::Function *raviV_op_varargF;
llvm::Function *raviV_op_addF;
llvm::Function *raviV_op_subF;
llvm::Function *raviV_op_mulF;
llvm::Function *raviV_op_divF;
llvm::Function *raviV_op_shrF;
llvm::Function *raviV_op_shlF;
llvm::Function *raviV_op_borF;

@ -2342,6 +2342,65 @@ void raviV_op_setupval(lua_State *L, LClosure *cl, TValue *ra, int b) {
luaC_upvalbarrier(L, uv);
}
void raviV_op_add(lua_State *L, TValue *ra, TValue *rb, TValue *rc) {
lua_Number nb;
lua_Number nc;
if (ttisinteger(rb) && ttisinteger(rc)) {
lua_Integer ib = ivalue(rb);
lua_Integer ic = ivalue(rc);
setivalue(ra, intop(+, ib, ic));
}
else if (tonumber(rb, &nb) && tonumber(rc, &nc)) {
setfltvalue(ra, luai_numadd(L, nb, nc));
}
else {
luaT_trybinTM(L, rb, rc, ra, TM_ADD);
}
}
void raviV_op_sub(lua_State *L, TValue *ra, TValue *rb, TValue *rc) {
lua_Number nb;
lua_Number nc;
if (ttisinteger(rb) && ttisinteger(rc)) {
lua_Integer ib = ivalue(rb);
lua_Integer ic = ivalue(rc);
setivalue(ra, intop(-, ib, ic));
}
else if (tonumber(rb, &nb) && tonumber(rc, &nc)) {
setfltvalue(ra, luai_numsub(L, nb, nc));
}
else {
luaT_trybinTM(L, rb, rc, ra, TM_SUB);
}
}
void raviV_op_mul(lua_State *L, TValue *ra, TValue *rb, TValue *rc) {
lua_Number nb;
lua_Number nc;
if (ttisinteger(rb) && ttisinteger(rc)) {
lua_Integer ib = ivalue(rb);
lua_Integer ic = ivalue(rc);
setivalue(ra, intop(*, ib, ic));
}
else if (tonumber(rb, &nb) && tonumber(rc, &nc)) {
setfltvalue(ra, luai_nummul(L, nb, nc));
}
else {
luaT_trybinTM(L, rb, rc, ra, TM_MUL);
}
}
void raviV_op_div(lua_State *L, TValue *ra, TValue *rb, TValue *rc) {
lua_Number nb;
lua_Number nc;
if (tonumber(rb, &nb) && tonumber(rc, &nc)) {
setfltvalue(ra, luai_numdiv(L, nb, nc));
}
else {
luaT_trybinTM(L, rb, rc, ra, TM_DIV);
}
}
void raviV_op_shl(lua_State *L, TValue *ra, TValue *rb, TValue *rc) {
lua_Integer ib;
lua_Integer ic;

@ -245,18 +245,18 @@ void RaviCodeGenerator::emit_BITWISE_BINARY_OP(RaviFunctionDef *def, OpCode op,
llvm::Value *result = NULL;
switch (op) {
case OP_RAVI_BAND_II:
result = def->builder->CreateAnd(lhs, rhs, "OP_RAVI_BAND_II_result");
break;
case OP_RAVI_BOR_II:
result = def->builder->CreateOr(lhs, rhs, "OP_RAVI_BOR_II_result");
break;
case OP_RAVI_BXOR_II:
result = def->builder->CreateXor(lhs, rhs, "OP_RAVI_BXOR_II_result");
break;
default:
fprintf(stderr, "unexpected value of opcode %d\n", (int)op);
abort();
case OP_RAVI_BAND_II:
result = def->builder->CreateAnd(lhs, rhs, "OP_RAVI_BAND_II_result");
break;
case OP_RAVI_BOR_II:
result = def->builder->CreateOr(lhs, rhs, "OP_RAVI_BOR_II_result");
break;
case OP_RAVI_BXOR_II:
result = def->builder->CreateXor(lhs, rhs, "OP_RAVI_BXOR_II_result");
break;
default:
fprintf(stderr, "unexpected value of opcode %d\n", (int)op);
abort();
}
emit_store_reg_i_withtype(def, result, ra);
}
@ -278,7 +278,8 @@ void RaviCodeGenerator::emit_bitwise_shiftl(RaviFunctionDef *def,
rb, llvm::ConstantInt::get(def->types->lua_IntegerT, -y));
emit_store_reg_i_withtype(def, result, ra);
}
} else {
}
else {
if (y >= NBITS)
emit_store_reg_i_withtype(
def, llvm::ConstantInt::get(def->types->lua_IntegerT, 0), ra);
@ -302,10 +303,12 @@ void RaviCodeGenerator::emit_BITWISE_SHIFT_OP(RaviFunctionDef *def, OpCode op,
if (op == OP_RAVI_SHL_II && ISK(C)) {
lua_Integer y = def->p->k[INDEXK(C)].value_.i;
emit_bitwise_shiftl(def, ra, B, y);
} else if (op == OP_RAVI_SHR_II && ISK(C)) {
}
else if (op == OP_RAVI_SHR_II && ISK(C)) {
lua_Integer y = def->p->k[INDEXK(C)].value_.i;
emit_bitwise_shiftl(def, ra, B, -y);
} else {
}
else {
// RHS is not a constant
llvm::Value *rc = emit_gep_register_or_constant(def, C);
llvm::Value *rb = emit_gep_register_or_constant(def, B);
@ -314,19 +317,19 @@ void RaviCodeGenerator::emit_BITWISE_SHIFT_OP(RaviFunctionDef *def, OpCode op,
// could invoke metamethods we need to set
// 'savedpc'
switch (op) {
case OP_SHL:
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:
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;
default:
fprintf(stderr, "unexpected value of opcode %d\n", (int)op);
abort();
case OP_SHL:
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:
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;
default:
fprintf(stderr, "unexpected value of opcode %d\n", (int)op);
abort();
}
}
}
@ -343,8 +346,8 @@ void RaviCodeGenerator::emit_BNOT_I(RaviFunctionDef *def, int A, int B,
emit_store_reg_i_withtype(def, result, ra);
}
void RaviCodeGenerator::emit_BOR_BXOR_BAND(RaviFunctionDef *def, OpCode op, int A, int B,
int C, int pc) {
void RaviCodeGenerator::emit_BOR_BXOR_BAND(RaviFunctionDef *def, OpCode op,
int A, int B, int C, int pc) {
bool traced = emit_debug_trace(def, op, pc);
// Below may invoke metamethod so we set savedpc
if (!traced) emit_update_savedpc(def, pc);
@ -352,9 +355,11 @@ void RaviCodeGenerator::emit_BOR_BXOR_BAND(RaviFunctionDef *def, OpCode op, int
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);
CreateCall4(def->builder, op == OP_BOR ? def->raviV_op_borF :
(op == OP_BAND ? def->raviV_op_bandF : def->raviV_op_bxorF),
def->L, ra, rb, rc);
CreateCall4(def->builder,
op == OP_BOR
? def->raviV_op_borF
: (op == OP_BAND ? def->raviV_op_bandF : def->raviV_op_bxorF),
def->L, ra, rb, rc);
}
void RaviCodeGenerator::emit_BNOT(RaviFunctionDef *def, int A, int B, int pc) {
@ -366,6 +371,4 @@ void RaviCodeGenerator::emit_BNOT(RaviFunctionDef *def, int A, int B, int pc) {
llvm::Value *rb = emit_gep_register(def, B);
CreateCall3(def->builder, def->raviV_op_bnotF, def->L, ra, rb);
}
}

@ -30,6 +30,34 @@ namespace ravi {
void RaviCodeGenerator::emit_ARITH(RaviFunctionDef *def, int A, int B, int C,
OpCode op, TMS tms, int pc) {
#if 0
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);
llvm::Value *rc = emit_gep_register_or_constant(def, C);
switch (op) {
case OP_ADD:
CreateCall4(def->builder, def->raviV_op_addF,
def->L, ra, rb, rc);
break;
case OP_SUB:
CreateCall4(def->builder, def->raviV_op_subF,
def->L, ra, rb, rc);
break;
case OP_MUL:
CreateCall4(def->builder, def->raviV_op_mulF,
def->L, ra, rb, rc);
break;
case OP_DIV:
CreateCall4(def->builder, def->raviV_op_divF,
def->L, ra, rb, rc);
break;
default:
lua_assert(0);
}
#else
// TValue *rb = RKB(i);
// TValue *rc = RKC(i);
// lua_Number nb; lua_Number nc;
@ -221,6 +249,7 @@ void RaviCodeGenerator::emit_ARITH(RaviFunctionDef *def, int A, int B, int C,
def->f->getBasicBlockList().push_back(done_block);
def->builder->SetInsertPoint(done_block);
#endif
}
// OP_MOD

@ -839,11 +839,11 @@ bool RaviCodeGenerator::canCompile(Proto *p) {
p->ravi_jit.jit_status = RAVI_JIT_CANT_COMPILE;
return false;
}
//const Instruction *code = p->code;
//int pc, n = p->sizecode;
// const Instruction *code = p->code;
// int pc, n = p->sizecode;
// Loop over the byte codes; as Lua compiler inserts
// an extra RETURN op we need to ignore the last op
//for (pc = 0; pc < n; pc++) {
// for (pc = 0; pc < n; pc++) {
// Instruction i = code[pc];
// OpCode o = GET_OPCODE(i);
// if (o == OP_EXTRAARG)
@ -1069,6 +1069,18 @@ void RaviCodeGenerator::emit_extern_declarations(RaviFunctionDef *def) {
def->raviV_op_bnotF = def->raviF->addExternFunction(
def->types->raviV_op_bnotT, reinterpret_cast<void *>(&raviV_op_bnot),
"raviV_op_bnot");
def->raviV_op_addF = def->raviF->addExternFunction(
def->types->raviV_op_addT, reinterpret_cast<void *>(&raviV_op_add),
"raviV_op_add");
def->raviV_op_subF = def->raviF->addExternFunction(
def->types->raviV_op_subT, reinterpret_cast<void *>(&raviV_op_sub),
"raviV_op_sub");
def->raviV_op_mulF = def->raviF->addExternFunction(
def->types->raviV_op_mulT, reinterpret_cast<void *>(&raviV_op_mul),
"raviV_op_mul");
def->raviV_op_divF = def->raviF->addExternFunction(
def->types->raviV_op_divT, reinterpret_cast<void *>(&raviV_op_div),
"raviV_op_div");
def->raviV_op_setupvaliF = def->raviF->addExternFunction(
def->types->raviV_op_setupvaliT,
reinterpret_cast<void *>(&raviV_op_setupvali), "raviV_op_setupvali");
@ -1577,14 +1589,7 @@ bool RaviCodeGenerator::compile(lua_State *L, Proto *p,
emit_SETTABLE_SK(def, A, B, C, pc);
} break;
// The SETTABLE_I code generation is broken as it
// doesn't handle metamethods etc. Needs to be done
// similar to SETTABLE_SK
case OP_RAVI_SETTABLE_I: /* {
int B = GETARG_B(i);
int C = GETARG_C(i);
emit_SETTABLE_I(def, A, B, C, pc);
} break; */
case OP_RAVI_SETTABLE_I:
case OP_SETTABLE: {
int B = GETARG_B(i);
int C = GETARG_C(i);

@ -25,7 +25,6 @@
namespace ravi {
LuaLLVMTypes::LuaLLVMTypes(llvm::LLVMContext &context) : mdbuilder(context) {
C_voidT = llvm::Type::getVoidTy(context);
C_floatT = llvm::Type::getFloatTy(context);
@ -35,19 +34,19 @@ LuaLLVMTypes::LuaLLVMTypes(llvm::LLVMContext &context) : mdbuilder(context) {
// issue #93 add support for 32-bit Lua
lua_NumberT = C_floatT;
static_assert(std::is_floating_point<lua_Number>::value &&
sizeof(lua_Number) == sizeof(float),
"lua_Number is not a float");
sizeof(lua_Number) == sizeof(float),
"lua_Number is not a float");
static_assert(sizeof(lua_Integer) == sizeof(lua_Number) &&
sizeof(lua_Integer) == sizeof(int32_t),
"lua_Integer size (32-bit) does not match lua_Number");
sizeof(lua_Integer) == sizeof(int32_t),
"lua_Integer size (32-bit) does not match lua_Number");
#else
lua_NumberT = C_doubleT;
static_assert(std::is_floating_point<lua_Number>::value &&
sizeof(lua_Number) == sizeof(double),
"lua_Number is not a double");
sizeof(lua_Number) == sizeof(double),
"lua_Number is not a double");
static_assert(sizeof(lua_Integer) == sizeof(lua_Number) &&
sizeof(lua_Integer) == sizeof(int64_t),
"lua_Integer size (64-bit) does not match lua_Number");
sizeof(lua_Integer) == sizeof(int64_t),
"lua_Integer size (64-bit) does not match lua_Number");
#endif
plua_NumberT = llvm::PointerType::get(lua_NumberT, 0);
@ -83,7 +82,7 @@ LuaLLVMTypes::LuaLLVMTypes(llvm::LLVMContext &context) : mdbuilder(context) {
tmsT = C_intT;
static_assert(sizeof(L_Umaxalign) == sizeof(double),
"L_Umaxalign is not same size as double");
"L_Umaxalign is not same size as double");
L_UmaxalignT = C_doubleT;
static_assert(sizeof(lu_byte) == sizeof(char),
@ -570,8 +569,8 @@ LuaLLVMTypes::LuaLLVMTypes(llvm::LLVMContext &context) : mdbuilder(context) {
elements.push_back(C_ptrdiff_t); /* extra */
elements.push_back(llvm::Type::getInt16Ty(context)); /* nresults */
elements.push_back(lu_byteT); /* callstatus */
elements.push_back(lu_byteT); /* jitstatus RAVI extension*/
elements.push_back(C_shortT); /* stacklevel RAVI extension */
elements.push_back(lu_byteT); /* jitstatus RAVI extension*/
elements.push_back(C_shortT); /* stacklevel RAVI extension */
CallInfoT->setBody(elements);
// typedef struct ravi_State ravi_State;
@ -798,15 +797,15 @@ LuaLLVMTypes::LuaLLVMTypes(llvm::LLVMContext &context) : mdbuilder(context) {
luaV_settableT =
llvm::FunctionType::get(llvm::Type::getVoidTy(context), elements, false);
raviV_gettable_sskeyT =
llvm::FunctionType::get(llvm::Type::getVoidTy(context), elements, false);
llvm::FunctionType::get(llvm::Type::getVoidTy(context), elements, false);
raviV_settable_sskeyT =
llvm::FunctionType::get(llvm::Type::getVoidTy(context), elements, false);
llvm::FunctionType::get(llvm::Type::getVoidTy(context), elements, false);
// void luaV_finishget (lua_State *L, const TValue *t, TValue *key,
// StkId val, const TValue *slot);
elements.push_back(pTValueT);
luaV_finishgetT =
llvm::FunctionType::get(llvm::Type::getVoidTy(context), elements, false);
llvm::FunctionType::get(llvm::Type::getVoidTy(context), elements, false);
// void luaT_trybinTM (lua_State *L, const TValue *p1, const TValue *p2,
// StkId res, TMS event);
@ -893,15 +892,15 @@ LuaLLVMTypes::LuaLLVMTypes(llvm::LLVMContext &context) : mdbuilder(context) {
elements.push_back(pTValueT);
elements.push_back(C_intT);
raviV_op_setupvaliT =
llvm::FunctionType::get(llvm::Type::getVoidTy(context), elements, false);
llvm::FunctionType::get(llvm::Type::getVoidTy(context), elements, false);
raviV_op_setupvalfT =
llvm::FunctionType::get(llvm::Type::getVoidTy(context), elements, false);
llvm::FunctionType::get(llvm::Type::getVoidTy(context), elements, false);
raviV_op_setupvalaiT =
llvm::FunctionType::get(llvm::Type::getVoidTy(context), elements, false);
llvm::FunctionType::get(llvm::Type::getVoidTy(context), elements, false);
raviV_op_setupvalafT =
llvm::FunctionType::get(llvm::Type::getVoidTy(context), elements, false);
llvm::FunctionType::get(llvm::Type::getVoidTy(context), elements, false);
raviV_op_setupvaltT =
llvm::FunctionType::get(llvm::Type::getVoidTy(context), elements, false);
llvm::FunctionType::get(llvm::Type::getVoidTy(context), elements, false);
// void raviV_op_bor(lua_State *L, TValue *ra, TValue *rb, TValue *rc);
// void raviV_op_bxor(lua_State *L, TValue *ra, TValue *rb, TValue *rc);
@ -914,25 +913,32 @@ LuaLLVMTypes::LuaLLVMTypes(llvm::LLVMContext &context) : mdbuilder(context) {
elements.push_back(pTValueT);
elements.push_back(pTValueT);
raviV_op_bnotT =
llvm::FunctionType::get(llvm::Type::getVoidTy(context), elements, false);
llvm::FunctionType::get(llvm::Type::getVoidTy(context), elements, false);
elements.push_back(pTValueT);
raviV_op_shlT =
llvm::FunctionType::get(llvm::Type::getVoidTy(context), elements, false);
raviV_op_shrT =
llvm::FunctionType::get(llvm::Type::getVoidTy(context), elements, false);
raviV_op_borT =
llvm::FunctionType::get(llvm::Type::getVoidTy(context), elements, false);
llvm::FunctionType::get(llvm::Type::getVoidTy(context), elements, false);
raviV_op_bxorT =
llvm::FunctionType::get(llvm::Type::getVoidTy(context), elements, false);
llvm::FunctionType::get(llvm::Type::getVoidTy(context), elements, false);
raviV_op_bandT =
llvm::FunctionType::get(llvm::Type::getVoidTy(context), elements, false);
llvm::FunctionType::get(llvm::Type::getVoidTy(context), elements, false);
raviV_op_addT =
llvm::FunctionType::get(llvm::Type::getVoidTy(context), elements, false);
raviV_op_subT =
llvm::FunctionType::get(llvm::Type::getVoidTy(context), elements, false);
raviV_op_mulT =
llvm::FunctionType::get(llvm::Type::getVoidTy(context), elements, false);
raviV_op_divT =
llvm::FunctionType::get(llvm::Type::getVoidTy(context), elements, false);
// const TValue *luaH_getint(Table *t, lua_Integer key);
elements.clear();
elements.push_back(pTableT);
elements.push_back(lua_IntegerT);
luaH_getintT =
llvm::FunctionType::get(pTValueT, elements, false);
luaH_getintT = llvm::FunctionType::get(pTValueT, elements, false);
// void luaH_setint(lua_State *L, Table *t, lua_Integer key, TValue *value);
elements.clear();
@ -941,14 +947,13 @@ LuaLLVMTypes::LuaLLVMTypes(llvm::LLVMContext &context) : mdbuilder(context) {
elements.push_back(lua_IntegerT);
elements.push_back(pTValueT);
luaH_setintT =
llvm::FunctionType::get(llvm::Type::getVoidTy(context), elements, false);
llvm::FunctionType::get(llvm::Type::getVoidTy(context), elements, false);
// const TValue *luaH_getstr(Table *t, TString *key);
elements.clear();
elements.push_back(pTableT);
elements.push_back(pTStringT);
luaH_getstrT =
llvm::FunctionType::get(pTValueT, elements, false);
luaH_getstrT = llvm::FunctionType::get(pTValueT, elements, false);
// void raviH_set_int(lua_State *L, Table *t, lua_Unsigned key, lua_Integer
// value);
@ -1000,29 +1005,29 @@ LuaLLVMTypes::LuaLLVMTypes(llvm::LLVMContext &context) : mdbuilder(context) {
kFalse = llvm::ConstantInt::getFalse(llvm::Type::getInt1Ty(context));
// Do what Clang does
//!5 = metadata !{metadata !"Simple C/C++ TBAA"}
//! 5 = metadata !{metadata !"Simple C/C++ TBAA"}
tbaa_root = mdbuilder.createTBAARoot("Simple C / C++ TBAA");
//!4 = metadata !{metadata !"omnipotent char", metadata !5, i64 0}
//! 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}
//! 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}
//! 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}
//! 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}
//! 9 = metadata !{metadata !"long long", metadata !4, i64 0}
tbaa_longlongT =
mdbuilder.createTBAAScalarTypeNode("long long", tbaa_charT, 0);
tbaa_plonglongT =
@ -1032,7 +1037,8 @@ LuaLLVMTypes::LuaLLVMTypes(llvm::LLVMContext &context) : mdbuilder(context) {
tbaa_pdoubleT =
mdbuilder.createTBAAStructTagNode(tbaa_doubleT, tbaa_doubleT, 0);
//!14 = metadata !{metadata !"CallInfoL", metadata !3, i64 0, metadata !3, i64
//! 14 = metadata !{metadata !"CallInfoL", metadata !3, i64 0, metadata !3,
//! i64
// 4, metadata !9, i64 8}
std::vector<std::pair<llvm::MDNode *, uint64_t>> nodes;
nodes.push_back(std::pair<llvm::MDNode *, uint64_t>(tbaa_pointerT, 0));
@ -1040,34 +1046,35 @@ LuaLLVMTypes::LuaLLVMTypes(llvm::LLVMContext &context) : mdbuilder(context) {
nodes.push_back(std::pair<llvm::MDNode *, uint64_t>(tbaa_longlongT, 8));
tbaa_CallInfo_lT = mdbuilder.createTBAAStructTypeNode("CallInfo_l", nodes);
//!13 = metadata !{metadata !"CallInfoLua",
//! 13 = metadata !{metadata !"CallInfoLua",
// metadata !3, i64 0, metadata !3, i64 4, metadata !3, i64 8,
// metadata !3, i64 12, metadata !14, i64 16, metadata !9, i64
// 32,
// metadata !10, i64 40, metadata !4, i64 42}
nodes.clear();
nodes.push_back(
std::pair<llvm::MDNode *, uint64_t>(tbaa_pointerT, 0)); // func
nodes.push_back(std::pair<llvm::MDNode *, uint64_t>(tbaa_pointerT, 4)); // top
std::pair<llvm::MDNode *, uint64_t>(tbaa_pointerT, 0)); // func
nodes.push_back(
std::pair<llvm::MDNode *, uint64_t>(tbaa_pointerT, 4)); // top
nodes.push_back(
std::pair<llvm::MDNode *, uint64_t>(tbaa_pointerT, 8)); // previous
std::pair<llvm::MDNode *, uint64_t>(tbaa_pointerT, 8)); // previous
nodes.push_back(
std::pair<llvm::MDNode *, uint64_t>(tbaa_pointerT, 12)); // next
std::pair<llvm::MDNode *, uint64_t>(tbaa_pointerT, 12)); // next
nodes.push_back(
std::pair<llvm::MDNode *, uint64_t>(tbaa_CallInfo_lT, 16)); // l
std::pair<llvm::MDNode *, uint64_t>(tbaa_CallInfo_lT, 16)); // l
nodes.push_back(
std::pair<llvm::MDNode *, uint64_t>(tbaa_longlongT, 32)); // extra
std::pair<llvm::MDNode *, uint64_t>(tbaa_longlongT, 32)); // extra
nodes.push_back(
std::pair<llvm::MDNode *, uint64_t>(tbaa_shortT, 40)); // nresults
std::pair<llvm::MDNode *, uint64_t>(tbaa_shortT, 40)); // nresults
nodes.push_back(
std::pair<llvm::MDNode *, uint64_t>(tbaa_charT, 42)); // callstatus
std::pair<llvm::MDNode *, uint64_t>(tbaa_charT, 42)); // callstatus
nodes.push_back(
std::pair<llvm::MDNode *, uint64_t>(tbaa_charT, 43)); // jitstatus
std::pair<llvm::MDNode *, uint64_t>(tbaa_charT, 43)); // jitstatus
nodes.push_back(
std::pair<llvm::MDNode *, uint64_t>(tbaa_shortT, 44)); // stacklevel
tbaa_CallInfoT = mdbuilder.createTBAAStructTypeNode("CallInfo", nodes);
std::pair<llvm::MDNode *, uint64_t>(tbaa_shortT, 44)); // stacklevel
tbaa_CallInfoT = mdbuilder.createTBAAStructTypeNode("CallInfo", nodes);
//!7 = metadata !{metadata !"lua_State",
//! 7 = metadata !{metadata !"lua_State",
// metadata !3, i64 0, metadata !4, i64 4, metadata !4, i64 5,
// metadata !4, i64 6, metadata !3, i64 8, metadata !3, i64 12,
// metadata !3, i64 16, metadata !3, i64 20, metadata !3, i64
@ -1127,7 +1134,7 @@ LuaLLVMTypes::LuaLLVMTypes(llvm::LLVMContext &context) : mdbuilder(context) {
tbaa_CallInfo_jitstatusT =
mdbuilder.createTBAAStructTagNode(tbaa_CallInfoT, tbaa_charT, 43);
//!20 = metadata !{metadata !"Proto",
//! 20 = metadata !{metadata !"Proto",
// metadata !3, i64 0, metadata !4, i64 4, metadata !4, i64 5,
// metadata !4, i64 6, metadata !4, i64 7, metadata !4, i64 8,
// metadata !11, i64 12, metadata !11, i64 16, metadata !11,
@ -1143,50 +1150,51 @@ LuaLLVMTypes::LuaLLVMTypes(llvm::LLVMContext &context) : mdbuilder(context) {
// metadata !3, i64 72, metadata !3, i64 76}
nodes.clear();
nodes.push_back(
std::pair<llvm::MDNode *, uint64_t>(tbaa_pointerT, 0)); // next
nodes.push_back(std::pair<llvm::MDNode *, uint64_t>(tbaa_charT, 4)); // tt
nodes.push_back(std::pair<llvm::MDNode *, uint64_t>(tbaa_charT, 5)); // marked
std::pair<llvm::MDNode *, uint64_t>(tbaa_pointerT, 0)); // next
nodes.push_back(std::pair<llvm::MDNode *, uint64_t>(tbaa_charT, 4)); // tt
nodes.push_back(
std::pair<llvm::MDNode *, uint64_t>(tbaa_charT, 6)); // numparams
std::pair<llvm::MDNode *, uint64_t>(tbaa_charT, 5)); // marked
nodes.push_back(
std::pair<llvm::MDNode *, uint64_t>(tbaa_charT, 7)); // is_vararg
std::pair<llvm::MDNode *, uint64_t>(tbaa_charT, 6)); // numparams
nodes.push_back(
std::pair<llvm::MDNode *, uint64_t>(tbaa_charT, 8)); // maxstacksize
std::pair<llvm::MDNode *, uint64_t>(tbaa_charT, 7)); // is_vararg
nodes.push_back(
std::pair<llvm::MDNode *, uint64_t>(tbaa_intT, 12)); // sizeupvalues
nodes.push_back(std::pair<llvm::MDNode *, uint64_t>(tbaa_intT, 16)); // sizek
std::pair<llvm::MDNode *, uint64_t>(tbaa_charT, 8)); // maxstacksize
nodes.push_back(
std::pair<llvm::MDNode *, uint64_t>(tbaa_intT, 20)); // sizecode
std::pair<llvm::MDNode *, uint64_t>(tbaa_intT, 12)); // sizeupvalues
nodes.push_back(std::pair<llvm::MDNode *, uint64_t>(tbaa_intT, 16)); // sizek
nodes.push_back(
std::pair<llvm::MDNode *, uint64_t>(tbaa_intT, 24)); // sizelineinfo
nodes.push_back(std::pair<llvm::MDNode *, uint64_t>(tbaa_intT, 28)); // sizep
std::pair<llvm::MDNode *, uint64_t>(tbaa_intT, 20)); // sizecode
nodes.push_back(
std::pair<llvm::MDNode *, uint64_t>(tbaa_intT, 32)); // sizelocvars
std::pair<llvm::MDNode *, uint64_t>(tbaa_intT, 24)); // sizelineinfo
nodes.push_back(std::pair<llvm::MDNode *, uint64_t>(tbaa_intT, 28)); // sizep
nodes.push_back(
std::pair<llvm::MDNode *, uint64_t>(tbaa_intT, 36)); // linedefined
std::pair<llvm::MDNode *, uint64_t>(tbaa_intT, 32)); // sizelocvars
nodes.push_back(
std::pair<llvm::MDNode *, uint64_t>(tbaa_intT, 40)); // lastlinedefined
nodes.push_back(std::pair<llvm::MDNode *, uint64_t>(tbaa_pointerT, 44)); // k
std::pair<llvm::MDNode *, uint64_t>(tbaa_intT, 36)); // linedefined
nodes.push_back(
std::pair<llvm::MDNode *, uint64_t>(tbaa_pointerT, 48)); // code
nodes.push_back(std::pair<llvm::MDNode *, uint64_t>(tbaa_pointerT, 52)); // p
std::pair<llvm::MDNode *, uint64_t>(tbaa_intT, 40)); // lastlinedefined
nodes.push_back(std::pair<llvm::MDNode *, uint64_t>(tbaa_pointerT, 44)); // k
nodes.push_back(
std::pair<llvm::MDNode *, uint64_t>(tbaa_pointerT, 56)); // lineinfo
std::pair<llvm::MDNode *, uint64_t>(tbaa_pointerT, 48)); // code
nodes.push_back(std::pair<llvm::MDNode *, uint64_t>(tbaa_pointerT, 52)); // p
nodes.push_back(
std::pair<llvm::MDNode *, uint64_t>(tbaa_pointerT, 60)); // locvars
std::pair<llvm::MDNode *, uint64_t>(tbaa_pointerT, 56)); // lineinfo
nodes.push_back(
std::pair<llvm::MDNode *, uint64_t>(tbaa_pointerT, 64)); // upvalues
std::pair<llvm::MDNode *, uint64_t>(tbaa_pointerT, 60)); // locvars
nodes.push_back(
std::pair<llvm::MDNode *, uint64_t>(tbaa_pointerT, 68)); // cache
std::pair<llvm::MDNode *, uint64_t>(tbaa_pointerT, 64)); // upvalues
nodes.push_back(
std::pair<llvm::MDNode *, uint64_t>(tbaa_pointerT, 72)); // source
std::pair<llvm::MDNode *, uint64_t>(tbaa_pointerT, 68)); // cache
nodes.push_back(
std::pair<llvm::MDNode *, uint64_t>(tbaa_pointerT, 76)); // gclist
std::pair<llvm::MDNode *, uint64_t>(tbaa_pointerT, 72)); // source
nodes.push_back(
std::pair<llvm::MDNode *, uint64_t>(tbaa_charT, 80)); // ravi_jit
std::pair<llvm::MDNode *, uint64_t>(tbaa_pointerT, 76)); // gclist
nodes.push_back(
std::pair<llvm::MDNode *, uint64_t>(tbaa_charT, 80)); // ravi_jit
tbaa_ProtoT = mdbuilder.createTBAAStructTypeNode("Proto", nodes);
//!18 = metadata !{metadata !"LClosure",
//! 18 = metadata !{metadata !"LClosure",
// metadata !3, i64 0, metadata !4, i64 4, metadata !4, i64 5,
// metadata !4, i64 6, metadata !3, i64 8, metadata !3, i64
// 12,
@ -1250,32 +1258,49 @@ LuaLLVMTypes::LuaLLVMTypes(llvm::LLVMContext &context) : mdbuilder(context) {
// Table TBAA struct type
nodes.clear();
nodes.push_back(std::pair<llvm::MDNode *, uint64_t>(tbaa_pointerT, 0)); /* next */
nodes.push_back(std::pair<llvm::MDNode *, uint64_t>(tbaa_charT, 4)); /* tt */
nodes.push_back(std::pair<llvm::MDNode *, uint64_t>(tbaa_charT, 5)); /* marked */
nodes.push_back(std::pair<llvm::MDNode *, uint64_t>(tbaa_charT, 6)); /* flags */
nodes.push_back(std::pair<llvm::MDNode *, uint64_t>(tbaa_charT, 7)); /* lsizenode */
nodes.push_back(std::pair<llvm::MDNode *, uint64_t>(tbaa_intT, 8)); /* size array */
nodes.push_back(std::pair<llvm::MDNode *, uint64_t>(tbaa_pointerT, 12)); /* array */
nodes.push_back(std::pair<llvm::MDNode *, uint64_t>(tbaa_pointerT, 16)); /* node */
nodes.push_back(std::pair<llvm::MDNode *, uint64_t>(tbaa_pointerT, 20)); /* lastfree */
nodes.push_back(std::pair<llvm::MDNode *, uint64_t>(tbaa_pointerT, 24)); /* metatable */
nodes.push_back(std::pair<llvm::MDNode *, uint64_t>(tbaa_pointerT, 28)); /* gclist */
nodes.push_back(std::pair<llvm::MDNode *, uint64_t>(tbaa_RaviArrayT, 32)); /* ravi_array */
nodes.push_back(
std::pair<llvm::MDNode *, uint64_t>(tbaa_pointerT, 0)); /* next */
nodes.push_back(std::pair<llvm::MDNode *, uint64_t>(tbaa_charT, 4)); /* tt */
nodes.push_back(
std::pair<llvm::MDNode *, uint64_t>(tbaa_charT, 5)); /* marked */
nodes.push_back(
std::pair<llvm::MDNode *, uint64_t>(tbaa_charT, 6)); /* flags */
nodes.push_back(
std::pair<llvm::MDNode *, uint64_t>(tbaa_charT, 7)); /* lsizenode */
nodes.push_back(
std::pair<llvm::MDNode *, uint64_t>(tbaa_intT, 8)); /* size array */
nodes.push_back(
std::pair<llvm::MDNode *, uint64_t>(tbaa_pointerT, 12)); /* array */
nodes.push_back(
std::pair<llvm::MDNode *, uint64_t>(tbaa_pointerT, 16)); /* node */
nodes.push_back(
std::pair<llvm::MDNode *, uint64_t>(tbaa_pointerT, 20)); /* lastfree */
nodes.push_back(
std::pair<llvm::MDNode *, uint64_t>(tbaa_pointerT, 24)); /* metatable */
nodes.push_back(
std::pair<llvm::MDNode *, uint64_t>(tbaa_pointerT, 28)); /* gclist */
nodes.push_back(std::pair<llvm::MDNode *, uint64_t>(tbaa_RaviArrayT,
32)); /* ravi_array */
tbaa_TableT = mdbuilder.createTBAAStructTypeNode("Table", nodes);
tbaa_Table_flags = mdbuilder.createTBAAStructTagNode(tbaa_TableT, tbaa_charT, 6);
tbaa_Table_lsizenode = mdbuilder.createTBAAStructTagNode(tbaa_TableT, tbaa_charT, 7);
tbaa_Table_sizearray = mdbuilder.createTBAAStructTagNode(tbaa_TableT, tbaa_pointerT, 8);
tbaa_Table_array = mdbuilder.createTBAAStructTagNode(tbaa_TableT, tbaa_pointerT, 12);
tbaa_Table_node = mdbuilder.createTBAAStructTagNode(tbaa_TableT, tbaa_pointerT, 16);
tbaa_Table_metatable = mdbuilder.createTBAAStructTagNode(tbaa_TableT, tbaa_pointerT, 24);
tbaa_Table_flags =
mdbuilder.createTBAAStructTagNode(tbaa_TableT, tbaa_charT, 6);
tbaa_Table_lsizenode =
mdbuilder.createTBAAStructTagNode(tbaa_TableT, tbaa_charT, 7);
tbaa_Table_sizearray =
mdbuilder.createTBAAStructTagNode(tbaa_TableT, tbaa_pointerT, 8);
tbaa_Table_array =
mdbuilder.createTBAAStructTagNode(tbaa_TableT, tbaa_pointerT, 12);
tbaa_Table_node =
mdbuilder.createTBAAStructTagNode(tbaa_TableT, tbaa_pointerT, 16);
tbaa_Table_metatable =
mdbuilder.createTBAAStructTagNode(tbaa_TableT, tbaa_pointerT, 24);
tbaa_RaviArray_dataT =
mdbuilder.createTBAAStructTagNode(tbaa_TableT, tbaa_pointerT, 32);
mdbuilder.createTBAAStructTagNode(tbaa_TableT, tbaa_pointerT, 32);
tbaa_RaviArray_lenT =
mdbuilder.createTBAAStructTagNode(tbaa_TableT, tbaa_intT, 36);
mdbuilder.createTBAAStructTagNode(tbaa_TableT, tbaa_intT, 36);
tbaa_RaviArray_typeT =
mdbuilder.createTBAAStructTagNode(tbaa_TableT, tbaa_charT, 44);
mdbuilder.createTBAAStructTagNode(tbaa_TableT, tbaa_charT, 44);
}
void LuaLLVMTypes::dump() {

Loading…
Cancel
Save