auto get_frame_size()

in cpp/profiler/unwindc/android_700/x86_64/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;
}