5#if !defined(DART_PRECOMPILED_RUNTIME)
25 "Compress the size of the deoptimization info for optimized code.");
33 intptr_t* cpu_registers,
35 bool deoptimizing_code)
37 object_pool_(
code.GetObjectPool()),
39 dest_frame_is_allocated_(
false),
42 source_frame_is_allocated_(
false),
43 source_frame_(nullptr),
44 source_frame_size_(0),
45 cpu_registers_(cpu_registers),
46 fpu_registers_(fpu_registers),
48 deopt_reason_(
ICData::kDeoptUnknown),
50 thread_(
Thread::Current()),
51 deopt_start_micros_(0),
52 deferred_slots_(nullptr),
53 deferred_objects_count_(0),
54 deferred_objects_(nullptr),
55 is_lazy_deopt_(is_lazy_deopt),
56 deoptimizing_code_(deoptimizing_code) {
58 code.GetDeoptInfoAtPc(
frame->pc(), &deopt_reason_, &deopt_flags_));
63 code.Disassemble(&formatter);
93 intptr_t* original_frame = source_frame_;
94 source_frame_ =
new intptr_t[source_frame_size_];
95 ASSERT(source_frame_ !=
nullptr);
96 for (intptr_t
i = 0;
i < source_frame_size_;
i++) {
97 source_frame_[
i] = original_frame[
i];
99 source_frame_is_allocated_ =
true;
106 dest_frame_ =
new intptr_t[dest_frame_size_];
107 ASSERT(source_frame_ !=
nullptr);
108 for (intptr_t
i = 0;
i < dest_frame_size_;
i++) {
111 dest_frame_is_allocated_ =
true;
120 if (FLAG_trace_deoptimization || FLAG_trace_deoptimization_verbose) {
122 "Deoptimizing (reason %d '%s') at "
123 "pc=%" Pp " fp=%" Pp " '%s' (count %d)\n",
132 if (source_frame_is_allocated_) {
133 delete[] source_frame_;
135 source_frame_ =
nullptr;
136 delete[] fpu_registers_;
137 delete[] cpu_registers_;
138 fpu_registers_ =
nullptr;
139 cpu_registers_ =
nullptr;
140 if (dest_frame_is_allocated_) {
141 delete[] dest_frame_;
143 dest_frame_ =
nullptr;
146 for (intptr_t
i = 0;
i < deferred_objects_count_;
i++) {
147 delete deferred_objects_[
i];
149 delete[] deferred_objects_;
150 deferred_objects_ =
nullptr;
151 deferred_objects_count_ = 0;
153#if defined(SUPPORT_TIMELINE)
154 if (deopt_start_micros_ != 0) {
156 ASSERT(compiler_stream !=
nullptr);
157 if (compiler_stream->
enabled()) {
165 const int counter =
function.deoptimization_counter();
166 TimelineEvent* timeline_event = compiler_stream->
StartEvent();
167 if (timeline_event !=
nullptr) {
168 timeline_event->Duration(
"Deoptimize", deopt_start_micros_,
170 timeline_event->SetNumArguments(3);
171 timeline_event->CopyArgument(0,
"function",
function_name.ToCString());
172 timeline_event->CopyArgument(1,
"reason", reason);
173 timeline_event->FormatArgument(2,
"deoptimizationCount",
"%d", counter);
174 timeline_event->Complete();
187 if (dest_frame_is_allocated_) {
188 for (intptr_t
i = 0;
i < dest_frame_size_;
i++) {
189 if (dest_frame_[
i] != 0) {
202 return source_frame_[source_frame_size_ - 1 - num_args_ -
207 return source_frame_[source_frame_size_ - 1 - num_args_ -
221 caller_fp_ = caller_fp;
267 const intptr_t
len = deopt_instructions.
length();
268 const intptr_t frame_size = dest_frame_size_;
273 const bool objects_only = dest_frame_is_allocated_;
283 const intptr_t num_materializations =
285 PrepareForDeferredMaterialization(num_materializations);
287 from_index < num_materializations; from_index++) {
288 const intptr_t field_count =
290 intptr_t*
args = GetDestFrameAddressAt(to_index);
292 SetDeferredObjectAt(from_index, obj);
297 for (intptr_t to_index = frame_size - 1, from_index =
len - 1; to_index >= 0;
298 to_index--, from_index--) {
299 intptr_t* to_addr = GetDestFrameAddressAt(to_index);
300 DeoptInstr* instr = deopt_instructions[from_index];
308 if (FLAG_trace_deoptimization_verbose) {
309 for (intptr_t
i = 0;
i < frame_size;
i++) {
310 intptr_t* to_addr = GetDestFrameAddressAt(
i);
311 THR_Print(
"*%" Pd ". [%p] 0x%" Px " [%s]\n",
i, to_addr, *to_addr,
312 deopt_instructions[
i + (
len - frame_size)]->ToCString());
330 for (intptr_t
i = 0;
i < num_vars;
i++) {
331 const intptr_t
len = deopt_instructions.
length();
336 intptr_t dest_index =
i -
params;
346 *slot_list =
nullptr;
348 while (slot !=
nullptr) {
368 intptr_t deopt_arg_count = 0;
369 for (intptr_t
i = 0;
i < DeferredObjectsCount();
i++) {
376 if (FLAG_trace_deoptimization || FLAG_trace_deoptimization_verbose) {
380 ASSERT(top_frame !=
nullptr);
387 if (
script.GetTokenLocation(token_pos, &
line)) {
389 char line_buffer[80];
394 THR_Print(
" Deopt args: %" Pd "\n", deopt_arg_count);
397 return deopt_arg_count;
401 ASSERT(dest_frame_ !=
nullptr && dest_frame_is_allocated_);
404 for (intptr_t
i = 0;
i < dest_frame_size_;
i++) {
408 return dest_array.
ptr();
434 "%" Pd ", %" Pd "", object_table_index_, deopt_id_);
447 static constexpr intptr_t kFieldWidth =
kBitsPerWord / 2;
448 class ObjectTableIndex :
public BitField<intptr_t, intptr_t, 0, kFieldWidth> {
451 :
public BitField<intptr_t, intptr_t, kFieldWidth, kFieldWidth> {};
453 const intptr_t object_table_index_;
454 const intptr_t deopt_id_;
463 : object_table_index_(object_table_index) {
464 ASSERT(object_table_index >= 0);
472 object_table_index_);
477 deopt_context->
zone(), deopt_context->
ObjectAt(object_table_index_));
482 intptr_t dest_slot) {
487 const intptr_t object_table_index_;
510 *dest_addr = source_.
Value<intptr_t>(deopt_context);
514 intptr_t dest_slot) {
537 value,
reinterpret_cast<MintPtr*
>(dest_addr));
570 hi_.
Value<int32_t>(deopt_context));
574 intptr_t dest_slot) {
583 static constexpr intptr_t kFieldWidth =
kBitsPerWord / 2;
584 class LoRegister :
public BitField<intptr_t, intptr_t, 0, kFieldWidth> {};
586 :
public BitField<intptr_t, intptr_t, kFieldWidth, kFieldWidth> {};
594template <DeoptInstr::Kind K, CatchEntryMove::SourceKind slot_kind,
typename T>
609 return static_cast<int64_t
>(source_.
Value<
T>(deopt_context));
613 intptr_t dest_slot) {
655 reinterpret_cast<PtrType*
>(dest_addr));
659 intptr_t dest_slot) {
704 : object_table_index_(object_table_index) {
705 ASSERT(object_table_index >= 0);
713 object_table_index_);
720 *
reinterpret_cast<ObjectPtr*
>(dest_addr) =
722 ? StubCode::DeoptimizeLazyFromReturn().ptr()
723 : StubCode::Deoptimize().ptr();
732 *
reinterpret_cast<ObjectPtr*
>(dest_addr) =
733 StubCode::FrameAwaitingMaterialization().ptr();
738 intptr_t object_table_index_;
748 : object_table_index_(object_table_index) {
749 ASSERT(object_table_index >= 0);
757 object_table_index_);
763 object_table_index_,
reinterpret_cast<ObjectPtr*
>(dest_addr));
767 intptr_t object_table_index_;
839 *
reinterpret_cast<SmiPtr*
>(dest_addr) =
Smi::New(0);
855 : field_count_(field_count) {
872 intptr_t field_count_;
892 if (!
error.IsNull()) {
898 UntaggedPcDescriptors::kDeopt);
949const char* DeoptInstr::KindToCString(
Kind kind) {
997 TrieNode() : instruction_(nullptr), info_number_(-1), children_(16) {}
1001 : instruction_(instruction), info_number_(
info_number), children_(4) {}
1006 if (child !=
nullptr) children_.Add(child);
1010 for (intptr_t
i = 0;
i < children_.length(); ++
i) {
1012 if (child->instruction_->
Equals(instruction))
return child;
1019 const intptr_t info_number_;
1025 const intptr_t num_args,
1029 num_args_(num_args),
1030 assembler_(assembler),
1032 current_info_number_(0),
1034 materializations_() {}
1036intptr_t DeoptInfoBuilder::FindOrAddObjectInTable(
const Object& obj)
const {
1040intptr_t DeoptInfoBuilder::CalculateStackIndex(
1041 const Location& source_loc)
const {
1043 source_loc.stack_index());
1044 return index < 0 ? index + num_args_
1049 if (loc.IsRegister()) {
1052 ASSERT(loc.IsStackSlot());
1054 CalculateStackIndex(loc));
1061 if (loc.IsFpuRegister()) {
1066 ASSERT(loc.kind() == stack_slot_kind);
1068 CalculateStackIndex(loc));
1074 intptr_t dest_index) {
1075 const intptr_t object_table_index = FindOrAddObjectInTable(
function);
1076 ASSERT(dest_index == FrameSize());
1077 instructions_.Add(
new (zone())
1082 intptr_t dest_index) {
1083 intptr_t object_table_index = FindOrAddObjectInTable(
function);
1084 ASSERT(dest_index == FrameSize());
1089 intptr_t object_table_index = FindOrAddObjectInTable(
function);
1090 ASSERT(dest_index == FrameSize());
1091 instructions_.Add(
new (zone())
DeoptPpInstr(object_table_index));
1096 const intptr_t dest_index) {
1099 intptr_t object_table_index = FindOrAddObjectInTable(source_loc.
constant());
1102 value->definition()->IsMaterializeObject()) {
1103 const intptr_t index =
1104 FindMaterialization(
value->definition()->AsMaterializeObject());
1115#if defined(TARGET_ARCH_IS_64_BIT)
1118 case kUnboxedInt64: {
1123 ToCpuRegisterSource(pair->
At(1)));
1131#if defined(TARGET_ARCH_IS_32_BIT)
1138 case kUnboxedUint32:
1146 case kUnboxedDouble:
1150 case kUnboxedFloat32x4:
1154 case kUnboxedFloat64x2:
1158 case kUnboxedInt32x4:
1167 ASSERT(dest_index == FrameSize());
1168 ASSERT(deopt_instr !=
nullptr);
1169 instructions_.Add(deopt_instr);
1173 ASSERT(dest_index == FrameSize());
1178 ASSERT(dest_index == FrameSize());
1183 ASSERT(dest_index == FrameSize());
1187void DeoptInfoBuilder::AddConstant(
const Object& obj, intptr_t dest_index) {
1188 ASSERT(dest_index == FrameSize());
1189 intptr_t object_table_index = FindOrAddObjectInTable(obj);
1194 const intptr_t index = FindMaterialization(mat);
1198 materializations_.Add(mat);
1203 intptr_t non_null_fields = 0;
1215 if (nested_mat !=
nullptr) {
1223 for (intptr_t
i = 0;
i < materializations_.length();
i++) {
1226 AddConstant(mat->
cls(), dest_index++);
1241intptr_t DeoptInfoBuilder::FindMaterialization(
1243 for (intptr_t
i = 0;
i < materializations_.length();
i++) {
1244 if (materializations_[
i] == mat) {
1252 intptr_t
length = instructions_.length();
1257 intptr_t suffix_length = 0;
1258 if (FLAG_compress_deopt_info) {
1259 for (intptr_t
i =
length - 1;
i >= 0; --
i) {
1261 if (node ==
nullptr)
break;
1269 const bool use_suffix = suffix_length > 1;
1271 length -= (suffix_length - 1);
1277 Writer::Write(&
stream, FrameSize());
1280 Writer::Write(&
stream, suffix_length);
1283 Writer::Write(&
stream, 0);
1288 const intptr_t write_count = use_suffix ?
length - 1 :
length;
1289 for (intptr_t
i = write_count - 1;
i >= 0; --
i) {
1309 instructions_.Clear();
1310 materializations_.Clear();
1313 ++current_info_number_;
1314 return deopt_info.
ptr();
1318 return length * kEntrySize;
1325 const Smi& reason) {
1327 intptr_t
i = index * kEntrySize;
1330 table.SetAt(
i + 2, reason);
1335 return table.Length() / kEntrySize;
1343 intptr_t
i = index * kEntrySize;
1346 *reason ^=
table.At(
i + 2);
1366void DeoptInfo::UnpackInto(
const Array&
table,
1374 const intptr_t frame_size =
Reader::Read(&read_stream);
1377 const intptr_t suffix_length =
Reader::Read(&read_stream);
1378 if (suffix_length != 0) {
1379 ASSERT(suffix_length > 1);
1380 const intptr_t info_number =
Reader::Read(&read_stream);
1387 UnpackInto(
table,
suffix, unpacked, suffix_length);
1390 while ((read_stream.PendingBytes() > 0) && (unpacked->
length() <
length)) {
1391 const intptr_t instruction =
Reader::Read(&read_stream);
1392 const intptr_t from_index =
Reader::Read(&read_stream);
1411#define FORMAT "[%s]"
1413 Unpack(deopt_table, packed, &deopt_instrs);
1417 for (intptr_t
i = 0;
i < deopt_instrs.
length();
i++) {
1426 for (intptr_t
i = 0;
i < deopt_instrs.
length();
i++) {
1437 const Array& deopt_table,
1440 Unpack(deopt_table, packed, &unpacked);
1442 for (intptr_t
i = 0;
i < unpacked.
length(); ++
i) {
static void info(const char *fmt,...) SK_PRINTF_LIKE(1
static void encode(uint8_t output[16], const uint32_t input[4])
static ArrayPtr New(intptr_t len, Heap::Space space=Heap::kNew)
void SetAt(intptr_t index, const Object &value) const
static CatchEntryMove FromSlot(SourceKind kind, intptr_t src_slot, intptr_t dest_slot)
static CatchEntryMove FromConstant(intptr_t pool_id, intptr_t dest_slot)
static intptr_t EncodePairSource(intptr_t src_lo_slot, intptr_t src_hi_slot)
static CatchEntryMoves * Allocate(intptr_t num_moves)
CatchEntryMove & At(intptr_t i)
static ErrorPtr EnsureUnoptimizedCode(Thread *thread, const Function &function)
intptr_t ArgumentCount() const
virtual void Materialize(DeoptContext *deopt_context)=0
DeferredSlot * next() const
virtual DeoptInstr::Kind kind() const
virtual intptr_t source_index() const
void Execute(DeoptContext *deopt_context, intptr_t *dest_addr)
virtual intptr_t source_index() const
virtual DeoptInstr::Kind kind() const
void Execute(DeoptContext *deopt_context, intptr_t *dest_addr)
void Execute(DeoptContext *deopt_context, intptr_t *dest_addr)
virtual DeoptInstr::Kind kind() const
virtual intptr_t source_index() const
CatchEntryMove ToCatchEntryMove(DeoptContext *deopt_context, intptr_t dest_slot)
virtual DeoptInstr::Kind kind() const
virtual const char * ArgumentsToCString() const
void Execute(DeoptContext *deopt_context, intptr_t *dest_addr)
virtual intptr_t source_index() const
DeoptConstantInstr(intptr_t object_table_index)
intptr_t GetSourceFp() const
intptr_t MaterializeDeferredObjects()
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)
bool is_lazy_deopt() const
intptr_t GetSourcePp() const
intptr_t GetCallerFp() const
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
intptr_t GetSourcePc() const
intptr_t * FrameBase(const StackFrame *frame)
void DeferPcMarkerMaterialization(intptr_t index, intptr_t *slot)
void VisitObjectPointers(ObjectPointerVisitor *visitor)
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)
ArrayPtr DestFrameAsArray()
DeferredObject * GetDeferredObject(intptr_t idx) const
virtual const char * ArgumentsToCString() const
DeoptFpuInstr(const FpuRegisterSource &source)
void Execute(DeoptContext *deopt_context, intptr_t *dest_addr)
virtual intptr_t source_index() const
virtual DeoptInstr::Kind kind() const
CatchEntryMove ToCatchEntryMove(DeoptContext *deopt_context, intptr_t dest_slot)
DeoptFpuInstr(intptr_t source_index)
TrieNode * FindChild(const DeoptInstr &instruction)
void AddChild(TrieNode *child)
TrieNode(DeoptInstr *instruction, intptr_t info_number)
intptr_t info_number() 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 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 intptr_t source_index() const
virtual const char * ArgumentsToCString() const
DeoptIntInstr(const CpuRegisterSource &source)
virtual int64_t GetValue(DeoptContext *deopt_context)
CatchEntryMove ToCatchEntryMove(DeoptContext *deopt_context, intptr_t dest_slot)
virtual DeoptInstr::Kind kind() const
DeoptIntInstr(intptr_t source_index)
void Execute(DeoptContext *deopt_context, intptr_t *dest_addr)
virtual int64_t GetValue(DeoptContext *deopt_context)=0
virtual intptr_t source_index() const
DeoptMaterializeObjectInstr(intptr_t field_count)
void Execute(DeoptContext *deopt_context, intptr_t *dest_addr)
virtual const char * ArgumentsToCString() const
virtual DeoptInstr::Kind kind() const
virtual intptr_t source_index() const
DeoptMaterializedObjectRefInstr(intptr_t index)
virtual const char * ArgumentsToCString() const
virtual DeoptInstr::Kind kind() const
void Execute(DeoptContext *deopt_context, intptr_t *dest_addr)
DeoptMintPairInstr(const CpuRegisterSource &lo, const CpuRegisterSource &hi)
virtual intptr_t source_index() const
virtual const char * ArgumentsToCString() const
virtual DeoptInstr::Kind kind() const
DeoptMintPairInstr(intptr_t source_index)
CatchEntryMove ToCatchEntryMove(DeoptContext *deopt_context, intptr_t dest_slot)
virtual int64_t GetValue(DeoptContext *deopt_context)
virtual intptr_t source_index() const
virtual const char * ArgumentsToCString() const
DeoptPcMarkerInstr(intptr_t object_table_index)
virtual DeoptInstr::Kind kind() const
void Execute(DeoptContext *deopt_context, intptr_t *dest_addr)
virtual intptr_t source_index() const
void Execute(DeoptContext *deopt_context, intptr_t *dest_addr)
virtual DeoptInstr::Kind kind() const
virtual const char * ArgumentsToCString() const
DeoptPpInstr(intptr_t object_table_index)
DeoptRetAddressInstr(intptr_t object_table_index, intptr_t deopt_id)
intptr_t object_table_index() const
intptr_t deopt_id() const
virtual intptr_t source_index() const
void Execute(DeoptContext *deopt_context, intptr_t *dest_addr)
virtual const char * ArgumentsToCString() const
virtual DeoptInstr::Kind kind() const
DeoptRetAddressInstr(intptr_t source_index)
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 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)
DeoptWordInstr(intptr_t source_index)
void Execute(DeoptContext *deopt_context, intptr_t *dest_addr)
virtual intptr_t source_index() const
DeoptWordInstr(const CpuRegisterSource &source)
virtual const char * ArgumentsToCString() const
CatchEntryMove ToCatchEntryMove(DeoptContext *deopt_context, intptr_t dest_slot)
virtual DeoptInstr::Kind kind() const
static DART_NORETURN void PropagateError(const Error &error)
const char * ToFullyQualifiedCString() const
PairLocation * AsPairLocation() const
bool IsPairLocation() const
const Object & constant() const
intptr_t FieldOffsetAt(intptr_t i) const
const Class & cls() const
intptr_t length_or_shape() const
const Location & LocationAt(intptr_t i)
static int64_t GetCurrentMonotonicMicros()
static void static void PrintErr(const char *format,...) PRINTF_ATTRIBUTE(1
void VisitPointer(ObjectPtr *p)
ObjectPtr ObjectAt(intptr_t index) const
static Object & ZoneHandle()
Location At(intptr_t i) const
static PassiveObject & Handle()
T Value(DeoptContext *context) const
intptr_t source_index() const
intptr_t StackSlot(DeoptContext *context) const
const char * ToCString() const
static SmiPtr New(intptr_t value)
static intptr_t RawValue(intptr_t value)
static bool IsValid(int64_t value)
@ kNoCrossThreadIteration
CodePtr LookupDartCode() const
static int SavedCallerPpSlotFromFp()
static const char * ToCString(Thread *thread, StringPtr ptr)
static Thread * Current()
TimelineEvent * StartEvent()
intptr_t LengthInBytes() const
void * DataAddr(intptr_t byte_offset) const
static TypedDataPtr New(intptr_t class_id, intptr_t len, Heap::Space space=Heap::kNew)
static int SNPrint(char *str, size_t size, const char *format,...) PRINTF_ATTRIBUTE(3
static int64_t LowHighTo64Bits(uint32_t low, int32_t high)
bool BindsToConstantNull() const
Definition * definition() const
intptr_t InputCount() const
Value * InputAt(intptr_t i) const
char * PrintToString(const char *format,...) PRINTF_ATTRIBUTE(2
ElementType * Alloc(intptr_t length)
ObjectPoolBuilder & object_pool_builder()
intptr_t FindObject(const Object &obj, ObjectPoolBuilderEntry::Patchability patchable=ObjectPoolBuilderEntry::kNotPatchable, ObjectPoolBuilderEntry::SnapshotBehavior snapshot_behavior=ObjectPoolBuilderEntry::kSnapshotable)
#define THR_Print(format,...)
const EmbeddedViewParams * params
G_BEGIN_DECLS G_MODULE_EXPORT FlValue * args
const uint8_t uint32_t uint32_t GError ** error
Dart_NativeFunction function
SK_API bool Read(SkStreamSeekable *src, SkDocumentPage *dstArray, int dstArrayCount, const SkDeserialProcs *=nullptr)
static bool Equals(const Object &expected, const Object &actual)
DeoptFpuInstr< DeoptInstr::kInt32x4, CatchEntryMove::SourceKind::kInt32x4Slot, simd128_value_t, Int32x4Ptr > DeoptInt32x4Instr
static void FillDeferredSlots(DeoptContext *deopt_context, DeferredSlot **slot_list)
DeoptFpuInstr< DeoptInstr::kFloat64x2, CatchEntryMove::SourceKind::kFloat64x2Slot, simd128_value_t, Float64x2Ptr > DeoptFloat64x2Instr
constexpr intptr_t kBitsPerWord
static constexpr int kDartFrameFixedSize
DeoptIntInstr< DeoptInstr::kUint32, CatchEntryMove::SourceKind::kUint32Slot, uint32_t > DeoptUint32Instr
static constexpr int kSavedCallerFpSlotFromFp
RegisterSource< Register > CpuRegisterSource
static constexpr int kParamEndSlotFromFp
static constexpr int kSavedPcSlotFromSp
DEFINE_FLAG(bool, print_cluster_information, false, "Print information about clusters written to snapshot")
DeoptIntInstr< DeoptInstr::kInt32, CatchEntryMove::SourceKind::kInt32Slot, int32_t > DeoptInt32Instr
FrameLayout runtime_frame_layout
DeoptFpuInstr< DeoptInstr::kFloat32x4, CatchEntryMove::SourceKind::kFloat32x4Slot, simd128_value_t, Float32x4Ptr > DeoptFloat32x4Instr
constexpr int32_t kMaxInt32
DeoptFpuInstr< DeoptInstr::kDouble, CatchEntryMove::SourceKind::kDoubleSlot, double, DoublePtr > DeoptDoubleInstr
constexpr intptr_t kWordSize
DeoptIntInstr< DeoptInstr::kMint, CatchEntryMove::SourceKind::kInt64Slot, int64_t > DeoptMintInstr
static bool IsObjectInstruction(DeoptInstr::Kind kind)
const char *const function_name
RegisterSource< FpuRegister > FpuRegisterSource
const char * DeoptReasonToCString(ICData::DeoptReasonId deopt_reason)
DeoptFpuInstr< DeoptInstr::kFloat, CatchEntryMove::SourceKind::kFloatSlot, float, DoublePtr > DeoptFloatInstr
DECLARE_FLAG(bool, show_invisible_frames)
DEF_SWITCHES_START aot vmservice shared library Name of the *so containing AOT compiled Dart assets for launching the service isolate vm snapshot The VM snapshot data that will be memory mapped as read only SnapshotAssetPath must be present isolate snapshot The isolate snapshot data that will be memory mapped as read only SnapshotAssetPath must be present cache dir Path to the cache directory This is different from the persistent_cache_path in embedder which is used for Skia shader cache icu native lib Path to the library file that exports the ICU data vm service The hostname IP address on which the Dart VM Service should be served If not defaults to or::depending on whether ipv6 is specified vm service A custom Dart VM Service port The default is to pick a randomly available open port disable vm Disable the Dart VM Service The Dart VM Service is never available in release mode disable vm service Disable mDNS Dart VM Service publication Bind to the IPv6 localhost address for the Dart VM Service Ignored if vm service host is set endless trace buffer
AsciiTrie::TrieNode TrieNode
static DecodeResult decode(std::string path)
intptr_t first_local_from_fp
intptr_t VariableIndexForFrameSlot(intptr_t frame_slot) const