Compiler.h revision 0dbd4fbaf5966b52e4382a748fd9c7c7b9b31f55
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;
23ade92778b99382413ff9c556c724dd3f447e5dfbZonr Changclass PassManager;
24ade92778b99382413ff9c556c724dd3f447e5dfbZonr Changclass TargetData;
25ade92778b99382413ff9c556c724dd3f447e5dfbZonr Changclass TargetMachine;
264a68b1cb89df9507584a51c3444aff99347afb74Stephen Hines
27ade92778b99382413ff9c556c724dd3f447e5dfbZonr Chang} // end namespace llvm
284a68b1cb89df9507584a51c3444aff99347afb74Stephen Hines
29ade92778b99382413ff9c556c724dd3f447e5dfbZonr Changnamespace bcc {
301f028c027b1df7fde0cd1a1eef9730856e8e5ae9Logan
31ade92778b99382413ff9c556c724dd3f447e5dfbZonr Changclass CompilerConfig;
32ade92778b99382413ff9c556c724dd3f447e5dfbZonr Changclass OutputFile;
33ade92778b99382413ff9c556c724dd3f447e5dfbZonr Changclass Script;
34ade92778b99382413ff9c556c724dd3f447e5dfbZonr Chang
35ade92778b99382413ff9c556c724dd3f447e5dfbZonr Chang//===----------------------------------------------------------------------===//
36ade92778b99382413ff9c556c724dd3f447e5dfbZonr Chang// Design of Compiler
37ade92778b99382413ff9c556c724dd3f447e5dfbZonr Chang//===----------------------------------------------------------------------===//
38ade92778b99382413ff9c556c724dd3f447e5dfbZonr Chang// 1. A compiler instance can be constructed provided an "initial config."
39ade92778b99382413ff9c556c724dd3f447e5dfbZonr Chang// 2. A compiler can later be re-configured using config().
40ade92778b99382413ff9c556c724dd3f447e5dfbZonr Chang// 3. Once config() is invoked, it'll re-create TargetMachine instance (i.e.,
41ade92778b99382413ff9c556c724dd3f447e5dfbZonr Chang//    mTarget) according to the configuration supplied. TargetMachine instance
42ade92778b99382413ff9c556c724dd3f447e5dfbZonr Chang//    is *shared* across the different calls to compile() before the next call
43ade92778b99382413ff9c556c724dd3f447e5dfbZonr Chang//    to config().
44ade92778b99382413ff9c556c724dd3f447e5dfbZonr Chang// 4. Once a compiler instance is created, you can use the compile() service
45ade92778b99382413ff9c556c724dd3f447e5dfbZonr Chang//    to compile the file over and over again. Each call uses TargetMachine
46ade92778b99382413ff9c556c724dd3f447e5dfbZonr Chang//    instance to construct the compilation passes.
47ade92778b99382413ff9c556c724dd3f447e5dfbZonr Changclass Compiler {
48ade92778b99382413ff9c556c724dd3f447e5dfbZonr Changpublic:
49ade92778b99382413ff9c556c724dd3f447e5dfbZonr Chang  enum ErrorCode {
50ade92778b99382413ff9c556c724dd3f447e5dfbZonr Chang    kSuccess,
51ade92778b99382413ff9c556c724dd3f447e5dfbZonr Chang
52ade92778b99382413ff9c556c724dd3f447e5dfbZonr Chang    kInvalidConfigNoTarget,
53ade92778b99382413ff9c556c724dd3f447e5dfbZonr Chang    kErrCreateTargetMachine,
54ade92778b99382413ff9c556c724dd3f447e5dfbZonr Chang    kErrSwitchTargetMachine,
55ade92778b99382413ff9c556c724dd3f447e5dfbZonr Chang    kErrNoTargetMachine,
56ade92778b99382413ff9c556c724dd3f447e5dfbZonr Chang    kErrTargetDataNoMemory,
57ade92778b99382413ff9c556c724dd3f447e5dfbZonr Chang    kErrMaterialization,
58ade92778b99382413ff9c556c724dd3f447e5dfbZonr Chang    kErrInvalidOutputFileState,
59ade92778b99382413ff9c556c724dd3f447e5dfbZonr Chang    kErrPrepareOutput,
60ade92778b99382413ff9c556c724dd3f447e5dfbZonr Chang    kPrepareCodeGenPass,
61ade92778b99382413ff9c556c724dd3f447e5dfbZonr Chang
62ade92778b99382413ff9c556c724dd3f447e5dfbZonr Chang    kErrHookBeforeAddLTOPasses,
63ade92778b99382413ff9c556c724dd3f447e5dfbZonr Chang    kErrHookAfterAddLTOPasses,
64ade92778b99382413ff9c556c724dd3f447e5dfbZonr Chang    kErrHookBeforeExecuteLTOPasses,
65ade92778b99382413ff9c556c724dd3f447e5dfbZonr Chang    kErrHookAfterExecuteLTOPasses,
66ade92778b99382413ff9c556c724dd3f447e5dfbZonr Chang
67ade92778b99382413ff9c556c724dd3f447e5dfbZonr Chang    kErrHookBeforeAddCodeGenPasses,
68ade92778b99382413ff9c556c724dd3f447e5dfbZonr Chang    kErrHookAfterAddCodeGenPasses,
69ade92778b99382413ff9c556c724dd3f447e5dfbZonr Chang    kErrHookBeforeExecuteCodeGenPasses,
70ade92778b99382413ff9c556c724dd3f447e5dfbZonr Chang    kErrHookAfterExecuteCodeGenPasses,
71ade92778b99382413ff9c556c724dd3f447e5dfbZonr Chang
72ade92778b99382413ff9c556c724dd3f447e5dfbZonr Chang    kMaxErrorCode,
73ade92778b99382413ff9c556c724dd3f447e5dfbZonr Chang  };
74ade92778b99382413ff9c556c724dd3f447e5dfbZonr Chang
75ade92778b99382413ff9c556c724dd3f447e5dfbZonr Chang  static const char *GetErrorString(enum ErrorCode pErrCode);
76ade92778b99382413ff9c556c724dd3f447e5dfbZonr Chang
77ade92778b99382413ff9c556c724dd3f447e5dfbZonr Changprivate:
78ade92778b99382413ff9c556c724dd3f447e5dfbZonr Chang  llvm::TargetMachine *mTarget;
79ade92778b99382413ff9c556c724dd3f447e5dfbZonr Chang  // LTO is enabled by default.
80ade92778b99382413ff9c556c724dd3f447e5dfbZonr Chang  bool mEnableLTO;
81ade92778b99382413ff9c556c724dd3f447e5dfbZonr Chang
82ade92778b99382413ff9c556c724dd3f447e5dfbZonr Chang  enum ErrorCode runLTO(Script &pScript);
83ade92778b99382413ff9c556c724dd3f447e5dfbZonr Chang  enum ErrorCode runCodeGen(Script &pScript, llvm::raw_ostream &pResult);
84ade92778b99382413ff9c556c724dd3f447e5dfbZonr Chang
85ade92778b99382413ff9c556c724dd3f447e5dfbZonr Changpublic:
86ade92778b99382413ff9c556c724dd3f447e5dfbZonr Chang  Compiler();
87ade92778b99382413ff9c556c724dd3f447e5dfbZonr Chang  Compiler(const CompilerConfig &pConfig);
88ade92778b99382413ff9c556c724dd3f447e5dfbZonr Chang
89ade92778b99382413ff9c556c724dd3f447e5dfbZonr Chang  enum ErrorCode config(const CompilerConfig &pConfig);
90ade92778b99382413ff9c556c724dd3f447e5dfbZonr Chang
91ade92778b99382413ff9c556c724dd3f447e5dfbZonr Chang  // Compile a script and output the result to a LLVM stream.
92ade92778b99382413ff9c556c724dd3f447e5dfbZonr Chang  enum ErrorCode compile(Script &pScript, llvm::raw_ostream &pResult);
93ade92778b99382413ff9c556c724dd3f447e5dfbZonr Chang
94ade92778b99382413ff9c556c724dd3f447e5dfbZonr Chang  // Compile a script and output the result to a file.
95ade92778b99382413ff9c556c724dd3f447e5dfbZonr Chang  enum ErrorCode compile(Script &pScript, OutputFile &pResult);
96ade92778b99382413ff9c556c724dd3f447e5dfbZonr Chang
970dbd4fbaf5966b52e4382a748fd9c7c7b9b31f55Shih-wei Liao  const llvm::TargetMachine& getTargetMachine() const
980dbd4fbaf5966b52e4382a748fd9c7c7b9b31f55Shih-wei Liao  { return *mTarget; }
990dbd4fbaf5966b52e4382a748fd9c7c7b9b31f55Shih-wei Liao
100ade92778b99382413ff9c556c724dd3f447e5dfbZonr Chang  void enableLTO(bool pEnable = true)
101ade92778b99382413ff9c556c724dd3f447e5dfbZonr Chang  { mEnableLTO = pEnable; }
102ade92778b99382413ff9c556c724dd3f447e5dfbZonr Chang
103ade92778b99382413ff9c556c724dd3f447e5dfbZonr Chang  virtual ~Compiler();
104ade92778b99382413ff9c556c724dd3f447e5dfbZonr Chang
105ade92778b99382413ff9c556c724dd3f447e5dfbZonr Changprotected:
106ade92778b99382413ff9c556c724dd3f447e5dfbZonr Chang  //===--------------------------------------------------------------------===//
107ade92778b99382413ff9c556c724dd3f447e5dfbZonr Chang  // Plugin callbacks for sub-class.
108ade92778b99382413ff9c556c724dd3f447e5dfbZonr Chang  //===--------------------------------------------------------------------===//
109ade92778b99382413ff9c556c724dd3f447e5dfbZonr Chang  // Called before adding first pass to code-generation passes.
110ade92778b99382413ff9c556c724dd3f447e5dfbZonr Chang  virtual bool beforeAddLTOPasses(Script &pScript, llvm::PassManager &pPM)
111ade92778b99382413ff9c556c724dd3f447e5dfbZonr Chang  { return true; }
112ade92778b99382413ff9c556c724dd3f447e5dfbZonr Chang
113ade92778b99382413ff9c556c724dd3f447e5dfbZonr Chang  // Called after adding last pass to code-generation passes.
114ade92778b99382413ff9c556c724dd3f447e5dfbZonr Chang  virtual bool afterAddLTOPasses(Script &pScript, llvm::PassManager &pPM)
115ade92778b99382413ff9c556c724dd3f447e5dfbZonr Chang  { return true; }
116ade92778b99382413ff9c556c724dd3f447e5dfbZonr Chang
117ade92778b99382413ff9c556c724dd3f447e5dfbZonr Chang  // Called before executing code-generation passes.
118ade92778b99382413ff9c556c724dd3f447e5dfbZonr Chang  virtual bool beforeExecuteLTOPasses(Script &pScript,
119ade92778b99382413ff9c556c724dd3f447e5dfbZonr Chang                                          llvm::PassManager &pPM)
120ade92778b99382413ff9c556c724dd3f447e5dfbZonr Chang  { return true; }
121ade92778b99382413ff9c556c724dd3f447e5dfbZonr Chang
122ade92778b99382413ff9c556c724dd3f447e5dfbZonr Chang  // Called after executing code-generation passes.
123ade92778b99382413ff9c556c724dd3f447e5dfbZonr Chang  virtual bool afterExecuteLTOPasses(Script &pScript)
124ade92778b99382413ff9c556c724dd3f447e5dfbZonr Chang  { return true; }
125ade92778b99382413ff9c556c724dd3f447e5dfbZonr Chang
126ade92778b99382413ff9c556c724dd3f447e5dfbZonr Chang  // Called before adding first pass to code-generation passes.
127ade92778b99382413ff9c556c724dd3f447e5dfbZonr Chang  virtual bool beforeAddCodeGenPasses(Script &pScript, llvm::PassManager &pPM)
128ade92778b99382413ff9c556c724dd3f447e5dfbZonr Chang  { return true; }
129ade92778b99382413ff9c556c724dd3f447e5dfbZonr Chang
130ade92778b99382413ff9c556c724dd3f447e5dfbZonr Chang  // Called after adding last pass to code-generation passes.
131ade92778b99382413ff9c556c724dd3f447e5dfbZonr Chang  virtual bool afterAddCodeGenPasses(Script &pScript, llvm::PassManager &pPM)
132ade92778b99382413ff9c556c724dd3f447e5dfbZonr Chang  { return true; }
133ade92778b99382413ff9c556c724dd3f447e5dfbZonr Chang
134ade92778b99382413ff9c556c724dd3f447e5dfbZonr Chang  // Called before executing code-generation passes.
135ade92778b99382413ff9c556c724dd3f447e5dfbZonr Chang  virtual bool beforeExecuteCodeGenPasses(Script &pScript,
136ade92778b99382413ff9c556c724dd3f447e5dfbZonr Chang                                          llvm::PassManager &pPM)
137ade92778b99382413ff9c556c724dd3f447e5dfbZonr Chang  { return true; }
138ade92778b99382413ff9c556c724dd3f447e5dfbZonr Chang
139ade92778b99382413ff9c556c724dd3f447e5dfbZonr Chang  // Called after executing code-generation passes.
140ade92778b99382413ff9c556c724dd3f447e5dfbZonr Chang  virtual bool afterExecuteCodeGenPasses(Script &pScript)
141ade92778b99382413ff9c556c724dd3f447e5dfbZonr Chang  { return true; }
142ade92778b99382413ff9c556c724dd3f447e5dfbZonr Chang};
143ade92778b99382413ff9c556c724dd3f447e5dfbZonr Chang
144ade92778b99382413ff9c556c724dd3f447e5dfbZonr Chang} // end namespace bcc
145ade92778b99382413ff9c556c724dd3f447e5dfbZonr Chang
146c72c4ddfcd79c74f70713da91a69569451b5c19eZonr Chang#endif // BCC_COMPILER_H
147