diff options
author | 2017-01-09 15:03:12 +0000 | |
---|---|---|
committer | 2017-01-16 12:09:53 +0000 | |
commit | 6bec91c7d4670905cd67440991ec76fd54d0f000 (patch) | |
tree | 05f4ba288e629270773c65b34b71be7bae5e92ff /runtime/entrypoints/entrypoint_utils.cc | |
parent | 4155998a2f5c7a252a6611e3926943e931ea280a (diff) |
Store resolved types for AOT code in .bss.
Test: m test-art-host
Test: m test-art-target on Nexus 9.
Test: Nexus 9 boots.
Test: Build aosp_mips64-eng.
Bug: 30627598
Bug: 34193123
Change-Id: I8ec60a98eb488cb46ae3ea56341f5709dad4f623
Diffstat (limited to 'runtime/entrypoints/entrypoint_utils.cc')
-rw-r--r-- | runtime/entrypoints/entrypoint_utils.cc | 39 |
1 files changed, 34 insertions, 5 deletions
diff --git a/runtime/entrypoints/entrypoint_utils.cc b/runtime/entrypoints/entrypoint_utils.cc index 5390165ecd..b17e1a8ab1 100644 --- a/runtime/entrypoints/entrypoint_utils.cc +++ b/runtime/entrypoints/entrypoint_utils.cc @@ -261,11 +261,8 @@ bool FillArrayData(ObjPtr<mirror::Object> obj, const Instruction::ArrayDataPaylo return true; } -ArtMethod* GetCalleeSaveMethodCaller(ArtMethod** sp, - Runtime::CalleeSaveType type, - bool do_caller_check) - REQUIRES_SHARED(Locks::mutator_lock_) { - ScopedAssertNoThreadSuspension ants(__FUNCTION__); +static inline std::pair<ArtMethod*, uintptr_t> DoGetCalleeSaveMethodOuterCallerAndPc( + ArtMethod** sp, Runtime::CalleeSaveType type) REQUIRES_SHARED(Locks::mutator_lock_) { DCHECK_EQ(*sp, Runtime::Current()->GetCalleeSaveMethod(type)); const size_t callee_frame_size = GetCalleeSaveFrameSize(kRuntimeISA, type); @@ -275,6 +272,13 @@ ArtMethod* GetCalleeSaveMethodCaller(ArtMethod** sp, uintptr_t caller_pc = *reinterpret_cast<uintptr_t*>( (reinterpret_cast<uint8_t*>(sp) + callee_return_pc_offset)); ArtMethod* outer_method = *caller_sp; + return std::make_pair(outer_method, caller_pc); +} + +static inline ArtMethod* DoGetCalleeSaveMethodCaller(ArtMethod* outer_method, + uintptr_t caller_pc, + bool do_caller_check) + REQUIRES_SHARED(Locks::mutator_lock_) { ArtMethod* caller = outer_method; if (LIKELY(caller_pc != reinterpret_cast<uintptr_t>(GetQuickInstrumentationExitPc()))) { if (outer_method != nullptr) { @@ -308,8 +312,33 @@ ArtMethod* GetCalleeSaveMethodCaller(ArtMethod** sp, visitor.WalkStack(); caller = visitor.caller; } + return caller; +} +ArtMethod* GetCalleeSaveMethodCaller(ArtMethod** sp, + Runtime::CalleeSaveType type, + bool do_caller_check) + REQUIRES_SHARED(Locks::mutator_lock_) { + ScopedAssertNoThreadSuspension ants(__FUNCTION__); + auto outer_caller_and_pc = DoGetCalleeSaveMethodOuterCallerAndPc(sp, type); + ArtMethod* outer_method = outer_caller_and_pc.first; + uintptr_t caller_pc = outer_caller_and_pc.second; + ArtMethod* caller = DoGetCalleeSaveMethodCaller(outer_method, caller_pc, do_caller_check); return caller; } +CallerAndOuterMethod GetCalleeSaveMethodCallerAndOuterMethod(Thread* self, + Runtime::CalleeSaveType type) { + CallerAndOuterMethod result; + ScopedAssertNoThreadSuspension ants(__FUNCTION__); + ArtMethod** sp = self->GetManagedStack()->GetTopQuickFrame(); + auto outer_caller_and_pc = DoGetCalleeSaveMethodOuterCallerAndPc(sp, type); + result.outer_method = outer_caller_and_pc.first; + uintptr_t caller_pc = outer_caller_and_pc.second; + result.caller = + DoGetCalleeSaveMethodCaller(result.outer_method, caller_pc, /* do_caller_check */ true); + return result; +} + + } // namespace art |