blob: 16f851eb9a0ec9510d896f61be23c0a103fd61d7 [file] [log] [blame]
Zonr Changc383a502010-10-12 01:52:08 +08001/*
2 * Copyright 2010, The Android Open Source Project
3 *
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
Stephen Hinese639eb52010-11-08 19:27:20 -080017#ifndef _FRAMEWORKS_COMPILE_SLANG_SLANG_H_ // NOLINT
18#define _FRAMEWORKS_COMPILE_SLANG_SLANG_H_
Shih-wei Liao462aefd2010-06-04 15:32:04 -070019
zonr6315f762010-10-05 15:35:14 +080020#include <cstdio>
21#include <string>
Ying Wange2e522f2010-09-01 13:24:01 -070022#include <vector>
Shih-wei Liao462aefd2010-06-04 15:32:04 -070023
Shih-wei Liao9ef2f782010-10-01 12:31:37 -070024#include "clang/Basic/TargetOptions.h"
Logan Chien9207a2e2011-10-21 15:39:28 +080025#include "clang/Lex/ModuleLoader.h"
Shih-wei Liao9ef2f782010-10-01 12:31:37 -070026
Stephen Hinese639eb52010-11-08 19:27:20 -080027#include "llvm/ADT/IntrusiveRefCntPtr.h"
28#include "llvm/ADT/OwningPtr.h"
29#include "llvm/ADT/StringRef.h"
30
mkopec1c460b372012-01-09 11:21:50 -050031#include "llvm/Target/TargetMachine.h"
32
zonr6315f762010-10-05 15:35:14 +080033#include "slang_diagnostic_buffer.h"
Stephen Hinese639eb52010-11-08 19:27:20 -080034#include "slang_pragma_recorder.h"
Shih-wei Liao462aefd2010-06-04 15:32:04 -070035
36namespace llvm {
Zonr Change8c263a2010-10-12 00:35:29 +080037 class tool_output_file;
Shih-wei Liao9ef2f782010-10-01 12:31:37 -070038}
Shih-wei Liao462aefd2010-06-04 15:32:04 -070039
40namespace clang {
Logan Chien9207a2e2011-10-21 15:39:28 +080041 class ASTConsumer;
42 class ASTContext;
43 class Backend;
44 class CodeGenOptions;
Zonr Chang3a9ca1f2010-10-06 17:52:56 +080045 class Diagnostic;
Logan Chien9207a2e2011-10-21 15:39:28 +080046 class DiagnosticsEngine;
Zonr Chang3a9ca1f2010-10-06 17:52:56 +080047 class FileManager;
Shih-wei Liaodf5bcce2011-02-28 18:39:23 -080048 class FileSystemOptions;
zonr6315f762010-10-05 15:35:14 +080049 class LangOptions;
Zonr Chang3a9ca1f2010-10-06 17:52:56 +080050 class Preprocessor;
Logan Chien9207a2e2011-10-21 15:39:28 +080051 class SourceManager;
Zonr Chang3a9ca1f2010-10-06 17:52:56 +080052 class TargetInfo;
Logan Chien9207a2e2011-10-21 15:39:28 +080053 class TargetOptions;
Stephen Hinese67239d2012-02-24 15:08:36 -080054} // namespace clang
Shih-wei Liao462aefd2010-06-04 15:32:04 -070055
56namespace slang {
57
Logan Chien9207a2e2011-10-21 15:39:28 +080058class Slang : public clang::ModuleLoader {
Shih-wei Liao9ef2f782010-10-01 12:31:37 -070059 static clang::LangOptions LangOpts;
60 static clang::CodeGenOptions CodeGenOpts;
Shih-wei Liao462aefd2010-06-04 15:32:04 -070061
Shih-wei Liao9ef2f782010-10-01 12:31:37 -070062 static bool GlobalInitialized;
Shih-wei Liao462aefd2010-06-04 15:32:04 -070063
Shih-wei Liao9ef2f782010-10-01 12:31:37 -070064 static void LLVMErrorHandler(void *UserData, const std::string &Message);
Shih-wei Liao462aefd2010-06-04 15:32:04 -070065
Zonr Chang3a9ca1f2010-10-06 17:52:56 +080066 public:
Logan Chien9207a2e2011-10-21 15:39:28 +080067 enum OutputType {
Stephen Hinescc0efad2010-10-04 16:13:02 -070068 OT_Dependency,
Zonr Chang3a9ca1f2010-10-06 17:52:56 +080069 OT_Assembly,
70 OT_LLVMAssembly,
71 OT_Bitcode,
72 OT_Nothing,
73 OT_Object,
74
75 OT_Default = OT_Bitcode
Logan Chien9207a2e2011-10-21 15:39:28 +080076 };
Zonr Chang3a9ca1f2010-10-06 17:52:56 +080077
Shih-wei Liao9ef2f782010-10-01 12:31:37 -070078 private:
Zonr Chang641558f2010-10-12 21:07:06 +080079 bool mInitialized;
80
Logan Chien9207a2e2011-10-21 15:39:28 +080081 // Diagnostics Mediator (An interface for both Producer and Consumer)
82 llvm::OwningPtr<clang::Diagnostic> mDiag;
83
Logan Chien9207a2e2011-10-21 15:39:28 +080084 // Diagnostics Engine (Producer and Diagnostics Reporter)
Stephen Hines8f4d9722011-12-05 14:14:42 -080085 clang::DiagnosticsEngine *mDiagEngine;
Logan Chien9207a2e2011-10-21 15:39:28 +080086
87 // Diagnostics Consumer
88 // NOTE: The ownership is taken by mDiagEngine after creation.
Zonr Chang3a9ca1f2010-10-06 17:52:56 +080089 DiagnosticBuffer *mDiagClient;
Logan Chien9207a2e2011-10-21 15:39:28 +080090
Shih-wei Liao9ef2f782010-10-01 12:31:37 -070091 // The target being compiled for
92 clang::TargetOptions mTargetOpts;
93 llvm::OwningPtr<clang::TargetInfo> mTarget;
Logan Chien9207a2e2011-10-21 15:39:28 +080094 void createTarget(std::string const &Triple, std::string const &CPU,
95 std::vector<std::string> const &Features);
Shih-wei Liao462aefd2010-06-04 15:32:04 -070096
Shih-wei Liao462aefd2010-06-04 15:32:04 -070097
Logan Chien9207a2e2011-10-21 15:39:28 +080098 // File manager (for prepocessor doing the job such as header file search)
Shih-wei Liao9ef2f782010-10-01 12:31:37 -070099 llvm::OwningPtr<clang::FileManager> mFileMgr;
Shih-wei Liaodf5bcce2011-02-28 18:39:23 -0800100 llvm::OwningPtr<clang::FileSystemOptions> mFileSysOpt;
Zonr Chang3a9ca1f2010-10-06 17:52:56 +0800101 void createFileManager();
Shih-wei Liao462aefd2010-06-04 15:32:04 -0700102
Logan Chien9207a2e2011-10-21 15:39:28 +0800103
104 // Source manager (responsible for the source code handling)
Shih-wei Liao9ef2f782010-10-01 12:31:37 -0700105 llvm::OwningPtr<clang::SourceManager> mSourceMgr;
Zonr Chang3a9ca1f2010-10-06 17:52:56 +0800106 void createSourceManager();
Shih-wei Liao462aefd2010-06-04 15:32:04 -0700107
Logan Chien9207a2e2011-10-21 15:39:28 +0800108
109 // Preprocessor (source code preprocessor)
Shih-wei Liao9ef2f782010-10-01 12:31:37 -0700110 llvm::OwningPtr<clang::Preprocessor> mPP;
111 void createPreprocessor();
Shih-wei Liao462aefd2010-06-04 15:32:04 -0700112
Logan Chien9207a2e2011-10-21 15:39:28 +0800113
114 // AST context (the context to hold long-lived AST nodes)
Shih-wei Liao9ef2f782010-10-01 12:31:37 -0700115 llvm::OwningPtr<clang::ASTContext> mASTContext;
Zonr Chang3a9ca1f2010-10-06 17:52:56 +0800116 void createASTContext();
Shih-wei Liao001fb6d2010-06-21 11:17:11 -0700117
Logan Chien9207a2e2011-10-21 15:39:28 +0800118
119 // AST consumer, responsible for code generation
Zonr Chang3a9ca1f2010-10-06 17:52:56 +0800120 llvm::OwningPtr<clang::ASTConsumer> mBackend;
Shih-wei Liao462aefd2010-06-04 15:32:04 -0700121
Logan Chien9207a2e2011-10-21 15:39:28 +0800122
123 // File names
Shih-wei Liao9ef2f782010-10-01 12:31:37 -0700124 std::string mInputFileName;
125 std::string mOutputFileName;
Shih-wei Liaob81c6a42010-10-10 14:15:00 -0700126
Stephen Hines0b7ef1a2010-10-07 16:36:59 -0700127 std::string mDepOutputFileName;
Stephen Hinescc0efad2010-10-04 16:13:02 -0700128 std::string mDepTargetBCFileName;
Shih-wei Liaob81c6a42010-10-10 14:15:00 -0700129 std::vector<std::string> mAdditionalDepTargets;
Stephen Hines4cc67fc2011-01-31 16:48:57 -0800130 std::vector<std::string> mGeneratedFileNames;
Shih-wei Liao462aefd2010-06-04 15:32:04 -0700131
Zonr Chang3a9ca1f2010-10-06 17:52:56 +0800132 OutputType mOT;
Shih-wei Liao462aefd2010-06-04 15:32:04 -0700133
Shih-wei Liao9ef2f782010-10-01 12:31:37 -0700134 // Output stream
Zonr Change8c263a2010-10-12 00:35:29 +0800135 llvm::OwningPtr<llvm::tool_output_file> mOS;
Logan Chien9207a2e2011-10-21 15:39:28 +0800136
Stephen Hines0b7ef1a2010-10-07 16:36:59 -0700137 // Dependency output stream
Zonr Change8c263a2010-10-12 00:35:29 +0800138 llvm::OwningPtr<llvm::tool_output_file> mDOS;
Shih-wei Liao462aefd2010-06-04 15:32:04 -0700139
Shih-wei Liao9ef2f782010-10-01 12:31:37 -0700140 std::vector<std::string> mIncludePaths;
Ying Wange2e522f2010-09-01 13:24:01 -0700141
Zonr Chang3a9ca1f2010-10-06 17:52:56 +0800142 protected:
143 PragmaList mPragmas;
144
Logan Chien9207a2e2011-10-21 15:39:28 +0800145 clang::DiagnosticsEngine &getDiagnostics() { return *mDiagEngine; }
146 clang::TargetInfo const &getTargetInfo() const { return *mTarget; }
147 clang::FileManager &getFileManager() { return *mFileMgr; }
148 clang::SourceManager &getSourceManager() { return *mSourceMgr; }
149 clang::Preprocessor &getPreprocessor() { return *mPP; }
150 clang::ASTContext &getASTContext() { return *mASTContext; }
Zonr Chang3a9ca1f2010-10-06 17:52:56 +0800151
Logan Chien9207a2e2011-10-21 15:39:28 +0800152 inline clang::TargetOptions const &getTargetOptions() const
Zonr Chang3a9ca1f2010-10-06 17:52:56 +0800153 { return mTargetOpts; }
154
155 virtual void initDiagnostic() {}
156 virtual void initPreprocessor() {}
157 virtual void initASTContext() {}
158
Logan Chien9207a2e2011-10-21 15:39:28 +0800159 virtual clang::ASTConsumer *
160 createBackend(const clang::CodeGenOptions& CodeGenOpts,
161 llvm::raw_ostream *OS,
162 OutputType OT);
Zonr Chang3a9ca1f2010-10-06 17:52:56 +0800163
Shih-wei Liao9ef2f782010-10-01 12:31:37 -0700164 public:
Shih-wei Liao9ef2f782010-10-01 12:31:37 -0700165 static const llvm::StringRef PragmaMetadataName;
Shih-wei Liao462aefd2010-06-04 15:32:04 -0700166
Shih-wei Liaob81c6a42010-10-10 14:15:00 -0700167 static void GlobalInitialization();
168
Zonr Chang641558f2010-10-12 21:07:06 +0800169 Slang();
170
171 void init(const std::string &Triple, const std::string &CPU,
Stephen Hines8f4d9722011-12-05 14:14:42 -0800172 const std::vector<std::string> &Features,
173 clang::DiagnosticsEngine *DiagEngine,
174 DiagnosticBuffer *DiagClient);
Shih-wei Liao462aefd2010-06-04 15:32:04 -0700175
Logan Chienac4e1852011-12-16 13:37:10 +0800176 virtual clang::Module *loadModule(clang::SourceLocation ImportLoc,
177 clang::ModuleIdPath Path,
178 clang::Module::NameVisibilityKind VK,
179 bool IsInclusionDirective);
Logan Chien9207a2e2011-10-21 15:39:28 +0800180
Zonr Chang3a9ca1f2010-10-06 17:52:56 +0800181 bool setInputSource(llvm::StringRef InputFile, const char *Text,
182 size_t TextLength);
Shih-wei Liao462aefd2010-06-04 15:32:04 -0700183
Zonr Chang3a9ca1f2010-10-06 17:52:56 +0800184 bool setInputSource(llvm::StringRef InputFile);
Shih-wei Liao462aefd2010-06-04 15:32:04 -0700185
Logan Chien9207a2e2011-10-21 15:39:28 +0800186 std::string const &getInputFileName() const { return mInputFileName; }
Ying Wange2e522f2010-09-01 13:24:01 -0700187
Logan Chien9207a2e2011-10-21 15:39:28 +0800188 void setIncludePaths(const std::vector<std::string> &IncludePaths) {
Shih-wei Liaob81c6a42010-10-10 14:15:00 -0700189 mIncludePaths = IncludePaths;
Shih-wei Liao9ef2f782010-10-01 12:31:37 -0700190 }
Shih-wei Liao462aefd2010-06-04 15:32:04 -0700191
Logan Chien9207a2e2011-10-21 15:39:28 +0800192 void setOutputType(OutputType OT) { mOT = OT; }
Shih-wei Liao462aefd2010-06-04 15:32:04 -0700193
Stephen Hines0b7ef1a2010-10-07 16:36:59 -0700194 bool setOutput(const char *OutputFile);
Logan Chien9207a2e2011-10-21 15:39:28 +0800195
196 std::string const &getOutputFileName() const {
Zonr Chang3a9ca1f2010-10-06 17:52:56 +0800197 return mOutputFileName;
Shih-wei Liao9ef2f782010-10-01 12:31:37 -0700198 }
Kirk Stewart1fd85792010-07-07 09:51:23 -0700199
Stephen Hines0b7ef1a2010-10-07 16:36:59 -0700200 bool setDepOutput(const char *OutputFile);
Logan Chien9207a2e2011-10-21 15:39:28 +0800201
202 void setDepTargetBC(const char *TargetBCFile) {
Shih-wei Liaob81c6a42010-10-10 14:15:00 -0700203 mDepTargetBCFileName = TargetBCFile;
204 }
Logan Chien9207a2e2011-10-21 15:39:28 +0800205
206 void setAdditionalDepTargets(
207 std::vector<std::string> const &AdditionalDepTargets) {
Shih-wei Liaob81c6a42010-10-10 14:15:00 -0700208 mAdditionalDepTargets = AdditionalDepTargets;
209 }
Logan Chien9207a2e2011-10-21 15:39:28 +0800210
211 void appendGeneratedFileName(std::string const &GeneratedFileName) {
Stephen Hines4cc67fc2011-01-31 16:48:57 -0800212 mGeneratedFileNames.push_back(GeneratedFileName);
213 }
Stephen Hinescc0efad2010-10-04 16:13:02 -0700214
215 int generateDepFile();
Logan Chien9207a2e2011-10-21 15:39:28 +0800216
Shih-wei Liao9ef2f782010-10-01 12:31:37 -0700217 int compile();
Shih-wei Liao462aefd2010-06-04 15:32:04 -0700218
Logan Chien9207a2e2011-10-21 15:39:28 +0800219 char const *getErrorMessage() { return mDiagClient->str().c_str(); }
Shih-wei Liao4c9f7422010-08-05 04:30:02 -0700220
mkopec1c460b372012-01-09 11:21:50 -0500221 void setDebugMetadataEmission(bool EmitDebug);
222
223 void setOptimizationLevel(llvm::CodeGenOpt::Level OptimizationLevel);
224
Shih-wei Liao9ef2f782010-10-01 12:31:37 -0700225 // Reset the slang compiler state such that it can be reused to compile
226 // another file
Zonr Chang3a9ca1f2010-10-06 17:52:56 +0800227 virtual void reset();
Shih-wei Liao462aefd2010-06-04 15:32:04 -0700228
Zonr Chang3a9ca1f2010-10-06 17:52:56 +0800229 virtual ~Slang();
Shih-wei Liao9ef2f782010-10-01 12:31:37 -0700230};
Shih-wei Liao462aefd2010-06-04 15:32:04 -0700231
Stephen Hinese639eb52010-11-08 19:27:20 -0800232} // namespace slang
233
234#endif // _FRAMEWORKS_COMPILE_SLANG_SLANG_H_ NOLINT