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