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();
332 intptr_t slot = i <
params ? i
335 DeoptInstr* instr = deopt_instructions[len - 1 - slot];
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++) {
405 obj =
static_cast<ObjectPtr>(dest_frame_[i]);
406 dest_array.
SetAt(i, obj);
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()) {
895 *code =
function.unoptimized_code();
897 uword res = code->GetPcForDeoptId(ret_address_instr->
deopt_id(),
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 {
1042 intptr_t index = -compiler::target::frame_layout.VariableIndexForFrameSlot(
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;
1204 for (intptr_t i = 0; i < mat->
InputCount(); i++) {
1212 for (intptr_t i = 0; i < mat->
InputCount(); i++) {
1215 if (nested_mat !=
nullptr) {
1223 for (intptr_t i = 0; i < materializations_.length(); i++) {
1226 AddConstant(mat->
cls(), dest_index++);
1229 for (intptr_t i = 0; i < mat->
InputCount(); i++) {
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) {
1260 TrieNode* node = suffix->FindChild(*instructions_[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);
1281 Writer::Write(&stream, suffix->info_number());
1283 Writer::Write(&stream, 0);
1287 TrieNode* node = use_suffix ? suffix : trie_root_;
1288 const intptr_t write_count = use_suffix ?
length - 1 :
length;
1289 for (intptr_t i = write_count - 1; i >= 0; --i) {
1291 Writer::Write(&stream, instr->
kind());
1300 zone(),
TypedData::New(kTypedDataUint8ArrayCid, stream.bytes_written(),
1304 memmove(deopt_info.
DataAddr(0), stream.buffer(), stream.bytes_written());
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);
1354 return Reader::Read(&read_stream);
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 ArrayPtr New(intptr_t len, Heap::Space space=Heap::kNew)
void SetAt(intptr_t index, const Object &value) const
static constexpr intptr_t encode(intptr_t value)
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
static const uint8_t buffer[]
const uint8_t uint32_t uint32_t GError ** error
#define DECLARE_FLAG(type, name)
#define DEFINE_FLAG(type, name, default_value, comment)
Dart_NativeFunction function
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
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
static DecodeResult decode(std::string path)
intptr_t first_local_from_fp