mirror of
https://github.com/corda/corda.git
synced 2025-02-02 01:08:09 +00:00
reorder code in CallEvent ctor to ensure we don't clobber argument registers when it comes time to marshal values for reading
This commit is contained in:
parent
8434abaa0e
commit
505d6df7ae
@ -476,6 +476,26 @@ addressSite(Context* c, Promise* address)
|
|||||||
return new (c->zone->allocate(sizeof(AddressSite))) AddressSite(address);
|
return new (c->zone->allocate(sizeof(AddressSite))) AddressSite(address);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
freeze(Register* r)
|
||||||
|
{
|
||||||
|
if (DebugRegisters) {
|
||||||
|
fprintf(stderr, "freeze %d to %d\n", r->number, r->freezeCount + 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
++ r->freezeCount;
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
thaw(Register* r)
|
||||||
|
{
|
||||||
|
if (DebugRegisters) {
|
||||||
|
fprintf(stderr, "thaw %d to %d\n", r->number, r->freezeCount - 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
-- r->freezeCount;
|
||||||
|
}
|
||||||
|
|
||||||
Register*
|
Register*
|
||||||
acquire(Context* c, uint32_t mask, Stack* stack, unsigned newSize,
|
acquire(Context* c, uint32_t mask, Stack* stack, unsigned newSize,
|
||||||
Value* newValue, Site* newSite);
|
Value* newValue, Site* newSite);
|
||||||
@ -517,9 +537,9 @@ class RegisterSite: public Site {
|
|||||||
virtual void acquire(Context* c, Stack* stack, unsigned size, Value* v) {
|
virtual void acquire(Context* c, Stack* stack, unsigned size, Value* v) {
|
||||||
low = ::acquire(c, mask, stack, size, v, this);
|
low = ::acquire(c, mask, stack, size, v, this);
|
||||||
if (size > BytesPerWord) {
|
if (size > BytesPerWord) {
|
||||||
++ low->freezeCount;
|
::freeze(low);
|
||||||
high = ::acquire(c, mask >> 32, stack, size, v, this);
|
high = ::acquire(c, mask >> 32, stack, size, v, this);
|
||||||
-- low->freezeCount;
|
::thaw(low);
|
||||||
|
|
||||||
mask = (static_cast<uint64_t>(1) << (high->number + 32)) |
|
mask = (static_cast<uint64_t>(1) << (high->number + 32)) |
|
||||||
(static_cast<uint64_t>(1) << low->number);
|
(static_cast<uint64_t>(1) << low->number);
|
||||||
@ -542,18 +562,18 @@ class RegisterSite: public Site {
|
|||||||
virtual void freeze(Context* c UNUSED) {
|
virtual void freeze(Context* c UNUSED) {
|
||||||
assert(c, low);
|
assert(c, low);
|
||||||
|
|
||||||
++ low->freezeCount;
|
::freeze(low);
|
||||||
if (high) {
|
if (high) {
|
||||||
++ high->freezeCount;
|
::freeze(high);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
virtual void thaw(Context* c UNUSED) {
|
virtual void thaw(Context* c UNUSED) {
|
||||||
assert(c, low);
|
assert(c, low);
|
||||||
|
|
||||||
-- low->freezeCount;
|
::thaw(low);
|
||||||
if (high) {
|
if (high) {
|
||||||
-- high->freezeCount;
|
::thaw(high);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -621,8 +641,7 @@ decrement(Context* c UNUSED, Register* r)
|
|||||||
assert(c, r->refCount > 0);
|
assert(c, r->refCount > 0);
|
||||||
|
|
||||||
if (DebugRegisters) {
|
if (DebugRegisters) {
|
||||||
fprintf(stderr, "decrement %d to %d\n",
|
fprintf(stderr, "decrement %d to %d\n", r->number, r->refCount - 1);
|
||||||
r->number, r->refCount - 1);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
-- r->refCount;
|
-- r->refCount;
|
||||||
@ -1012,9 +1031,9 @@ swap(Context* c, Register* a, Register* b)
|
|||||||
Register*
|
Register*
|
||||||
replace(Context* c, Stack* stack, Register* r)
|
replace(Context* c, Stack* stack, Register* r)
|
||||||
{
|
{
|
||||||
++ r->freezeCount;
|
freeze(r);
|
||||||
Register* s = acquire(c, ~0, stack, r->size, r->value, r->site);
|
Register* s = acquire(c, ~0, stack, r->size, r->value, r->site);
|
||||||
-- r->freezeCount;
|
thaw(r);
|
||||||
swap(c, r, s);
|
swap(c, r, s);
|
||||||
return s;
|
return s;
|
||||||
}
|
}
|
||||||
@ -1185,6 +1204,10 @@ class CallEvent: public Event {
|
|||||||
resultSize(resultSize),
|
resultSize(resultSize),
|
||||||
argumentFootprint(0)
|
argumentFootprint(0)
|
||||||
{
|
{
|
||||||
|
for (Stack* s = stack; s; s = s->next) {
|
||||||
|
addRead(c, s->value, s->size * BytesPerWord, 0);
|
||||||
|
}
|
||||||
|
|
||||||
Stack* s = argumentStack;
|
Stack* s = argumentStack;
|
||||||
unsigned index = 0;
|
unsigned index = 0;
|
||||||
for (unsigned i = 0; i < argumentCount; ++i) {
|
for (unsigned i = 0; i < argumentCount; ++i) {
|
||||||
@ -1202,10 +1225,6 @@ class CallEvent: public Event {
|
|||||||
s = s->next;
|
s = s->next;
|
||||||
}
|
}
|
||||||
|
|
||||||
for (Stack* s = stack; s; s = s->next) {
|
|
||||||
addRead(c, s->value, s->size * BytesPerWord, 0);
|
|
||||||
}
|
|
||||||
|
|
||||||
addRead(c, address, BytesPerWord,
|
addRead(c, address, BytesPerWord,
|
||||||
((flags & Compiler::Indirect) ?
|
((flags & Compiler::Indirect) ?
|
||||||
registerSite(c, c->assembler->returnLow()) : 0));
|
registerSite(c, c->assembler->returnLow()) : 0));
|
||||||
|
Loading…
x
Reference in New Issue
Block a user