1 /* 2 * Copyright (C) 2011 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 #ifndef ART_COMPILER_COMMON_COMPILER_TEST_H_ 18 #define ART_COMPILER_COMMON_COMPILER_TEST_H_ 19 20 #include <list> 21 #include <unordered_set> 22 #include <vector> 23 24 #include "common_runtime_test.h" 25 #include "compiler.h" 26 #include "jit/offline_profiling_info.h" 27 #include "oat_file.h" 28 29 namespace art { 30 namespace mirror { 31 class ClassLoader; 32 } // namespace mirror 33 34 class CompilerDriver; 35 class CompilerOptions; 36 class CumulativeLogger; 37 class DexFileToMethodInlinerMap; 38 class VerificationResults; 39 40 template<class T> class Handle; 41 42 class CommonCompilerTest : public CommonRuntimeTest { 43 public: 44 CommonCompilerTest(); 45 ~CommonCompilerTest(); 46 47 // Create an OatMethod based on pointers (for unit tests). 48 OatFile::OatMethod CreateOatMethod(const void* code); 49 50 void MakeExecutable(ArtMethod* method) SHARED_REQUIRES(Locks::mutator_lock_); 51 52 static void MakeExecutable(const void* code_start, size_t code_length); 53 54 void MakeExecutable(mirror::ClassLoader* class_loader, const char* class_name) 55 SHARED_REQUIRES(Locks::mutator_lock_); 56 57 protected: 58 virtual void SetUp(); 59 60 virtual void SetUpRuntimeOptions(RuntimeOptions* options); 61 62 Compiler::Kind GetCompilerKind() const; 63 void SetCompilerKind(Compiler::Kind compiler_kind); 64 65 InstructionSet GetInstructionSet() const; 66 67 // Get the set of image classes given to the compiler-driver in SetUp. Note: the compiler 68 // driver assumes ownership of the set, so the test should properly release the set. 69 virtual std::unordered_set<std::string>* GetImageClasses(); 70 71 // Get the set of compiled classes given to the compiler-driver in SetUp. Note: the compiler 72 // driver assumes ownership of the set, so the test should properly release the set. 73 virtual std::unordered_set<std::string>* GetCompiledClasses(); 74 75 // Get the set of compiled methods given to the compiler-driver in SetUp. Note: the compiler 76 // driver assumes ownership of the set, so the test should properly release the set. 77 virtual std::unordered_set<std::string>* GetCompiledMethods(); 78 79 virtual ProfileCompilationInfo* GetProfileCompilationInfo(); 80 81 virtual void TearDown(); 82 83 void CompileClass(mirror::ClassLoader* class_loader, const char* class_name) 84 SHARED_REQUIRES(Locks::mutator_lock_); 85 86 void CompileMethod(ArtMethod* method) SHARED_REQUIRES(Locks::mutator_lock_); 87 88 void CompileDirectMethod(Handle<mirror::ClassLoader> class_loader, const char* class_name, 89 const char* method_name, const char* signature) 90 SHARED_REQUIRES(Locks::mutator_lock_); 91 92 void CompileVirtualMethod(Handle<mirror::ClassLoader> class_loader, const char* class_name, 93 const char* method_name, const char* signature) 94 SHARED_REQUIRES(Locks::mutator_lock_); 95 96 void CreateCompilerDriver(Compiler::Kind kind, InstructionSet isa, size_t number_of_threads = 2U); 97 98 void ReserveImageSpace(); 99 100 void UnreserveImageSpace(); 101 102 Compiler::Kind compiler_kind_ = Compiler::kOptimizing; 103 std::unique_ptr<CompilerOptions> compiler_options_; 104 std::unique_ptr<VerificationResults> verification_results_; 105 std::unique_ptr<DexFileToMethodInlinerMap> method_inliner_map_; 106 std::unique_ptr<CompilerDriver> compiler_driver_; 107 std::unique_ptr<CumulativeLogger> timer_; 108 std::unique_ptr<const InstructionSetFeatures> instruction_set_features_; 109 110 111 private: 112 std::unique_ptr<MemMap> image_reservation_; 113 114 // Chunks must not move their storage after being created - use the node-based std::list. 115 std::list<std::vector<uint8_t>> header_code_and_maps_chunks_; 116 }; 117 118 // TODO: When read barrier works with all tests, get rid of this. 119 #define TEST_DISABLED_FOR_READ_BARRIER() \ 120 if (kUseReadBarrier) { \ 121 printf("WARNING: TEST DISABLED FOR READ BARRIER\n"); \ 122 return; \ 123 } 124 125 // TODO: When read barrier works with all Optimizing back ends, get rid of this. 126 #define TEST_DISABLED_FOR_READ_BARRIER_WITH_OPTIMIZING_FOR_UNSUPPORTED_INSTRUCTION_SETS() \ 127 if (kUseReadBarrier && GetCompilerKind() == Compiler::kOptimizing) { \ 128 switch (GetInstructionSet()) { \ 129 case kArm64: \ 130 case kThumb2: \ 131 case kX86: \ 132 case kX86_64: \ 133 /* Instruction set has read barrier support. */ \ 134 break; \ 135 \ 136 default: \ 137 /* Instruction set does not have barrier support. */ \ 138 printf("WARNING: TEST DISABLED FOR READ BARRIER WITH OPTIMIZING " \ 139 "FOR THIS INSTRUCTION SET\n"); \ 140 return; \ 141 } \ 142 } 143 144 } // namespace art 145 146 #endif // ART_COMPILER_COMMON_COMPILER_TEST_H_ 147