Flutter Engine
The Flutter Engine
Loading...
Searching...
No Matches
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
87 ASSERT(fpu_registers_ != NULL);
88 ASSERT(reg >= 0);
90 return *reinterpret_cast<float*>(&fpu_registers_[reg]);
91 }
92
95 ASSERT(fpu_registers_ != nullptr);
96 ASSERT(reg >= 0);
98 return *reinterpret_cast<double*>(&fpu_registers_[reg]);
99 }
100
103 ASSERT(fpu_registers_ != nullptr);
104 ASSERT(reg >= 0);
106 const float* address = reinterpret_cast<float*>(&fpu_registers_[reg]);
107 return simd128_value_t().readFrom(address);
108 }
109
110 // Return base pointer for the given frame (either source or destination).
111 // Base pointer points to the slot with the lowest address in the frame
112 // including incoming arguments and artificial deoptimization frame
113 // on top of it.
114 // Note: artificial frame created by the deoptimization stub is considered
115 // part of the frame because it contains saved caller PC and FP that
116 // deoptimization will fill in.
117 intptr_t* FrameBase(const StackFrame* frame) {
118 // SP of the deoptimization frame is the lowest slot because
119 // stack is growing downwards.
120 return reinterpret_cast<intptr_t*>(frame->sp() -
122 }
123
125 ASSERT(frame != nullptr && dest_frame_ == nullptr);
126 dest_frame_ = FrameBase(frame);
127 }
128
129 Thread* thread() const { return thread_; }
130 Zone* zone() const { return thread_->zone(); }
131
132 intptr_t source_frame_size() const { return source_frame_size_; }
133 intptr_t dest_frame_size() const { return dest_frame_size_; }
134
135 CodePtr code() const { return code_; }
136
137 bool is_lazy_deopt() const { return is_lazy_deopt_; }
138
139 bool deoptimizing_code() const { return deoptimizing_code_; }
140
141 ICData::DeoptReasonId deopt_reason() const { return deopt_reason_; }
143 return (deopt_flags_ & flag) != 0;
144 }
145
146 TypedDataPtr deopt_info() const { return deopt_info_; }
147
148 // Fills the destination frame but defers materialization of
149 // objects.
150 void FillDestFrame();
151
152 // Convert deoptimization instructions to a list of moves that need
153 // to be executed when entering catch entry block from this deoptimization
154 // point.
155 const CatchEntryMoves* ToCatchEntryMoves(intptr_t num_vars);
156
157 // Materializes all deferred objects. Returns the total number of
158 // artificial arguments used during deoptimization.
160
161 ArrayPtr DestFrameAsArray();
162
164
165 void DeferMaterializedObjectRef(intptr_t idx, intptr_t* slot) {
166 deferred_slots_ = new DeferredObjectRef(
167 idx, reinterpret_cast<ObjectPtr*>(slot), deferred_slots_);
168 }
169
170 void DeferMaterialization(float value, DoublePtr* slot) {
171 deferred_slots_ = new DeferredDouble(
172 value, reinterpret_cast<ObjectPtr*>(slot), deferred_slots_);
173 }
174
175 void DeferMaterialization(double value, DoublePtr* slot) {
176 deferred_slots_ = new DeferredDouble(
177 value, reinterpret_cast<ObjectPtr*>(slot), deferred_slots_);
178 }
179
180 void DeferMintMaterialization(int64_t value, MintPtr* slot) {
181 deferred_slots_ = new DeferredMint(
182 value, reinterpret_cast<ObjectPtr*>(slot), deferred_slots_);
183 }
184
185 void DeferMaterialization(simd128_value_t value, Float32x4Ptr* slot) {
186 deferred_slots_ = new DeferredFloat32x4(
187 value, reinterpret_cast<ObjectPtr*>(slot), deferred_slots_);
188 }
189
190 void DeferMaterialization(simd128_value_t value, Float64x2Ptr* slot) {
191 deferred_slots_ = new DeferredFloat64x2(
192 value, reinterpret_cast<ObjectPtr*>(slot), deferred_slots_);
193 }
194
195 void DeferMaterialization(simd128_value_t value, Int32x4Ptr* slot) {
196 deferred_slots_ = new DeferredInt32x4(
197 value, reinterpret_cast<ObjectPtr*>(slot), deferred_slots_);
198 }
199
200 void DeferRetAddrMaterialization(intptr_t index,
201 intptr_t deopt_id,
202 intptr_t* slot) {
203 deferred_slots_ = new DeferredRetAddr(
204 index, deopt_id, reinterpret_cast<ObjectPtr*>(slot), deferred_slots_);
205 }
206
207 void DeferPcMarkerMaterialization(intptr_t index, intptr_t* slot) {
208 deferred_slots_ = new DeferredPcMarker(
209 index, reinterpret_cast<ObjectPtr*>(slot), deferred_slots_);
210 }
211
212 void DeferPpMaterialization(intptr_t index, ObjectPtr* slot) {
213 deferred_slots_ = new DeferredPp(index, slot, deferred_slots_);
214 }
215
216 DeferredObject* GetDeferredObject(intptr_t idx) const {
217 return deferred_objects_[idx];
218 }
219
220 intptr_t num_args() const { return num_args_; }
221
222 private:
223 intptr_t* GetDestFrameAddressAt(intptr_t index) const {
224 ASSERT(dest_frame_ != nullptr);
225 ASSERT((0 <= index) && (index < dest_frame_size_));
226 return &dest_frame_[index];
227 }
228
229 void PrepareForDeferredMaterialization(intptr_t count) {
230 if (count > 0) {
231 deferred_objects_ = new DeferredObject*[count];
232 deferred_objects_count_ = count;
233 }
234 }
235
236 // Sets the materialized value for some deferred object.
237 //
238 // Claims ownership of the memory for 'object'.
239 void SetDeferredObjectAt(intptr_t idx, DeferredObject* object) {
240 deferred_objects_[idx] = object;
241 }
242
243 intptr_t DeferredObjectsCount() const { return deferred_objects_count_; }
244
245 CodePtr code_;
246 ObjectPoolPtr object_pool_;
247 TypedDataPtr deopt_info_;
248 bool dest_frame_is_allocated_;
249 intptr_t* dest_frame_;
250 intptr_t dest_frame_size_;
251 bool source_frame_is_allocated_;
252 intptr_t* source_frame_;
253 intptr_t source_frame_size_;
254 intptr_t* cpu_registers_;
255 fpu_register_t* fpu_registers_;
256 intptr_t num_args_;
257 ICData::DeoptReasonId deopt_reason_;
258 uint32_t deopt_flags_;
259 intptr_t caller_fp_;
260 Thread* thread_;
261 int64_t deopt_start_micros_;
262
263 DeferredSlot* deferred_slots_;
264
265 intptr_t deferred_objects_count_;
266 DeferredObject** deferred_objects_;
267
268 const bool is_lazy_deopt_;
269 const bool deoptimizing_code_;
270
271 DISALLOW_COPY_AND_ASSIGN(DeoptContext);
272};
273
274// Represents one deopt instruction, e.g, setup return address, store object,
275// store register, etc. The target is defined by instruction's position in
276// the deopt-info array.
277class DeoptInstr : public ZoneAllocated {
278 public:
279 enum Kind {
288 // Mints are split into low and high words on 32-bit architectures. Each
289 // word can be in a register or stack slot. Note Mint pairs are only
290 // used on 32-bit architectures.
292 // Mints are held in one word on 64-bit architectures.
303 };
304
305 static DeoptInstr* Create(intptr_t kind_as_int, intptr_t source_index);
306
308 virtual ~DeoptInstr() {}
309
310 virtual const char* ToCString() const {
311 const char* args = ArgumentsToCString();
312 if (args != nullptr) {
314 "%s(%s)", KindToCString(kind()), args);
315 } else {
316 return KindToCString(kind());
317 }
318 }
319
320 virtual void Execute(DeoptContext* deopt_context, intptr_t* dest_addr) = 0;
321
323 intptr_t dest_slot) {
324 UNREACHABLE();
325 return CatchEntryMove();
326 }
327
328 virtual DeoptInstr::Kind kind() const = 0;
329
330 bool Equals(const DeoptInstr& other) const {
331 return (kind() == other.kind()) && (source_index() == other.source_index());
332 }
333
334 // Get the code and return address which is encoded in this
335 // kRetAfterAddress deopt instruction.
336 static uword GetRetAddress(DeoptInstr* instr,
337 const ObjectPool& object_pool,
338 Code* code);
339
340 // Return number of initialized fields in the object that will be
341 // materialized by kMaterializeObject instruction.
342 static intptr_t GetFieldCount(DeoptInstr* instr) {
344 return instr->source_index();
345 }
346
347 protected:
348 friend class DeoptInfoBuilder;
349
350 virtual intptr_t source_index() const = 0;
351
352 virtual const char* ArgumentsToCString() const { return nullptr; }
353
354 private:
355 static const char* KindToCString(Kind kind);
356
358};
359
360// Helper class that allows to read a value of the given register from
361// the DeoptContext as the specified type.
362// It calls different method depending on which kind of register (cpu/fpu) and
363// destination types are specified.
364template <typename RegisterType, typename DestinationType>
366
367template <typename T>
369 static intptr_t Read(DeoptContext* context, Register reg) {
370 return context->RegisterValue(reg);
371 }
372};
373
374template <>
376 static double Read(DeoptContext* context, FpuRegister reg) {
377 return context->FpuRegisterValueAsFloat(reg);
378 }
379};
380
381template <>
383 static double Read(DeoptContext* context, FpuRegister reg) {
384 return context->FpuRegisterValueAsDouble(reg);
385 }
386};
387
388template <>
391 return context->FpuRegisterValueAsSimd128(reg);
392 }
393};
394
395// Class that encapsulates reading and writing of values that were either in
396// the registers in the optimized code or were spilled from those registers
397// to the stack.
398template <typename RegisterType>
400 public:
401 enum Kind {
402 // Spilled register source represented as its spill slot.
404 // Register source represented as its register index.
405 kRegister = 1
406 };
407
408 explicit RegisterSource(intptr_t source_index)
409 : source_index_(source_index) {}
410
411 RegisterSource(Kind kind, intptr_t index)
412 : source_index_(KindField::encode(kind) |
413 UntaggedIndexField::encode(index)) {}
414
415 template <typename T>
416 T Value(DeoptContext* context) const {
417 if (is_register()) {
418 return static_cast<T>(
420 } else {
421 return *reinterpret_cast<T*>(
422 context->GetSourceFrameAddressAt(raw_index()));
423 }
424 }
425
426 intptr_t StackSlot(DeoptContext* context) const {
427 ASSERT(!is_register());
428 return context->GetStackSlot(raw_index());
429 }
430
431 intptr_t source_index() const { return source_index_; }
432
433 const char* ToCString() const {
434 if (is_register()) {
435 return Name(reg());
436 } else {
437 return Thread::Current()->zone()->PrintToString("s%" Pd "", raw_index());
438 }
439 }
440
441 private:
442 class KindField : public BitField<intptr_t, intptr_t, 0, 1> {};
443 class UntaggedIndexField
444 : public BitField<intptr_t, intptr_t, 1, kBitsPerWord - 1> {};
445
446 bool is_register() const {
447 return KindField::decode(source_index_) == kRegister;
448 }
449 intptr_t raw_index() const {
450 return UntaggedIndexField::decode(source_index_);
451 }
452
453 RegisterType reg() const { return static_cast<RegisterType>(raw_index()); }
454
455 static const char* Name(Register reg) {
456 return RegisterNames::RegisterName(reg);
457 }
458
459 static const char* Name(FpuRegister fpu_reg) {
460 return RegisterNames::FpuRegisterName(fpu_reg);
461 }
462
463 const intptr_t source_index_;
464};
465
468
469// Builds a deoptimization info table, one DeoptInfo at a time. Call AddXXX
470// methods in the order of their target, starting wih deoptimized code
471// continuation pc and ending with the first argument of the deoptimized
472// code. Call CreateDeoptInfo to write the accumulated instructions into
473// the heap and reset the builder's internal state for the next DeoptInfo.
475 public:
477 const intptr_t num_args,
478 compiler::Assembler* assembler);
479
480 // Return address before instruction.
482 intptr_t deopt_id,
483 intptr_t dest_index);
484
485 // Copy from optimized frame to unoptimized.
486 void AddCopy(Value* value, const Location& source_loc, intptr_t dest_index);
487 void AddPcMarker(const Function& function, intptr_t dest_index);
488 void AddPp(const Function& function, intptr_t dest_index);
489 void AddCallerFp(intptr_t dest_index);
490 void AddCallerPp(intptr_t dest_index);
491 void AddCallerPc(intptr_t dest_index);
492
493 // Add object to be materialized. Emit kMaterializeObject instruction.
495
496 // For every materialized object emit instructions describing data required
497 // for materialization: class of the instance to allocate and field-value
498 // pairs for initialization.
499 // Emitted instructions are expected to follow fixed size section of frame
500 // emitted first. This way they become a part of the bottom-most deoptimized
501 // frame and are discoverable by GC.
502 // At deoptimization they will be removed by the stub at the very end:
503 // after they were used to materialize objects.
504 // Returns the index of the next stack slot. Used for verification.
505 intptr_t EmitMaterializationArguments(intptr_t dest_index);
506
507 TypedDataPtr CreateDeoptInfo(const Array& deopt_table);
508
509 // Mark the actual start of the frame description after all materialization
510 // instructions were emitted. Used for verification purposes.
512 ASSERT(frame_start_ == -1);
513 frame_start_ = instructions_.length();
514 }
515
516 private:
517 friend class CompilerDeoptInfo; // For current_info_number_.
518
519 class TrieNode;
520
521 CpuRegisterSource ToCpuRegisterSource(const Location& loc);
522 FpuRegisterSource ToFpuRegisterSource(
523 const Location& loc,
524 Location::Kind expected_stack_slot_kind);
525
526 intptr_t FindOrAddObjectInTable(const Object& obj) const;
527 intptr_t FindMaterialization(MaterializeObjectInstr* mat) const;
528 intptr_t CalculateStackIndex(const Location& source_loc) const;
529
530 intptr_t FrameSize() const {
531 ASSERT(frame_start_ != -1);
532 const intptr_t frame_size = instructions_.length() - frame_start_;
533 ASSERT(frame_size >= 0);
534 return frame_size;
535 }
536
537 void AddConstant(const Object& obj, intptr_t dest_index);
538
539 Zone* zone() const { return zone_; }
540
541 Zone* zone_;
542
543 GrowableArray<DeoptInstr*> instructions_;
544 const intptr_t num_args_;
545 compiler::Assembler* assembler_;
546
547 // Used to compress entries by sharing suffixes.
548 TrieNode* trie_root_;
549 intptr_t current_info_number_;
550
551 intptr_t frame_start_;
552 GrowableArray<MaterializeObjectInstr*> materializations_;
553
554 DISALLOW_COPY_AND_ASSIGN(DeoptInfoBuilder);
555};
556
557// Utilities for managing the deopt table and its entries. The table is
558// stored in an Array in the heap. It consists of triples of (PC offset,
559// info, reason). Elements of each entry are stored consecutively in the
560// array.
561// TODO(vegorov): consider compressing the whole table into a single TypedData
562// object.
563class DeoptTable : public AllStatic {
564 public:
565 // Return the array size in elements for a given number of table entries.
566 static intptr_t SizeFor(intptr_t length);
567
568 // Set the entry at the given index into the table (not an array index).
569 static void SetEntry(const Array& table,
570 intptr_t index,
571 const Smi& offset,
572 const TypedData& info,
573 const Smi& reason_and_flags);
574
575 // Return the length of the table in entries.
576 static intptr_t GetLength(const Array& table);
577
578 // Set the output parameters (offset, info, reason) to the entry values at
579 // the index into the table (not an array index).
580 static void GetEntry(const Array& table,
581 intptr_t index,
582 Smi* offset,
584 Smi* reason_and_flags);
585
587 uint32_t flags) {
589 }
590
591 class ReasonField : public BitField<intptr_t, ICData::DeoptReasonId, 0, 8> {};
592 class FlagsField : public BitField<intptr_t, uint32_t, 8, 8> {};
593
594 private:
595 static constexpr intptr_t kEntrySize = 3;
596};
597
598// Holds deopt information at one deoptimization point. The information consists
599// of two parts:
600// - first a prefix consisting of kMaterializeObject instructions describing
601// objects which had their allocation removed as part of AllocationSinking
602// pass and have to be materialized;
603// - followed by a list of DeoptInstr objects, specifying transformation
604// information for each slot in unoptimized frame(s).
605// Arguments for object materialization (class of instance to be allocated and
606// field-value pairs) are added as artificial slots to the expression stack
607// of the bottom-most frame. They are removed from the stack at the very end
608// of deoptimization by the deoptimization stub.
609class DeoptInfo : public AllStatic {
610 public:
611 // Size of the frame part of the translation not counting kMaterializeObject
612 // instructions in the prefix.
613 static intptr_t FrameSize(const TypedData& packed);
614
615 // Returns the number of kMaterializeObject instructions in the prefix.
616 static intptr_t NumMaterializations(const GrowableArray<DeoptInstr*>&);
617
618 // Unpack the entire translation into an array of deoptimization
619 // instructions. This copies any shared suffixes into the array.
620 static void Unpack(const Array& table,
621 const TypedData& packed,
622 GrowableArray<DeoptInstr*>* instructions);
623
624 // Size of the frame part of the translation not counting kMaterializeObject
625 // instructions in the prefix.
626 static const char* ToCString(const Array& table, const TypedData& packed);
627
628 // Returns true iff decompression yields the same instructions as the
629 // original.
630 static bool VerifyDecompression(const GrowableArray<DeoptInstr*>& original,
631 const Array& deopt_table,
632 const TypedData& packed);
633
634 private:
635 static void UnpackInto(const Array& table,
636 const TypedData& packed,
637 GrowableArray<DeoptInstr*>* instructions,
638 intptr_t length);
639};
640
641} // namespace dart
642
643#endif // !defined(DART_PRECOMPILED_RUNTIME)
644#endif // RUNTIME_VM_DEOPT_INSTRUCTIONS_H_
static void info(const char *fmt,...) SK_PRINTF_LIKE(1
Definition DM.cpp:213
int count
static sk_sp< Effect > Create()
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 decode(intptr_t value)
Definition bitfield.h:173
static constexpr intptr_t encode(ICData::DeoptReasonId value)
Definition bitfield.h:167
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
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
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
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
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)
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 SupportsUnboxedDoubles()
static bool SupportsUnboxedSimd128()
ObjectPtr ObjectAt(intptr_t index) const
Definition object.h:5599
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:9985
Zone * zone() const
static Thread * Current()
Definition thread.h:361
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
static constexpr int kDartFrameFixedSize
RegisterSource< Register > CpuRegisterSource
uintptr_t uword
Definition globals.h:501
@ kNumberOfCpuRegisters
const int kNumberOfFpuRegisters
constexpr intptr_t kWordSize
Definition globals.h:509
QRegister FpuRegister
simd128_value_t fpu_register_t
RegisterSource< FpuRegister > FpuRegisterSource
#define Pd
Definition globals.h:408
#define DISALLOW_COPY_AND_ASSIGN(TypeName)
Definition globals.h:581
#define T
Point 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