xref: /aosp_15_r20/art/runtime/entrypoints/quick/callee_save_frame.h (revision 795d594fd825385562da6b089ea9b2033f3abf5a)
1*795d594fSAndroid Build Coastguard Worker /*
2*795d594fSAndroid Build Coastguard Worker  * Copyright (C) 2012 The Android Open Source Project
3*795d594fSAndroid Build Coastguard Worker  *
4*795d594fSAndroid Build Coastguard Worker  * Licensed under the Apache License, Version 2.0 (the "License");
5*795d594fSAndroid Build Coastguard Worker  * you may not use this file except in compliance with the License.
6*795d594fSAndroid Build Coastguard Worker  * You may obtain a copy of the License at
7*795d594fSAndroid Build Coastguard Worker  *
8*795d594fSAndroid Build Coastguard Worker  *      http://www.apache.org/licenses/LICENSE-2.0
9*795d594fSAndroid Build Coastguard Worker  *
10*795d594fSAndroid Build Coastguard Worker  * Unless required by applicable law or agreed to in writing, software
11*795d594fSAndroid Build Coastguard Worker  * distributed under the License is distributed on an "AS IS" BASIS,
12*795d594fSAndroid Build Coastguard Worker  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*795d594fSAndroid Build Coastguard Worker  * See the License for the specific language governing permissions and
14*795d594fSAndroid Build Coastguard Worker  * limitations under the License.
15*795d594fSAndroid Build Coastguard Worker  */
16*795d594fSAndroid Build Coastguard Worker 
17*795d594fSAndroid Build Coastguard Worker #ifndef ART_RUNTIME_ENTRYPOINTS_QUICK_CALLEE_SAVE_FRAME_H_
18*795d594fSAndroid Build Coastguard Worker #define ART_RUNTIME_ENTRYPOINTS_QUICK_CALLEE_SAVE_FRAME_H_
19*795d594fSAndroid Build Coastguard Worker 
20*795d594fSAndroid Build Coastguard Worker #include "arch/instruction_set.h"
21*795d594fSAndroid Build Coastguard Worker #include "base/callee_save_type.h"
22*795d594fSAndroid Build Coastguard Worker #include "base/locks.h"
23*795d594fSAndroid Build Coastguard Worker #include "base/pointer_size.h"
24*795d594fSAndroid Build Coastguard Worker #include "quick/quick_method_frame_info.h"
25*795d594fSAndroid Build Coastguard Worker #include "thread-inl.h"
26*795d594fSAndroid Build Coastguard Worker 
27*795d594fSAndroid Build Coastguard Worker // Specific frame size code is in architecture-specific files. We include this to compile-time
28*795d594fSAndroid Build Coastguard Worker // specialize the code.
29*795d594fSAndroid Build Coastguard Worker #include "arch/arm/callee_save_frame_arm.h"
30*795d594fSAndroid Build Coastguard Worker #include "arch/arm64/callee_save_frame_arm64.h"
31*795d594fSAndroid Build Coastguard Worker #include "arch/riscv64/callee_save_frame_riscv64.h"
32*795d594fSAndroid Build Coastguard Worker #include "arch/x86/callee_save_frame_x86.h"
33*795d594fSAndroid Build Coastguard Worker #include "arch/x86_64/callee_save_frame_x86_64.h"
34*795d594fSAndroid Build Coastguard Worker 
35*795d594fSAndroid Build Coastguard Worker namespace art HIDDEN {
36*795d594fSAndroid Build Coastguard Worker class ArtMethod;
37*795d594fSAndroid Build Coastguard Worker 
38*795d594fSAndroid Build Coastguard Worker class ScopedQuickEntrypointChecks {
39*795d594fSAndroid Build Coastguard Worker  public:
40*795d594fSAndroid Build Coastguard Worker   explicit ScopedQuickEntrypointChecks(Thread *self,
41*795d594fSAndroid Build Coastguard Worker                                        bool entry_check = kIsDebugBuild,
42*795d594fSAndroid Build Coastguard Worker                                        bool exit_check = kIsDebugBuild)
REQUIRES_SHARED(Locks::mutator_lock_)43*795d594fSAndroid Build Coastguard Worker       REQUIRES_SHARED(Locks::mutator_lock_) : self_(self), exit_check_(exit_check) {
44*795d594fSAndroid Build Coastguard Worker     if (entry_check) {
45*795d594fSAndroid Build Coastguard Worker       TestsOnEntry();
46*795d594fSAndroid Build Coastguard Worker     }
47*795d594fSAndroid Build Coastguard Worker   }
48*795d594fSAndroid Build Coastguard Worker 
REQUIRES_SHARED(Locks::mutator_lock_)49*795d594fSAndroid Build Coastguard Worker   ~ScopedQuickEntrypointChecks() REQUIRES_SHARED(Locks::mutator_lock_) {
50*795d594fSAndroid Build Coastguard Worker     if (exit_check_) {
51*795d594fSAndroid Build Coastguard Worker       TestsOnExit();
52*795d594fSAndroid Build Coastguard Worker     }
53*795d594fSAndroid Build Coastguard Worker   }
54*795d594fSAndroid Build Coastguard Worker 
55*795d594fSAndroid Build Coastguard Worker  private:
TestsOnEntry()56*795d594fSAndroid Build Coastguard Worker   void TestsOnEntry() REQUIRES_SHARED(Locks::mutator_lock_) {
57*795d594fSAndroid Build Coastguard Worker     Locks::mutator_lock_->AssertSharedHeld(self_);
58*795d594fSAndroid Build Coastguard Worker     self_->VerifyStack();
59*795d594fSAndroid Build Coastguard Worker   }
60*795d594fSAndroid Build Coastguard Worker 
TestsOnExit()61*795d594fSAndroid Build Coastguard Worker   void TestsOnExit() REQUIRES_SHARED(Locks::mutator_lock_) {
62*795d594fSAndroid Build Coastguard Worker     Locks::mutator_lock_->AssertSharedHeld(self_);
63*795d594fSAndroid Build Coastguard Worker     self_->VerifyStack();
64*795d594fSAndroid Build Coastguard Worker   }
65*795d594fSAndroid Build Coastguard Worker 
66*795d594fSAndroid Build Coastguard Worker   Thread* const self_;
67*795d594fSAndroid Build Coastguard Worker   bool exit_check_;
68*795d594fSAndroid Build Coastguard Worker };
69*795d594fSAndroid Build Coastguard Worker 
70*795d594fSAndroid Build Coastguard Worker namespace detail {
71*795d594fSAndroid Build Coastguard Worker 
72*795d594fSAndroid Build Coastguard Worker template <InstructionSet>
73*795d594fSAndroid Build Coastguard Worker struct CSFSelector;  // No definition for unspecialized callee save frame selector.
74*795d594fSAndroid Build Coastguard Worker 
75*795d594fSAndroid Build Coastguard Worker // Note: kThumb2 is never the kRuntimeISA.
76*795d594fSAndroid Build Coastguard Worker template <>
77*795d594fSAndroid Build Coastguard Worker struct CSFSelector<InstructionSet::kArm> {
78*795d594fSAndroid Build Coastguard Worker   using type = arm::ArmCalleeSaveFrame;
79*795d594fSAndroid Build Coastguard Worker };
80*795d594fSAndroid Build Coastguard Worker template <>
81*795d594fSAndroid Build Coastguard Worker struct CSFSelector<InstructionSet::kArm64> {
82*795d594fSAndroid Build Coastguard Worker   using type = arm64::Arm64CalleeSaveFrame;
83*795d594fSAndroid Build Coastguard Worker };
84*795d594fSAndroid Build Coastguard Worker template <>
85*795d594fSAndroid Build Coastguard Worker struct CSFSelector<InstructionSet::kRiscv64> {
86*795d594fSAndroid Build Coastguard Worker   using type = riscv64::Riscv64CalleeSaveFrame;
87*795d594fSAndroid Build Coastguard Worker };
88*795d594fSAndroid Build Coastguard Worker template <>
89*795d594fSAndroid Build Coastguard Worker struct CSFSelector<InstructionSet::kX86> {
90*795d594fSAndroid Build Coastguard Worker   using type = x86::X86CalleeSaveFrame;
91*795d594fSAndroid Build Coastguard Worker };
92*795d594fSAndroid Build Coastguard Worker template <>
93*795d594fSAndroid Build Coastguard Worker struct CSFSelector<InstructionSet::kX86_64> {
94*795d594fSAndroid Build Coastguard Worker   using type = x86_64::X86_64CalleeSaveFrame;
95*795d594fSAndroid Build Coastguard Worker };
96*795d594fSAndroid Build Coastguard Worker 
97*795d594fSAndroid Build Coastguard Worker }  // namespace detail
98*795d594fSAndroid Build Coastguard Worker 
99*795d594fSAndroid Build Coastguard Worker using RuntimeCalleeSaveFrame = detail::CSFSelector<kRuntimeQuickCodeISA>::type;
100*795d594fSAndroid Build Coastguard Worker 
101*795d594fSAndroid Build Coastguard Worker }  // namespace art
102*795d594fSAndroid Build Coastguard Worker 
103*795d594fSAndroid Build Coastguard Worker #endif  // ART_RUNTIME_ENTRYPOINTS_QUICK_CALLEE_SAVE_FRAME_H_
104