1d1fec81868a3567560a3868350e0a945248e925bShih-wei Liao/*
2d1fec81868a3567560a3868350e0a945248e925bShih-wei Liao * Copyright (C) 2012 The Android Open Source Project
3d1fec81868a3567560a3868350e0a945248e925bShih-wei Liao *
4d1fec81868a3567560a3868350e0a945248e925bShih-wei Liao * Licensed under the Apache License, Version 2.0 (the "License");
5d1fec81868a3567560a3868350e0a945248e925bShih-wei Liao * you may not use this file except in compliance with the License.
6d1fec81868a3567560a3868350e0a945248e925bShih-wei Liao * You may obtain a copy of the License at
7d1fec81868a3567560a3868350e0a945248e925bShih-wei Liao *
8d1fec81868a3567560a3868350e0a945248e925bShih-wei Liao *      http://www.apache.org/licenses/LICENSE-2.0
9d1fec81868a3567560a3868350e0a945248e925bShih-wei Liao *
10d1fec81868a3567560a3868350e0a945248e925bShih-wei Liao * Unless required by applicable law or agreed to in writing, software
11d1fec81868a3567560a3868350e0a945248e925bShih-wei Liao * distributed under the License is distributed on an "AS IS" BASIS,
12d1fec81868a3567560a3868350e0a945248e925bShih-wei Liao * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13d1fec81868a3567560a3868350e0a945248e925bShih-wei Liao * See the License for the specific language governing permissions and
14d1fec81868a3567560a3868350e0a945248e925bShih-wei Liao * limitations under the License.
15d1fec81868a3567560a3868350e0a945248e925bShih-wei Liao */
16d1fec81868a3567560a3868350e0a945248e925bShih-wei Liao
17fc0e3219edc9a5bf81b166e82fd5db2796eb6a0dBrian Carlstrom#ifndef ART_COMPILER_LLVM_COMPILER_LLVM_H_
18fc0e3219edc9a5bf81b166e82fd5db2796eb6a0dBrian Carlstrom#define ART_COMPILER_LLVM_COMPILER_LLVM_H_
19d1fec81868a3567560a3868350e0a945248e925bShih-wei Liao
20700a402244a1a423da4f3ba8032459f4b65fa18fIan Rogers#include <memory>
21700a402244a1a423da4f3ba8032459f4b65fa18fIan Rogers#include <string>
22700a402244a1a423da4f3ba8032459f4b65fa18fIan Rogers#include <utility>
23700a402244a1a423da4f3ba8032459f4b65fa18fIan Rogers#include <vector>
24700a402244a1a423da4f3ba8032459f4b65fa18fIan Rogers
25761600567d73b23324ae0251e871c15d6849ffd8Elliott Hughes#include "base/macros.h"
26d1fec81868a3567560a3868350e0a945248e925bShih-wei Liao#include "dex_file.h"
277940e44f4517de5e2634a7e07d58d0fb26160513Brian Carlstrom#include "driver/compiler_driver.h"
280f3c55331439970e01af67f80ac117c473bc04cfElliott Hughes#include "instruction_set.h"
292dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers#include "mirror/object.h"
30d1fec81868a3567560a3868350e0a945248e925bShih-wei Liao
31d1fec81868a3567560a3868350e0a945248e925bShih-wei Liaonamespace art {
32d1fec81868a3567560a3868350e0a945248e925bShih-wei Liao  class CompiledMethod;
331212a022fa5f8ef9585d765b1809521812af882cIan Rogers  class CompilerDriver;
3489756f21c107d96e6d1bbc75811bd33078c8ceeeIan Rogers  class DexCompilationUnit;
352dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers  namespace mirror {
36ea46f950e7a51585db293cd7f047de190a482414Brian Carlstrom    class ArtMethod;
372dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers    class ClassLoader;
382dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers  }  // namespace mirror
392dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers}  // namespace art
40d1fec81868a3567560a3868350e0a945248e925bShih-wei Liao
41d1fec81868a3567560a3868350e0a945248e925bShih-wei Liao
42d1fec81868a3567560a3868350e0a945248e925bShih-wei Liaonamespace llvm {
43d1fec81868a3567560a3868350e0a945248e925bShih-wei Liao  class Function;
44d1fec81868a3567560a3868350e0a945248e925bShih-wei Liao  class LLVMContext;
45d1fec81868a3567560a3868350e0a945248e925bShih-wei Liao  class Module;
46d1fec81868a3567560a3868350e0a945248e925bShih-wei Liao  class PointerType;
47d1fec81868a3567560a3868350e0a945248e925bShih-wei Liao  class StructType;
48d1fec81868a3567560a3868350e0a945248e925bShih-wei Liao  class Type;
492dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers}  // namespace llvm
50d1fec81868a3567560a3868350e0a945248e925bShih-wei Liao
51d1fec81868a3567560a3868350e0a945248e925bShih-wei Liao
52d1fec81868a3567560a3868350e0a945248e925bShih-wei Liaonamespace art {
534c1c283a7410784e9cab309f868248690b788a9cIan Rogersnamespace llvm {
54d1fec81868a3567560a3868350e0a945248e925bShih-wei Liao
55641ce0371c2f0dc95d26be02d8366124c8b66653Brian Carlstromclass LlvmCompilationUnit;
56d1fec81868a3567560a3868350e0a945248e925bShih-wei Liaoclass IRBuilder;
57d1fec81868a3567560a3868350e0a945248e925bShih-wei Liao
58d1fec81868a3567560a3868350e0a945248e925bShih-wei Liaoclass CompilerLLVM {
59d1fec81868a3567560a3868350e0a945248e925bShih-wei Liao public:
601212a022fa5f8ef9585d765b1809521812af882cIan Rogers  CompilerLLVM(CompilerDriver* driver, InstructionSet insn_set);
61d1fec81868a3567560a3868350e0a945248e925bShih-wei Liao
62d1fec81868a3567560a3868350e0a945248e925bShih-wei Liao  ~CompilerLLVM();
63d1fec81868a3567560a3868350e0a945248e925bShih-wei Liao
641212a022fa5f8ef9585d765b1809521812af882cIan Rogers  CompilerDriver* GetCompiler() const {
651212a022fa5f8ef9585d765b1809521812af882cIan Rogers    return compiler_driver_;
66d1fec81868a3567560a3868350e0a945248e925bShih-wei Liao  }
67d1fec81868a3567560a3868350e0a945248e925bShih-wei Liao
68d1fec81868a3567560a3868350e0a945248e925bShih-wei Liao  InstructionSet GetInstructionSet() const {
69d1fec81868a3567560a3868350e0a945248e925bShih-wei Liao    return insn_set_;
70d1fec81868a3567560a3868350e0a945248e925bShih-wei Liao  }
71d1fec81868a3567560a3868350e0a945248e925bShih-wei Liao
723d504075f7c1204d581923460754bf6d3714b13fIan Rogers  void SetBitcodeFileName(const std::string& filename) {
738b977d38483aaa08abcbdaa5fa888076c1142169Logan Chien    bitcode_filename_ = filename;
74d1fec81868a3567560a3868350e0a945248e925bShih-wei Liao  }
75d1fec81868a3567560a3868350e0a945248e925bShih-wei Liao
7689756f21c107d96e6d1bbc75811bd33078c8ceeeIan Rogers  CompiledMethod* CompileDexMethod(DexCompilationUnit* dex_compilation_unit,
77bb33f2fa8e462937574a8cd1b744b86c2f762571Shih-wei Liao                                   InvokeType invoke_type);
78bb33f2fa8e462937574a8cd1b744b86c2f762571Shih-wei Liao
7989756f21c107d96e6d1bbc75811bd33078c8ceeeIan Rogers  CompiledMethod* CompileGBCMethod(DexCompilationUnit* dex_compilation_unit, std::string* func);
80d1fec81868a3567560a3868350e0a945248e925bShih-wei Liao
8189756f21c107d96e6d1bbc75811bd33078c8ceeeIan Rogers  CompiledMethod* CompileNativeMethod(DexCompilationUnit* dex_compilation_unit);
8288894ee835411de72025cd8a5d8d111a6f2a004aLogan Chien
83d1fec81868a3567560a3868350e0a945248e925bShih-wei Liao private:
84641ce0371c2f0dc95d26be02d8366124c8b66653Brian Carlstrom  LlvmCompilationUnit* AllocateCompilationUnit();
858b977d38483aaa08abcbdaa5fa888076c1142169Logan Chien
860d94eb659387bb797498918ac7e1a41f14b4a11bIan Rogers  CompilerDriver* const compiler_driver_;
87d1fec81868a3567560a3868350e0a945248e925bShih-wei Liao
880d94eb659387bb797498918ac7e1a41f14b4a11bIan Rogers  const InstructionSet insn_set_;
89d1fec81868a3567560a3868350e0a945248e925bShih-wei Liao
90265091e581c9f643b37e7966890911f09e223269Brian Carlstrom  Mutex next_cunit_id_lock_ DEFAULT_MUTEX_ACQUIRED_AFTER;
91265091e581c9f643b37e7966890911f09e223269Brian Carlstrom  size_t next_cunit_id_ GUARDED_BY(next_cunit_id_lock_);
92d1fec81868a3567560a3868350e0a945248e925bShih-wei Liao
938b977d38483aaa08abcbdaa5fa888076c1142169Logan Chien  std::string bitcode_filename_;
94d1fec81868a3567560a3868350e0a945248e925bShih-wei Liao
95d1fec81868a3567560a3868350e0a945248e925bShih-wei Liao  DISALLOW_COPY_AND_ASSIGN(CompilerLLVM);
96d1fec81868a3567560a3868350e0a945248e925bShih-wei Liao};
97d1fec81868a3567560a3868350e0a945248e925bShih-wei Liao
98d1fec81868a3567560a3868350e0a945248e925bShih-wei Liao
997934ac288acfb2552bb0b06ec1f61e5820d924a4Brian Carlstrom}  // namespace llvm
1007934ac288acfb2552bb0b06ec1f61e5820d924a4Brian Carlstrom}  // namespace art
101d1fec81868a3567560a3868350e0a945248e925bShih-wei Liao
102fc0e3219edc9a5bf81b166e82fd5db2796eb6a0dBrian Carlstrom#endif  // ART_COMPILER_LLVM_COMPILER_LLVM_H_
103