mirror of
https://github.com/corda/corda.git
synced 2025-06-15 13:48:14 +00:00
introduce Frame::stackCall util
This commit is contained in:
@ -91,7 +91,8 @@ class Compiler {
|
|||||||
unsigned flags,
|
unsigned flags,
|
||||||
TraceHandler* traceHandler,
|
TraceHandler* traceHandler,
|
||||||
ir::Type resultType,
|
ir::Type resultType,
|
||||||
unsigned argumentFootprint) = 0;
|
unsigned argumentFootprint /*,
|
||||||
|
util::Slice<ir::Value*> arguments*/) = 0;
|
||||||
|
|
||||||
virtual void return_(ir::Type type, ir::Value* value) = 0;
|
virtual void return_(ir::Type type, ir::Value* value) = 0;
|
||||||
virtual void return_() = 0;
|
virtual void return_() = 0;
|
||||||
|
125
src/compile.cpp
125
src/compile.cpp
@ -1351,6 +1351,38 @@ void storeLocal(Context* context,
|
|||||||
|
|
||||||
avian::util::FixedAllocator* codeAllocator(MyThread* t);
|
avian::util::FixedAllocator* codeAllocator(MyThread* t);
|
||||||
|
|
||||||
|
ir::Type operandTypeForFieldCode(Thread* t, unsigned code)
|
||||||
|
{
|
||||||
|
ir::Types types(TargetBytesPerWord);
|
||||||
|
|
||||||
|
switch (code) {
|
||||||
|
case ByteField:
|
||||||
|
case BooleanField:
|
||||||
|
return types.i1;
|
||||||
|
case CharField:
|
||||||
|
case ShortField:
|
||||||
|
return types.i2;
|
||||||
|
case IntField:
|
||||||
|
return types.i4;
|
||||||
|
case LongField:
|
||||||
|
return types.i8;
|
||||||
|
|
||||||
|
case ObjectField:
|
||||||
|
return types.object;
|
||||||
|
|
||||||
|
case FloatField:
|
||||||
|
return types.f4;
|
||||||
|
case DoubleField:
|
||||||
|
return types.f8;
|
||||||
|
|
||||||
|
case VoidField:
|
||||||
|
return types.void_;
|
||||||
|
|
||||||
|
default:
|
||||||
|
abort(t);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
class Frame {
|
class Frame {
|
||||||
public:
|
public:
|
||||||
enum StackType {
|
enum StackType {
|
||||||
@ -1942,6 +1974,21 @@ class Frame {
|
|||||||
return e;
|
return e;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
ir::Value* stackCall(ir::Value* methodValue,
|
||||||
|
object methodObject,
|
||||||
|
unsigned flags,
|
||||||
|
TraceElement* trace)
|
||||||
|
{
|
||||||
|
ir::Value* result = c->stackCall(
|
||||||
|
methodValue,
|
||||||
|
flags,
|
||||||
|
trace,
|
||||||
|
operandTypeForFieldCode(t, methodReturnCode(t, methodObject)),
|
||||||
|
methodParameterFootprint(t, methodObject));
|
||||||
|
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
unsigned startSubroutine(unsigned ip, avian::codegen::Promise* returnAddress) {
|
unsigned startSubroutine(unsigned ip, avian::codegen::Promise* returnAddress) {
|
||||||
pushAddress(absoluteAddressOperand(returnAddress));
|
pushAddress(absoluteAddressOperand(returnAddress));
|
||||||
|
|
||||||
@ -3125,38 +3172,6 @@ ir::Value* popField(MyThread* t, Frame* frame, int code)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
ir::Type operandTypeForFieldCode(Thread* t, unsigned code)
|
|
||||||
{
|
|
||||||
ir::Types types(TargetBytesPerWord);
|
|
||||||
|
|
||||||
switch (code) {
|
|
||||||
case ByteField:
|
|
||||||
case BooleanField:
|
|
||||||
return types.i1;
|
|
||||||
case CharField:
|
|
||||||
case ShortField:
|
|
||||||
return types.i2;
|
|
||||||
case IntField:
|
|
||||||
return types.i4;
|
|
||||||
case LongField:
|
|
||||||
return types.i8;
|
|
||||||
|
|
||||||
case ObjectField:
|
|
||||||
return types.object;
|
|
||||||
|
|
||||||
case FloatField:
|
|
||||||
return types.f4;
|
|
||||||
case DoubleField:
|
|
||||||
return types.f8;
|
|
||||||
|
|
||||||
case VoidField:
|
|
||||||
return types.void_;
|
|
||||||
|
|
||||||
default:
|
|
||||||
abort(t);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
bool
|
bool
|
||||||
useLongJump(MyThread* t, uintptr_t target)
|
useLongJump(MyThread* t, uintptr_t target)
|
||||||
{
|
{
|
||||||
@ -3217,12 +3232,11 @@ ir::Value* compileDirectInvoke(MyThread* t,
|
|||||||
(frame->context->zone.allocate(sizeof(TraceElementPromise)))
|
(frame->context->zone.allocate(sizeof(TraceElementPromise)))
|
||||||
TraceElementPromise(t->m->system, trace);
|
TraceElementPromise(t->m->system, trace);
|
||||||
|
|
||||||
ir::Value* result = c->stackCall(
|
ir::Value* result = frame->stackCall(
|
||||||
c->promiseConstant(returnAddressPromise, types.address),
|
c->promiseConstant(returnAddressPromise, types.address),
|
||||||
|
target,
|
||||||
flags,
|
flags,
|
||||||
trace,
|
trace);
|
||||||
operandTypeForFieldCode(t, methodReturnCode(t, target)),
|
|
||||||
methodParameterFootprint(t, target));
|
|
||||||
|
|
||||||
c->store(
|
c->store(
|
||||||
types.address,
|
types.address,
|
||||||
@ -3237,12 +3251,10 @@ ir::Value* compileDirectInvoke(MyThread* t,
|
|||||||
|
|
||||||
return result;
|
return result;
|
||||||
} else {
|
} else {
|
||||||
return c->stackCall(
|
return frame->stackCall(c->constant(defaultThunk(t), types.address),
|
||||||
c->constant(defaultThunk(t), types.address),
|
target,
|
||||||
flags,
|
flags,
|
||||||
frame->trace(target, traceFlags),
|
frame->trace(target, traceFlags));
|
||||||
operandTypeForFieldCode(t, methodReturnCode(t, target)),
|
|
||||||
methodParameterFootprint(t, target));
|
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
ir::Value* address
|
ir::Value* address
|
||||||
@ -3250,13 +3262,13 @@ ir::Value* compileDirectInvoke(MyThread* t,
|
|||||||
? c->promiseConstant(addressPromise, types.address)
|
? c->promiseConstant(addressPromise, types.address)
|
||||||
: c->constant(methodAddress(t, target), types.address));
|
: c->constant(methodAddress(t, target), types.address));
|
||||||
|
|
||||||
return c->stackCall
|
return frame->stackCall(
|
||||||
(address,
|
address,
|
||||||
flags,
|
target,
|
||||||
tailCall ? 0 : frame->trace
|
flags,
|
||||||
((methodFlags(t, target) & ACC_NATIVE) ? target : 0, 0),
|
tailCall ? 0
|
||||||
operandTypeForFieldCode(t, methodReturnCode(t, target)),
|
: frame->trace(
|
||||||
methodParameterFootprint(t, target));
|
(methodFlags(t, target) & ACC_NATIVE) ? target : 0, 0));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -3397,12 +3409,8 @@ void compileAbstractInvoke(MyThread* t,
|
|||||||
|
|
||||||
unsigned rSize = resultSize(t, returnCode);
|
unsigned rSize = resultSize(t, returnCode);
|
||||||
|
|
||||||
ir::Value* result
|
ir::Value* result = frame->stackCall(
|
||||||
= frame->c->stackCall(method,
|
method, target, tailCall ? Compiler::TailJump : 0, frame->trace(0, 0));
|
||||||
tailCall ? Compiler::TailJump : 0,
|
|
||||||
frame->trace(0, 0),
|
|
||||||
operandTypeForFieldCode(t, returnCode),
|
|
||||||
parameterFootprint);
|
|
||||||
|
|
||||||
frame->pop(parameterFootprint);
|
frame->pop(parameterFootprint);
|
||||||
|
|
||||||
@ -5191,17 +5199,16 @@ compile(MyThread* t, Frame* initialFrame, unsigned initialIp,
|
|||||||
|
|
||||||
unsigned rSize = resultSize(t, methodReturnCode(t, target));
|
unsigned rSize = resultSize(t, methodReturnCode(t, target));
|
||||||
|
|
||||||
ir::Value* result = c->stackCall(
|
ir::Value* result = frame->stackCall(
|
||||||
c->memory(c->binaryOp(lir::And,
|
c->memory(c->binaryOp(lir::And,
|
||||||
types.address,
|
types.address,
|
||||||
c->constant(TargetPointerMask, types.i4),
|
c->constant(TargetPointerMask, types.i4),
|
||||||
c->memory(instance, types.object)),
|
c->memory(instance, types.object)),
|
||||||
types.object,
|
types.object,
|
||||||
offset),
|
offset),
|
||||||
|
target,
|
||||||
tailCall ? Compiler::TailJump : 0,
|
tailCall ? Compiler::TailJump : 0,
|
||||||
frame->trace(0, 0),
|
frame->trace(0, 0));
|
||||||
operandTypeForFieldCode(t, methodReturnCode(t, target)),
|
|
||||||
parameterFootprint);
|
|
||||||
|
|
||||||
frame->pop(parameterFootprint);
|
frame->pop(parameterFootprint);
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user