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