Flutter Engine
The Flutter Engine
deopt_instructions.h
Go to the documentation of this 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
3// BSD-style license that can be found in the LICENSE file.
4
5#ifndef RUNTIME_VM_DEOPT_INSTRUCTIONS_H_
6#define RUNTIME_VM_DEOPT_INSTRUCTIONS_H_
7#if !defined(DART_PRECOMPILED_RUNTIME)
8
9#include "vm/allocation.h"
10#include "vm/code_descriptors.h"
13#include "vm/deferred_objects.h"
14#include "vm/growable_array.h"
15#include "vm/object.h"
16#include "vm/runtime_entry.h"
17#include "vm/stack_frame.h"
18#include "vm/thread.h"
19
20namespace dart {
21
22class Location;
23class Value;
24class MaterializeObjectInstr;
25class StackFrame;
26class TimelineEvent;
27
28// Holds all data relevant for execution of deoptimization instructions.
29// Structure is allocated in C-heap.
31 public:
33 kDestIsOriginalFrame, // Replace the original frame with deopt frame.
34 kDestIsAllocated // Write deopt frame to a buffer.
35 };
36
37 // If 'deoptimizing_code' is false, only frame is being deoptimized.
39 const Code& code,
40 DestFrameOptions dest_options,
41 fpu_register_t* fpu_registers,
42 intptr_t* cpu_registers,
43 bool is_lazy_deopt,
45 virtual ~DeoptContext();
46
47 // Returns the offset of the dest fp from the dest sp. Used in
48 // runtime code to adjust the stack size before deoptimization.
49 intptr_t DestStackAdjustment() const;
50
51 intptr_t* GetSourceFrameAddressAt(intptr_t index) const {
52 ASSERT(source_frame_ != nullptr);
53 ASSERT((0 <= index) && (index < source_frame_size_));
54 // Convert FP relative index to SP relative one.
55 index = source_frame_size_ - 1 - index;
56 return &source_frame_[index];
57 }
58
59 // Returns index in stack slot notation where -1 is the first argument
60 intptr_t GetStackSlot(intptr_t index) const {
61 ASSERT((0 <= index) && (index < source_frame_size_));
62 index -= num_args_;
63 return index < 0 ? index : index - kDartFrameFixedSize;
64 }
65
66 intptr_t GetSourceFp() const;
67 intptr_t GetSourcePp() const;
68 intptr_t GetSourcePc() const;
69
70 intptr_t GetCallerFp() const;
71 void SetCallerFp(intptr_t callers_fp);
72
73 ObjectPtr ObjectAt(intptr_t index) const {
74 const ObjectPool& object_pool = ObjectPool::Handle(object_pool_);
75 return object_pool.ObjectAt(index);
76 }
77
78 intptr_t RegisterValue(Register reg) const {
79 ASSERT(reg >= 0);
81 ASSERT(cpu_registers_ != nullptr);
82 return cpu_registers_[reg];
83 }
84
86 ASSERT(fpu_registers_ != NULL);
87 ASSERT(reg >= 0);
89 return *reinterpret_cast<float*>(&fpu_registers_[reg]);
90 }
91
93 ASSERT(fpu_registers_ != nullptr);
94 ASSERT(reg >= 0);
96 return *reinterpret_cast<double*>(&fpu_registers_[reg]);
97 }
98
101 ASSERT(fpu_registers_ != nullptr);
102 ASSERT(reg >= 0);
104 const float* address = reinterpret_cast<float*>(&fpu_registers_[reg]);
105 return simd128_value_t().readFrom(address);
106 }
107
108 // Return base pointer for the given frame (either source or destination).
109 // Base pointer points to the slot with the lowest address in the frame
110 // including incoming arguments and artificial deoptimization frame
111 // on top of it.
112 // Note: artificial frame created by the deoptimization stub is considered
113 // part of the frame because it contains saved caller PC and FP that
114 // deoptimization will fill in.
115 intptr_t* FrameBase(const StackFrame* frame) {
116 // SP of the deoptimization frame is the lowest slot because
117 // stack is growing downwards.
118 return reinterpret_cast<intptr_t*>(frame->sp() -
120 }
121
123 ASSERT(frame != nullptr && dest_frame_ == nullptr);
124 dest_frame_ = FrameBase(frame);
125 }
126
127 Thread* thread() const { return thread_; }
128 Zone* zone() const { return thread_->zone(); }
129
130 intptr_t source_frame_size() const { return source_frame_size_; }
131 intptr_t dest_frame_size() const { return dest_frame_size_; }
132
133 CodePtr code() const { return code_; }
134
135 bool is_lazy_deopt() const { return is_lazy_deopt_; }
136
137 bool deoptimizing_code() const { return deoptimizing_code_; }
138
139 ICData::DeoptReasonId deopt_reason() const { return deopt_reason_; }
141 return (deopt_flags_ & flag) != 0;
142 }
143
144 TypedDataPtr deopt_info() const { return deopt_info_; }
145
146 // Fills the destination frame but defers materialization of
147 // objects.
148 void FillDestFrame();
149
150 // Convert deoptimization instructions to a list of moves that need
151 // to be executed when entering catch entry block from this deoptimization
152 // point.
153 const CatchEntryMoves* ToCatchEntryMoves(intptr_t num_vars);
154
155 // Materializes all deferred objects. Returns the total number of
156 // artificial arguments used during deoptimization.
158
159 ArrayPtr DestFrameAsArray();
160
162
163 void DeferMaterializedObjectRef(intptr_t idx, intptr_t* slot) {
164 deferred_slots_ = new DeferredObjectRef(
165 idx, reinterpret_cast<ObjectPtr*>(slot), deferred_slots_);
166 }
167
168 void DeferMaterialization(float value, DoublePtr* slot) {
169 deferred_slots_ = new DeferredDouble(
170 value, reinterpret_cast<ObjectPtr*>(slot), deferred_slots_);
171 }
172
173 void DeferMaterialization(double value, DoublePtr* slot) {
174 deferred_slots_ = new DeferredDouble(
175 value, reinterpret_cast<ObjectPtr*>(slot), deferred_slots_);
176 }
177
178 void DeferMintMaterialization(int64_t value, MintPtr* slot) {
179 deferred_slots_ = new DeferredMint(
180 value, reinterpret_cast<ObjectPtr*>(slot), deferred_slots_);
181 }
182
183 void DeferMaterialization(simd128_value_t value, Float32x4Ptr* slot) {
184 deferred_slots_ = new DeferredFloat32x4(
185 value, reinterpret_cast<ObjectPtr*>(slot), deferred_slots_);
186 }
187
188 void DeferMaterialization(simd128_value_t value, Float64x2Ptr* slot) {
189 deferred_slots_ = new DeferredFloat64x2(
190 value, reinterpret_cast<ObjectPtr*>(slot), deferred_slots_);
191 }
192
194 deferred_slots_ = new DeferredInt32x4(
195 value, reinterpret_cast<ObjectPtr*>(slot), deferred_slots_);
196 }
197
198 void DeferRetAddrMaterialization(intptr_t index,
199 intptr_t deopt_id,
200 intptr_t* slot) {
201 deferred_slots_ = new DeferredRetAddr(
202 index, deopt_id, reinterpret_cast<ObjectPtr*>(slot), deferred_slots_);
203 }
204
205 void DeferPcMarkerMaterialization(intptr_t index, intptr_t* slot) {
206 deferred_slots_ = new DeferredPcMarker(
207 index, reinterpret_cast<ObjectPtr*>(slot), deferred_slots_);
208 }
209
210 void DeferPpMaterialization(intptr_t index, ObjectPtr* slot) {
211 deferred_slots_ = new DeferredPp(index, slot, deferred_slots_);
212 }
213
214 DeferredObject* GetDeferredObject(intptr_t idx) const {
215 return deferred_objects_[idx];
216 }
217
218 intptr_t num_args() const { return num_args_; }
219
220 private:
221 intptr_t* GetDestFrameAddressAt(intptr_t index) const {
222 ASSERT(dest_frame_ != nullptr);
223 ASSERT((0 <= index) && (index < dest_frame_size_));
224 return &dest_frame_[index];
225 }
226
227 void PrepareForDeferredMaterialization(intptr_t count) {
228 if (count > 0) {
229 deferred_objects_ = new DeferredObject*[count];
230 deferred_objects_count_ = count;
231 }
232 }
233
234 // Sets the materialized value for some deferred object.
235 //
236 // Claims ownership of the memory for 'object'.
237 void SetDeferredObjectAt(intptr_t idx, DeferredObject* object) {
238 deferred_objects_[idx] = object;
239 }
240
241 intptr_t DeferredObjectsCount() const { return deferred_objects_count_; }
242
243 CodePtr code_;
244 ObjectPoolPtr object_pool_;
245 TypedDataPtr deopt_info_;
246 bool dest_frame_is_allocated_;
247 intptr_t* dest_frame_;
248 intptr_t dest_frame_size_;
249 bool source_frame_is_allocated_;
250 intptr_t* source_frame_;
251 intptr_t source_frame_size_;
252 intptr_t* cpu_registers_;
253 fpu_register_t* fpu_registers_;
254 intptr_t num_args_;
255 ICData::DeoptReasonId deopt_reason_;
256 uint32_t deopt_flags_;
257 intptr_t caller_fp_;
258 Thread* thread_;
259 int64_t deopt_start_micros_;
260
261 DeferredSlot* deferred_slots_;
262
263 intptr_t deferred_objects_count_;
264 DeferredObject** deferred_objects_;
265
266 const bool is_lazy_deopt_;
267 const bool deoptimizing_code_;
268
269 DISALLOW_COPY_AND_ASSIGN(DeoptContext);
270};
271
272// Represents one deopt instruction, e.g, setup return address, store object,
273// store register, etc. The target is defined by instruction's position in
274// the deopt-info array.
275class DeoptInstr : public ZoneAllocated {
276 public:
277 enum Kind {
286 // Mints are split into low and high words on 32-bit architectures. Each
287 // word can be in a register or stack slot. Note Mint pairs are only
288 // used on 32-bit architectures.
290 // Mints are held in one word on 64-bit architectures.
301 };
302
303 static DeoptInstr* Create(intptr_t kind_as_int, intptr_t source_index);
304
306 virtual ~DeoptInstr() {}
307
308 virtual const char* ToCString() const {
309 const char* args = ArgumentsToCString();
310 if (args != nullptr) {
312 "%s(%s)", KindToCString(kind()), args);
313 } else {
314 return KindToCString(kind());
315 }
316 }
317
318 virtual void Execute(DeoptContext* deopt_context, intptr_t* dest_addr) = 0;
319
321 intptr_t dest_slot) {
322 UNREACHABLE();
323 return CatchEntryMove();
324 }
325
326 virtual DeoptInstr::Kind kind() const = 0;
327
328 bool Equals(const DeoptInstr& other) const {
329 return (kind() == other.kind()) && (source_index() == other.source_index());
330 }
331
332 // Get the code and return address which is encoded in this
333 // kRetAfterAddress deopt instruction.
334 static uword GetRetAddress(DeoptInstr* instr,
335 const ObjectPool& object_pool,
336 Code* code);
337
338 // Return number of initialized fields in the object that will be
339 // materialized by kMaterializeObject instruction.
340 static intptr_t GetFieldCount(DeoptInstr* instr) {
342 return instr->source_index();
343 }
344
345 protected:
346 friend class DeoptInfoBuilder;
347
348 virtual intptr_t source_index() const = 0;
349
350 virtual const char* ArgumentsToCString() const { return nullptr; }
351
352 private:
353 static const char* KindToCString(Kind kind);
354
356};
357
358// Helper class that allows to read a value of the given register from
359// the DeoptContext as the specified type.
360// It calls different method depending on which kind of register (cpu/fpu) and
361// destination types are specified.
362template <typename RegisterType, typename DestinationType>
364
365template <typename T>
367 static intptr_t Read(DeoptContext* context, Register reg) {
368 return context->RegisterValue(reg);
369 }
370};
371
372template <>
374 static double Read(DeoptContext* context, FpuRegister reg) {
375 return context->FpuRegisterValueAsFloat(reg);
376 }
377};
378
379template <>
381 static double Read(DeoptContext* context, FpuRegister reg) {
382 return context->FpuRegisterValueAsDouble(reg);
383 }
384};
385
386template <>
389 return context->FpuRegisterValueAsSimd128(reg);
390 }
391};
392
393// Class that encapsulates reading and writing of values that were either in
394// the registers in the optimized code or were spilled from those registers
395// to the stack.
396template <typename RegisterType>
398 public:
399 enum Kind {
400 // Spilled register source represented as its spill slot.
402 // Register source represented as its register index.
403 kRegister = 1
404 };
405
406 explicit RegisterSource(intptr_t source_index)
407 : source_index_(source_index) {}
408
409 RegisterSource(Kind kind, intptr_t index)
410 : source_index_(KindField::encode(kind) |
411 UntaggedIndexField::encode(index)) {}
412
413 template <typename T>
414 T Value(DeoptContext* context) const {
415 if (is_register()) {
416 return static_cast<T>(
418 } else {
419 return *reinterpret_cast<T*>(
420 context->GetSourceFrameAddressAt(raw_index()));
421 }
422 }
423
424 intptr_t StackSlot(DeoptContext* context) const {
425 ASSERT(!is_register());
426 return context->GetStackSlot(raw_index());
427 }
428
429 intptr_t source_index() const { return source_index_; }
430
431 const char* ToCString() const {
432 if (is_register()) {
433 return Name(reg());
434 } else {
435 return Thread::Current()->zone()->PrintToString("s%" Pd "", raw_index());
436 }
437 }
438
439 private:
440 class KindField : public BitField<intptr_t, intptr_t, 0, 1> {};
441 class UntaggedIndexField
442 : public BitField<intptr_t, intptr_t, 1, kBitsPerWord - 1> {};
443
444 bool is_register() const {
445 return KindField::decode(source_index_) == kRegister;
446 }
447 intptr_t raw_index() const {
448 return UntaggedIndexField::decode(source_index_);
449 }
450
451 RegisterType reg() const { return static_cast<RegisterType>(raw_index()); }
452
453 static const char* Name(Register reg) {
454 return RegisterNames::RegisterName(reg);
455 }
456
457 static const char* Name(FpuRegister fpu_reg) {
458 return RegisterNames::FpuRegisterName(fpu_reg);
459 }
460
461 const intptr_t source_index_;
462};
463
466
467// Builds a deoptimization info table, one DeoptInfo at a time. Call AddXXX
468// methods in the order of their target, starting wih deoptimized code
469// continuation pc and ending with the first argument of the deoptimized
470// code. Call CreateDeoptInfo to write the accumulated instructions into
471// the heap and reset the builder's internal state for the next DeoptInfo.
473 public:
475 const intptr_t num_args,
476 compiler::Assembler* assembler);
477
478 // Return address before instruction.
480 intptr_t deopt_id,
481 intptr_t dest_index);
482
483 // Copy from optimized frame to unoptimized.
484 void AddCopy(Value* value, const Location& source_loc, intptr_t dest_index);
485 void AddPcMarker(const Function& function, intptr_t dest_index);
486 void AddPp(const Function& function, intptr_t dest_index);
487 void AddCallerFp(intptr_t dest_index);
488 void AddCallerPp(intptr_t dest_index);
489 void AddCallerPc(intptr_t dest_index);
490
491 // Add object to be materialized. Emit kMaterializeObject instruction.
493
494 // For every materialized object emit instructions describing data required
495 // for materialization: class of the instance to allocate and field-value
496 // pairs for initialization.
497 // Emitted instructions are expected to follow fixed size section of frame
498 // emitted first. This way they become a part of the bottom-most deoptimized
499 // frame and are discoverable by GC.
500 // At deoptimization they will be removed by the stub at the very end:
501 // after they were used to materialize objects.
502 // Returns the index of the next stack slot. Used for verification.
503 intptr_t EmitMaterializationArguments(intptr_t dest_index);
504
505 TypedDataPtr CreateDeoptInfo(const Array& deopt_table);
506
507 // Mark the actual start of the frame description after all materialization
508 // instructions were emitted. Used for verification purposes.
510 ASSERT(frame_start_ == -1);
511 frame_start_ = instructions_.length();
512 }
513
514 private:
515 friend class CompilerDeoptInfo; // For current_info_number_.
516
517 class TrieNode;
518
519 CpuRegisterSource ToCpuRegisterSource(const Location& loc);
520 FpuRegisterSource ToFpuRegisterSource(
521 const Location& loc,
522 Location::Kind expected_stack_slot_kind);
523
524 intptr_t FindOrAddObjectInTable(const Object& obj) const;
525 intptr_t FindMaterialization(MaterializeObjectInstr* mat) const;
526 intptr_t CalculateStackIndex(const Location& source_loc) const;
527
528 intptr_t FrameSize() const {
529 ASSERT(frame_start_ != -1);
530 const intptr_t frame_size = instructions_.length() - frame_start_;
531 ASSERT(frame_size >= 0);
532 return frame_size;
533 }
534
535 void AddConstant(const Object& obj, intptr_t dest_index);
536
537 Zone* zone() const { return zone_; }
538
539 Zone* zone_;
540
541 GrowableArray<DeoptInstr*> instructions_;
542 const intptr_t num_args_;
543 compiler::Assembler* assembler_;
544
545 // Used to compress entries by sharing suffixes.
546 TrieNode* trie_root_;
547 intptr_t current_info_number_;
548
549 intptr_t frame_start_;
550 GrowableArray<MaterializeObjectInstr*> materializations_;
551
553};
554
555// Utilities for managing the deopt table and its entries. The table is
556// stored in an Array in the heap. It consists of triples of (PC offset,
557// info, reason). Elements of each entry are stored consecutively in the
558// array.
559// TODO(vegorov): consider compressing the whole table into a single TypedData
560// object.
561class DeoptTable : public AllStatic {
562 public:
563 // Return the array size in elements for a given number of table entries.
564 static intptr_t SizeFor(intptr_t length);
565
566 // Set the entry at the given index into the table (not an array index).
567 static void SetEntry(const Array& table,
568 intptr_t index,
569 const Smi& offset,
570 const TypedData& info,
571 const Smi& reason_and_flags);
572
573 // Return the length of the table in entries.
574 static intptr_t GetLength(const Array& table);
575
576 // Set the output parameters (offset, info, reason) to the entry values at
577 // the index into the table (not an array index).
578 static void GetEntry(const Array& table,
579 intptr_t index,
580 Smi* offset,
582 Smi* reason_and_flags);
583
585 uint32_t flags) {
587 }
588
589 class ReasonField : public BitField<intptr_t, ICData::DeoptReasonId, 0, 8> {};
590 class FlagsField : public BitField<intptr_t, uint32_t, 8, 8> {};
591
592 private:
593 static constexpr intptr_t kEntrySize = 3;
594};
595
596// Holds deopt information at one deoptimization point. The information consists
597// of two parts:
598// - first a prefix consisting of kMaterializeObject instructions describing
599// objects which had their allocation removed as part of AllocationSinking
600// pass and have to be materialized;
601// - followed by a list of DeoptInstr objects, specifying transformation
602// information for each slot in unoptimized frame(s).
603// Arguments for object materialization (class of instance to be allocated and
604// field-value pairs) are added as artificial slots to the expression stack
605// of the bottom-most frame. They are removed from the stack at the very end
606// of deoptimization by the deoptimization stub.
607class DeoptInfo : public AllStatic {
608 public:
609 // Size of the frame part of the translation not counting kMaterializeObject
610 // instructions in the prefix.
611 static intptr_t FrameSize(const TypedData& packed);
612
613 // Returns the number of kMaterializeObject instructions in the prefix.
614 static intptr_t NumMaterializations(const GrowableArray<DeoptInstr*>&);
615
616 // Unpack the entire translation into an array of deoptimization
617 // instructions. This copies any shared suffixes into the array.
618 static void Unpack(const Array& table,
619 const TypedData& packed,
620 GrowableArray<DeoptInstr*>* instructions);
621
622 // Size of the frame part of the translation not counting kMaterializeObject
623 // instructions in the prefix.
624 static const char* ToCString(const Array& table, const TypedData& packed);
625
626 // Returns true iff decompression yields the same instructions as the
627 // original.
628 static bool VerifyDecompression(const GrowableArray<DeoptInstr*>& original,
629 const Array& deopt_table,
630 const TypedData& packed);
631
632 private:
633 static void UnpackInto(const Array& table,
634 const TypedData& packed,
635 GrowableArray<DeoptInstr*>* instructions,
636 intptr_t length);
637};
638
639} // namespace dart
640
641#endif // !defined(DART_PRECOMPILED_RUNTIME)
642#endif // RUNTIME_VM_DEOPT_INSTRUCTIONS_H_
static void info(const char *fmt,...) SK_PRINTF_LIKE(1
Definition: DM.cpp:213
int count
Definition: FontMgrTest.cpp:50
static void encode(uint8_t output[16], const uint32_t input[4])
Definition: SkMD5.cpp:240
SI F table(const skcms_Curve *curve, F v)
#define UNREACHABLE()
Definition: assert.h:248
static constexpr intptr_t encode(ICData::DeoptReasonId value)
Definition: bitfield.h:165
intptr_t num_args() const
intptr_t GetSourceFp() const
intptr_t RegisterValue(Register reg) const
intptr_t MaterializeDeferredObjects()
intptr_t * GetSourceFrameAddressAt(intptr_t index) const
double FpuRegisterValueAsDouble(FpuRegister reg) const
bool deoptimizing_code() const
DeoptContext(const StackFrame *frame, const Code &code, DestFrameOptions dest_options, fpu_register_t *fpu_registers, intptr_t *cpu_registers, bool is_lazy_deopt, bool deoptimizing_code)
simd128_value_t FpuRegisterValueAsSimd128(FpuRegister reg) const
bool HasDeoptFlag(ICData::DeoptFlags flag)
Thread * thread() const
intptr_t dest_frame_size() const
intptr_t source_frame_size() const
bool is_lazy_deopt() const
intptr_t GetSourcePp() const
intptr_t GetCallerFp() const
void DeferMaterialization(double value, DoublePtr *slot)
ObjectPtr ObjectAt(intptr_t index) const
void DeferRetAddrMaterialization(intptr_t index, intptr_t deopt_id, intptr_t *slot)
void DeferMaterialization(float value, DoublePtr *slot)
ICData::DeoptReasonId deopt_reason() const
void set_dest_frame(const StackFrame *frame)
intptr_t GetSourcePc() const
intptr_t GetStackSlot(intptr_t index) const
void DeferMaterialization(simd128_value_t value, Float32x4Ptr *slot)
float FpuRegisterValueAsFloat(FpuRegister reg) const
CodePtr code() const
intptr_t * FrameBase(const StackFrame *frame)
void DeferMaterialization(simd128_value_t value, Float64x2Ptr *slot)
void DeferPcMarkerMaterialization(intptr_t index, intptr_t *slot)
void VisitObjectPointers(ObjectPointerVisitor *visitor)
void DeferMaterialization(simd128_value_t value, Int32x4Ptr *slot)
void DeferPpMaterialization(intptr_t index, ObjectPtr *slot)
const CatchEntryMoves * ToCatchEntryMoves(intptr_t num_vars)
TypedDataPtr deopt_info() const
intptr_t DestStackAdjustment() const
void SetCallerFp(intptr_t callers_fp)
void DeferMaterializedObjectRef(intptr_t idx, intptr_t *slot)
void DeferMintMaterialization(int64_t value, MintPtr *slot)
DeferredObject * GetDeferredObject(intptr_t idx) const
DeoptInfoBuilder(Zone *zone, const intptr_t num_args, compiler::Assembler *assembler)
void AddCopy(Value *value, const Location &source_loc, intptr_t dest_index)
TypedDataPtr CreateDeoptInfo(const Array &deopt_table)
void AddMaterialization(MaterializeObjectInstr *mat)
void AddPcMarker(const Function &function, intptr_t dest_index)
void AddReturnAddress(const Function &function, intptr_t deopt_id, intptr_t dest_index)
void AddCallerFp(intptr_t dest_index)
void AddCallerPp(intptr_t dest_index)
intptr_t EmitMaterializationArguments(intptr_t dest_index)
void AddPp(const Function &function, intptr_t dest_index)
void AddCallerPc(intptr_t dest_index)
static intptr_t NumMaterializations(const GrowableArray< DeoptInstr * > &)
static void Unpack(const Array &table, const TypedData &packed, GrowableArray< DeoptInstr * > *instructions)
static const char * ToCString(const Array &table, const TypedData &packed)
static intptr_t FrameSize(const TypedData &packed)
static bool VerifyDecompression(const GrowableArray< DeoptInstr * > &original, const Array &deopt_table, const TypedData &packed)
static DeoptInstr * Create(intptr_t kind_as_int, intptr_t source_index)
virtual const char * ArgumentsToCString() const
virtual void Execute(DeoptContext *deopt_context, intptr_t *dest_addr)=0
virtual DeoptInstr::Kind kind() const =0
virtual intptr_t source_index() const =0
static intptr_t GetFieldCount(DeoptInstr *instr)
bool Equals(const DeoptInstr &other) const
virtual CatchEntryMove ToCatchEntryMove(DeoptContext *deopt_context, intptr_t dest_slot)
static uword GetRetAddress(DeoptInstr *instr, const ObjectPool &object_pool, Code *code)
virtual const char * ToCString() const
static void GetEntry(const Array &table, intptr_t index, Smi *offset, TypedData *info, Smi *reason_and_flags)
static intptr_t GetLength(const Array &table)
static SmiPtr EncodeReasonAndFlags(ICData::DeoptReasonId reason, uint32_t flags)
static intptr_t SizeFor(intptr_t length)
static void SetEntry(const Array &table, intptr_t index, const Smi &offset, const TypedData &info, const Smi &reason_and_flags)
static bool SupportsUnboxedSimd128()
ObjectPtr ObjectAt(intptr_t index) const
Definition: object.h:5628
static Object & Handle()
Definition: object.h:407
static const char * FpuRegisterName(FpuRegister reg)
Definition: constants.h:54
static const char * RegisterName(Register reg)
Definition: constants.h:46
T Value(DeoptContext *context) const
intptr_t source_index() const
RegisterSource(Kind kind, intptr_t index)
intptr_t StackSlot(DeoptContext *context) const
const char * ToCString() const
RegisterSource(intptr_t source_index)
static SmiPtr New(intptr_t value)
Definition: object.h:10006
Zone * zone() const
Definition: thread_state.h:37
static Thread * Current()
Definition: thread.h:362
Definition: il.h:75
char * PrintToString(const char *format,...) PRINTF_ATTRIBUTE(2
Definition: zone.cc:313
#define ASSERT(E)
double frame
Definition: examples.cpp:31
FlutterSemanticsFlag flag
FlutterSemanticsFlag flags
G_BEGIN_DECLS G_MODULE_EXPORT FlValue * args
uint8_t value
Dart_NativeFunction function
Definition: fuchsia.cc:51
size_t length
SK_API bool Read(SkStreamSeekable *src, SkDocumentPage *dstArray, int dstArrayCount, const SkDeserialProcs *=nullptr)
Definition: dart_vm.cc:33
static constexpr int kDartFrameFixedSize
RegisterSource< Register > CpuRegisterSource
uintptr_t uword
Definition: globals.h:501
@ kNumberOfCpuRegisters
Definition: constants_arm.h:98
const int kNumberOfFpuRegisters
constexpr intptr_t kWordSize
Definition: globals.h:509
QRegister FpuRegister
simd128_value_t fpu_register_t
RegisterSource< FpuRegister > FpuRegisterSource
AsciiTrie::TrieNode TrieNode
Definition: ascii_trie.cc:10
#define Pd
Definition: globals.h:408
#define DISALLOW_COPY_AND_ASSIGN(TypeName)
Definition: globals.h:581
static DecodeResult decode(std::string path)
Definition: png_codec.cpp:124
#define T
Definition: precompiler.cc:65
SeparatedVector2 offset
static double Read(DeoptContext *context, FpuRegister reg)
static double Read(DeoptContext *context, FpuRegister reg)
static simd128_value_t Read(DeoptContext *context, FpuRegister reg)
static intptr_t Read(DeoptContext *context, Register reg)
simd128_value_t & readFrom(const float *v)
Definition: globals.h:153