blob: 881ef5c5c17161247a0e8c0c0298ae4e0bbeec92 [file] [log] [blame]
Logan1f028c02010-11-27 01:02:48 +08001/*
Stephen Hinesdb169182012-01-05 18:46:36 -08002 * Copyright 2010-2012, The Android Open Source Project
Logan1f028c02010-11-27 01:02:48 +08003 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
Zonr Changc72c4dd2012-04-12 15:38:53 +080017#ifndef BCC_COMPILER_H
18#define BCC_COMPILER_H
Logan1f028c02010-11-27 01:02:48 +080019
Logan1f028c02010-11-27 01:02:48 +080020namespace llvm {
Logan1f028c02010-11-27 01:02:48 +080021
Zonr Changade92772012-04-13 15:58:24 +080022class raw_ostream;
23class PassManager;
24class TargetData;
25class TargetMachine;
26
27} // end namespace llvm
Logan1f028c02010-11-27 01:02:48 +080028
29namespace bcc {
30
Zonr Changade92772012-04-13 15:58:24 +080031class CompilerConfig;
32class OutputFile;
33class Script;
Logan1f028c02010-11-27 01:02:48 +080034
Zonr Changade92772012-04-13 15:58:24 +080035//===----------------------------------------------------------------------===//
36// Design of Compiler
37//===----------------------------------------------------------------------===//
38// 1. A compiler instance can be constructed provided an "initial config."
39// 2. A compiler can later be re-configured using config().
40// 3. Once config() is invoked, it'll re-create TargetMachine instance (i.e.,
41// mTarget) according to the configuration supplied. TargetMachine instance
42// is *shared* across the different calls to compile() before the next call
43// to config().
44// 4. Once a compiler instance is created, you can use the compile() service
45// to compile the file over and over again. Each call uses TargetMachine
46// instance to construct the compilation passes.
47class Compiler {
48public:
49 enum ErrorCode {
50 kSuccess,
Logan1f028c02010-11-27 01:02:48 +080051
Zonr Changade92772012-04-13 15:58:24 +080052 kInvalidConfigNoTarget,
53 kErrCreateTargetMachine,
54 kErrSwitchTargetMachine,
55 kErrNoTargetMachine,
56 kErrTargetDataNoMemory,
57 kErrMaterialization,
58 kErrInvalidOutputFileState,
59 kErrPrepareOutput,
60 kPrepareCodeGenPass,
Logan1f028c02010-11-27 01:02:48 +080061
Zonr Changade92772012-04-13 15:58:24 +080062 kErrHookBeforeAddLTOPasses,
63 kErrHookAfterAddLTOPasses,
64 kErrHookBeforeExecuteLTOPasses,
65 kErrHookAfterExecuteLTOPasses,
Logan1f028c02010-11-27 01:02:48 +080066
Zonr Changade92772012-04-13 15:58:24 +080067 kErrHookBeforeAddCodeGenPasses,
68 kErrHookAfterAddCodeGenPasses,
69 kErrHookBeforeExecuteCodeGenPasses,
70 kErrHookAfterExecuteCodeGenPasses,
Logan1f028c02010-11-27 01:02:48 +080071
Zonr Changade92772012-04-13 15:58:24 +080072 kMaxErrorCode,
73 };
Logan1f028c02010-11-27 01:02:48 +080074
Zonr Changade92772012-04-13 15:58:24 +080075 static const char *GetErrorString(enum ErrorCode pErrCode);
Logan1f028c02010-11-27 01:02:48 +080076
Zonr Changade92772012-04-13 15:58:24 +080077private:
78 llvm::TargetMachine *mTarget;
79 // LTO is enabled by default.
80 bool mEnableLTO;
Logan2a6dc822011-01-06 04:05:20 +080081
Zonr Changade92772012-04-13 15:58:24 +080082 enum ErrorCode runLTO(Script &pScript);
83 enum ErrorCode runCodeGen(Script &pScript, llvm::raw_ostream &pResult);
Logan1f028c02010-11-27 01:02:48 +080084
Zonr Changade92772012-04-13 15:58:24 +080085public:
86 Compiler();
87 Compiler(const CompilerConfig &pConfig);
Logan Chienda5e0c32011-06-13 03:47:21 +080088
Zonr Changade92772012-04-13 15:58:24 +080089 enum ErrorCode config(const CompilerConfig &pConfig);
Logan1f028c02010-11-27 01:02:48 +080090
Zonr Changade92772012-04-13 15:58:24 +080091 // Compile a script and output the result to a LLVM stream.
92 enum ErrorCode compile(Script &pScript, llvm::raw_ostream &pResult);
Logan1f028c02010-11-27 01:02:48 +080093
Zonr Changade92772012-04-13 15:58:24 +080094 // Compile a script and output the result to a file.
95 enum ErrorCode compile(Script &pScript, OutputFile &pResult);
Logan1f028c02010-11-27 01:02:48 +080096
Zonr Changade92772012-04-13 15:58:24 +080097 void enableLTO(bool pEnable = true)
98 { mEnableLTO = pEnable; }
Logan1f028c02010-11-27 01:02:48 +080099
Zonr Changade92772012-04-13 15:58:24 +0800100 virtual ~Compiler();
Loganecf4cbd2011-01-06 05:34:11 +0800101
Zonr Changade92772012-04-13 15:58:24 +0800102protected:
103 //===--------------------------------------------------------------------===//
104 // Plugin callbacks for sub-class.
105 //===--------------------------------------------------------------------===//
106 // Called before adding first pass to code-generation passes.
107 virtual bool beforeAddLTOPasses(Script &pScript, llvm::PassManager &pPM)
108 { return true; }
Logan Chien9347e0b2011-07-07 19:51:47 +0800109
Zonr Changade92772012-04-13 15:58:24 +0800110 // Called after adding last pass to code-generation passes.
111 virtual bool afterAddLTOPasses(Script &pScript, llvm::PassManager &pPM)
112 { return true; }
Shih-wei Liao4deffde2012-01-17 20:38:17 +0800113
Zonr Changade92772012-04-13 15:58:24 +0800114 // Called before executing code-generation passes.
115 virtual bool beforeExecuteLTOPasses(Script &pScript,
116 llvm::PassManager &pPM)
117 { return true; }
Logan1f028c02010-11-27 01:02:48 +0800118
Zonr Changade92772012-04-13 15:58:24 +0800119 // Called after executing code-generation passes.
120 virtual bool afterExecuteLTOPasses(Script &pScript)
121 { return true; }
Shih-wei Liao5e3e0ce2011-06-17 13:59:46 -0700122
Zonr Changade92772012-04-13 15:58:24 +0800123 // Called before adding first pass to code-generation passes.
124 virtual bool beforeAddCodeGenPasses(Script &pScript, llvm::PassManager &pPM)
125 { return true; }
Logan Chienda5e0c32011-06-13 03:47:21 +0800126
Zonr Changade92772012-04-13 15:58:24 +0800127 // Called after adding last pass to code-generation passes.
128 virtual bool afterAddCodeGenPasses(Script &pScript, llvm::PassManager &pPM)
129 { return true; }
Logan1f028c02010-11-27 01:02:48 +0800130
Zonr Changade92772012-04-13 15:58:24 +0800131 // Called before executing code-generation passes.
132 virtual bool beforeExecuteCodeGenPasses(Script &pScript,
133 llvm::PassManager &pPM)
134 { return true; }
Logan1f028c02010-11-27 01:02:48 +0800135
Zonr Changade92772012-04-13 15:58:24 +0800136 // Called after executing code-generation passes.
137 virtual bool afterExecuteCodeGenPasses(Script &pScript)
138 { return true; }
139};
Logan1f028c02010-11-27 01:02:48 +0800140
Zonr Changade92772012-04-13 15:58:24 +0800141} // end namespace bcc
Logan1f028c02010-11-27 01:02:48 +0800142
Zonr Changc72c4dd2012-04-12 15:38:53 +0800143#endif // BCC_COMPILER_H