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

Side by Side Diff: runtime/vm/isolate.h

Issue 14935005: Implement a variation of scalar replacement for non-escaping allocations. (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: address comments Created 7 years, 7 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 unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « runtime/vm/intermediate_language.cc ('k') | runtime/vm/isolate.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file 1 // Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file
2 // for details. All rights reserved. Use of this source code is governed by a 2 // for details. All rights reserved. Use of this source code is governed by a
3 // BSD-style license that can be found in the LICENSE file. 3 // BSD-style license that can be found in the LICENSE file.
4 4
5 #ifndef VM_ISOLATE_H_ 5 #ifndef VM_ISOLATE_H_
6 #define VM_ISOLATE_H_ 6 #define VM_ISOLATE_H_
7 7
8 #include "include/dart_api.h" 8 #include "include/dart_api.h"
9 #include "platform/assert.h" 9 #include "platform/assert.h"
10 #include "platform/thread.h" 10 #include "platform/thread.h"
11 #include "vm/base_isolate.h" 11 #include "vm/base_isolate.h"
12 #include "vm/class_table.h" 12 #include "vm/class_table.h"
13 #include "vm/gc_callbacks.h" 13 #include "vm/gc_callbacks.h"
14 #include "vm/megamorphic_cache_table.h" 14 #include "vm/megamorphic_cache_table.h"
15 #include "vm/store_buffer.h" 15 #include "vm/store_buffer.h"
16 #include "vm/timer.h" 16 #include "vm/timer.h"
17 17
18 namespace dart { 18 namespace dart {
19 19
20 // Forward declarations. 20 // Forward declarations.
21 class ApiState; 21 class ApiState;
22 class CodeIndexTable; 22 class CodeIndexTable;
23 class Debugger; 23 class Debugger;
24 class Function; 24 class Function;
25 class HandleScope; 25 class HandleScope;
26 class HandleVisitor; 26 class HandleVisitor;
27 class Heap; 27 class Heap;
28 class ICData; 28 class ICData;
29 class Instance;
29 class LongJump; 30 class LongJump;
30 class MessageHandler; 31 class MessageHandler;
31 class Mutex; 32 class Mutex;
32 class ObjectPointerVisitor; 33 class ObjectPointerVisitor;
33 class ObjectStore; 34 class ObjectStore;
34 class RawInstance; 35 class RawInstance;
35 class RawArray; 36 class RawArray;
36 class RawContext; 37 class RawContext;
37 class RawDouble; 38 class RawDouble;
38 class RawMint; 39 class RawMint;
39 class RawObject; 40 class RawObject;
40 class RawInteger; 41 class RawInteger;
41 class RawError; 42 class RawError;
42 class Simulator; 43 class Simulator;
43 class StackResource; 44 class StackResource;
44 class StackZone; 45 class StackZone;
45 class StubCode; 46 class StubCode;
46 class RawFloat32x4; 47 class RawFloat32x4;
47 class RawUint32x4; 48 class RawUint32x4;
48 49
49 50
50 // Used by the deoptimization infrastructure to defer allocation of unboxed 51 // Used by the deoptimization infrastructure to defer allocation of unboxed
51 // objects until frame is fully rewritten and GC is safe. 52 // objects until frame is fully rewritten and GC is safe.
52 // See callers of Isolate::DeferObjectMaterialization. 53 // Describes a stack slot that should be populated with a reference to the
53 class DeferredObject { 54 // materialized object.
55 class DeferredSlot {
54 public: 56 public:
55 DeferredObject(RawInstance** slot, DeferredObject* next) 57 DeferredSlot(RawInstance** slot, DeferredSlot* next)
56 : slot_(slot), next_(next) { } 58 : slot_(slot), next_(next) { }
57 virtual ~DeferredObject() { } 59 virtual ~DeferredSlot() { }
58 60
59 RawInstance** slot() const { return slot_; } 61 RawInstance** slot() const { return slot_; }
60 DeferredObject* next() const { return next_; } 62 DeferredSlot* next() const { return next_; }
61 63
62 virtual void Materialize() = 0; 64 virtual void Materialize() = 0;
63 65
64 private: 66 private:
65 RawInstance** const slot_; 67 RawInstance** const slot_;
66 DeferredObject* const next_; 68 DeferredSlot* const next_;
67 69
68 DISALLOW_COPY_AND_ASSIGN(DeferredObject); 70 DISALLOW_COPY_AND_ASSIGN(DeferredSlot);
69 }; 71 };
70 72
71 73
72 class DeferredDouble : public DeferredObject { 74 class DeferredDouble : public DeferredSlot {
73 public: 75 public:
74 DeferredDouble(double value, RawInstance** slot, DeferredObject* next) 76 DeferredDouble(double value, RawInstance** slot, DeferredSlot* next)
75 : DeferredObject(slot, next), value_(value) { } 77 : DeferredSlot(slot, next), value_(value) { }
76 78
77 virtual void Materialize(); 79 virtual void Materialize();
78 80
79 double value() const { return value_; } 81 double value() const { return value_; }
80 82
81 private: 83 private:
82 const double value_; 84 const double value_;
83 85
84 DISALLOW_COPY_AND_ASSIGN(DeferredDouble); 86 DISALLOW_COPY_AND_ASSIGN(DeferredDouble);
85 }; 87 };
86 88
87 89
88 class DeferredMint : public DeferredObject { 90 class DeferredMint : public DeferredSlot {
89 public: 91 public:
90 DeferredMint(int64_t value, RawInstance** slot, DeferredObject* next) 92 DeferredMint(int64_t value, RawInstance** slot, DeferredSlot* next)
91 : DeferredObject(slot, next), value_(value) { } 93 : DeferredSlot(slot, next), value_(value) { }
92 94
93 virtual void Materialize(); 95 virtual void Materialize();
94 96
95 int64_t value() const { return value_; } 97 int64_t value() const { return value_; }
96 98
97 private: 99 private:
98 const int64_t value_; 100 const int64_t value_;
99 101
100 DISALLOW_COPY_AND_ASSIGN(DeferredMint); 102 DISALLOW_COPY_AND_ASSIGN(DeferredMint);
101 }; 103 };
102 104
103 105
104 class DeferredFloat32x4 : public DeferredObject { 106 class DeferredFloat32x4 : public DeferredSlot {
105 public: 107 public:
106 DeferredFloat32x4(simd128_value_t value, RawInstance** slot, 108 DeferredFloat32x4(simd128_value_t value, RawInstance** slot,
107 DeferredObject* next) 109 DeferredSlot* next)
108 : DeferredObject(slot, next), value_(value) { } 110 : DeferredSlot(slot, next), value_(value) { }
109 111
110 virtual void Materialize(); 112 virtual void Materialize();
111 113
112 simd128_value_t value() const { return value_; } 114 simd128_value_t value() const { return value_; }
113 115
114 private: 116 private:
115 const simd128_value_t value_; 117 const simd128_value_t value_;
116 118
117 DISALLOW_COPY_AND_ASSIGN(DeferredFloat32x4); 119 DISALLOW_COPY_AND_ASSIGN(DeferredFloat32x4);
118 }; 120 };
119 121
120 122
121 class DeferredUint32x4 : public DeferredObject { 123 class DeferredUint32x4 : public DeferredSlot {
122 public: 124 public:
123 DeferredUint32x4(simd128_value_t value, RawInstance** slot, 125 DeferredUint32x4(simd128_value_t value, RawInstance** slot,
124 DeferredObject* next) 126 DeferredSlot* next)
125 : DeferredObject(slot, next), value_(value) { } 127 : DeferredSlot(slot, next), value_(value) { }
126 128
127 virtual void Materialize(); 129 virtual void Materialize();
128 130
129 simd128_value_t value() const { return value_; } 131 simd128_value_t value() const { return value_; }
130 132
131 private: 133 private:
132 const simd128_value_t value_; 134 const simd128_value_t value_;
133 135
134 DISALLOW_COPY_AND_ASSIGN(DeferredUint32x4); 136 DISALLOW_COPY_AND_ASSIGN(DeferredUint32x4);
135 }; 137 };
136 138
137 139
140 // Describes a slot that contains a reference to an object that had its
141 // allocation removed by AllocationSinking pass.
142 // Object itself is described and materialized by DeferredObject.
143 class DeferredObjectRef : public DeferredSlot {
144 public:
145 DeferredObjectRef(intptr_t index, RawInstance** slot, DeferredSlot* next)
146 : DeferredSlot(slot, next), index_(index) { }
147
148 virtual void Materialize();
149
150 intptr_t index() const { return index_; }
151
152 private:
153 const intptr_t index_;
154
155 DISALLOW_COPY_AND_ASSIGN(DeferredObjectRef);
156 };
157
158
159 // Describes an object which allocation was removed by AllocationSinking pass.
160 // Arguments for materialization are stored as a part of expression stack
161 // for the bottommost deoptimized frame so that GC could discover them.
162 // They will be removed from the stack at the very end of deoptimization.
163 class DeferredObject {
164 public:
165 DeferredObject(intptr_t field_count, intptr_t* args)
166 : field_count_(field_count),
167 args_(reinterpret_cast<RawObject**>(args)),
168 object_(NULL) { }
169
170 intptr_t ArgumentCount() const {
171 return kFieldsStartIndex + kFieldEntrySize * field_count_;
172 }
173
174 RawInstance* object();
175
176 private:
177 enum {
178 kClassIndex = 0,
179 kFieldsStartIndex = kClassIndex + 1
180 };
181
182 enum {
183 kFieldIndex = 0,
184 kValueIndex,
185 kFieldEntrySize,
186 };
187
188 // Materializes the object. Returns amount of values that were consumed
189 // and should be removed from the expression stack at the very end of
190 // deoptimization.
191 void Materialize();
192
193 RawObject* GetClass() const {
194 return args_[kClassIndex];
195 }
196
197 RawObject* GetField(intptr_t index) const {
198 return args_[kFieldsStartIndex + kFieldEntrySize * index + kFieldIndex];
199 }
200
201 RawObject* GetValue(intptr_t index) const {
202 return args_[kFieldsStartIndex + kFieldEntrySize * index + kValueIndex];
203 }
204
205 // Amount of fields that have to be initialized.
206 const intptr_t field_count_;
207
208 // Pointer to the first materialization argument on the stack.
209 // The first argument is Class of the instance to materialize followed by
210 // Field, value pairs.
211 RawObject** args_;
212
213 // Object materialized from this description.
214 const Instance* object_;
215
216 DISALLOW_COPY_AND_ASSIGN(DeferredObject);
217 };
218
219
138 class Isolate : public BaseIsolate { 220 class Isolate : public BaseIsolate {
139 public: 221 public:
140 ~Isolate(); 222 ~Isolate();
141 223
142 static inline Isolate* Current() { 224 static inline Isolate* Current() {
143 return reinterpret_cast<Isolate*>(Thread::GetThreadLocal(isolate_key)); 225 return reinterpret_cast<Isolate*>(Thread::GetThreadLocal(isolate_key));
144 } 226 }
145 227
146 static void SetCurrent(Isolate* isolate); 228 static void SetCurrent(Isolate* isolate);
147 229
(...skipping 269 matching lines...) Expand 10 before | Expand all | Expand 10 after
417 } 499 }
418 intptr_t* deopt_frame_copy() const { return deopt_frame_copy_; } 500 intptr_t* deopt_frame_copy() const { return deopt_frame_copy_; }
419 void SetDeoptFrameCopy(intptr_t* value, intptr_t size) { 501 void SetDeoptFrameCopy(intptr_t* value, intptr_t size) {
420 ASSERT((value == NULL) || (size > 0)); 502 ASSERT((value == NULL) || (size > 0));
421 ASSERT((value == NULL) || (deopt_frame_copy_ == NULL)); 503 ASSERT((value == NULL) || (deopt_frame_copy_ == NULL));
422 deopt_frame_copy_ = value; 504 deopt_frame_copy_ = value;
423 deopt_frame_copy_size_ = size; 505 deopt_frame_copy_size_ = size;
424 } 506 }
425 intptr_t deopt_frame_copy_size() const { return deopt_frame_copy_size_; } 507 intptr_t deopt_frame_copy_size() const { return deopt_frame_copy_size_; }
426 508
509 void PrepareForDeferredMaterialization(intptr_t count) {
510 if (count > 0) {
511 deferred_objects_ = new DeferredObject*[count];
512 deferred_objects_count_ = count;
513 }
514 }
515
516 void DeleteDeferredObjects() {
517 for (intptr_t i = 0; i < deferred_objects_count_; i++) {
518 delete deferred_objects_[i];
519 }
520 delete[] deferred_objects_;
521 deferred_objects_ = NULL;
522 deferred_objects_count_ = 0;
523 }
524
525 DeferredObject* GetDeferredObject(intptr_t idx) const {
526 return deferred_objects_[idx];
527 }
528
529 void SetDeferredObjectAt(intptr_t idx, DeferredObject* object) {
530 deferred_objects_[idx] = object;
531 }
532
533 intptr_t DeferredObjectsCount() const {
534 return deferred_objects_count_;
535 }
536
537 void DeferMaterializedObjectRef(intptr_t idx, intptr_t* slot) {
538 deferred_object_refs_ = new DeferredObjectRef(
539 idx,
540 reinterpret_cast<RawInstance**>(slot),
541 deferred_object_refs_);
542 }
543
427 void DeferDoubleMaterialization(double value, RawDouble** slot) { 544 void DeferDoubleMaterialization(double value, RawDouble** slot) {
428 deferred_objects_ = new DeferredDouble( 545 deferred_boxes_ = new DeferredDouble(
429 value, 546 value,
430 reinterpret_cast<RawInstance**>(slot), 547 reinterpret_cast<RawInstance**>(slot),
431 deferred_objects_); 548 deferred_boxes_);
432 } 549 }
433 550
434 void DeferMintMaterialization(int64_t value, RawMint** slot) { 551 void DeferMintMaterialization(int64_t value, RawMint** slot) {
435 deferred_objects_ = new DeferredMint(value, 552 deferred_boxes_ = new DeferredMint(
436 reinterpret_cast<RawInstance**>(slot), 553 value,
437 deferred_objects_); 554 reinterpret_cast<RawInstance**>(slot),
555 deferred_boxes_);
438 } 556 }
439 557
440 void DeferFloat32x4Materialization(simd128_value_t value, 558 void DeferFloat32x4Materialization(simd128_value_t value,
441 RawFloat32x4** slot) { 559 RawFloat32x4** slot) {
442 deferred_objects_ = new DeferredFloat32x4( 560 deferred_boxes_ = new DeferredFloat32x4(
443 value, 561 value,
444 reinterpret_cast<RawInstance**>(slot), 562 reinterpret_cast<RawInstance**>(slot),
445 deferred_objects_); 563 deferred_boxes_);
446 } 564 }
447 565
448 void DeferUint32x4Materialization(simd128_value_t value, 566 void DeferUint32x4Materialization(simd128_value_t value,
449 RawUint32x4** slot) { 567 RawUint32x4** slot) {
450 deferred_objects_ = new DeferredUint32x4( 568 deferred_boxes_ = new DeferredUint32x4(
451 value, 569 value,
452 reinterpret_cast<RawInstance**>(slot), 570 reinterpret_cast<RawInstance**>(slot),
453 deferred_objects_); 571 deferred_boxes_);
454 } 572 }
455 573
456 DeferredObject* DetachDeferredObjects() { 574 // Populate all deferred slots that contain boxes for double, mint, simd
457 DeferredObject* list = deferred_objects_; 575 // values.
458 deferred_objects_ = NULL; 576 void MaterializeDeferredBoxes();
459 return list; 577
460 } 578 // Populate all slots containing references to objects which allocations
579 // were eliminated by AllocationSinking pass.
580 void MaterializeDeferredObjects();
461 581
462 static char* GetStatus(const char* request); 582 static char* GetStatus(const char* request);
463 583
464 private: 584 private:
465 Isolate(); 585 Isolate();
466 586
467 void BuildName(const char* name_prefix); 587 void BuildName(const char* name_prefix);
468 void PrintInvokedFunctions(); 588 void PrintInvokedFunctions();
469 589
470 static bool FetchStacktrace(); 590 static bool FetchStacktrace();
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after
504 bool is_runnable_; 624 bool is_runnable_;
505 IsolateRunState running_state_; 625 IsolateRunState running_state_;
506 GcPrologueCallbacks gc_prologue_callbacks_; 626 GcPrologueCallbacks gc_prologue_callbacks_;
507 GcEpilogueCallbacks gc_epilogue_callbacks_; 627 GcEpilogueCallbacks gc_epilogue_callbacks_;
508 628
509 // Deoptimization support. 629 // Deoptimization support.
510 intptr_t* deopt_cpu_registers_copy_; 630 intptr_t* deopt_cpu_registers_copy_;
511 fpu_register_t* deopt_fpu_registers_copy_; 631 fpu_register_t* deopt_fpu_registers_copy_;
512 intptr_t* deopt_frame_copy_; 632 intptr_t* deopt_frame_copy_;
513 intptr_t deopt_frame_copy_size_; 633 intptr_t deopt_frame_copy_size_;
514 DeferredObject* deferred_objects_; 634 DeferredSlot* deferred_boxes_;
635 DeferredSlot* deferred_object_refs_;
636
637 intptr_t deferred_objects_count_;
638 DeferredObject** deferred_objects_;
515 639
516 // Status support. 640 // Status support.
517 char* stacktrace_; 641 char* stacktrace_;
518 intptr_t stack_frame_index_; 642 intptr_t stack_frame_index_;
519 643
520 static Dart_IsolateCreateCallback create_callback_; 644 static Dart_IsolateCreateCallback create_callback_;
521 static Dart_IsolateInterruptCallback interrupt_callback_; 645 static Dart_IsolateInterruptCallback interrupt_callback_;
522 static Dart_IsolateUnhandledExceptionCallback unhandled_exception_callback_; 646 static Dart_IsolateUnhandledExceptionCallback unhandled_exception_callback_;
523 static Dart_IsolateShutdownCallback shutdown_callback_; 647 static Dart_IsolateShutdownCallback shutdown_callback_;
524 static Dart_FileOpenCallback file_open_callback_; 648 static Dart_FileOpenCallback file_open_callback_;
(...skipping 113 matching lines...) Expand 10 before | Expand all | Expand 10 after
638 762
639 private: 763 private:
640 Isolate::IsolateRunState saved_state_; 764 Isolate::IsolateRunState saved_state_;
641 765
642 DISALLOW_COPY_AND_ASSIGN(IsolateRunStateManager); 766 DISALLOW_COPY_AND_ASSIGN(IsolateRunStateManager);
643 }; 767 };
644 768
645 } // namespace dart 769 } // namespace dart
646 770
647 #endif // VM_ISOLATE_H_ 771 #endif // VM_ISOLATE_H_
OLDNEW
« no previous file with comments | « runtime/vm/intermediate_language.cc ('k') | runtime/vm/isolate.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698