Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(679)

Unified Diff: runtime/vm/deopt_instructions.h

Issue 24834002: Refactor some deoptimization code. (Closed) Base URL: http://dart.googlecode.com/svn/branches/bleeding_edge/dart/
Patch Set: Created 7 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: runtime/vm/deopt_instructions.h
===================================================================
--- runtime/vm/deopt_instructions.h (revision 27970)
+++ runtime/vm/deopt_instructions.h (working copy)
@@ -8,6 +8,7 @@
#include "vm/allocation.h"
#include "vm/assembler.h"
#include "vm/code_generator.h"
+#include "vm/deferred_objects.h"
#include "vm/growable_array.h"
#include "vm/object.h"
@@ -18,23 +19,41 @@
class MaterializeObjectInstr;
// Holds all data relevant for execution of deoptimization instructions.
-class DeoptimizationContext : public ValueObject {
+class DeoptContext {
public:
- // 'to_frame_start' points to the fixed size portion of the frame under sp.
// 'num_args' is 0 if there are no arguments or if there are optional
// arguments.
- DeoptimizationContext(intptr_t* to_frame_start,
- intptr_t to_frame_size,
- const Array& object_table,
- intptr_t num_args,
- DeoptReasonId deopt_reason);
+ DeoptContext(const Array& object_table,
+ intptr_t num_args,
+ DeoptReasonId deopt_reason);
+ ~DeoptContext();
srdjan 2013/09/27 17:04:54 virtual, just in case?
turnidge 2013/09/30 17:40:22 Done.
+
+ // 'start' points to the fixed size portion of the frame under sp.
+ //
+ // DeoptContext does not claim ownership of the frame memory.
+ void SetToFrame(intptr_t* start, intptr_t size);
+
+ // DeoptContext does not claim ownership of the frame memory.
+ void SetFromFrame(intptr_t* start, intptr_t size);
+
+ // DeoptContext does not claim ownership of the memory used for the
+ // saved registers.
+ void SetSavedRegisters(fpu_register_t* fpu_registers,
+ intptr_t* cpu_registers);
+
+ intptr_t* from_frame() const { return from_frame_; }
+ fpu_register_t* fpu_registers() const { return fpu_registers_; }
+ intptr_t* cpu_registers() const { return cpu_registers_; }
+
intptr_t* GetFromFrameAddressAt(intptr_t index) const {
+ ASSERT(from_frame_ != NULL);
ASSERT((0 <= index) && (index < from_frame_size_));
return &from_frame_[index];
}
intptr_t* GetToFrameAddressAt(intptr_t index) const {
+ ASSERT(to_frame_ != NULL);
ASSERT((0 <= index) && (index < to_frame_size_));
return &to_frame_[index];
}
@@ -47,23 +66,24 @@
void SetCallerFp(intptr_t callers_fp);
RawObject* ObjectAt(intptr_t index) const {
- return object_table_.At(index);
+ const Array& object_table = Array::Handle(object_table_);
+ return object_table.At(index);
}
intptr_t RegisterValue(Register reg) const {
- return registers_copy_[reg];
+ return cpu_registers_[reg];
}
double FpuRegisterValue(FpuRegister reg) const {
- return *reinterpret_cast<double*>(&fpu_registers_copy_[reg]);
+ return *reinterpret_cast<double*>(&fpu_registers_[reg]);
}
int64_t FpuRegisterValueAsInt64(FpuRegister reg) const {
- return *reinterpret_cast<int64_t*>(&fpu_registers_copy_[reg]);
+ return *reinterpret_cast<int64_t*>(&fpu_registers_[reg]);
}
simd128_value_t FpuRegisterValueAsSimd128(FpuRegister reg) const {
- const float* address = reinterpret_cast<float*>(&fpu_registers_copy_[reg]);
+ const float* address = reinterpret_cast<float*>(&fpu_registers_[reg]);
return simd128_value_t().readFrom(address);
}
@@ -73,20 +93,91 @@
DeoptReasonId deopt_reason() const { return deopt_reason_; }
+ void VisitObjectPointers(ObjectPointerVisitor* visitor);
+
+ void PrepareForDeferredMaterialization(intptr_t count) {
+ if (count > 0) {
+ deferred_objects_ = new DeferredObject*[count];
+ deferred_objects_count_ = count;
+ }
+ }
+
+ DeferredObject* GetDeferredObject(intptr_t idx) const {
+ return deferred_objects_[idx];
+ }
+
+ // Sets the materialized value for some deferred object.
+ //
+ // Claims ownership of the memory for 'object'.
+ void SetDeferredObjectAt(intptr_t idx, DeferredObject* object) {
+ deferred_objects_[idx] = object;
+ }
+
+ intptr_t DeferredObjectsCount() const {
+ return deferred_objects_count_;
+ }
+
+ void DeferMaterializedObjectRef(intptr_t idx, intptr_t* slot) {
+ deferred_object_refs_ = new DeferredObjectRef(
+ idx,
+ reinterpret_cast<RawInstance**>(slot),
+ deferred_object_refs_);
+ }
+
+ void DeferDoubleMaterialization(double value, RawDouble** slot) {
+ deferred_boxes_ = new DeferredDouble(
+ value,
+ reinterpret_cast<RawInstance**>(slot),
+ deferred_boxes_);
+ }
+
+ void DeferMintMaterialization(int64_t value, RawMint** slot) {
+ deferred_boxes_ = new DeferredMint(
+ value,
+ reinterpret_cast<RawInstance**>(slot),
+ deferred_boxes_);
+ }
+
+ void DeferFloat32x4Materialization(simd128_value_t value,
+ RawFloat32x4** slot) {
+ deferred_boxes_ = new DeferredFloat32x4(
+ value,
+ reinterpret_cast<RawInstance**>(slot),
+ deferred_boxes_);
+ }
+
+ void DeferUint32x4Materialization(simd128_value_t value,
+ RawUint32x4** slot) {
+ deferred_boxes_ = new DeferredUint32x4(
+ value,
+ reinterpret_cast<RawInstance**>(slot),
+ deferred_boxes_);
+ }
+
+ // Materializes all deferred objects. Returns the total number of
+ // artificial arguments used during deoptimization.
+ intptr_t MaterializeDeferredObjects();
+
private:
- const Array& object_table_;
+ RawArray* object_table_;
intptr_t* to_frame_;
- const intptr_t to_frame_size_;
+ intptr_t to_frame_size_;
intptr_t* from_frame_;
intptr_t from_frame_size_;
- intptr_t* registers_copy_;
- fpu_register_t* fpu_registers_copy_;
+ intptr_t* cpu_registers_;
+ fpu_register_t* fpu_registers_;
const intptr_t num_args_;
const DeoptReasonId deopt_reason_;
intptr_t caller_fp_;
Isolate* isolate_;
- DISALLOW_COPY_AND_ASSIGN(DeoptimizationContext);
+ DeferredSlot* deferred_boxes_;
+ DeferredSlot* deferred_object_refs_;
+
+ intptr_t deferred_objects_count_;
+ DeferredObject** deferred_objects_;
+
+ DISALLOW_COPY_AND_ASSIGN(DeoptContext);
};
@@ -126,8 +217,7 @@
virtual const char* ToCString() const = 0;
- virtual void Execute(DeoptimizationContext* deopt_context,
- intptr_t* to_addr) = 0;
+ virtual void Execute(DeoptContext* deopt_context, intptr_t* to_addr) = 0;
virtual DeoptInstr::Kind kind() const = 0;

Powered by Google App Engine
This is Rietveld 408576698