in cpp/profiler/unwindc/android_710/arm64/unwinder.h [602:681]
auto get_frame_size(
uintptr_t frameptr,
uintptr_t runtime_obj,
uintptr_t thread_obj,
uintptr_t pc) {
uintptr_t method = frameptr;
auto entry_point = get_quick_entry_point_from_compiled_code(method);
auto oat_quick_method_header =
get_oat_quick_method_header(method, runtime_obj, thread_obj, pc);
if ((oat_quick_method_header != 0UL)) {
return Read4(AccessField(AccessField(oat_quick_method_header, 4UL), 0UL));
}
uint32_t size = 0U;
uintptr_t callee_save_methods = AccessField(runtime_obj, 0UL);
uintptr_t callee_save_infos = AccessField(runtime_obj, 64UL);
uintptr_t kSaveAll = 0UL;
uintptr_t kRefsOnly = 1UL;
uintptr_t kRefsAndArgs = 2UL;
uintptr_t method_info = 0UL;
if (is_abstract_method(method)) {
method_info = AccessArrayItem(callee_save_infos, kRefsAndArgs, 12UL);
size = Read4(AccessField(method_info, 0UL));
return size;
}
if (is_runtime_method(method)) {
if ((frameptr ==
Read8(AccessArrayItem(callee_save_methods, kRefsAndArgs, 8UL)))) {
method_info = AccessArrayItem(callee_save_infos, kRefsAndArgs, 12UL);
} else {
if ((frameptr ==
Read8(AccessArrayItem(callee_save_methods, kSaveAll, 8UL)))) {
method_info = AccessArrayItem(callee_save_infos, kSaveAll, 12UL);
} else {
method_info = AccessArrayItem(callee_save_infos, kRefsOnly, 12UL);
}
}
size = Read4(AccessField(method_info, 0UL));
return size;
}
if (is_proxy_method(method)) {
if (is_direct_method(method)) {
auto info = get_quick_frame_info_from_entry_point(entry_point);
size = Read4(AccessField(info, 0UL));
return size;
} else {
method_info = AccessArrayItem(callee_save_infos, kRefsAndArgs, 12UL);
size = Read4(AccessField(method_info, 0UL));
return size;
}
}
uintptr_t code = 0UL;
bool is_native = false;
if ((is_quick_resolution_stub(entry_point, runtime_obj, thread_obj) ||
is_quick_to_interpreter_bridge(entry_point, runtime_obj, thread_obj))) {
if (is_native_method(method)) {
is_native = true;
} else {
;
}
}
code = entry_point;
if ((is_native || is_quick_generic_jni_stub(code, runtime_obj, thread_obj))) {
uintptr_t callee_info =
AccessArrayItem(callee_save_infos, kRefsAndArgs, 12UL);
uint32_t callee_info_size = Read4(AccessField(callee_info, 0UL));
uintptr_t voidptr_size = 8UL;
uintptr_t artmethodptr_size = 8UL;
auto num_refs = (get_number_of_refs_without_receiver(method) + 1UL);
uintptr_t handle_scope_size = (12UL + (4UL * num_refs));
size =
(((callee_info_size - voidptr_size) + artmethodptr_size) +
handle_scope_size);
uintptr_t kStackAlignment = 16UL;
size = round_up(size, kStackAlignment);
return size;
}
auto frame_info = get_quick_frame_info_from_entry_point(code);
size = Read4(AccessField(frame_info, 0UL));
return size;
}