blob: d4ceede07a799f9fb6d602d141a2ed9f8cffec8d [file] [log] [blame]
Andreas Gampe5c1e4352014-04-21 19:28:24 -07001/*
2 * Copyright (C) 2014 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17#include <stdint.h>
18
Mathieu Chartiere401d142015-04-22 13:56:20 -070019#include "art_method-inl.h"
Andreas Gampe8228cdf2017-05-30 15:03:54 -070020#include "base/callee_save_type.h"
Vladimir Markofe72cd32018-05-17 08:43:47 +010021#include "entrypoints/quick/callee_save_frame.h"
Andreas Gampe5c1e4352014-04-21 19:28:24 -070022#include "common_runtime_test.h"
Vladimir Marko7624d252014-05-02 14:40:15 +010023#include "quick/quick_method_frame_info.h"
Andreas Gampeb2d18fa2017-06-06 20:46:10 -070024
Andreas Gampeb2d18fa2017-06-06 20:46:10 -070025// asm_support.h declares tests next to the #defines. We use asm_support_check.h to (safely)
26// generate CheckAsmSupportOffsetsAndSizes using gtest's EXPECT for the tests. We also use the
27// RETURN_TYPE, HEADER and FOOTER defines from asm_support_check.h to try to ensure that any
28// tests are actually generated.
29
30// Let CheckAsmSupportOffsetsAndSizes return a size_t (the count).
31#define ASM_SUPPORT_CHECK_RETURN_TYPE size_t
32
33// Declare the counter that will be updated per test.
34#define ASM_SUPPORT_CHECK_HEADER size_t count = 0;
35
36// Use EXPECT_EQ for tests, and increment the counter.
37#define ADD_TEST_EQ(x, y) EXPECT_EQ(x, y); count++;
38
39// Return the counter at the end of CheckAsmSupportOffsetsAndSizes.
40#define ASM_SUPPORT_CHECK_FOOTER return count;
41
42// Generate CheckAsmSupportOffsetsAndSizes().
43#include "asm_support_check.h"
Andreas Gampe5c1e4352014-04-21 19:28:24 -070044
45namespace art {
46
47class ArchTest : public CommonRuntimeTest {
48 protected:
Jeff Hao6d254192015-02-17 18:01:00 -080049 void SetUpRuntimeOptions(RuntimeOptions *options) OVERRIDE {
50 // Use 64-bit ISA for runtime setup to make method size potentially larger
51 // than necessary (rather than smaller) during CreateCalleeSaveMethod
52 options->push_back(std::make_pair("imageinstructionset", "x86_64"));
53 }
54
Andreas Gampea00f0122015-12-16 16:54:35 -080055 // Do not do any of the finalization. We don't want to run any code, we don't need the heap
56 // prepared, it actually will be a problem with setting the instruction set to x86_64 in
57 // SetUpRuntimeOptions.
58 void FinalizeSetup() OVERRIDE {
59 ASSERT_EQ(InstructionSet::kX86_64, Runtime::Current()->GetInstructionSet());
60 }
Andreas Gampe5c1e4352014-04-21 19:28:24 -070061};
62
Ian Rogers1d8cdbc2014-09-22 22:51:09 -070063TEST_F(ArchTest, CheckCommonOffsetsAndSizes) {
Andreas Gampeb2d18fa2017-06-06 20:46:10 -070064 size_t test_count = CheckAsmSupportOffsetsAndSizes();
65 EXPECT_GT(test_count, 0u);
Ian Rogers1d8cdbc2014-09-22 22:51:09 -070066}
67
68// Grab architecture specific constants.
69namespace arm {
Andreas Gampe5c1e4352014-04-21 19:28:24 -070070#include "arch/arm/asm_support_arm.h"
Vladimir Markofd36f1f2016-08-03 18:49:58 +010071static constexpr size_t kFrameSizeSaveAllCalleeSaves = FRAME_SIZE_SAVE_ALL_CALLEE_SAVES;
72#undef FRAME_SIZE_SAVE_ALL_CALLEE_SAVES
73static constexpr size_t kFrameSizeSaveRefsOnly = FRAME_SIZE_SAVE_REFS_ONLY;
74#undef FRAME_SIZE_SAVE_REFS_ONLY
75static constexpr size_t kFrameSizeSaveRefsAndArgs = FRAME_SIZE_SAVE_REFS_AND_ARGS;
76#undef FRAME_SIZE_SAVE_REFS_AND_ARGS
Mingyao Yang0a87a652017-04-12 13:43:15 -070077static constexpr size_t kFrameSizeSaveEverythingForClinit = FRAME_SIZE_SAVE_EVERYTHING_FOR_CLINIT;
78#undef FRAME_SIZE_SAVE_EVERYTHING_FOR_CLINIT
79static constexpr size_t kFrameSizeSaveEverythingForSuspendCheck =
80 FRAME_SIZE_SAVE_EVERYTHING_FOR_SUSPEND_CHECK;
81#undef FRAME_SIZE_SAVE_EVERYTHING_FOR_SUSPEND_CHECK
Vladimir Markofd36f1f2016-08-03 18:49:58 +010082static constexpr size_t kFrameSizeSaveEverything = FRAME_SIZE_SAVE_EVERYTHING;
83#undef FRAME_SIZE_SAVE_EVERYTHING
Vladimir Marko88abba22017-05-03 17:09:25 +010084#undef BAKER_MARK_INTROSPECTION_FIELD_LDR_NARROW_ENTRYPOINT_OFFSET
85#undef BAKER_MARK_INTROSPECTION_GC_ROOT_LDR_WIDE_ENTRYPOINT_OFFSET
86#undef BAKER_MARK_INTROSPECTION_GC_ROOT_LDR_NARROW_ENTRYPOINT_OFFSET
Vladimir Markoeee1c0e2017-04-21 17:58:41 +010087#undef BAKER_MARK_INTROSPECTION_ARRAY_SWITCH_OFFSET
Vladimir Marko88abba22017-05-03 17:09:25 +010088#undef BAKER_MARK_INTROSPECTION_FIELD_LDR_WIDE_OFFSET
89#undef BAKER_MARK_INTROSPECTION_FIELD_LDR_NARROW_OFFSET
Vladimir Markoeee1c0e2017-04-21 17:58:41 +010090#undef BAKER_MARK_INTROSPECTION_ARRAY_LDR_OFFSET
Vladimir Marko88abba22017-05-03 17:09:25 +010091#undef BAKER_MARK_INTROSPECTION_GC_ROOT_LDR_WIDE_OFFSET
92#undef BAKER_MARK_INTROSPECTION_GC_ROOT_LDR_NARROW_OFFSET
Vladimir Marko952dbb12016-07-28 12:01:51 +010093} // namespace arm
Ian Rogers1d8cdbc2014-09-22 22:51:09 -070094
95namespace arm64 {
96#include "arch/arm64/asm_support_arm64.h"
Vladimir Markofd36f1f2016-08-03 18:49:58 +010097static constexpr size_t kFrameSizeSaveAllCalleeSaves = FRAME_SIZE_SAVE_ALL_CALLEE_SAVES;
98#undef FRAME_SIZE_SAVE_ALL_CALLEE_SAVES
99static constexpr size_t kFrameSizeSaveRefsOnly = FRAME_SIZE_SAVE_REFS_ONLY;
100#undef FRAME_SIZE_SAVE_REFS_ONLY
101static constexpr size_t kFrameSizeSaveRefsAndArgs = FRAME_SIZE_SAVE_REFS_AND_ARGS;
102#undef FRAME_SIZE_SAVE_REFS_AND_ARGS
Mingyao Yang0a87a652017-04-12 13:43:15 -0700103static constexpr size_t kFrameSizeSaveEverythingForClinit = FRAME_SIZE_SAVE_EVERYTHING_FOR_CLINIT;
104#undef FRAME_SIZE_SAVE_EVERYTHING_FOR_CLINIT
105static constexpr size_t kFrameSizeSaveEverythingForSuspendCheck =
106 FRAME_SIZE_SAVE_EVERYTHING_FOR_SUSPEND_CHECK;
107#undef FRAME_SIZE_SAVE_EVERYTHING_FOR_SUSPEND_CHECK
Vladimir Markofd36f1f2016-08-03 18:49:58 +0100108static constexpr size_t kFrameSizeSaveEverything = FRAME_SIZE_SAVE_EVERYTHING;
109#undef FRAME_SIZE_SAVE_EVERYTHING
Vladimir Markoeee1c0e2017-04-21 17:58:41 +0100110#undef BAKER_MARK_INTROSPECTION_ARRAY_SWITCH_OFFSET
111#undef BAKER_MARK_INTROSPECTION_GC_ROOT_ENTRYPOINT_OFFSET
112#undef BAKER_MARK_INTROSPECTION_FIELD_LDR_OFFSET
113#undef BAKER_MARK_INTROSPECTION_ARRAY_LDR_OFFSET
114#undef BAKER_MARK_INTROSPECTION_GC_ROOT_LDR_OFFSET
Vladimir Marko952dbb12016-07-28 12:01:51 +0100115} // namespace arm64
Ian Rogers1d8cdbc2014-09-22 22:51:09 -0700116
117namespace mips {
118#include "arch/mips/asm_support_mips.h"
Vladimir Markofd36f1f2016-08-03 18:49:58 +0100119static constexpr size_t kFrameSizeSaveAllCalleeSaves = FRAME_SIZE_SAVE_ALL_CALLEE_SAVES;
120#undef FRAME_SIZE_SAVE_ALL_CALLEE_SAVES
121static constexpr size_t kFrameSizeSaveRefsOnly = FRAME_SIZE_SAVE_REFS_ONLY;
122#undef FRAME_SIZE_SAVE_REFS_ONLY
123static constexpr size_t kFrameSizeSaveRefsAndArgs = FRAME_SIZE_SAVE_REFS_AND_ARGS;
124#undef FRAME_SIZE_SAVE_REFS_AND_ARGS
Mingyao Yang0a87a652017-04-12 13:43:15 -0700125static constexpr size_t kFrameSizeSaveEverythingForClinit = FRAME_SIZE_SAVE_EVERYTHING_FOR_CLINIT;
126#undef FRAME_SIZE_SAVE_EVERYTHING_FOR_CLINIT
127static constexpr size_t kFrameSizeSaveEverythingForSuspendCheck =
128 FRAME_SIZE_SAVE_EVERYTHING_FOR_SUSPEND_CHECK;
129#undef FRAME_SIZE_SAVE_EVERYTHING_FOR_SUSPEND_CHECK
Vladimir Markofd36f1f2016-08-03 18:49:58 +0100130static constexpr size_t kFrameSizeSaveEverything = FRAME_SIZE_SAVE_EVERYTHING;
131#undef FRAME_SIZE_SAVE_EVERYTHING
Alexey Frunze4147fcc2017-06-17 19:57:27 -0700132#undef BAKER_MARK_INTROSPECTION_REGISTER_COUNT
133#undef BAKER_MARK_INTROSPECTION_FIELD_ARRAY_ENTRY_SIZE
134#undef BAKER_MARK_INTROSPECTION_GC_ROOT_ENTRIES_OFFSET
135#undef BAKER_MARK_INTROSPECTION_GC_ROOT_ENTRY_SIZE
Vladimir Marko952dbb12016-07-28 12:01:51 +0100136} // namespace mips
Ian Rogers1d8cdbc2014-09-22 22:51:09 -0700137
Andreas Gampe1a5c4062015-01-15 12:10:47 -0800138namespace mips64 {
139#include "arch/mips64/asm_support_mips64.h"
Vladimir Markofd36f1f2016-08-03 18:49:58 +0100140static constexpr size_t kFrameSizeSaveAllCalleeSaves = FRAME_SIZE_SAVE_ALL_CALLEE_SAVES;
141#undef FRAME_SIZE_SAVE_ALL_CALLEE_SAVES
142static constexpr size_t kFrameSizeSaveRefsOnly = FRAME_SIZE_SAVE_REFS_ONLY;
143#undef FRAME_SIZE_SAVE_REFS_ONLY
144static constexpr size_t kFrameSizeSaveRefsAndArgs = FRAME_SIZE_SAVE_REFS_AND_ARGS;
145#undef FRAME_SIZE_SAVE_REFS_AND_ARGS
Mingyao Yang0a87a652017-04-12 13:43:15 -0700146static constexpr size_t kFrameSizeSaveEverythingForClinit = FRAME_SIZE_SAVE_EVERYTHING_FOR_CLINIT;
147#undef FRAME_SIZE_SAVE_EVERYTHING_FOR_CLINIT
148static constexpr size_t kFrameSizeSaveEverythingForSuspendCheck =
149 FRAME_SIZE_SAVE_EVERYTHING_FOR_SUSPEND_CHECK;
150#undef FRAME_SIZE_SAVE_EVERYTHING_FOR_SUSPEND_CHECK
Vladimir Markofd36f1f2016-08-03 18:49:58 +0100151static constexpr size_t kFrameSizeSaveEverything = FRAME_SIZE_SAVE_EVERYTHING;
152#undef FRAME_SIZE_SAVE_EVERYTHING
Alexey Frunze4147fcc2017-06-17 19:57:27 -0700153#undef BAKER_MARK_INTROSPECTION_REGISTER_COUNT
154#undef BAKER_MARK_INTROSPECTION_FIELD_ARRAY_ENTRY_SIZE
155#undef BAKER_MARK_INTROSPECTION_GC_ROOT_ENTRIES_OFFSET
156#undef BAKER_MARK_INTROSPECTION_GC_ROOT_ENTRY_SIZE
Vladimir Marko952dbb12016-07-28 12:01:51 +0100157} // namespace mips64
Andreas Gampe1a5c4062015-01-15 12:10:47 -0800158
Ian Rogers1d8cdbc2014-09-22 22:51:09 -0700159namespace x86 {
160#include "arch/x86/asm_support_x86.h"
Vladimir Markofd36f1f2016-08-03 18:49:58 +0100161static constexpr size_t kFrameSizeSaveAllCalleeSaves = FRAME_SIZE_SAVE_ALL_CALLEE_SAVES;
162#undef FRAME_SIZE_SAVE_ALL_CALLEE_SAVES
163static constexpr size_t kFrameSizeSaveRefsOnly = FRAME_SIZE_SAVE_REFS_ONLY;
164#undef FRAME_SIZE_SAVE_REFS_ONLY
165static constexpr size_t kFrameSizeSaveRefsAndArgs = FRAME_SIZE_SAVE_REFS_AND_ARGS;
166#undef FRAME_SIZE_SAVE_REFS_AND_ARGS
Mingyao Yang0a87a652017-04-12 13:43:15 -0700167static constexpr size_t kFrameSizeSaveEverythingForClinit = FRAME_SIZE_SAVE_EVERYTHING_FOR_CLINIT;
168#undef FRAME_SIZE_SAVE_EVERYTHING_FOR_CLINIT
169static constexpr size_t kFrameSizeSaveEverythingForSuspendCheck =
170 FRAME_SIZE_SAVE_EVERYTHING_FOR_SUSPEND_CHECK;
171#undef FRAME_SIZE_SAVE_EVERYTHING_FOR_SUSPEND_CHECK
Vladimir Markofd36f1f2016-08-03 18:49:58 +0100172static constexpr size_t kFrameSizeSaveEverything = FRAME_SIZE_SAVE_EVERYTHING;
173#undef FRAME_SIZE_SAVE_EVERYTHING
Vladimir Marko952dbb12016-07-28 12:01:51 +0100174} // namespace x86
Ian Rogers1d8cdbc2014-09-22 22:51:09 -0700175
176namespace x86_64 {
177#include "arch/x86_64/asm_support_x86_64.h"
Vladimir Markofd36f1f2016-08-03 18:49:58 +0100178static constexpr size_t kFrameSizeSaveAllCalleeSaves = FRAME_SIZE_SAVE_ALL_CALLEE_SAVES;
179#undef FRAME_SIZE_SAVE_ALL_CALLEE_SAVES
180static constexpr size_t kFrameSizeSaveRefsOnly = FRAME_SIZE_SAVE_REFS_ONLY;
181#undef FRAME_SIZE_SAVE_REFS_ONLY
182static constexpr size_t kFrameSizeSaveRefsAndArgs = FRAME_SIZE_SAVE_REFS_AND_ARGS;
183#undef FRAME_SIZE_SAVE_REFS_AND_ARGS
Mingyao Yang0a87a652017-04-12 13:43:15 -0700184static constexpr size_t kFrameSizeSaveEverythingForClinit = FRAME_SIZE_SAVE_EVERYTHING_FOR_CLINIT;
185#undef FRAME_SIZE_SAVE_EVERYTHING_FOR_CLINIT
186static constexpr size_t kFrameSizeSaveEverythingForSuspendCheck =
187 FRAME_SIZE_SAVE_EVERYTHING_FOR_SUSPEND_CHECK;
188#undef FRAME_SIZE_SAVE_EVERYTHING_FOR_SUSPEND_CHECK
Vladimir Markofd36f1f2016-08-03 18:49:58 +0100189static constexpr size_t kFrameSizeSaveEverything = FRAME_SIZE_SAVE_EVERYTHING;
190#undef FRAME_SIZE_SAVE_EVERYTHING
Vladimir Marko952dbb12016-07-28 12:01:51 +0100191} // namespace x86_64
Ian Rogers1d8cdbc2014-09-22 22:51:09 -0700192
193// Check architecture specific constants are sound.
Vladimir Markofe72cd32018-05-17 08:43:47 +0100194// We expect the return PC to be stored at the highest address slot in the frame.
195#define TEST_ARCH_TYPE(Arch, arch, type) \
196 EXPECT_EQ(arch::Arch##CalleeSaveFrame::GetFrameSize(CalleeSaveType::k##type), \
197 arch::kFrameSize##type); \
198 EXPECT_EQ(arch::Arch##CalleeSaveFrame::GetReturnPcOffset(CalleeSaveType::k##type), \
199 arch::kFrameSize##type - static_cast<size_t>(k##Arch##PointerSize))
200#define TEST_ARCH(Arch, arch) \
201 TEST_F(ArchTest, Arch) { \
202 TEST_ARCH_TYPE(Arch, arch, SaveAllCalleeSaves); \
203 TEST_ARCH_TYPE(Arch, arch, SaveRefsOnly); \
204 TEST_ARCH_TYPE(Arch, arch, SaveRefsAndArgs); \
205 TEST_ARCH_TYPE(Arch, arch, SaveEverything); \
206 TEST_ARCH_TYPE(Arch, arch, SaveEverythingForClinit); \
207 TEST_ARCH_TYPE(Arch, arch, SaveEverythingForSuspendCheck); \
Vladimir Markofd36f1f2016-08-03 18:49:58 +0100208 }
209TEST_ARCH(Arm, arm)
210TEST_ARCH(Arm64, arm64)
211TEST_ARCH(Mips, mips)
212TEST_ARCH(Mips64, mips64)
213TEST_ARCH(X86, x86)
214TEST_ARCH(X86_64, x86_64)
Andreas Gampecf4035a2014-05-28 22:43:01 -0700215
Andreas Gampe5c1e4352014-04-21 19:28:24 -0700216} // namespace art