xref: /aosp_15_r20/art/runtime/arch/arch_test.cc (revision 795d594fd825385562da6b089ea9b2033f3abf5a)
1*795d594fSAndroid Build Coastguard Worker /*
2*795d594fSAndroid Build Coastguard Worker  * Copyright (C) 2014 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 #include <stdint.h>
18*795d594fSAndroid Build Coastguard Worker 
19*795d594fSAndroid Build Coastguard Worker #include "art_method-inl.h"
20*795d594fSAndroid Build Coastguard Worker #include "base/callee_save_type.h"
21*795d594fSAndroid Build Coastguard Worker #include "base/common_art_test.h"
22*795d594fSAndroid Build Coastguard Worker #include "entrypoints/quick/callee_save_frame.h"
23*795d594fSAndroid Build Coastguard Worker #include "quick/quick_method_frame_info.h"
24*795d594fSAndroid Build Coastguard Worker 
25*795d594fSAndroid Build Coastguard Worker namespace art HIDDEN {
26*795d594fSAndroid Build Coastguard Worker 
27*795d594fSAndroid Build Coastguard Worker class ArchTest : public CommonArtTest {};
28*795d594fSAndroid Build Coastguard Worker 
29*795d594fSAndroid Build Coastguard Worker // Grab architecture specific constants.
30*795d594fSAndroid Build Coastguard Worker namespace arm {
31*795d594fSAndroid Build Coastguard Worker #include "arch/arm/asm_support_arm.h"
32*795d594fSAndroid Build Coastguard Worker static constexpr size_t kFrameSizeSaveAllCalleeSaves = FRAME_SIZE_SAVE_ALL_CALLEE_SAVES;
33*795d594fSAndroid Build Coastguard Worker #undef FRAME_SIZE_SAVE_ALL_CALLEE_SAVES
34*795d594fSAndroid Build Coastguard Worker static constexpr size_t kFrameSizeSaveRefsOnly = FRAME_SIZE_SAVE_REFS_ONLY;
35*795d594fSAndroid Build Coastguard Worker #undef FRAME_SIZE_SAVE_REFS_ONLY
36*795d594fSAndroid Build Coastguard Worker static constexpr size_t kFrameSizeSaveRefsAndArgs = FRAME_SIZE_SAVE_REFS_AND_ARGS;
37*795d594fSAndroid Build Coastguard Worker #undef FRAME_SIZE_SAVE_REFS_AND_ARGS
38*795d594fSAndroid Build Coastguard Worker static constexpr size_t kFrameSizeSaveEverythingForClinit = FRAME_SIZE_SAVE_EVERYTHING_FOR_CLINIT;
39*795d594fSAndroid Build Coastguard Worker #undef FRAME_SIZE_SAVE_EVERYTHING_FOR_CLINIT
40*795d594fSAndroid Build Coastguard Worker static constexpr size_t kFrameSizeSaveEverythingForSuspendCheck =
41*795d594fSAndroid Build Coastguard Worker     FRAME_SIZE_SAVE_EVERYTHING_FOR_SUSPEND_CHECK;
42*795d594fSAndroid Build Coastguard Worker #undef FRAME_SIZE_SAVE_EVERYTHING_FOR_SUSPEND_CHECK
43*795d594fSAndroid Build Coastguard Worker static constexpr size_t kFrameSizeSaveEverything = FRAME_SIZE_SAVE_EVERYTHING;
44*795d594fSAndroid Build Coastguard Worker #undef FRAME_SIZE_SAVE_EVERYTHING
45*795d594fSAndroid Build Coastguard Worker #undef BAKER_MARK_INTROSPECTION_FIELD_LDR_NARROW_ENTRYPOINT_OFFSET
46*795d594fSAndroid Build Coastguard Worker #undef BAKER_MARK_INTROSPECTION_GC_ROOT_LDR_WIDE_ENTRYPOINT_OFFSET
47*795d594fSAndroid Build Coastguard Worker #undef BAKER_MARK_INTROSPECTION_GC_ROOT_LDR_NARROW_ENTRYPOINT_OFFSET
48*795d594fSAndroid Build Coastguard Worker #undef BAKER_MARK_INTROSPECTION_ARRAY_SWITCH_OFFSET
49*795d594fSAndroid Build Coastguard Worker #undef BAKER_MARK_INTROSPECTION_FIELD_LDR_WIDE_OFFSET
50*795d594fSAndroid Build Coastguard Worker #undef BAKER_MARK_INTROSPECTION_FIELD_LDR_NARROW_OFFSET
51*795d594fSAndroid Build Coastguard Worker #undef BAKER_MARK_INTROSPECTION_ARRAY_LDR_OFFSET
52*795d594fSAndroid Build Coastguard Worker #undef BAKER_MARK_INTROSPECTION_GC_ROOT_LDR_WIDE_OFFSET
53*795d594fSAndroid Build Coastguard Worker #undef BAKER_MARK_INTROSPECTION_GC_ROOT_LDR_NARROW_OFFSET
54*795d594fSAndroid Build Coastguard Worker }  // namespace arm
55*795d594fSAndroid Build Coastguard Worker 
56*795d594fSAndroid Build Coastguard Worker namespace arm64 {
57*795d594fSAndroid Build Coastguard Worker #include "arch/arm64/asm_support_arm64.h"
58*795d594fSAndroid Build Coastguard Worker static constexpr size_t kFrameSizeSaveAllCalleeSaves = FRAME_SIZE_SAVE_ALL_CALLEE_SAVES;
59*795d594fSAndroid Build Coastguard Worker #undef FRAME_SIZE_SAVE_ALL_CALLEE_SAVES
60*795d594fSAndroid Build Coastguard Worker static constexpr size_t kFrameSizeSaveRefsOnly = FRAME_SIZE_SAVE_REFS_ONLY;
61*795d594fSAndroid Build Coastguard Worker #undef FRAME_SIZE_SAVE_REFS_ONLY
62*795d594fSAndroid Build Coastguard Worker static constexpr size_t kFrameSizeSaveRefsAndArgs = FRAME_SIZE_SAVE_REFS_AND_ARGS;
63*795d594fSAndroid Build Coastguard Worker #undef FRAME_SIZE_SAVE_REFS_AND_ARGS
64*795d594fSAndroid Build Coastguard Worker static constexpr size_t kFrameSizeSaveEverythingForClinit = FRAME_SIZE_SAVE_EVERYTHING_FOR_CLINIT;
65*795d594fSAndroid Build Coastguard Worker #undef FRAME_SIZE_SAVE_EVERYTHING_FOR_CLINIT
66*795d594fSAndroid Build Coastguard Worker static constexpr size_t kFrameSizeSaveEverythingForSuspendCheck =
67*795d594fSAndroid Build Coastguard Worker     FRAME_SIZE_SAVE_EVERYTHING_FOR_SUSPEND_CHECK;
68*795d594fSAndroid Build Coastguard Worker #undef FRAME_SIZE_SAVE_EVERYTHING_FOR_SUSPEND_CHECK
69*795d594fSAndroid Build Coastguard Worker static constexpr size_t kFrameSizeSaveEverything = FRAME_SIZE_SAVE_EVERYTHING;
70*795d594fSAndroid Build Coastguard Worker #undef FRAME_SIZE_SAVE_EVERYTHING
71*795d594fSAndroid Build Coastguard Worker #undef BAKER_MARK_INTROSPECTION_ARRAY_SWITCH_OFFSET
72*795d594fSAndroid Build Coastguard Worker #undef BAKER_MARK_INTROSPECTION_GC_ROOT_ENTRYPOINT_OFFSET
73*795d594fSAndroid Build Coastguard Worker #undef BAKER_MARK_INTROSPECTION_FIELD_LDR_OFFSET
74*795d594fSAndroid Build Coastguard Worker #undef BAKER_MARK_INTROSPECTION_ARRAY_LDR_OFFSET
75*795d594fSAndroid Build Coastguard Worker #undef BAKER_MARK_INTROSPECTION_GC_ROOT_LDR_OFFSET
76*795d594fSAndroid Build Coastguard Worker }  // namespace arm64
77*795d594fSAndroid Build Coastguard Worker 
78*795d594fSAndroid Build Coastguard Worker namespace x86 {
79*795d594fSAndroid Build Coastguard Worker #include "arch/x86/asm_support_x86.h"
80*795d594fSAndroid Build Coastguard Worker static constexpr size_t kFrameSizeSaveAllCalleeSaves = FRAME_SIZE_SAVE_ALL_CALLEE_SAVES;
81*795d594fSAndroid Build Coastguard Worker #undef FRAME_SIZE_SAVE_ALL_CALLEE_SAVES
82*795d594fSAndroid Build Coastguard Worker static constexpr size_t kFrameSizeSaveRefsOnly = FRAME_SIZE_SAVE_REFS_ONLY;
83*795d594fSAndroid Build Coastguard Worker #undef FRAME_SIZE_SAVE_REFS_ONLY
84*795d594fSAndroid Build Coastguard Worker static constexpr size_t kFrameSizeSaveRefsAndArgs = FRAME_SIZE_SAVE_REFS_AND_ARGS;
85*795d594fSAndroid Build Coastguard Worker #undef FRAME_SIZE_SAVE_REFS_AND_ARGS
86*795d594fSAndroid Build Coastguard Worker static constexpr size_t kFrameSizeSaveEverythingForClinit = FRAME_SIZE_SAVE_EVERYTHING_FOR_CLINIT;
87*795d594fSAndroid Build Coastguard Worker #undef FRAME_SIZE_SAVE_EVERYTHING_FOR_CLINIT
88*795d594fSAndroid Build Coastguard Worker static constexpr size_t kFrameSizeSaveEverythingForSuspendCheck =
89*795d594fSAndroid Build Coastguard Worker     FRAME_SIZE_SAVE_EVERYTHING_FOR_SUSPEND_CHECK;
90*795d594fSAndroid Build Coastguard Worker #undef FRAME_SIZE_SAVE_EVERYTHING_FOR_SUSPEND_CHECK
91*795d594fSAndroid Build Coastguard Worker static constexpr size_t kFrameSizeSaveEverything = FRAME_SIZE_SAVE_EVERYTHING;
92*795d594fSAndroid Build Coastguard Worker #undef FRAME_SIZE_SAVE_EVERYTHING
93*795d594fSAndroid Build Coastguard Worker }  // namespace x86
94*795d594fSAndroid Build Coastguard Worker 
95*795d594fSAndroid Build Coastguard Worker namespace x86_64 {
96*795d594fSAndroid Build Coastguard Worker #include "arch/x86_64/asm_support_x86_64.h"
97*795d594fSAndroid Build Coastguard Worker static constexpr size_t kFrameSizeSaveAllCalleeSaves = FRAME_SIZE_SAVE_ALL_CALLEE_SAVES;
98*795d594fSAndroid Build Coastguard Worker #undef FRAME_SIZE_SAVE_ALL_CALLEE_SAVES
99*795d594fSAndroid Build Coastguard Worker static constexpr size_t kFrameSizeSaveRefsOnly = FRAME_SIZE_SAVE_REFS_ONLY;
100*795d594fSAndroid Build Coastguard Worker #undef FRAME_SIZE_SAVE_REFS_ONLY
101*795d594fSAndroid Build Coastguard Worker static constexpr size_t kFrameSizeSaveRefsAndArgs = FRAME_SIZE_SAVE_REFS_AND_ARGS;
102*795d594fSAndroid Build Coastguard Worker #undef FRAME_SIZE_SAVE_REFS_AND_ARGS
103*795d594fSAndroid Build Coastguard Worker static constexpr size_t kFrameSizeSaveEverythingForClinit = FRAME_SIZE_SAVE_EVERYTHING_FOR_CLINIT;
104*795d594fSAndroid Build Coastguard Worker #undef FRAME_SIZE_SAVE_EVERYTHING_FOR_CLINIT
105*795d594fSAndroid Build Coastguard Worker static constexpr size_t kFrameSizeSaveEverythingForSuspendCheck =
106*795d594fSAndroid Build Coastguard Worker     FRAME_SIZE_SAVE_EVERYTHING_FOR_SUSPEND_CHECK;
107*795d594fSAndroid Build Coastguard Worker #undef FRAME_SIZE_SAVE_EVERYTHING_FOR_SUSPEND_CHECK
108*795d594fSAndroid Build Coastguard Worker static constexpr size_t kFrameSizeSaveEverything = FRAME_SIZE_SAVE_EVERYTHING;
109*795d594fSAndroid Build Coastguard Worker #undef FRAME_SIZE_SAVE_EVERYTHING
110*795d594fSAndroid Build Coastguard Worker }  // namespace x86_64
111*795d594fSAndroid Build Coastguard Worker 
112*795d594fSAndroid Build Coastguard Worker // Check architecture specific constants are sound.
113*795d594fSAndroid Build Coastguard Worker // We expect the return PC to be stored at the highest address slot in the frame.
114*795d594fSAndroid Build Coastguard Worker #define TEST_ARCH_TYPE(Arch, arch, type)                                              \
115*795d594fSAndroid Build Coastguard Worker   EXPECT_EQ(arch::Arch##CalleeSaveFrame::GetFrameSize(CalleeSaveType::k##type),       \
116*795d594fSAndroid Build Coastguard Worker             arch::kFrameSize##type);                                                  \
117*795d594fSAndroid Build Coastguard Worker   EXPECT_EQ(arch::Arch##CalleeSaveFrame::GetReturnPcOffset(CalleeSaveType::k##type),  \
118*795d594fSAndroid Build Coastguard Worker             arch::kFrameSize##type - static_cast<size_t>(k##Arch##PointerSize))
119*795d594fSAndroid Build Coastguard Worker #define TEST_ARCH(Arch, arch)                                   \
120*795d594fSAndroid Build Coastguard Worker   TEST_F(ArchTest, Arch) {                                      \
121*795d594fSAndroid Build Coastguard Worker     TEST_ARCH_TYPE(Arch, arch, SaveAllCalleeSaves);             \
122*795d594fSAndroid Build Coastguard Worker     TEST_ARCH_TYPE(Arch, arch, SaveRefsOnly);                   \
123*795d594fSAndroid Build Coastguard Worker     TEST_ARCH_TYPE(Arch, arch, SaveRefsAndArgs);                \
124*795d594fSAndroid Build Coastguard Worker     TEST_ARCH_TYPE(Arch, arch, SaveEverything);                 \
125*795d594fSAndroid Build Coastguard Worker     TEST_ARCH_TYPE(Arch, arch, SaveEverythingForClinit);        \
126*795d594fSAndroid Build Coastguard Worker     TEST_ARCH_TYPE(Arch, arch, SaveEverythingForSuspendCheck);  \
127*795d594fSAndroid Build Coastguard Worker   }
128*795d594fSAndroid Build Coastguard Worker TEST_ARCH(Arm, arm)
129*795d594fSAndroid Build Coastguard Worker TEST_ARCH(Arm64, arm64)
130*795d594fSAndroid Build Coastguard Worker TEST_ARCH(X86, x86)
131*795d594fSAndroid Build Coastguard Worker TEST_ARCH(X86_64, x86_64)
132*795d594fSAndroid Build Coastguard Worker 
133*795d594fSAndroid Build Coastguard Worker }  // namespace art
134