arch_test.cc revision b132ec5bba1a14d77fa11574df8dc593ae12a643
1/*
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
19#include "common_runtime_test.h"
20#include "mirror/art_method.h"
21
22namespace art {
23
24class ArchTest : public CommonRuntimeTest {
25 protected:
26  static void CheckFrameSize(InstructionSet isa, Runtime::CalleeSaveType type, uint32_t save_size)
27      NO_THREAD_SAFETY_ANALYSIS {
28    Runtime* r = Runtime::Current();
29
30    Thread* t = Thread::Current();
31    t->TransitionFromSuspendedToRunnable();  // So we can create callee-save methods.
32
33    mirror::ArtMethod* save_method = r->CreateCalleeSaveMethod(isa, type);
34    EXPECT_EQ(save_method->GetFrameSizeInBytes(), save_size) << "Expected and real size differs for "
35        << type << " core spills=" << std::hex << save_method->GetCoreSpillMask() << " fp spills="
36        << save_method->GetFpSpillMask() << std::dec;
37
38    t->TransitionFromRunnableToSuspended(ThreadState::kNative);  // So we can shut down.
39  }
40};
41
42
43TEST_F(ArchTest, ARM) {
44#include "arch/arm/asm_support_arm.h"
45#undef ART_RUNTIME_ARCH_ARM_ASM_SUPPORT_ARM_H_
46
47
48#ifdef FRAME_SIZE_SAVE_ALL_CALLEE_SAVE
49  CheckFrameSize(InstructionSet::kArm, Runtime::kSaveAll, FRAME_SIZE_SAVE_ALL_CALLEE_SAVE);
50#else
51  LOG(WARNING) << "No frame size for SaveAll";
52#endif
53#ifdef FRAME_SIZE_REFS_ONLY_CALLEE_SAVE
54  CheckFrameSize(InstructionSet::kArm, Runtime::kRefsOnly, FRAME_SIZE_REFS_ONLY_CALLEE_SAVE);
55#else
56  LOG(WARNING) << "No frame size for RefsOnly";
57#endif
58#ifdef FRAME_SIZE_REFS_AND_ARGS_CALLEE_SAVE
59  CheckFrameSize(InstructionSet::kArm, Runtime::kRefsAndArgs, FRAME_SIZE_REFS_AND_ARGS_CALLEE_SAVE);
60#else
61  LOG(WARNING) << "No frame size for RefsAndArgs";
62#endif
63
64
65#ifdef RUNTIME_SAVE_ALL_CALLEE_SAVE_FRAME_OFFSET
66#undef RUNTIME_SAVE_ALL_CALLEE_SAVE_FRAME_OFFSET
67#endif
68#ifdef RUNTIME_REFS_ONLY_CALLEE_SAVE_FRAME_OFFSET
69#undef RUNTIME_REFS_ONLY_CALLEE_SAVE_FRAME_OFFSET
70#endif
71#ifdef RUNTIME_REF_AND_ARGS_CALLEE_SAVE_FRAME_OFFSET
72#undef RUNTIME_REF_AND_ARGS_CALLEE_SAVE_FRAME_OFFSET
73#endif
74#ifdef THREAD_SELF_OFFSET
75#undef THREAD_SELF_OFFSET
76#endif
77#ifdef THREAD_CARD_TABLE_OFFSET
78#undef THREAD_CARD_TABLE_OFFSET
79#endif
80#ifdef THREAD_EXCEPTION_OFFSET
81#undef THREAD_EXCEPTION_OFFSET
82#endif
83#ifdef THREAD_ID_OFFSET
84#undef THREAD_ID_OFFSET
85#endif
86#ifdef FRAME_SIZE_SAVE_ALL_CALLEE_SAVE
87#undef FRAME_SIZE_SAVE_ALL_CALLEE_SAVE
88#endif
89#ifdef FRAME_SIZE_REFS_ONLY_CALLEE_SAVE
90#undef FRAME_SIZE_REFS_ONLY_CALLEE_SAVE
91#endif
92#ifdef FRAME_SIZE_REFS_AND_ARGS_CALLEE_SAVE
93#undef FRAME_SIZE_REFS_AND_ARGS_CALLEE_SAVE
94#endif
95#ifdef HEAP_REFERENCE_SIZE
96#undef HEAP_REFERENCE_SIZE
97#endif
98}
99
100
101TEST_F(ArchTest, ARM64) {
102#include "arch/arm64/asm_support_arm64.h"
103#undef ART_RUNTIME_ARCH_ARM64_ASM_SUPPORT_ARM64_H_
104
105
106#ifdef FRAME_SIZE_SAVE_ALL_CALLEE_SAVE
107  CheckFrameSize(InstructionSet::kArm64, Runtime::kSaveAll, FRAME_SIZE_SAVE_ALL_CALLEE_SAVE);
108#else
109  LOG(WARNING) << "No frame size for SaveAll";
110#endif
111#ifdef FRAME_SIZE_REFS_ONLY_CALLEE_SAVE
112  CheckFrameSize(InstructionSet::kArm64, Runtime::kRefsOnly, FRAME_SIZE_REFS_ONLY_CALLEE_SAVE);
113#else
114  LOG(WARNING) << "No frame size for RefsOnly";
115#endif
116#ifdef FRAME_SIZE_REFS_AND_ARGS_CALLEE_SAVE
117  CheckFrameSize(InstructionSet::kArm64, Runtime::kRefsAndArgs, FRAME_SIZE_REFS_AND_ARGS_CALLEE_SAVE);
118#else
119  LOG(WARNING) << "No frame size for RefsAndArgs";
120#endif
121
122
123#ifdef RUNTIME_SAVE_ALL_CALLEE_SAVE_FRAME_OFFSET
124#undef RUNTIME_SAVE_ALL_CALLEE_SAVE_FRAME_OFFSET
125#endif
126#ifdef RUNTIME_REFS_ONLY_CALLEE_SAVE_FRAME_OFFSET
127#undef RUNTIME_REFS_ONLY_CALLEE_SAVE_FRAME_OFFSET
128#endif
129#ifdef RUNTIME_REF_AND_ARGS_CALLEE_SAVE_FRAME_OFFSET
130#undef RUNTIME_REF_AND_ARGS_CALLEE_SAVE_FRAME_OFFSET
131#endif
132#ifdef THREAD_SELF_OFFSET
133#undef THREAD_SELF_OFFSET
134#endif
135#ifdef THREAD_CARD_TABLE_OFFSET
136#undef THREAD_CARD_TABLE_OFFSET
137#endif
138#ifdef THREAD_EXCEPTION_OFFSET
139#undef THREAD_EXCEPTION_OFFSET
140#endif
141#ifdef THREAD_ID_OFFSET
142#undef THREAD_ID_OFFSET
143#endif
144#ifdef FRAME_SIZE_SAVE_ALL_CALLEE_SAVE
145#undef FRAME_SIZE_SAVE_ALL_CALLEE_SAVE
146#endif
147#ifdef FRAME_SIZE_REFS_ONLY_CALLEE_SAVE
148#undef FRAME_SIZE_REFS_ONLY_CALLEE_SAVE
149#endif
150#ifdef FRAME_SIZE_REFS_AND_ARGS_CALLEE_SAVE
151#undef FRAME_SIZE_REFS_AND_ARGS_CALLEE_SAVE
152#endif
153#ifdef HEAP_REFERENCE_SIZE
154#undef HEAP_REFERENCE_SIZE
155#endif
156}
157
158
159TEST_F(ArchTest, MIPS) {
160#include "arch/mips/asm_support_mips.h"
161#undef ART_RUNTIME_ARCH_MIPS_ASM_SUPPORT_MIPS_H_
162
163
164#ifdef FRAME_SIZE_SAVE_ALL_CALLEE_SAVE
165  CheckFrameSize(InstructionSet::kMips, Runtime::kSaveAll, FRAME_SIZE_SAVE_ALL_CALLEE_SAVE);
166#else
167  LOG(WARNING) << "No frame size for SaveAll";
168#endif
169#ifdef FRAME_SIZE_REFS_ONLY_CALLEE_SAVE
170  CheckFrameSize(InstructionSet::kMips, Runtime::kRefsOnly, FRAME_SIZE_REFS_ONLY_CALLEE_SAVE);
171#else
172  LOG(WARNING) << "No frame size for RefsOnly";
173#endif
174#ifdef FRAME_SIZE_REFS_AND_ARGS_CALLEE_SAVE
175  CheckFrameSize(InstructionSet::kMips, Runtime::kRefsAndArgs, FRAME_SIZE_REFS_AND_ARGS_CALLEE_SAVE);
176#else
177  LOG(WARNING) << "No frame size for RefsAndArgs";
178#endif
179
180
181#ifdef RUNTIME_SAVE_ALL_CALLEE_SAVE_FRAME_OFFSET
182#undef RUNTIME_SAVE_ALL_CALLEE_SAVE_FRAME_OFFSET
183#endif
184#ifdef RUNTIME_REFS_ONLY_CALLEE_SAVE_FRAME_OFFSET
185#undef RUNTIME_REFS_ONLY_CALLEE_SAVE_FRAME_OFFSET
186#endif
187#ifdef RUNTIME_REF_AND_ARGS_CALLEE_SAVE_FRAME_OFFSET
188#undef RUNTIME_REF_AND_ARGS_CALLEE_SAVE_FRAME_OFFSET
189#endif
190#ifdef THREAD_SELF_OFFSET
191#undef THREAD_SELF_OFFSET
192#endif
193#ifdef THREAD_CARD_TABLE_OFFSET
194#undef THREAD_CARD_TABLE_OFFSET
195#endif
196#ifdef THREAD_EXCEPTION_OFFSET
197#undef THREAD_EXCEPTION_OFFSET
198#endif
199#ifdef THREAD_ID_OFFSET
200#undef THREAD_ID_OFFSET
201#endif
202#ifdef FRAME_SIZE_SAVE_ALL_CALLEE_SAVE
203#undef FRAME_SIZE_SAVE_ALL_CALLEE_SAVE
204#endif
205#ifdef FRAME_SIZE_REFS_ONLY_CALLEE_SAVE
206#undef FRAME_SIZE_REFS_ONLY_CALLEE_SAVE
207#endif
208#ifdef FRAME_SIZE_REFS_AND_ARGS_CALLEE_SAVE
209#undef FRAME_SIZE_REFS_AND_ARGS_CALLEE_SAVE
210#endif
211#ifdef HEAP_REFERENCE_SIZE
212#undef HEAP_REFERENCE_SIZE
213#endif
214}
215
216
217TEST_F(ArchTest, X86) {
218#include "arch/x86/asm_support_x86.h"
219#undef ART_RUNTIME_ARCH_X86_ASM_SUPPORT_X86_H_
220
221
222#ifdef FRAME_SIZE_SAVE_ALL_CALLEE_SAVE
223  CheckFrameSize(InstructionSet::kX86, Runtime::kSaveAll, FRAME_SIZE_SAVE_ALL_CALLEE_SAVE);
224#else
225  LOG(WARNING) << "No frame size for SaveAll";
226#endif
227#ifdef FRAME_SIZE_REFS_ONLY_CALLEE_SAVE
228  CheckFrameSize(InstructionSet::kX86, Runtime::kRefsOnly, FRAME_SIZE_REFS_ONLY_CALLEE_SAVE);
229#else
230  LOG(WARNING) << "No frame size for RefsOnly";
231#endif
232#ifdef FRAME_SIZE_REFS_AND_ARGS_CALLEE_SAVE
233  CheckFrameSize(InstructionSet::kX86, Runtime::kRefsAndArgs, FRAME_SIZE_REFS_AND_ARGS_CALLEE_SAVE);
234#else
235  LOG(WARNING) << "No frame size for RefsAndArgs";
236#endif
237
238
239#ifdef RUNTIME_SAVE_ALL_CALLEE_SAVE_FRAME_OFFSET
240#undef RUNTIME_SAVE_ALL_CALLEE_SAVE_FRAME_OFFSET
241#endif
242#ifdef RUNTIME_REFS_ONLY_CALLEE_SAVE_FRAME_OFFSET
243#undef RUNTIME_REFS_ONLY_CALLEE_SAVE_FRAME_OFFSET
244#endif
245#ifdef RUNTIME_REF_AND_ARGS_CALLEE_SAVE_FRAME_OFFSET
246#undef RUNTIME_REF_AND_ARGS_CALLEE_SAVE_FRAME_OFFSET
247#endif
248#ifdef THREAD_SELF_OFFSET
249#undef THREAD_SELF_OFFSET
250#endif
251#ifdef THREAD_CARD_TABLE_OFFSET
252#undef THREAD_CARD_TABLE_OFFSET
253#endif
254#ifdef THREAD_EXCEPTION_OFFSET
255#undef THREAD_EXCEPTION_OFFSET
256#endif
257#ifdef THREAD_ID_OFFSET
258#undef THREAD_ID_OFFSET
259#endif
260#ifdef FRAME_SIZE_SAVE_ALL_CALLEE_SAVE
261#undef FRAME_SIZE_SAVE_ALL_CALLEE_SAVE
262#endif
263#ifdef FRAME_SIZE_REFS_ONLY_CALLEE_SAVE
264#undef FRAME_SIZE_REFS_ONLY_CALLEE_SAVE
265#endif
266#ifdef FRAME_SIZE_REFS_AND_ARGS_CALLEE_SAVE
267#undef FRAME_SIZE_REFS_AND_ARGS_CALLEE_SAVE
268#endif
269#ifdef HEAP_REFERENCE_SIZE
270#undef HEAP_REFERENCE_SIZE
271#endif
272}
273
274
275TEST_F(ArchTest, X86_64) {
276#include "arch/x86_64/asm_support_x86_64.h"
277#undef ART_RUNTIME_ARCH_X86_64_ASM_SUPPORT_X86_64_H_
278
279
280#ifdef FRAME_SIZE_SAVE_ALL_CALLEE_SAVE
281  CheckFrameSize(InstructionSet::kX86_64, Runtime::kSaveAll, FRAME_SIZE_SAVE_ALL_CALLEE_SAVE);
282#else
283  LOG(WARNING) << "No frame size for SaveAll";
284#endif
285#ifdef FRAME_SIZE_REFS_ONLY_CALLEE_SAVE
286  CheckFrameSize(InstructionSet::kX86_64, Runtime::kRefsOnly, FRAME_SIZE_REFS_ONLY_CALLEE_SAVE);
287#else
288  LOG(WARNING) << "No frame size for RefsOnly";
289#endif
290#ifdef FRAME_SIZE_REFS_AND_ARGS_CALLEE_SAVE
291  CheckFrameSize(InstructionSet::kX86_64, Runtime::kRefsAndArgs, FRAME_SIZE_REFS_AND_ARGS_CALLEE_SAVE);
292#else
293  LOG(WARNING) << "No frame size for RefsAndArgs";
294#endif
295
296
297#ifdef RUNTIME_SAVE_ALL_CALLEE_SAVE_FRAME_OFFSET
298#undef RUNTIME_SAVE_ALL_CALLEE_SAVE_FRAME_OFFSET
299#endif
300#ifdef RUNTIME_REFS_ONLY_CALLEE_SAVE_FRAME_OFFSET
301#undef RUNTIME_REFS_ONLY_CALLEE_SAVE_FRAME_OFFSET
302#endif
303#ifdef RUNTIME_REF_AND_ARGS_CALLEE_SAVE_FRAME_OFFSET
304#undef RUNTIME_REF_AND_ARGS_CALLEE_SAVE_FRAME_OFFSET
305#endif
306#ifdef THREAD_SELF_OFFSET
307#undef THREAD_SELF_OFFSET
308#endif
309#ifdef THREAD_CARD_TABLE_OFFSET
310#undef THREAD_CARD_TABLE_OFFSET
311#endif
312#ifdef THREAD_EXCEPTION_OFFSET
313#undef THREAD_EXCEPTION_OFFSET
314#endif
315#ifdef THREAD_ID_OFFSET
316#undef THREAD_ID_OFFSET
317#endif
318#ifdef FRAME_SIZE_SAVE_ALL_CALLEE_SAVE
319#undef FRAME_SIZE_SAVE_ALL_CALLEE_SAVE
320#endif
321#ifdef FRAME_SIZE_REFS_ONLY_CALLEE_SAVE
322#undef FRAME_SIZE_REFS_ONLY_CALLEE_SAVE
323#endif
324#ifdef FRAME_SIZE_REFS_AND_ARGS_CALLEE_SAVE
325#undef FRAME_SIZE_REFS_AND_ARGS_CALLEE_SAVE
326#endif
327#ifdef HEAP_REFERENCE_SIZE
328#undef HEAP_REFERENCE_SIZE
329#endif
330}
331
332
333// The following tests are all for the running architecture. So we get away
334// with just including it and not undefining it every time.
335
336
337#if defined(__arm__)
338#include "arch/arm/asm_support_arm.h"
339#undef ART_RUNTIME_ARCH_ARM_ASM_SUPPORT_ARM_H_
340#elif defined(__aarch64__)
341#include "arch/arm64/asm_support_arm64.h"
342#undef ART_RUNTIME_ARCH_ARM64_ASM_SUPPORT_ARM64_H_
343#elif defined(__mips__)
344#include "arch/mips/asm_support_mips.h"
345#undef ART_RUNTIME_ARCH_MIPS_ASM_SUPPORT_MIPS_H_
346#elif defined(__i386__)
347#include "arch/x86/asm_support_x86.h"
348#undef ART_RUNTIME_ARCH_X86_ASM_SUPPORT_X86_H_
349#elif defined(__x86_64__)
350#include "arch/x86_64/asm_support_x86_64.h"
351#undef ART_RUNTIME_ARCH_X86_64_ASM_SUPPORT_X86_64_H_
352#else
353  // This happens for the host test.
354#ifdef __LP64__
355#include "arch/x86_64/asm_support_x86_64.h"
356#undef ART_RUNTIME_ARCH_X86_64_ASM_SUPPORT_X86_64_H_
357#else
358#include "arch/x86/asm_support_x86.h"
359#undef ART_RUNTIME_ARCH_X86_ASM_SUPPORT_X86_H_
360#endif
361#endif
362
363
364TEST_F(ArchTest, ThreadOffsets) {
365  // Ugly hack, change when possible.
366#ifdef __LP64__
367#define POINTER_SIZE 8
368#else
369#define POINTER_SIZE 4
370#endif
371
372#if defined(THREAD_SELF_OFFSET)
373  ThreadOffset<POINTER_SIZE> self_offset = Thread::SelfOffset<POINTER_SIZE>();
374  EXPECT_EQ(self_offset.Int32Value(), THREAD_SELF_OFFSET);
375#else
376  LOG(INFO) << "No Thread Self Offset found.";
377#endif
378
379#if defined(THREAD_CARD_TABLE_OFFSET)
380  ThreadOffset<POINTER_SIZE> card_offset = Thread::CardTableOffset<POINTER_SIZE>();
381  EXPECT_EQ(card_offset.Int32Value(), THREAD_CARD_TABLE_OFFSET);
382#else
383  LOG(INFO) << "No Thread Card Table Offset found.";
384#endif
385
386#if defined(THREAD_EXCEPTION_OFFSET)
387  ThreadOffset<POINTER_SIZE> exc_offset = Thread::ExceptionOffset<POINTER_SIZE>();
388    EXPECT_EQ(exc_offset.Int32Value(), THREAD_EXCEPTION_OFFSET);
389#else
390  LOG(INFO) << "No Thread Exception Offset found.";
391#endif
392
393#if defined(THREAD_ID_OFFSET)
394  ThreadOffset<POINTER_SIZE> id_offset = Thread::ThinLockIdOffset<POINTER_SIZE>();
395  EXPECT_EQ(id_offset.Int32Value(), THREAD_ID_OFFSET);
396#else
397  LOG(INFO) << "No Thread ID Offset found.";
398#endif
399}
400
401
402TEST_F(ArchTest, CalleeSaveMethodOffsets) {
403#if defined(RUNTIME_SAVE_ALL_CALLEE_SAVE_FRAME_OFFSET)
404  EXPECT_EQ(Runtime::GetCalleeSaveMethodOffset(Runtime::kSaveAll),
405            static_cast<size_t>(RUNTIME_SAVE_ALL_CALLEE_SAVE_FRAME_OFFSET));
406#else
407  LOG(INFO) << "No Runtime Save-all Offset found.";
408#endif
409
410#if defined(RUNTIME_REFS_ONLY_CALLEE_SAVE_FRAME_OFFSET)
411  EXPECT_EQ(Runtime::GetCalleeSaveMethodOffset(Runtime::kRefsOnly),
412            static_cast<size_t>(RUNTIME_REFS_ONLY_CALLEE_SAVE_FRAME_OFFSET));
413#else
414  LOG(INFO) << "No Runtime Refs-only Offset found.";
415#endif
416
417#if defined(RUNTIME_REF_AND_ARGS_CALLEE_SAVE_FRAME_OFFSET)
418  EXPECT_EQ(Runtime::GetCalleeSaveMethodOffset(Runtime::kRefsAndArgs),
419            static_cast<size_t>(RUNTIME_REF_AND_ARGS_CALLEE_SAVE_FRAME_OFFSET));
420#else
421  LOG(INFO) << "No Runtime Refs-and-Args Offset found.";
422#endif
423}
424
425
426TEST_F(ArchTest, HeapReferenceSize) {
427#if defined(HEAP_REFERENCE_SIZE)
428  EXPECT_EQ(sizeof(mirror::HeapReference<mirror::Object>),
429            static_cast<size_t>(HEAP_REFERENCE_SIZE));
430#else
431  LOG(INFO) << "No expected HeapReference Size found.";
432#endif
433}
434
435}  // namespace art
436