add extra type checks to Compiler::store and Compiler::memory

This commit is contained in:
Joshua Warner
2014-04-30 23:39:44 -06:00
committed by Joshua Warner
parent 1fc6011bf7
commit f9b781149e
2 changed files with 16 additions and 10 deletions

View File

@ -2323,6 +2323,8 @@ class MyCompiler: public Compiler {
Operand* index = 0, Operand* index = 0,
unsigned scale = 1) unsigned scale = 1)
{ {
assert(&c, index != 0 || scale == 1);
assert(&c, type.size() == scale || index == 0);
Value* result = value(&c, type); Value* result = value(&c, type);
appendMemory(&c, static_cast<Value*>(base), displacement, appendMemory(&c, static_cast<Value*>(base), displacement,
@ -2600,6 +2602,10 @@ class MyCompiler: public Compiler {
{ {
assert(&c, srcType.flavor() == static_cast<Value*>(src)->type.flavor()); assert(&c, srcType.flavor() == static_cast<Value*>(src)->type.flavor());
assert(&c, dstType.flavor() == static_cast<Value*>(dst)->type.flavor()); assert(&c, dstType.flavor() == static_cast<Value*>(dst)->type.flavor());
assert(&c, srcType.flavor() == dstType.flavor());
assert(&c,
srcType.flavor() != ir::Type::Float
|| srcType.size() == static_cast<Value*>(src)->type.size());
appendMove(&c, appendMove(&c,
lir::Move, lir::Move,
srcType.size(), srcType.size(),

View File

@ -4145,7 +4145,7 @@ compile(MyThread* t, Frame* initialFrame, unsigned initialIp,
frame->pushInt( frame->pushInt(
c->load(1, c->load(1,
1, 1,
c->memory(array, types.i4, TargetArrayBody, index, 1), c->memory(array, types.i1, TargetArrayBody, index, 1),
TargetBytesPerWord)); TargetBytesPerWord));
break; break;
@ -4153,25 +4153,25 @@ compile(MyThread* t, Frame* initialFrame, unsigned initialIp,
frame->pushInt( frame->pushInt(
c->loadz(2, c->loadz(2,
2, 2,
c->memory(array, types.i4, TargetArrayBody, index, 2), c->memory(array, types.i2, TargetArrayBody, index, 2),
TargetBytesPerWord)); TargetBytesPerWord));
break; break;
case daload: case daload:
frame->pushLong(c->load( frame->pushLong(c->load(
8, 8, c->memory(array, types.f4, TargetArrayBody, index, 8), 8)); 8, 8, c->memory(array, types.f8, TargetArrayBody, index, 8), 8));
break; break;
case laload: case laload:
frame->pushLong(c->load( frame->pushLong(c->load(
8, 8, c->memory(array, types.i4, TargetArrayBody, index, 8), 8)); 8, 8, c->memory(array, types.i8, TargetArrayBody, index, 8), 8));
break; break;
case saload: case saload:
frame->pushInt( frame->pushInt(
c->load(2, c->load(2,
2, 2,
c->memory(array, types.i4, TargetArrayBody, index, 2), c->memory(array, types.i2, TargetArrayBody, index, 2),
TargetBytesPerWord)); TargetBytesPerWord));
break; break;
} }
@ -4245,7 +4245,7 @@ compile(MyThread* t, Frame* initialFrame, unsigned initialIp,
c->store(types.address, c->store(types.address,
value, value,
types.i1, types.i1,
c->memory(array, types.i4, TargetArrayBody, index, 1)); c->memory(array, types.i1, TargetArrayBody, index, 1));
break; break;
case castore: case castore:
@ -4253,14 +4253,14 @@ compile(MyThread* t, Frame* initialFrame, unsigned initialIp,
c->store(types.address, c->store(types.address,
value, value,
types.i2, types.i2,
c->memory(array, types.i4, TargetArrayBody, index, 2)); c->memory(array, types.i2, TargetArrayBody, index, 2));
break; break;
case dastore: case dastore:
c->store(types.f8, c->store(types.f8,
value, value,
types.f8, types.f8,
c->memory(array, types.f4, TargetArrayBody, index, 8)); c->memory(array, types.f8, TargetArrayBody, index, 8));
break; break;
case lastore: case lastore:
@ -5453,8 +5453,8 @@ compile(MyThread* t, Frame* initialFrame, unsigned initialIp,
memcpy(&v, &singletonValue(t, pool, index - 1), 8); memcpy(&v, &singletonValue(t, pool, index - 1), 8);
frame->pushLong(c->constant( frame->pushLong(c->constant(
v, v,
singletonBit(t, pool, poolSize(t, pool), index - 1) ? types.f4 singletonBit(t, pool, poolSize(t, pool), index - 1) ? types.f8
: types.i4)); : types.i8));
} break; } break;
case ldiv_: { case ldiv_: {