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