11f028c027b1df7fde0cd1a1eef9730856e8e5ae9Logan/*
2db169187dea4602e4ad32058762d23d474753fd0Stephen Hines * Copyright 2010-2012, The Android Open Source Project
31f028c027b1df7fde0cd1a1eef9730856e8e5ae9Logan *
41f028c027b1df7fde0cd1a1eef9730856e8e5ae9Logan * Licensed under the Apache License, Version 2.0 (the "License");
51f028c027b1df7fde0cd1a1eef9730856e8e5ae9Logan * you may not use this file except in compliance with the License.
61f028c027b1df7fde0cd1a1eef9730856e8e5ae9Logan * You may obtain a copy of the License at
71f028c027b1df7fde0cd1a1eef9730856e8e5ae9Logan *
81f028c027b1df7fde0cd1a1eef9730856e8e5ae9Logan *     http://www.apache.org/licenses/LICENSE-2.0
91f028c027b1df7fde0cd1a1eef9730856e8e5ae9Logan *
101f028c027b1df7fde0cd1a1eef9730856e8e5ae9Logan * Unless required by applicable law or agreed to in writing, software
111f028c027b1df7fde0cd1a1eef9730856e8e5ae9Logan * distributed under the License is distributed on an "AS IS" BASIS,
121f028c027b1df7fde0cd1a1eef9730856e8e5ae9Logan * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
131f028c027b1df7fde0cd1a1eef9730856e8e5ae9Logan * See the License for the specific language governing permissions and
141f028c027b1df7fde0cd1a1eef9730856e8e5ae9Logan * limitations under the License.
151f028c027b1df7fde0cd1a1eef9730856e8e5ae9Logan */
161f028c027b1df7fde0cd1a1eef9730856e8e5ae9Logan
17c72c4ddfcd79c74f70713da91a69569451b5c19eZonr Chang#ifndef BCC_COMPILER_H
18c72c4ddfcd79c74f70713da91a69569451b5c19eZonr Chang#define BCC_COMPILER_H
194a68b1cb89df9507584a51c3444aff99347afb74Stephen Hines
204a68b1cb89df9507584a51c3444aff99347afb74Stephen Hinesnamespace llvm {
214a68b1cb89df9507584a51c3444aff99347afb74Stephen Hines
22ade92778b99382413ff9c556c724dd3f447e5dfbZonr Changclass raw_ostream;
23b730e239619a546d93e5926ea92d698ab77ec7f6Stephen Hinesclass DataLayout;
24ade92778b99382413ff9c556c724dd3f447e5dfbZonr Changclass TargetMachine;
254a68b1cb89df9507584a51c3444aff99347afb74Stephen Hines
26dee928bc6675807469a05ebd00816063e2ecff25Stephen Hinesnamespace legacy {
27dee928bc6675807469a05ebd00816063e2ecff25Stephen Hinesclass PassManager;
28dee928bc6675807469a05ebd00816063e2ecff25Stephen Hines} // end namespace legacy
29dee928bc6675807469a05ebd00816063e2ecff25Stephen Hines
30dee928bc6675807469a05ebd00816063e2ecff25Stephen Hinesusing legacy::PassManager;
31dee928bc6675807469a05ebd00816063e2ecff25Stephen Hines
32ade92778b99382413ff9c556c724dd3f447e5dfbZonr Chang} // end namespace llvm
334a68b1cb89df9507584a51c3444aff99347afb74Stephen Hines
34ade92778b99382413ff9c556c724dd3f447e5dfbZonr Changnamespace bcc {
351f028c027b1df7fde0cd1a1eef9730856e8e5ae9Logan
36ade92778b99382413ff9c556c724dd3f447e5dfbZonr Changclass CompilerConfig;
37ade92778b99382413ff9c556c724dd3f447e5dfbZonr Changclass OutputFile;
38ade92778b99382413ff9c556c724dd3f447e5dfbZonr Changclass Script;
39ade92778b99382413ff9c556c724dd3f447e5dfbZonr Chang
40ade92778b99382413ff9c556c724dd3f447e5dfbZonr Chang//===----------------------------------------------------------------------===//
41ade92778b99382413ff9c556c724dd3f447e5dfbZonr Chang// Design of Compiler
42ade92778b99382413ff9c556c724dd3f447e5dfbZonr Chang//===----------------------------------------------------------------------===//
43ade92778b99382413ff9c556c724dd3f447e5dfbZonr Chang// 1. A compiler instance can be constructed provided an "initial config."
44ade92778b99382413ff9c556c724dd3f447e5dfbZonr Chang// 2. A compiler can later be re-configured using config().
45ade92778b99382413ff9c556c724dd3f447e5dfbZonr Chang// 3. Once config() is invoked, it'll re-create TargetMachine instance (i.e.,
46ade92778b99382413ff9c556c724dd3f447e5dfbZonr Chang//    mTarget) according to the configuration supplied. TargetMachine instance
47ade92778b99382413ff9c556c724dd3f447e5dfbZonr Chang//    is *shared* across the different calls to compile() before the next call
48ade92778b99382413ff9c556c724dd3f447e5dfbZonr Chang//    to config().
49ade92778b99382413ff9c556c724dd3f447e5dfbZonr Chang// 4. Once a compiler instance is created, you can use the compile() service
50ade92778b99382413ff9c556c724dd3f447e5dfbZonr Chang//    to compile the file over and over again. Each call uses TargetMachine
51ade92778b99382413ff9c556c724dd3f447e5dfbZonr Chang//    instance to construct the compilation passes.
52ade92778b99382413ff9c556c724dd3f447e5dfbZonr Changclass Compiler {
53ade92778b99382413ff9c556c724dd3f447e5dfbZonr Changpublic:
54ade92778b99382413ff9c556c724dd3f447e5dfbZonr Chang  enum ErrorCode {
55ade92778b99382413ff9c556c724dd3f447e5dfbZonr Chang    kSuccess,
56ade92778b99382413ff9c556c724dd3f447e5dfbZonr Chang
57ade92778b99382413ff9c556c724dd3f447e5dfbZonr Chang    kInvalidConfigNoTarget,
58ade92778b99382413ff9c556c724dd3f447e5dfbZonr Chang    kErrCreateTargetMachine,
59ade92778b99382413ff9c556c724dd3f447e5dfbZonr Chang    kErrSwitchTargetMachine,
60ade92778b99382413ff9c556c724dd3f447e5dfbZonr Chang    kErrNoTargetMachine,
61b730e239619a546d93e5926ea92d698ab77ec7f6Stephen Hines    kErrDataLayoutNoMemory,
62ade92778b99382413ff9c556c724dd3f447e5dfbZonr Chang    kErrMaterialization,
63ade92778b99382413ff9c556c724dd3f447e5dfbZonr Chang    kErrInvalidOutputFileState,
64ade92778b99382413ff9c556c724dd3f447e5dfbZonr Chang    kErrPrepareOutput,
65ade92778b99382413ff9c556c724dd3f447e5dfbZonr Chang    kPrepareCodeGenPass,
66ade92778b99382413ff9c556c724dd3f447e5dfbZonr Chang
67ade92778b99382413ff9c556c724dd3f447e5dfbZonr Chang    kErrHookBeforeAddLTOPasses,
68ade92778b99382413ff9c556c724dd3f447e5dfbZonr Chang    kErrHookAfterAddLTOPasses,
69ade92778b99382413ff9c556c724dd3f447e5dfbZonr Chang    kErrHookAfterExecuteLTOPasses,
70ade92778b99382413ff9c556c724dd3f447e5dfbZonr Chang
71ade92778b99382413ff9c556c724dd3f447e5dfbZonr Chang    kErrHookBeforeAddCodeGenPasses,
72ade92778b99382413ff9c556c724dd3f447e5dfbZonr Chang    kErrHookAfterAddCodeGenPasses,
73ade92778b99382413ff9c556c724dd3f447e5dfbZonr Chang    kErrHookBeforeExecuteCodeGenPasses,
74ade92778b99382413ff9c556c724dd3f447e5dfbZonr Chang    kErrHookAfterExecuteCodeGenPasses,
75ade92778b99382413ff9c556c724dd3f447e5dfbZonr Chang
765b7f52aff2030d520ee2ac6d3ac7d917f38d550cTobias Grosser    kErrInvalidSource
77ade92778b99382413ff9c556c724dd3f447e5dfbZonr Chang  };
78ade92778b99382413ff9c556c724dd3f447e5dfbZonr Chang
79ade92778b99382413ff9c556c724dd3f447e5dfbZonr Chang  static const char *GetErrorString(enum ErrorCode pErrCode);
80ade92778b99382413ff9c556c724dd3f447e5dfbZonr Chang
81ade92778b99382413ff9c556c724dd3f447e5dfbZonr Changprivate:
82ade92778b99382413ff9c556c724dd3f447e5dfbZonr Chang  llvm::TargetMachine *mTarget;
83ade92778b99382413ff9c556c724dd3f447e5dfbZonr Chang  // LTO is enabled by default.
84ade92778b99382413ff9c556c724dd3f447e5dfbZonr Chang  bool mEnableLTO;
85ade92778b99382413ff9c556c724dd3f447e5dfbZonr Chang
86ade92778b99382413ff9c556c724dd3f447e5dfbZonr Chang  enum ErrorCode runLTO(Script &pScript);
87ade92778b99382413ff9c556c724dd3f447e5dfbZonr Chang  enum ErrorCode runCodeGen(Script &pScript, llvm::raw_ostream &pResult);
88ade92778b99382413ff9c556c724dd3f447e5dfbZonr Chang
89ade92778b99382413ff9c556c724dd3f447e5dfbZonr Changpublic:
90ade92778b99382413ff9c556c724dd3f447e5dfbZonr Chang  Compiler();
91ade92778b99382413ff9c556c724dd3f447e5dfbZonr Chang  Compiler(const CompilerConfig &pConfig);
92ade92778b99382413ff9c556c724dd3f447e5dfbZonr Chang
93ade92778b99382413ff9c556c724dd3f447e5dfbZonr Chang  enum ErrorCode config(const CompilerConfig &pConfig);
94ade92778b99382413ff9c556c724dd3f447e5dfbZonr Chang
95ade92778b99382413ff9c556c724dd3f447e5dfbZonr Chang  // Compile a script and output the result to a LLVM stream.
9627fb7edfd3f53f52fba6ee81267c02f7896198a3Tobias Grosser  //
9727fb7edfd3f53f52fba6ee81267c02f7896198a3Tobias Grosser  // @param IRStream If not NULL, the LLVM-IR that is fed to code generation
9827fb7edfd3f53f52fba6ee81267c02f7896198a3Tobias Grosser  //                 will be written to IRStream.
9927fb7edfd3f53f52fba6ee81267c02f7896198a3Tobias Grosser  enum ErrorCode compile(Script &pScript, llvm::raw_ostream &pResult,
10027fb7edfd3f53f52fba6ee81267c02f7896198a3Tobias Grosser                         llvm::raw_ostream *IRStream);
101ade92778b99382413ff9c556c724dd3f447e5dfbZonr Chang
102ade92778b99382413ff9c556c724dd3f447e5dfbZonr Chang  // Compile a script and output the result to a file.
10327fb7edfd3f53f52fba6ee81267c02f7896198a3Tobias Grosser  enum ErrorCode compile(Script &pScript, OutputFile &pResult,
10427fb7edfd3f53f52fba6ee81267c02f7896198a3Tobias Grosser                         llvm::raw_ostream *IRStream = 0);
105ade92778b99382413ff9c556c724dd3f447e5dfbZonr Chang
1060dbd4fbaf5966b52e4382a748fd9c7c7b9b31f55Shih-wei Liao  const llvm::TargetMachine& getTargetMachine() const
1070dbd4fbaf5966b52e4382a748fd9c7c7b9b31f55Shih-wei Liao  { return *mTarget; }
1080dbd4fbaf5966b52e4382a748fd9c7c7b9b31f55Shih-wei Liao
109ade92778b99382413ff9c556c724dd3f447e5dfbZonr Chang  void enableLTO(bool pEnable = true)
110ade92778b99382413ff9c556c724dd3f447e5dfbZonr Chang  { mEnableLTO = pEnable; }
111ade92778b99382413ff9c556c724dd3f447e5dfbZonr Chang
112ade92778b99382413ff9c556c724dd3f447e5dfbZonr Chang  virtual ~Compiler();
113ade92778b99382413ff9c556c724dd3f447e5dfbZonr Chang
114ade92778b99382413ff9c556c724dd3f447e5dfbZonr Changprotected:
115ade92778b99382413ff9c556c724dd3f447e5dfbZonr Chang  //===--------------------------------------------------------------------===//
116ade92778b99382413ff9c556c724dd3f447e5dfbZonr Chang  // Plugin callbacks for sub-class.
117ade92778b99382413ff9c556c724dd3f447e5dfbZonr Chang  //===--------------------------------------------------------------------===//
118ade92778b99382413ff9c556c724dd3f447e5dfbZonr Chang  // Called before adding first pass to code-generation passes.
119ade92778b99382413ff9c556c724dd3f447e5dfbZonr Chang  virtual bool beforeAddLTOPasses(Script &pScript, llvm::PassManager &pPM)
120ade92778b99382413ff9c556c724dd3f447e5dfbZonr Chang  { return true; }
121ade92778b99382413ff9c556c724dd3f447e5dfbZonr Chang
122ade92778b99382413ff9c556c724dd3f447e5dfbZonr Chang  // Called after adding last pass to code-generation passes.
123ade92778b99382413ff9c556c724dd3f447e5dfbZonr Chang  virtual bool afterAddLTOPasses(Script &pScript, llvm::PassManager &pPM)
124ade92778b99382413ff9c556c724dd3f447e5dfbZonr Chang  { return true; }
125ade92778b99382413ff9c556c724dd3f447e5dfbZonr Chang
126ade92778b99382413ff9c556c724dd3f447e5dfbZonr Chang  // Called before executing code-generation passes.
127ade92778b99382413ff9c556c724dd3f447e5dfbZonr Chang  virtual bool beforeExecuteLTOPasses(Script &pScript,
128ade92778b99382413ff9c556c724dd3f447e5dfbZonr Chang                                          llvm::PassManager &pPM)
129ade92778b99382413ff9c556c724dd3f447e5dfbZonr Chang  { return true; }
130ade92778b99382413ff9c556c724dd3f447e5dfbZonr Chang
131ade92778b99382413ff9c556c724dd3f447e5dfbZonr Chang  // Called after executing code-generation passes.
132ade92778b99382413ff9c556c724dd3f447e5dfbZonr Chang  virtual bool afterExecuteLTOPasses(Script &pScript)
133ade92778b99382413ff9c556c724dd3f447e5dfbZonr Chang  { return true; }
134ade92778b99382413ff9c556c724dd3f447e5dfbZonr Chang
135ade92778b99382413ff9c556c724dd3f447e5dfbZonr Chang  // Called before adding first pass to code-generation passes.
136ade92778b99382413ff9c556c724dd3f447e5dfbZonr Chang  virtual bool beforeAddCodeGenPasses(Script &pScript, llvm::PassManager &pPM)
137ade92778b99382413ff9c556c724dd3f447e5dfbZonr Chang  { return true; }
138ade92778b99382413ff9c556c724dd3f447e5dfbZonr Chang
139ade92778b99382413ff9c556c724dd3f447e5dfbZonr Chang  // Called after adding last pass to code-generation passes.
140ade92778b99382413ff9c556c724dd3f447e5dfbZonr Chang  virtual bool afterAddCodeGenPasses(Script &pScript, llvm::PassManager &pPM)
141ade92778b99382413ff9c556c724dd3f447e5dfbZonr Chang  { return true; }
142ade92778b99382413ff9c556c724dd3f447e5dfbZonr Chang
143ade92778b99382413ff9c556c724dd3f447e5dfbZonr Chang  // Called before executing code-generation passes.
144ade92778b99382413ff9c556c724dd3f447e5dfbZonr Chang  virtual bool beforeExecuteCodeGenPasses(Script &pScript,
145ade92778b99382413ff9c556c724dd3f447e5dfbZonr Chang                                          llvm::PassManager &pPM)
146ade92778b99382413ff9c556c724dd3f447e5dfbZonr Chang  { return true; }
147ade92778b99382413ff9c556c724dd3f447e5dfbZonr Chang
148ade92778b99382413ff9c556c724dd3f447e5dfbZonr Chang  // Called after executing code-generation passes.
149ade92778b99382413ff9c556c724dd3f447e5dfbZonr Chang  virtual bool afterExecuteCodeGenPasses(Script &pScript)
150ade92778b99382413ff9c556c724dd3f447e5dfbZonr Chang  { return true; }
151ade92778b99382413ff9c556c724dd3f447e5dfbZonr Chang};
152ade92778b99382413ff9c556c724dd3f447e5dfbZonr Chang
153ade92778b99382413ff9c556c724dd3f447e5dfbZonr Chang} // end namespace bcc
154ade92778b99382413ff9c556c724dd3f447e5dfbZonr Chang
155c72c4ddfcd79c74f70713da91a69569451b5c19eZonr Chang#endif // BCC_COMPILER_H
156