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;
2398137cca7eebca946b869b010fef2821c9bf4971Pirama Arumuga Nainarclass raw_pwrite_stream;
24b730e239619a546d93e5926ea92d698ab77ec7f6Stephen Hinesclass DataLayout;
25ade92778b99382413ff9c556c724dd3f447e5dfbZonr Changclass TargetMachine;
264a68b1cb89df9507584a51c3444aff99347afb74Stephen Hines
27dee928bc6675807469a05ebd00816063e2ecff25Stephen Hinesnamespace legacy {
28dee928bc6675807469a05ebd00816063e2ecff25Stephen Hinesclass PassManager;
29dee928bc6675807469a05ebd00816063e2ecff25Stephen Hines} // end namespace legacy
30dee928bc6675807469a05ebd00816063e2ecff25Stephen Hines
31ade92778b99382413ff9c556c724dd3f447e5dfbZonr Chang} // end namespace llvm
324a68b1cb89df9507584a51c3444aff99347afb74Stephen Hines
33ade92778b99382413ff9c556c724dd3f447e5dfbZonr Changnamespace bcc {
341f028c027b1df7fde0cd1a1eef9730856e8e5ae9Logan
35ade92778b99382413ff9c556c724dd3f447e5dfbZonr Changclass CompilerConfig;
36ade92778b99382413ff9c556c724dd3f447e5dfbZonr Changclass Script;
37ade92778b99382413ff9c556c724dd3f447e5dfbZonr Chang
38ade92778b99382413ff9c556c724dd3f447e5dfbZonr Chang//===----------------------------------------------------------------------===//
39ade92778b99382413ff9c556c724dd3f447e5dfbZonr Chang// Design of Compiler
40ade92778b99382413ff9c556c724dd3f447e5dfbZonr Chang//===----------------------------------------------------------------------===//
41ade92778b99382413ff9c556c724dd3f447e5dfbZonr Chang// 1. A compiler instance can be constructed provided an "initial config."
42ade92778b99382413ff9c556c724dd3f447e5dfbZonr Chang// 2. A compiler can later be re-configured using config().
43ade92778b99382413ff9c556c724dd3f447e5dfbZonr Chang// 3. Once config() is invoked, it'll re-create TargetMachine instance (i.e.,
44ade92778b99382413ff9c556c724dd3f447e5dfbZonr Chang//    mTarget) according to the configuration supplied. TargetMachine instance
45ade92778b99382413ff9c556c724dd3f447e5dfbZonr Chang//    is *shared* across the different calls to compile() before the next call
46ade92778b99382413ff9c556c724dd3f447e5dfbZonr Chang//    to config().
47ade92778b99382413ff9c556c724dd3f447e5dfbZonr Chang// 4. Once a compiler instance is created, you can use the compile() service
48ade92778b99382413ff9c556c724dd3f447e5dfbZonr Chang//    to compile the file over and over again. Each call uses TargetMachine
49ade92778b99382413ff9c556c724dd3f447e5dfbZonr Chang//    instance to construct the compilation passes.
50ade92778b99382413ff9c556c724dd3f447e5dfbZonr Changclass Compiler {
51ade92778b99382413ff9c556c724dd3f447e5dfbZonr Changpublic:
52ade92778b99382413ff9c556c724dd3f447e5dfbZonr Chang  enum ErrorCode {
53ade92778b99382413ff9c556c724dd3f447e5dfbZonr Chang    kSuccess,
54ade92778b99382413ff9c556c724dd3f447e5dfbZonr Chang
55ade92778b99382413ff9c556c724dd3f447e5dfbZonr Chang    kInvalidConfigNoTarget,
56ade92778b99382413ff9c556c724dd3f447e5dfbZonr Chang    kErrCreateTargetMachine,
57ade92778b99382413ff9c556c724dd3f447e5dfbZonr Chang    kErrSwitchTargetMachine,
58ade92778b99382413ff9c556c724dd3f447e5dfbZonr Chang    kErrNoTargetMachine,
59ade92778b99382413ff9c556c724dd3f447e5dfbZonr Chang    kErrMaterialization,
60ade92778b99382413ff9c556c724dd3f447e5dfbZonr Chang    kErrInvalidOutputFileState,
61ade92778b99382413ff9c556c724dd3f447e5dfbZonr Chang    kErrPrepareOutput,
62ade92778b99382413ff9c556c724dd3f447e5dfbZonr Chang    kPrepareCodeGenPass,
63ade92778b99382413ff9c556c724dd3f447e5dfbZonr Chang
64b4447cd2b14f53efd9102d28da48000be7b2d4fdChris Wailes    kErrCustomPasses,
65ade92778b99382413ff9c556c724dd3f447e5dfbZonr Chang
661e0557ae75ae780352845bd2ba0f4babdc5ae4e6Pirama Arumuga Nainar    kErrInvalidSource,
671e0557ae75ae780352845bd2ba0f4babdc5ae4e6Pirama Arumuga Nainar
68d2d5ee3893220cec256c829a4740a718232f84acPirama Arumuga Nainar    kIllegalGlobalFunction,
69d2d5ee3893220cec256c829a4740a718232f84acPirama Arumuga Nainar
7094350549959ebc4c9ec70803a418bec09ad27378David Gross    kErrInvalidTargetMachine,
7194350549959ebc4c9ec70803a418bec09ad27378David Gross
7294350549959ebc4c9ec70803a418bec09ad27378David Gross    kErrInvalidLayout
73ade92778b99382413ff9c556c724dd3f447e5dfbZonr Chang  };
74ade92778b99382413ff9c556c724dd3f447e5dfbZonr Chang
75ade92778b99382413ff9c556c724dd3f447e5dfbZonr Chang  static const char *GetErrorString(enum ErrorCode pErrCode);
76ade92778b99382413ff9c556c724dd3f447e5dfbZonr Chang
77ade92778b99382413ff9c556c724dd3f447e5dfbZonr Changprivate:
78ade92778b99382413ff9c556c724dd3f447e5dfbZonr Chang  llvm::TargetMachine *mTarget;
79b4447cd2b14f53efd9102d28da48000be7b2d4fdChris Wailes  // Optimization is enabled by default.
80b4447cd2b14f53efd9102d28da48000be7b2d4fdChris Wailes  bool mEnableOpt;
81b4447cd2b14f53efd9102d28da48000be7b2d4fdChris Wailes
8298137cca7eebca946b869b010fef2821c9bf4971Pirama Arumuga Nainar  enum ErrorCode runPasses(Script &pScript, llvm::raw_pwrite_stream &pResult);
83ade92778b99382413ff9c556c724dd3f447e5dfbZonr Chang
841bd9f627fa0affb457507e86b0b6684c695fe726Stephen Hines  bool addInternalizeSymbolsPass(Script &pScript, llvm::legacy::PassManager &pPM);
854e7a50685ae18a24087f6f2a51c604e71fab69e2Matt Wala  void addExpandKernelPass(llvm::legacy::PassManager &pPM);
8609c7a41f73602bec33e9d392cc959d78931f73c4Dean De Leo  void addDebugInfoPass(Script &pScript, llvm::legacy::PassManager &pPM);
875aefc98db2dc14a703ce3d4f134565b834686552David Gross  void addGlobalInfoPass(Script &pScript, llvm::legacy::PassManager &pPM);
885aefc98db2dc14a703ce3d4f134565b834686552David Gross  void addInvariantPass(llvm::legacy::PassManager &pPM);
895aefc98db2dc14a703ce3d4f134565b834686552David Gross  void addInvokeHelperPass(llvm::legacy::PassManager &pPM);
90ade92778b99382413ff9c556c724dd3f447e5dfbZonr Chang
91ade92778b99382413ff9c556c724dd3f447e5dfbZonr Changpublic:
92ade92778b99382413ff9c556c724dd3f447e5dfbZonr Chang  Compiler();
938a019dd0040bedf5078e4d18e06a244a675b80e8Chih-Hung Hsieh  explicit Compiler(const CompilerConfig &pConfig);
94ade92778b99382413ff9c556c724dd3f447e5dfbZonr Chang
95ade92778b99382413ff9c556c724dd3f447e5dfbZonr Chang  enum ErrorCode config(const CompilerConfig &pConfig);
96ade92778b99382413ff9c556c724dd3f447e5dfbZonr Chang
97ade92778b99382413ff9c556c724dd3f447e5dfbZonr Chang  // Compile a script and output the result to a LLVM stream.
9827fb7edfd3f53f52fba6ee81267c02f7896198a3Tobias Grosser  //
9927fb7edfd3f53f52fba6ee81267c02f7896198a3Tobias Grosser  // @param IRStream If not NULL, the LLVM-IR that is fed to code generation
10027fb7edfd3f53f52fba6ee81267c02f7896198a3Tobias Grosser  //                 will be written to IRStream.
10198137cca7eebca946b869b010fef2821c9bf4971Pirama Arumuga Nainar  enum ErrorCode compile(Script &pScript, llvm::raw_pwrite_stream &pResult,
10227fb7edfd3f53f52fba6ee81267c02f7896198a3Tobias Grosser                         llvm::raw_ostream *IRStream);
103ade92778b99382413ff9c556c724dd3f447e5dfbZonr Chang
1040dbd4fbaf5966b52e4382a748fd9c7c7b9b31f55Shih-wei Liao  const llvm::TargetMachine& getTargetMachine() const
1050dbd4fbaf5966b52e4382a748fd9c7c7b9b31f55Shih-wei Liao  { return *mTarget; }
1060dbd4fbaf5966b52e4382a748fd9c7c7b9b31f55Shih-wei Liao
107b4447cd2b14f53efd9102d28da48000be7b2d4fdChris Wailes  void enableOpt(bool pEnable = true)
108b4447cd2b14f53efd9102d28da48000be7b2d4fdChris Wailes  { mEnableOpt = pEnable; }
109ade92778b99382413ff9c556c724dd3f447e5dfbZonr Chang
110b4447cd2b14f53efd9102d28da48000be7b2d4fdChris Wailes  ~Compiler();
111ebff2ead4ad622ff1bd3f3c108790cead62fe7c7Pirama Arumuga Nainar
112ebff2ead4ad622ff1bd3f3c108790cead62fe7c7Pirama Arumuga Nainar  // Compare undefined external functions in pScript against a 'whitelist' of
113ebff2ead4ad622ff1bd3f3c108790cead62fe7c7Pirama Arumuga Nainar  // all RenderScript functions.  Returns error if any external function that is
114ebff2ead4ad622ff1bd3f3c108790cead62fe7c7Pirama Arumuga Nainar  // not in this whitelist is callable from the script.
115ebff2ead4ad622ff1bd3f3c108790cead62fe7c7Pirama Arumuga Nainar  enum ErrorCode screenGlobalFunctions(Script &pScript);
116d2d5ee3893220cec256c829a4740a718232f84acPirama Arumuga Nainar
117d2d5ee3893220cec256c829a4740a718232f84acPirama Arumuga Nainar  void translateGEPs(Script &pScript);
118ade92778b99382413ff9c556c724dd3f447e5dfbZonr Chang};
119ade92778b99382413ff9c556c724dd3f447e5dfbZonr Chang
120ade92778b99382413ff9c556c724dd3f447e5dfbZonr Chang} // end namespace bcc
121ade92778b99382413ff9c556c724dd3f447e5dfbZonr Chang
122c72c4ddfcd79c74f70713da91a69569451b5c19eZonr Chang#endif // BCC_COMPILER_H
123