6#if defined(TARGET_ARCH_ARM64)
15class PoolPointerCall :
public ValueObject {
17 PoolPointerCall(
uword pc,
const Code&
code)
18 : end_(pc), object_pool_(ObjectPool::Handle(
code.GetObjectPool())) {
20 ASSERT(*(
reinterpret_cast<uint32_t*
>(end_) - 1) == 0xd63f03c0);
25 intptr_t pp_index()
const {
return index_; }
28 return static_cast<CodePtr
>(object_pool_.ObjectAt(pp_index()));
31 void SetTarget(
const Code&
target)
const {
32 object_pool_.SetObjectAt(pp_index(),
target);
39 const ObjectPool& object_pool_;
47 ASSERT(
code.ContainsInstructionAt(return_address));
48 PoolPointerCall
call(return_address,
code);
54 const Code& new_target) {
60 const Code& new_target) {
61 ASSERT(
code.ContainsInstructionAt(return_address));
62 PoolPointerCall
call(return_address,
code);
63 call.SetTarget(new_target);
71 const Code& caller_code,
73 ASSERT(caller_code.ContainsInstructionAt(return_address));
74 ICCallPattern
call(return_address, caller_code);
75 if (
data !=
nullptr) {
78 return call.TargetCode();
82 const Code& caller_code,
86 thread->isolate_group()->RunWithStoppedMutators([&]() {
95 const Code& caller_code,
98 ASSERT(caller_code.ContainsInstructionAt(return_address));
99 ICCallPattern
call(return_address, caller_code);
106 ICData* ic_data_result) {
107 ASSERT(
code.ContainsInstructionAt(return_address));
108 ICCallPattern static_call(return_address,
code);
110 ic_data ^= static_call.Data();
111 if (ic_data_result !=
nullptr) {
112 *ic_data_result = ic_data.ptr();
114 return ic_data.GetTargetAt(0);
118 const Code& caller_code,
123 thread->isolate_group()->RunWithStoppedMutators([&]() {
131 uword return_address,
132 const Code& caller_code,
135 if (FLAG_precompiled_mode) {
136 BareSwitchableCallPattern
call(return_address);
140 SwitchableCallPattern
call(return_address, caller_code);
147 const Code& caller_code) {
148 if (FLAG_precompiled_mode) {
149 BareSwitchableCallPattern
call(return_address);
150 return call.target_entry();
152 SwitchableCallPattern
call(return_address, caller_code);
153 return call.target_entry();
158 const Code& caller_code) {
159 if (FLAG_precompiled_mode) {
160 BareSwitchableCallPattern
call(return_address);
163 SwitchableCallPattern
call(return_address, caller_code);
169 const Code& caller_code,
171 const Code& trampoline) {
173 ASSERT(caller_code.ContainsInstructionAt(return_address));
174 NativeCallPattern
call(return_address, caller_code);
175 call.set_target(trampoline);
181 const Code& caller_code,
183 ASSERT(caller_code.ContainsInstructionAt(return_address));
184 NativeCallPattern
call(return_address, caller_code);
186 return call.target();
static void PatchInstanceCallAt(uword return_address, const Code &caller_code, const Object &data, const Code &target)
static void PatchPoolPointerCallAt(uword return_address, const Code &code, const Code &new_target)
static CodePtr GetStaticCallTargetAt(uword return_address, const Code &code)
static void PatchSwitchableCallAtWithMutatorsStopped(Thread *thread, uword return_address, const Code &caller_code, const Object &data, const Code &target)
static void PatchInstanceCallAtWithMutatorsStopped(Thread *thread, uword return_address, const Code &caller_code, const Object &data, const Code &target)
static void PatchSwitchableCallAt(uword return_address, const Code &caller_code, const Object &data, const Code &target)
static FunctionPtr GetUnoptimizedStaticCallAt(uword return_address, const Code &code, ICData *ic_data)
static uword GetSwitchableCallTargetEntryAt(uword return_address, const Code &caller_code)
static ObjectPtr GetSwitchableCallDataAt(uword return_address, const Code &caller_code)
static void InsertDeoptimizationCallAt(uword start)
static CodePtr GetInstanceCallAt(uword return_address, const Code &caller_code, Object *data)
static CodePtr GetNativeCallAt(uword return_address, const Code &caller_code, NativeFunction *target)
static void PatchStaticCallAt(uword return_address, const Code &code, const Code &new_target)
static void PatchNativeCallAt(uword return_address, const Code &caller_code, NativeFunction target, const Code &trampoline)
static uword DecodeLoadWordFromPool(uword end, Register *reg, intptr_t *index)
void RunWithStoppedMutators(T single_current_mutator, S otherwise, bool use_force_growth_in_otherwise=false)
static Thread * Current()
IsolateGroup * isolate_group() const
static int8_t data[kExtLength]
void(* NativeFunction)(NativeArguments *arguments)