in cpp/profiler/unwindc/android_500/arm/unwinder.h [231:303]
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);
uint32_t size = 0U;
uintptr_t callee_save_methods = AccessField(runtime_obj, 0U);
uintptr_t callee_save_infos = AccessField(runtime_obj, 36U);
uintptr_t kSaveAll = 0U;
uintptr_t kRefsOnly = 1U;
uintptr_t kRefsAndArgs = 2U;
uintptr_t method_info = 0U;
if (is_abstract_method(method)) {
method_info = AccessArrayItem(callee_save_infos, kRefsAndArgs, 12U);
size = Read4(AccessField(method_info, 0U));
return size;
}
if (is_runtime_method(method)) {
if ((frameptr == AccessArrayItem(callee_save_methods, kRefsAndArgs, 4U))) {
method_info = AccessArrayItem(callee_save_infos, kRefsAndArgs, 12U);
} else {
if ((frameptr == AccessArrayItem(callee_save_methods, kSaveAll, 4U))) {
method_info = AccessArrayItem(callee_save_infos, kSaveAll, 12U);
} else {
method_info = AccessArrayItem(callee_save_infos, kRefsOnly, 12U);
}
}
size = Read4(AccessField(method_info, 0U));
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, 0U));
return size;
} else {
method_info = AccessArrayItem(callee_save_infos, kRefsAndArgs, 12U);
size = Read4(AccessField(method_info, 0U));
return size;
}
}
uintptr_t code = 0U;
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, 12U);
uint32_t callee_info_size = Read4(AccessField(callee_info, 0U));
uintptr_t voidptr_size = 4U;
uintptr_t artmethodptr_size = 4U;
auto num_refs = (get_number_of_refs_without_receiver(method) + 1U);
uintptr_t handle_scope_size = (8U + (4U * num_refs));
size =
(((callee_info_size - voidptr_size) + artmethodptr_size) +
handle_scope_size);
uintptr_t kStackAlignment = 16U;
size = round_up(size, kStackAlignment);
return size;
}
auto frame_info = get_quick_frame_info_from_entry_point(code);
size = Read4(AccessField(frame_info, 0U));
return size;
}