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