compiler_ir.h revision 7940e44f4517de5e2634a7e07d58d0fb26160513
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 17395116cae130c983498c0a2f42b89e42f75bb9d0buzbee#ifndef ART_SRC_COMPILER_DEX_COMPILER_IR_H_ 18395116cae130c983498c0a2f42b89e42f75bb9d0buzbee#define ART_SRC_COMPILER_DEX_COMPILER_IR_H_ 1967bf885d62b1473c833bece1c9e0bb624e6ba391buzbee 20a0e180632411f7fe0edf454e571c42209ee7b540Elliott Hughes#include <vector> 2137d4879df243f7a2161b5416fad299ad1d495131Brian Carlstrom#include <llvm/IR/Module.h> 227940e44f4517de5e2634a7e07d58d0fb26160513Brian Carlstrom#include "arena_allocator.h" 231fd3346740dfb7f47be9922312b68a4227fada96buzbee#include "backend.h" 24cbd6d44c0a94f3d26671b5325aa21bbf1335ffe8buzbee#include "compiler_enums.h" 257940e44f4517de5e2634a7e07d58d0fb26160513Brian Carlstrom#include "dex/quick/mir_to_lir.h" 26265091e581c9f643b37e7966890911f09e223269Brian Carlstrom#include "dex_instruction.h" 277940e44f4517de5e2634a7e07d58d0fb26160513Brian Carlstrom#include "driver/compiler_driver.h" 287940e44f4517de5e2634a7e07d58d0fb26160513Brian Carlstrom#include "driver/dex_compilation_unit.h" 297940e44f4517de5e2634a7e07d58d0fb26160513Brian Carlstrom#include "llvm/intrinsic_helper.h" 307940e44f4517de5e2634a7e07d58d0fb26160513Brian Carlstrom#include "llvm/ir_builder.h" 31265091e581c9f643b37e7966890911f09e223269Brian Carlstrom#include "safe_map.h" 3267bf885d62b1473c833bece1c9e0bb624e6ba391buzbee 3311d1b0c31ddd710d26068da8e0e4621002205b4bElliott Hughesnamespace art { 3411d1b0c31ddd710d26068da8e0e4621002205b4bElliott Hughes 35eaf09bc65f9a10d12befcdb239156938c9bceef2buzbeeclass LLVMInfo; 36265091e581c9f643b37e7966890911f09e223269Brian Carlstromnamespace llvm { 37265091e581c9f643b37e7966890911f09e223269Brian Carlstromclass LlvmCompilationUnit; 38265091e581c9f643b37e7966890911f09e223269Brian Carlstrom} // namespace llvm 39eaf09bc65f9a10d12befcdb239156938c9bceef2buzbee 40ba938cbb8d73a0dcf151dfaec4662496da6afdbfbuzbeestruct ArenaMemBlock; 41ba938cbb8d73a0dcf151dfaec4662496da6afdbfbuzbeestruct Memstats; 42311ca169f4727d46a55bdc8dfa0059719fa72b65buzbeeclass MIRGraph; 431fd3346740dfb7f47be9922312b68a4227fada96buzbeeclass Mir2Lir; 445b53710b4abcf8f35c91a963a475b72cb34757e6buzbee 45719ace4734f519c67fd2c1ff7a232c079309a615Elliott Hughesstruct CompilationUnit { 46e52e49b32f5cf862a414da63e5dbd2eb04ad758eElliott Hughes CompilationUnit() 47311ca169f4727d46a55bdc8dfa0059719fa72b65buzbee : compiler_driver(NULL), 48a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee class_linker(NULL), 49a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee dex_file(NULL), 50a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee class_loader(NULL), 51fffdb023275613612a22ec62b3421ffe4d2b73feIan Rogers class_def_idx(0), 52a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee method_idx(0), 53a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee code_item(NULL), 54a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee access_flags(0), 5508f753d5859936f8d3524e9e4faa6cee353873eaIan Rogers invoke_type(kDirect), 56a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee shorty(NULL), 57fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee disable_opt(0), 58fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee enable_debug(0), 59fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee verbose(false), 601fd3346740dfb7f47be9922312b68a4227fada96buzbee compiler_backend(kNoBackend), 61fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee instruction_set(kNone), 62fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee num_dalvik_registers(0), 63311ca169f4727d46a55bdc8dfa0059719fa72b65buzbee insns(NULL), 64fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee num_ins(0), 65fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee num_outs(0), 66fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee num_regs(0), 67fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee num_compiler_temps(0), 68fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee compiler_flip_match(false), 69311ca169f4727d46a55bdc8dfa0059719fa72b65buzbee mir_graph(NULL), 701fd3346740dfb7f47be9922312b68a4227fada96buzbee cg(NULL) {} 71311ca169f4727d46a55bdc8dfa0059719fa72b65buzbee /* 72311ca169f4727d46a55bdc8dfa0059719fa72b65buzbee * Fields needed/generated by common frontend and generally used throughout 73311ca169f4727d46a55bdc8dfa0059719fa72b65buzbee * the compiler. 74311ca169f4727d46a55bdc8dfa0059719fa72b65buzbee */ 751212a022fa5f8ef9585d765b1809521812af882cIan Rogers CompilerDriver* compiler_driver; 7602031b185b4653e6c72e21f7a51238b903f6d638buzbee ClassLinker* class_linker; // Linker to resolve fields and methods. 7702031b185b4653e6c72e21f7a51238b903f6d638buzbee const DexFile* dex_file; // DexFile containing the method being compiled. 7802031b185b4653e6c72e21f7a51238b903f6d638buzbee jobject class_loader; // compiling method's class loader. 79fffdb023275613612a22ec62b3421ffe4d2b73feIan Rogers uint32_t class_def_idx; // compiling method's defining class definition index. 8002031b185b4653e6c72e21f7a51238b903f6d638buzbee uint32_t method_idx; // compiling method's index into method_ids of DexFile. 8102031b185b4653e6c72e21f7a51238b903f6d638buzbee const DexFile::CodeItem* code_item; // compiling method's DexFile code_item. 8202031b185b4653e6c72e21f7a51238b903f6d638buzbee uint32_t access_flags; // compiling method's access flags. 8302031b185b4653e6c72e21f7a51238b903f6d638buzbee InvokeType invoke_type; // compiling method's invocation type. 8402031b185b4653e6c72e21f7a51238b903f6d638buzbee const char* shorty; // compiling method's shorty. 8502031b185b4653e6c72e21f7a51238b903f6d638buzbee uint32_t disable_opt; // opt_control_vector flags. 8602031b185b4653e6c72e21f7a51238b903f6d638buzbee uint32_t enable_debug; // debugControlVector flags. 87311ca169f4727d46a55bdc8dfa0059719fa72b65buzbee bool verbose; 881fd3346740dfb7f47be9922312b68a4227fada96buzbee CompilerBackend compiler_backend; 89fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee InstructionSet instruction_set; 90a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee 911fd3346740dfb7f47be9922312b68a4227fada96buzbee // TODO: much of this info available elsewhere. Go to the original source? 9202031b185b4653e6c72e21f7a51238b903f6d638buzbee int num_dalvik_registers; // method->registers_size. 93311ca169f4727d46a55bdc8dfa0059719fa72b65buzbee const uint16_t* insns; 94fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee int num_ins; 95fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee int num_outs; 9602031b185b4653e6c72e21f7a51238b903f6d638buzbee int num_regs; // Unlike num_dalvik_registers, does not include ins. 971fd3346740dfb7f47be9922312b68a4227fada96buzbee 981fd3346740dfb7f47be9922312b68a4227fada96buzbee // TODO: may want to move this to MIRGraph. 99fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee int num_compiler_temps; 1001fd3346740dfb7f47be9922312b68a4227fada96buzbee 101a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee // If non-empty, apply optimizer/debug flags only to matching methods. 102fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee std::string compiler_method_match; 103fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee // Flips sense of compiler_method_match - apply flags if doesn't match. 104fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee bool compiler_flip_match; 1051fd3346740dfb7f47be9922312b68a4227fada96buzbee 1061fd3346740dfb7f47be9922312b68a4227fada96buzbee // TODO: move memory management to mir_graph, or just switch to using standard containers. 107862a76027076c341c26aa6cd4a30a7cdd6dc2143buzbee ArenaAllocator arena; 108265091e581c9f643b37e7966890911f09e223269Brian Carlstrom 1091fd3346740dfb7f47be9922312b68a4227fada96buzbee UniquePtr<MIRGraph> mir_graph; // MIR container. 1101fd3346740dfb7f47be9922312b68a4227fada96buzbee UniquePtr<Backend> cg; // Target-specific codegen. 11116da88c70c4bdbd97b8482be8b42103a52f22d59buzbee}; 11216da88c70c4bdbd97b8482be8b42103a52f22d59buzbee 11311d1b0c31ddd710d26068da8e0e4621002205b4bElliott Hughes} // namespace art 11411d1b0c31ddd710d26068da8e0e4621002205b4bElliott Hughes 115395116cae130c983498c0a2f42b89e42f75bb9d0buzbee#endif // ART_SRC_COMPILER_DEX_COMPILER_IR_H_ 116