remove experimental NAN TAGGING solution (as it is not helpful) and fix bugs in SETLIST for numeric arrays (missing type conversion)

pull/81/head
Dibyendu Majumdar 9 years ago
parent 71e651c05e
commit 261c8218a3

@ -93,200 +93,7 @@ struct GCObject {
*/
typedef union Value Value;
#define RAVI_NAN_TAGGING 0
#if RAVI_NAN_TAGGING
#define RAVI_NAN_TAG 0x7ffc0000
#define RAVI_TYPE_MASK 0x0000ffff
/*
TODO This is little endian - need to switch lo/hi for big
endian
*/
typedef struct ravi_HiLo {
int lo;
int hi;
} HiLo;
typedef union ravi_TypeOrDouble {
HiLo hilo;
double n;
/* for debugging */
unsigned char bytes[8];
} TypeOrDouble;
/*
** Tagged Values. This is the basic representation of values in Lua,
** an actual value plus a tag with its type.
*/
#define TValuefields Value value_; TypeOrDouble tt_
typedef struct lua_TValue TValue;
/* macro defining a nil value */
/* TODO this is for little endian, make it work for big endian */
#define NILCONSTANT {NULL}, {0, (RAVI_NAN_TAG|LUA_TNIL)}
/* Note that numbers are not stored in value_ when NaN tagging is ON */
#define val_(o) ((o)->value_)
#define numval_(o) ((o)->tt_)
#define extracttype(o) ((o)->tt_.hilo.hi & RAVI_NAN_TAG)
/* raw type tag of a TValue */
#define rttype(o) (extracttype(o)==RAVI_NAN_TAG ? ((o)->tt_.hilo.hi & RAVI_TYPE_MASK) : LUA_TNUMFLT)
/* tag with no variants (bits 0-3) */
#define novariant(x) ((x) & 0x0F)
/* type tag of a TValue (bits 0-3 for tags + variant bits 4-5) */
#define ttype(o) (rttype(o) & 0x3F)
/* type tag of a TValue with no variants (bits 0-3) */
#define ttnov(o) (novariant(rttype(o)))
/* Macros to test type */
#define checktag(o,t) (rttype(o) == (t))
#define checktype(o,t) (ttnov(o) == (t))
#define ttisfloat(o) (extracttype(o) != RAVI_NAN_TAG)
#define ttisinteger(o) checktag((o), LUA_TNUMINT)
#define ttisnumber(o) (ttisfloat(o) || ttisinteger(o))
#define ttisnil(o) checktag((o), LUA_TNIL)
#define ttisboolean(o) checktag((o), LUA_TBOOLEAN)
#define ttislightuserdata(o) checktag((o), LUA_TLIGHTUSERDATA)
#define ttisstring(o) checktype((o), LUA_TSTRING)
#define ttisshrstring(o) checktag((o), ctb(LUA_TSHRSTR))
#define ttislngstring(o) checktag((o), ctb(LUA_TLNGSTR))
#define ttistable(o) checktag((o), ctb(LUA_TTABLE))
#define ttisfunction(o) checktype(o, LUA_TFUNCTION)
#define ttisclosure(o) ((rttype(o) & 0x1F) == LUA_TFUNCTION)
#define ttisCclosure(o) checktag((o), ctb(LUA_TCCL))
#define ttisLclosure(o) checktag((o), ctb(LUA_TLCL))
#define ttislcf(o) checktag((o), LUA_TLCF)
#define ttisfulluserdata(o) checktag((o), ctb(LUA_TUSERDATA))
#define ttisthread(o) checktag((o), ctb(LUA_TTHREAD))
#define ttisdeadkey(o) checktag((o), LUA_TDEADKEY)
/* Macros to access values */
#define ivalue(o) check_exp(ttisinteger(o), val_(o).i)
#define fltvalue(o) check_exp(ttisfloat(o), numval_(o).n)
#define nvalue(o) check_exp(ttisnumber(o), \
(ttisinteger(o) ? cast_num(ivalue(o)) : fltvalue(o)))
#define gcvalue(o) check_exp(iscollectable(o), val_(o).gc)
#define pvalue(o) check_exp(ttislightuserdata(o), val_(o).p)
#define tsvalue(o) check_exp(ttisstring(o), gco2ts(val_(o).gc))
#define uvalue(o) check_exp(ttisfulluserdata(o), gco2u(val_(o).gc))
#define clvalue(o) check_exp(ttisclosure(o), gco2cl(val_(o).gc))
#define clLvalue(o) check_exp(ttisLclosure(o), gco2lcl(val_(o).gc))
#define clCvalue(o) check_exp(ttisCclosure(o), gco2ccl(val_(o).gc))
#define fvalue(o) check_exp(ttislcf(o), val_(o).f)
#define hvalue(o) check_exp(ttistable(o), gco2t(val_(o).gc))
#define bvalue(o) check_exp(ttisboolean(o), val_(o).b)
#define thvalue(o) check_exp(ttisthread(o), gco2th(val_(o).gc))
/* a dead value may get the 'gc' field, but cannot access its contents */
#define deadvalue(o) check_exp(ttisdeadkey(o), cast(void *, val_(o).gc))
#define l_isfalse(o) (ttisnil(o) || (ttisboolean(o) && bvalue(o) == 0))
#define iscollectable(o) (rttype(o) & BIT_ISCOLLECTABLE)
/* Macros for internal tests */
#define righttt(obj) (ttype(obj) == gcvalue(obj)->tt)
#define checkliveness(g,obj) \
lua_longassert(!iscollectable(obj) || \
(righttt(obj) && !isdead(g,gcvalue(obj))))
/* Macros to set values */
#define settt_(o,t) ((o)->tt_.hilo.hi=(t|RAVI_NAN_TAG))
#define setfltvalue(obj,x) \
{ TValue *io=(obj); numval_(io).n=(x); }
#define setivalue(obj,x) \
{ TValue *io=(obj); val_(io).i=(x); settt_(io, LUA_TNUMINT); }
#define setnilvalue(obj) settt_(obj, LUA_TNIL)
#define setfvalue(obj,x) \
{ TValue *io=(obj); val_(io).f=(x); settt_(io, LUA_TLCF); }
#define setpvalue(obj,x) \
{ TValue *io=(obj); val_(io).p=(x); settt_(io, LUA_TLIGHTUSERDATA); }
#define setbvalue(obj,x) \
{ TValue *io=(obj); val_(io).b=(x); settt_(io, LUA_TBOOLEAN); }
#define setgcovalue(L,obj,x) \
{ TValue *io = (obj); GCObject *i_g=(x); \
val_(io).gc = i_g; settt_(io, ctb(i_g->tt)); }
#define setsvalue(L,obj,x) \
{ TValue *io = (obj); TString *x_ = (x); \
val_(io).gc = obj2gco(x_); settt_(io, ctb(x_->tt)); \
checkliveness(G(L),io); }
#define setuvalue(L,obj,x) \
{ TValue *io = (obj); Udata *x_ = (x); \
val_(io).gc = obj2gco(x_); settt_(io, ctb(LUA_TUSERDATA)); \
checkliveness(G(L),io); }
#define setthvalue(L,obj,x) \
{ TValue *io = (obj); lua_State *x_ = (x); \
val_(io).gc = obj2gco(x_); settt_(io, ctb(LUA_TTHREAD)); \
checkliveness(G(L),io); }
#define setclLvalue(L,obj,x) \
{ TValue *io = (obj); LClosure *x_ = (x); \
val_(io).gc = obj2gco(x_); settt_(io, ctb(LUA_TLCL)); \
checkliveness(G(L),io); }
#define setclCvalue(L,obj,x) \
{ TValue *io = (obj); CClosure *x_ = (x); \
val_(io).gc = obj2gco(x_); settt_(io, ctb(LUA_TCCL)); \
checkliveness(G(L),io); }
#define sethvalue(L,obj,x) \
{ TValue *io = (obj); Table *x_ = (x); \
val_(io).gc = obj2gco(x_); settt_(io, ctb(LUA_TTABLE)); \
checkliveness(G(L),io); }
#define setdeadvalue(obj) settt_(obj, LUA_TDEADKEY)
#define setobj(L,obj1,obj2) \
{ TValue *io1=(obj1); *io1 = *(obj2); \
(void)L; checkliveness(G(L),io1); }
/*
** different types of assignments, according to destination
*/
/* from stack to (same) stack */
#define setobjs2s setobj
/* to stack (not from same stack) */
#define setobj2s setobj
#define setsvalue2s setsvalue
#define sethvalue2s sethvalue
#define setptvalue2s setptvalue
/* from table to same table */
#define setobjt2t setobj
/* to table */
#define setobj2t setobj
/* to new object */
#define setobj2n setobj
#define setsvalue2n setsvalue
#else
/*
** Tagged Values. This is the basic representation of values in Lua,
** an actual value plus a tag with its type.
@ -462,8 +269,6 @@ typedef struct lua_TValue TValue;
#define setsvalue2n setsvalue
#endif
/*
** {======================================================

@ -167,9 +167,6 @@ struct ravi_gcc_types_t {
gcc_jit_field *Value_value_b;
gcc_jit_field *Value_tt;
gcc_jit_struct *HiLoT;
gcc_jit_type *pHiLoT;
gcc_jit_struct *TStringT;
gcc_jit_type *pTStringT;
gcc_jit_type *ppTStringT;

@ -151,10 +151,6 @@ struct LuaLLVMTypes {
llvm::StructType *ValueT;
llvm::StructType *TValueT;
llvm::PointerType *pTValueT;
llvm::StructType *HiLoT;
llvm::PointerType *pHiLoT;
llvm::StructType *TStringT;
llvm::PointerType *pTStringT;
llvm::PointerType *ppTStringT;
@ -302,9 +298,6 @@ struct LuaLLVMTypes {
llvm::MDNode *tbaa_RaviArray_typeT;
llvm::MDNode *tbaa_RaviArray_dataT;
llvm::MDNode *tbaa_RaviArray_lenT;
llvm::MDNode *tbaa_HiLoT;
llvm::MDNode *tbaa_HiLo_loT;
llvm::MDNode *tbaa_HiLo_hiT;
};
class RAVI_API RaviJITStateImpl;

@ -0,0 +1,31 @@
-- test 40
function x(t) return t; end
function f()
local tt: integer[] = {1}
local ss: number[] = { 55.5 }
tt = x(tt)
ss = x(ss)
end
assert(ravi.compile(x))
assert(ravi.compile(f))
assert(pcall(f))
function f()
local tt: integer[] = {1}
tt = x({})
end
--ravi.dumplua(f)
print'+'
assert(ravi.compile(f))
assert(not pcall(f))
print'+'
function f()
local tt: integer[] = {1}
local ss: number[] = { 55.5 }
ss = x(tt)
end
print'+'
assert(ravi.compile(f))
assert(not pcall(f))
print("test 40 OK")

@ -531,34 +531,6 @@ assert(math.abs(testdiv("1.5",1.6)-0.9375) < 1e-12)
assert(math.abs(testdiv("1.5","1.6")-0.9375) < 1e-12)
print("test 26 OK")
-- test 40
function x(t) return t; end
function f()
local tt: integer[] = {1}
local ss: number[] = { 55.5 }
tt = x(tt)
ss = x(ss)
end
assert(ravi.compile(x))
assert(ravi.compile(f))
assert(pcall(f))
function f()
local tt: integer[] = {1}
tt = x({})
end
assert(ravi.compile(f))
assert(not pcall(f))
function f()
local tt: integer[] = {1}
local ss: number[] = { 55.5 }
ss = x(tt)
end
assert(ravi.compile(f))
assert(not pcall(f))
print("test 40 OK")
-- test 37
-- this tests that within the for loop

@ -1295,16 +1295,33 @@ newframe: /* reentry point when frame changes (call/return) */
unsigned int u = (unsigned int)(i);
switch (h->ravi_array.array_type) {
case RAVI_TARRAYINT: {
if (ttisinteger(val))
raviH_set_int(L, h, u, ivalue(val));
else
raviH_set_int(L, h, u, (lua_Integer)(fltvalue(val)));
if (ttisinteger(val)) {
raviH_set_int_inline(L, h, u, ivalue(val));
}
else {
lua_Integer i = 0;
if (luaV_tointeger_(val, &i)) {
raviH_set_int_inline(L, h, u, i);
}
else
luaG_runerror(L, "value cannot be converted to integer");
}
} break;
case RAVI_TARRAYFLT: {
if (ttisinteger(val))
raviH_set_float(L, h, u, (lua_Number)(ivalue(val)));
else
raviH_set_float(L, h, u, fltvalue(val));
if (ttisfloat(val)) {
raviH_set_float_inline(L, h, u, fltvalue(val));
}
else if (ttisinteger(val)) {
raviH_set_float_inline(L, h, u, (lua_Number)(ivalue(val)));
}
else {
lua_Number d = 0.0;
if (luaV_tonumber_(val, &d)) {
raviH_set_float_inline(L, h, u, d);
}
else
luaG_runerror(L, "value cannot be converted to number");
}
} break;
default:
lua_assert(0);
@ -1749,16 +1766,33 @@ void raviV_op_setlist(lua_State *L, CallInfo *ci, TValue *ra, int b, int c) {
unsigned int u = (unsigned int)(i);
switch (h->ravi_array.array_type) {
case RAVI_TARRAYINT: {
if (ttisinteger(val))
raviH_set_int(L, h, u, ivalue(val));
else
raviH_set_int(L, h, u, (lua_Integer)(fltvalue(val)));
if (ttisinteger(val)) {
raviH_set_int_inline(L, h, u, ivalue(val));
}
else {
lua_Integer i = 0;
if (luaV_tointeger_(val, &i)) {
raviH_set_int_inline(L, h, u, i);
}
else
luaG_runerror(L, "value cannot be converted to integer");
}
} break;
case RAVI_TARRAYFLT: {
if (ttisinteger(val))
raviH_set_float(L, h, u, (lua_Number)(ivalue(val)));
else
raviH_set_float(L, h, u, fltvalue(val));
if (ttisfloat(val)) {
raviH_set_float_inline(L, h, u, fltvalue(val));
}
else if (ttisinteger(val)) {
raviH_set_float_inline(L, h, u, (lua_Number)(ivalue(val)));
}
else {
lua_Number d = 0.0;
if (luaV_tonumber_(val, &d)) {
raviH_set_float_inline(L, h, u, d);
}
else
luaG_runerror(L, "value cannot be converted to number");
}
} break;
default:
lua_assert(0);

@ -205,18 +205,10 @@ RaviCodeGenerator::emit_load_register_or_constant_n(RaviFunctionDef *def,
llvm::Instruction *RaviCodeGenerator::emit_load_reg_n(RaviFunctionDef *def,
llvm::Value *rb) {
#if RAVI_NAN_TAGGING
llvm::Value *tt_ptr = emit_gep(def, "value.tt.ptr", rb, 0, 1);
llvm::Value *rb_n =
def->builder->CreateBitCast(tt_ptr, def->types->plua_NumberT);
llvm::Instruction *lhs = def->builder->CreateLoad(rb_n);
lhs->setMetadata(llvm::LLVMContext::MD_tbaa, def->types->tbaa_pdoubleT);
#else
llvm::Value *rb_n = def->builder->CreateBitCast(rb, def->types->plua_NumberT);
// llvm::Value *rb_n = emit_gep(def, "value.value_.n", rb, 0, 0, 0);
llvm::Instruction *lhs = def->builder->CreateLoad(rb_n);
lhs->setMetadata(llvm::LLVMContext::MD_tbaa, def->types->tbaa_TValue_nT);
#endif
return lhs;
}
@ -272,19 +264,11 @@ RaviCodeGenerator::emit_load_reg_h_intarray(RaviFunctionDef *def,
void RaviCodeGenerator::emit_store_reg_n(RaviFunctionDef *def,
llvm::Value *result,
llvm::Value *dest_ptr) {
#if RAVI_NAN_TAGGING
llvm::Value *tt_ptr = emit_gep(def, "value.tt.ptr", dest_ptr, 0, 1);
llvm::Value *ra_n =
def->builder->CreateBitCast(tt_ptr, def->types->plua_NumberT);
llvm::Instruction *store = def->builder->CreateStore(result, ra_n);
store->setMetadata(llvm::LLVMContext::MD_tbaa, def->types->tbaa_pdoubleT);
#else
llvm::Value *ra_n =
def->builder->CreateBitCast(dest_ptr, def->types->plua_NumberT);
// llvm::Value *ra_n = emit_gep(def, "value.value_.n", dest_ptr, 0, 0, 0);
llvm::Instruction *store = def->builder->CreateStore(result, ra_n);
store->setMetadata(llvm::LLVMContext::MD_tbaa, def->types->tbaa_TValue_nT);
#endif
}
void RaviCodeGenerator::emit_store_reg_n_withtype(RaviFunctionDef *def,
@ -330,34 +314,17 @@ void RaviCodeGenerator::emit_store_type_(RaviFunctionDef *def,
llvm::Value *value, int type) {
lua_assert(type == LUA_TNUMFLT || type == LUA_TNUMINT ||
type == LUA_TBOOLEAN);
#if RAVI_NAN_TAGGING
// The whole point of NaN tagging!
if (type == LUA_TNUMFLT || type == LUA_TNUMBER)
return;
int code = (type | RAVI_NAN_TAG);
llvm::Value *hi_ptr = emit_gep(def, "hi.ptr", value, 0, 1, 1);
llvm::Instruction *store = def->builder->CreateStore(
llvm::ConstantInt::get(def->types->C_intT, code), hi_ptr);
store->setMetadata(llvm::LLVMContext::MD_tbaa, def->types->tbaa_HiLo_hiT);
#else
llvm::Value *desttype = emit_gep(def, "dest.tt", value, 0, 1);
llvm::Instruction *store =
def->builder->CreateStore(def->types->kInt[type], desttype);
store->setMetadata(llvm::LLVMContext::MD_tbaa, def->types->tbaa_TValue_ttT);
#endif
}
llvm::Instruction *RaviCodeGenerator::emit_load_type(RaviFunctionDef *def,
llvm::Value *value) {
#if RAVI_NAN_TAGGING
llvm::Value *hi_ptr = emit_gep(def, "hi.ptr", value, 0, 1, 1);
llvm::Instruction *tt = def->builder->CreateLoad(hi_ptr, "hi");
tt->setMetadata(llvm::LLVMContext::MD_tbaa, def->types->tbaa_HiLo_hiT);
#else
llvm::Value *tt_ptr = emit_gep(def, "value.tt.ptr", value, 0, 1);
llvm::Instruction *tt = def->builder->CreateLoad(tt_ptr, "value.tt");
tt->setMetadata(llvm::LLVMContext::MD_tbaa, def->types->tbaa_TValue_ttT);
#endif
return tt;
}
@ -365,49 +332,15 @@ llvm::Value *RaviCodeGenerator::emit_is_value_of_type(RaviFunctionDef *def,
llvm::Value *value_type,
LuaTypeCode lua_type,
const char *varname) {
#if RAVI_NAN_TAGGING
if (lua_type == LUA__TNUMFLT || lua_type == LUA__TNUMBER) {
//%and = and i32 % 1, 2147221504
//% cmp = icmp ne i32 %and, 2147221504
llvm::Value *andNaN = def->builder->CreateAnd(
value_type, llvm::ConstantInt::get(def->types->C_intT, RAVI_NAN_TAG),
"and.NaN");
return def->builder->CreateICmpNE(
andNaN, llvm::ConstantInt::get(def->types->C_intT, RAVI_NAN_TAG),
"is.numflt");
} else {
llvm::Constant *expect =
llvm::ConstantInt::get(def->types->C_intT, lua_type | RAVI_NAN_TAG);
return def->builder->CreateICmpEQ(value_type, expect, "is.type");
}
#else
return def->builder->CreateICmpEQ(value_type, def->types->kInt[int(lua_type)],
varname);
#endif
}
llvm::Value *RaviCodeGenerator::emit_is_not_value_of_type(
RaviFunctionDef *def, llvm::Value *value_type, LuaTypeCode lua_type,
const char *varname) {
#if RAVI_NAN_TAGGING
if (lua_type == LUA__TNUMFLT || lua_type == LUA__TNUMBER) {
//%and = and i32 % 1, 2147221504
//% cmp = icmp ne i32 %and, 2147221504
llvm::Value *andNaN = def->builder->CreateAnd(
value_type, llvm::ConstantInt::get(def->types->C_intT, RAVI_NAN_TAG),
"and.NaN");
return def->builder->CreateICmpEQ(
andNaN, llvm::ConstantInt::get(def->types->C_intT, RAVI_NAN_TAG),
"is.numflt");
} else {
llvm::Constant *expect =
llvm::ConstantInt::get(def->types->C_intT, lua_type | RAVI_NAN_TAG);
return def->builder->CreateICmpNE(value_type, expect, "is.type");
}
#else
return def->builder->CreateICmpNE(value_type, def->types->kInt[int(lua_type)],
varname);
#endif
}
llvm::Instruction *

@ -400,27 +400,11 @@ void RaviCodeGenerator::emit_assign(RaviFunctionDef *def, llvm::Value *dest,
store->setMetadata(llvm::LLVMContext::MD_tbaa, def->types->tbaa_TValue_nT);
// destvalue->type = srcvalue->type
#if RAVI_NAN_TAGGING
llvm::Value *srctype = emit_gep(def, "srctype", src, 0, 1, 0);
llvm::Value *desttype = emit_gep(def, "desttype", dest, 0, 1, 0);
// TODO note assumption below that lua_Number is double
load = def->builder->CreateLoad(srctype);
load->setMetadata(llvm::LLVMContext::MD_tbaa, def->types->tbaa_HiLo_loT);
store = def->builder->CreateStore(load, desttype);
store->setMetadata(llvm::LLVMContext::MD_tbaa, def->types->tbaa_HiLo_loT);
srctype = emit_gep(def, "srctype", src, 0, 1, 1);
desttype = emit_gep(def, "desttype", dest, 0, 1, 1);
load = def->builder->CreateLoad(srctype);
load->setMetadata(llvm::LLVMContext::MD_tbaa, def->types->tbaa_HiLo_hiT);
store = def->builder->CreateStore(load, desttype);
store->setMetadata(llvm::LLVMContext::MD_tbaa, def->types->tbaa_HiLo_hiT);
#else
llvm::Value *srctype = emit_gep(def, "srctype", src, 0, 1);
llvm::Value *desttype = emit_gep(def, "desttype", dest, 0, 1);
load = def->builder->CreateLoad(srctype);
load->setMetadata(llvm::LLVMContext::MD_tbaa, def->types->tbaa_TValue_ttT);
store = def->builder->CreateStore(load, desttype);
store->setMetadata(llvm::LLVMContext::MD_tbaa, def->types->tbaa_TValue_ttT);
#endif
}
}

@ -148,18 +148,6 @@ LuaLLVMTypes::LuaLLVMTypes(llvm::LLVMContext &context) : mdbuilder(context) {
elements.push_back(lua_NumberT);
ValueT->setBody(elements);
// TODO Needs to handle big endian
// struct ravi_HiLo {
// int lo;
// int hi;
//} HiLo;
HiLoT = llvm::StructType::create(context, "struct.HiLo");
elements.clear();
elements.push_back(C_intT);
elements.push_back(C_intT);
HiLoT->setBody(elements);
pHiLoT = llvm::PointerType::get(HiLoT, 0);
// NOTE: Following structure changes when NaN tagging is enabled
// struct TValue {
// union Value value_;
@ -168,11 +156,7 @@ LuaLLVMTypes::LuaLLVMTypes(llvm::LLVMContext &context) : mdbuilder(context) {
TValueT = llvm::StructType::create(context, "struct.TValue");
elements.clear();
elements.push_back(ValueT);
#if RAVI_NAN_TAGGING
elements.push_back(HiLoT);
#else
elements.push_back(C_intT);
#endif
TValueT->setBody(elements);
pTValueT = llvm::PointerType::get(TValueT, 0);
@ -420,11 +404,7 @@ LuaLLVMTypes::LuaLLVMTypes(llvm::LLVMContext &context) : mdbuilder(context) {
TKeyT = llvm::StructType::create(context, "struct.TKey");
elements.clear();
elements.push_back(ValueT);
#if RAVI_NAN_TAGGING
elements.push_back(HiLoT);
#else
elements.push_back(C_intT);
#endif
elements.push_back(C_intT); /* next */
TKeyT->setBody(elements);
pTKeyT = llvm::PointerType::get(TKeyT, 0);
@ -1167,14 +1147,6 @@ LuaLLVMTypes::LuaLLVMTypes(llvm::LLVMContext &context) : mdbuilder(context) {
mdbuilder.createTBAAStructTagNode(tbaa_TableT, tbaa_intT, 36);
tbaa_RaviArray_typeT =
mdbuilder.createTBAAStructTagNode(tbaa_TableT, tbaa_charT, 44);
// TODO Needs to handle big endian
nodes.clear();
nodes.push_back(std::pair<llvm::MDNode *, uint64_t>(tbaa_intT, 0)); /* lo */
nodes.push_back(std::pair<llvm::MDNode *, uint64_t>(tbaa_intT, 4)); /* hi */
tbaa_HiLoT = mdbuilder.createTBAAStructTypeNode("HiLo", nodes);
tbaa_HiLo_loT = mdbuilder.createTBAAStructTagNode(tbaa_HiLoT, tbaa_intT, 0);
tbaa_HiLo_hiT = mdbuilder.createTBAAStructTagNode(tbaa_HiLoT, tbaa_intT, 4);
}
void LuaLLVMTypes::dump() {

Loading…
Cancel
Save