167bf885d62b1473c833bece1c9e0bb624e6ba391buzbee/* 267bf885d62b1473c833bece1c9e0bb624e6ba391buzbee * Copyright (C) 2011 The Android Open Source Project 367bf885d62b1473c833bece1c9e0bb624e6ba391buzbee * 467bf885d62b1473c833bece1c9e0bb624e6ba391buzbee * Licensed under the Apache License, Version 2.0 (the "License"); 567bf885d62b1473c833bece1c9e0bb624e6ba391buzbee * you may not use this file except in compliance with the License. 667bf885d62b1473c833bece1c9e0bb624e6ba391buzbee * You may obtain a copy of the License at 767bf885d62b1473c833bece1c9e0bb624e6ba391buzbee * 867bf885d62b1473c833bece1c9e0bb624e6ba391buzbee * http://www.apache.org/licenses/LICENSE-2.0 967bf885d62b1473c833bece1c9e0bb624e6ba391buzbee * 1067bf885d62b1473c833bece1c9e0bb624e6ba391buzbee * Unless required by applicable law or agreed to in writing, software 1167bf885d62b1473c833bece1c9e0bb624e6ba391buzbee * distributed under the License is distributed on an "AS IS" BASIS, 1267bf885d62b1473c833bece1c9e0bb624e6ba391buzbee * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1367bf885d62b1473c833bece1c9e0bb624e6ba391buzbee * See the License for the specific language governing permissions and 1467bf885d62b1473c833bece1c9e0bb624e6ba391buzbee * limitations under the License. 1567bf885d62b1473c833bece1c9e0bb624e6ba391buzbee */ 1667bf885d62b1473c833bece1c9e0bb624e6ba391buzbee 17fc0e3219edc9a5bf81b166e82fd5db2796eb6a0dBrian Carlstrom#ifndef ART_COMPILER_DEX_FRONTEND_H_ 18fc0e3219edc9a5bf81b166e82fd5db2796eb6a0dBrian Carlstrom#define ART_COMPILER_DEX_FRONTEND_H_ 1967bf885d62b1473c833bece1c9e0bb624e6ba391buzbee 200571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers#include "dex_file.h" 21adb8c67f6d87a160d4e3a8afea7cb93f6c14568bElliott Hughes#include "dex_instruction.h" 220571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers 237467ee05012e1fd9834df74663c1ebda46f5636bDragos Sbirlea 247467ee05012e1fd9834df74663c1ebda46f5636bDragos Sbirlea 257467ee05012e1fd9834df74663c1ebda46f5636bDragos Sbirlea 267467ee05012e1fd9834df74663c1ebda46f5636bDragos Sbirlea 277467ee05012e1fd9834df74663c1ebda46f5636bDragos Sbirlea 28692be80cb2278ae585a776a163bc4b3ef60cae88buzbeenamespace llvm { 29692be80cb2278ae585a776a163bc4b3ef60cae88buzbee class Module; 30692be80cb2278ae585a776a163bc4b3ef60cae88buzbee class LLVMContext; 31692be80cb2278ae585a776a163bc4b3ef60cae88buzbee} 32692be80cb2278ae585a776a163bc4b3ef60cae88buzbee 3311d1b0c31ddd710d26068da8e0e4621002205b4bElliott Hughesnamespace art { 344c1c283a7410784e9cab309f868248690b788a9cIan Rogersnamespace llvm { 35692be80cb2278ae585a776a163bc4b3ef60cae88buzbee class IntrinsicHelper; 36692be80cb2278ae585a776a163bc4b3ef60cae88buzbee class IRBuilder; 37692be80cb2278ae585a776a163bc4b3ef60cae88buzbee} 3811d1b0c31ddd710d26068da8e0e4621002205b4bElliott Hughes 39e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee/* 40e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee * Assembly is an iterative process, and usually terminates within 41e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee * two or three passes. This should be high enough to handle bizarre 42e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee * cases, but detect an infinite loop bug. 43e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee */ 44e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee#define MAX_ASSEMBLER_RETRIES 50 45e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee 4602031b185b4653e6c72e21f7a51238b903f6d638buzbee// Suppress optimization if corresponding bit set. 47fa57c47f1b72916371a9c2d5c1389219bce655b4buzbeeenum opt_control_vector { 48a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee kLoadStoreElimination = 0, 49a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee kLoadHoisting, 50a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee kSuppressLoads, 51a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee kNullCheckElimination, 52a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee kPromoteRegs, 53a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee kTrackLiveTemps, 54a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee kSafeOptimizations, 55a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee kBBOpt, 56a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee kMatch, 57a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee kPromoteCompilerTemps, 581fd3346740dfb7f47be9922312b68a4227fada96buzbee kBranchFusing, 59ce30293d222c864fa281da98bc896dd1c98a9a16buzbee}; 60ce30293d222c864fa281da98bc896dd1c98a9a16buzbee 6102031b185b4653e6c72e21f7a51238b903f6d638buzbee// Force code generation paths for testing. 62ce30293d222c864fa281da98bc896dd1c98a9a16buzbeeenum debugControlVector { 63a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee kDebugVerbose, 64a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee kDebugDumpCFG, 65a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee kDebugSlowFieldPath, 66a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee kDebugSlowInvokePath, 67a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee kDebugSlowStringPath, 68a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee kDebugSlowTypePath, 69a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee kDebugSlowestFieldPath, 70a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee kDebugSlowestStringPath, 71a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee kDebugExerciseResolveMethod, 72a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee kDebugVerifyDataflow, 73a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee kDebugShowMemoryUsage, 74a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee kDebugShowNops, 75a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee kDebugCountOpcodes, 76d1643e41ef242ae656f667bf3c8b0324635cefd3buzbee kDebugDumpCheckStats, 77ad8f15e0b13383b2eaa2486b230debeae7a55661buzbee kDebugDumpBitcodeFile, 78c9f40dd0a3dba696fc694d51fb82b61dcff19066Bill Buzbee kDebugVerifyBitcode, 79a5abf7091711eed1e9f1d0e1538fe9963ebdf31cbuzbee kDebugShowSummaryMemoryUsage, 80ee17e0aa4d24deb11c1766bfcc6a864519df1c1ebuzbee kDebugShowFilterStats, 81ce30293d222c864fa281da98bc896dd1c98a9a16buzbee}; 82ce30293d222c864fa281da98bc896dd1c98a9a16buzbee 834df2bbdfe6602ce5f141b7b44028b95faa0bd8efbuzbeeclass LLVMInfo { 84692be80cb2278ae585a776a163bc4b3ef60cae88buzbee public: 854df2bbdfe6602ce5f141b7b44028b95faa0bd8efbuzbee LLVMInfo(); 864df2bbdfe6602ce5f141b7b44028b95faa0bd8efbuzbee ~LLVMInfo(); 87692be80cb2278ae585a776a163bc4b3ef60cae88buzbee 884c1c283a7410784e9cab309f868248690b788a9cIan Rogers ::llvm::LLVMContext* GetLLVMContext() { 89692be80cb2278ae585a776a163bc4b3ef60cae88buzbee return llvm_context_.get(); 90692be80cb2278ae585a776a163bc4b3ef60cae88buzbee } 91692be80cb2278ae585a776a163bc4b3ef60cae88buzbee 924c1c283a7410784e9cab309f868248690b788a9cIan Rogers ::llvm::Module* GetLLVMModule() { 9355e5e6c5702e3f1f68bd83ae741af769740d9a74TDYa return llvm_module_; 94692be80cb2278ae585a776a163bc4b3ef60cae88buzbee } 95692be80cb2278ae585a776a163bc4b3ef60cae88buzbee 964c1c283a7410784e9cab309f868248690b788a9cIan Rogers art::llvm::IntrinsicHelper* GetIntrinsicHelper() { 97692be80cb2278ae585a776a163bc4b3ef60cae88buzbee return intrinsic_helper_.get(); 98692be80cb2278ae585a776a163bc4b3ef60cae88buzbee } 99692be80cb2278ae585a776a163bc4b3ef60cae88buzbee 1004c1c283a7410784e9cab309f868248690b788a9cIan Rogers art::llvm::IRBuilder* GetIRBuilder() { 101692be80cb2278ae585a776a163bc4b3ef60cae88buzbee return ir_builder_.get(); 102692be80cb2278ae585a776a163bc4b3ef60cae88buzbee } 103692be80cb2278ae585a776a163bc4b3ef60cae88buzbee 104692be80cb2278ae585a776a163bc4b3ef60cae88buzbee private: 1054c1c283a7410784e9cab309f868248690b788a9cIan Rogers UniquePtr< ::llvm::LLVMContext> llvm_context_; 1067934ac288acfb2552bb0b06ec1f61e5820d924a4Brian Carlstrom ::llvm::Module* llvm_module_; // Managed by context_. 1074c1c283a7410784e9cab309f868248690b788a9cIan Rogers UniquePtr<art::llvm::IntrinsicHelper> intrinsic_helper_; 1084c1c283a7410784e9cab309f868248690b788a9cIan Rogers UniquePtr<art::llvm::IRBuilder> ir_builder_; 109692be80cb2278ae585a776a163bc4b3ef60cae88buzbee}; 110692be80cb2278ae585a776a163bc4b3ef60cae88buzbee 11167bf885d62b1473c833bece1c9e0bb624e6ba391buzbeestruct CompilationUnit; 11267bf885d62b1473c833bece1c9e0bb624e6ba391buzbeestruct BasicBlock; 113eaf09bc65f9a10d12befcdb239156938c9bceef2buzbee 11411d1b0c31ddd710d26068da8e0e4621002205b4bElliott Hughes} // namespace art 11511d1b0c31ddd710d26068da8e0e4621002205b4bElliott Hughes 1161212a022fa5f8ef9585d765b1809521812af882cIan Rogersextern "C" art::CompiledMethod* ArtCompileMethod(art::CompilerDriver& driver, 117b3bd5f07884f5a1f2b84224363b1372d7c28d447Elliott Hughes const art::DexFile::CodeItem* code_item, 11808f753d5859936f8d3524e9e4faa6cee353873eaIan Rogers uint32_t access_flags, 11908f753d5859936f8d3524e9e4faa6cee353873eaIan Rogers art::InvokeType invoke_type, 120ee39a10e45a6a0880e8b829525c40d6055818560Ian Rogers uint16_t class_def_idx, 12108f753d5859936f8d3524e9e4faa6cee353873eaIan Rogers uint32_t method_idx, 12200f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers jobject class_loader, 123b3bd5f07884f5a1f2b84224363b1372d7c28d447Elliott Hughes const art::DexFile& dex_file); 124b3bd5f07884f5a1f2b84224363b1372d7c28d447Elliott Hughes 1257467ee05012e1fd9834df74663c1ebda46f5636bDragos Sbirlea 1267467ee05012e1fd9834df74663c1ebda46f5636bDragos Sbirlea 127fc0e3219edc9a5bf81b166e82fd5db2796eb6a0dBrian Carlstrom#endif // ART_COMPILER_DEX_FRONTEND_H_ 128