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_DEX_FRONTEND_H_ 18 #define ART_COMPILER_DEX_FRONTEND_H_ 19 20 #include "dex_file.h" 21 #include "invoke_type.h" 22 23 namespace llvm { 24 class Module; 25 class LLVMContext; 26 } 27 28 namespace art { 29 namespace llvm { 30 class IntrinsicHelper; 31 class IRBuilder; 32 } 33 34 /* 35 * Assembly is an iterative process, and usually terminates within 36 * two or three passes. This should be high enough to handle bizarre 37 * cases, but detect an infinite loop bug. 38 */ 39 #define MAX_ASSEMBLER_RETRIES 50 40 41 // Suppress optimization if corresponding bit set. 42 enum opt_control_vector { 43 kLoadStoreElimination = 0, 44 kLoadHoisting, 45 kSuppressLoads, 46 kNullCheckElimination, 47 kClassInitCheckElimination, 48 kGlobalValueNumbering, 49 kPromoteRegs, 50 kTrackLiveTemps, 51 kSafeOptimizations, 52 kBBOpt, 53 kMatch, 54 kPromoteCompilerTemps, 55 kBranchFusing, 56 kSuppressExceptionEdges, 57 kSuppressMethodInlining, 58 }; 59 60 // Force code generation paths for testing. 61 enum debugControlVector { 62 kDebugVerbose, 63 kDebugDumpCFG, 64 kDebugSlowFieldPath, 65 kDebugSlowInvokePath, 66 kDebugSlowStringPath, 67 kDebugSlowTypePath, 68 kDebugSlowestFieldPath, 69 kDebugSlowestStringPath, 70 kDebugExerciseResolveMethod, 71 kDebugVerifyDataflow, 72 kDebugShowMemoryUsage, 73 kDebugShowNops, 74 kDebugCountOpcodes, 75 kDebugDumpCheckStats, 76 kDebugDumpBitcodeFile, 77 kDebugVerifyBitcode, 78 kDebugShowSummaryMemoryUsage, 79 kDebugShowFilterStats, 80 kDebugTimings, 81 kDebugCodegenDump 82 }; 83 84 class LLVMInfo { 85 public: 86 LLVMInfo(); 87 ~LLVMInfo(); 88 89 ::llvm::LLVMContext* GetLLVMContext() { 90 return llvm_context_.get(); 91 } 92 93 ::llvm::Module* GetLLVMModule() { 94 return llvm_module_; 95 } 96 97 art::llvm::IntrinsicHelper* GetIntrinsicHelper() { 98 return intrinsic_helper_.get(); 99 } 100 101 art::llvm::IRBuilder* GetIRBuilder() { 102 return ir_builder_.get(); 103 } 104 105 private: 106 std::unique_ptr< ::llvm::LLVMContext> llvm_context_; 107 ::llvm::Module* llvm_module_; // Managed by context_. 108 std::unique_ptr<art::llvm::IntrinsicHelper> intrinsic_helper_; 109 std::unique_ptr<art::llvm::IRBuilder> ir_builder_; 110 }; 111 112 class CompiledMethod; 113 class CompilerDriver; 114 115 } // namespace art 116 117 extern "C" art::CompiledMethod* ArtCompileMethod(art::CompilerDriver& driver, 118 const art::DexFile::CodeItem* code_item, 119 uint32_t access_flags, 120 art::InvokeType invoke_type, 121 uint16_t class_def_idx, 122 uint32_t method_idx, 123 jobject class_loader, 124 const art::DexFile& dex_file); 125 126 127 128 #endif // ART_COMPILER_DEX_FRONTEND_H_ 129