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