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