blob: a60c5c75e6bd22c12a2a0f4f206e9233c6d27a0e [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
Stephen Hines23c43582013-01-09 20:02:04 -080024// Terrible workaround for TargetOptions.h not using llvm::RefCountedBase!
25#include "llvm/ADT/IntrusiveRefCntPtr.h"
26using llvm::RefCountedBase;
27
Shih-wei Liao9ef2f782010-10-01 12:31:37 -070028#include "clang/Basic/TargetOptions.h"
Logan Chien9207a2e2011-10-21 15:39:28 +080029#include "clang/Lex/ModuleLoader.h"
Shih-wei Liao9ef2f782010-10-01 12:31:37 -070030
Stephen Hinese639eb52010-11-08 19:27:20 -080031#include "llvm/ADT/OwningPtr.h"
32#include "llvm/ADT/StringRef.h"
33
mkopec1c460b372012-01-09 11:21:50 -050034#include "llvm/Target/TargetMachine.h"
35
zonr6315f762010-10-05 15:35:14 +080036#include "slang_diagnostic_buffer.h"
Stephen Hinese639eb52010-11-08 19:27:20 -080037#include "slang_pragma_recorder.h"
Shih-wei Liao462aefd2010-06-04 15:32:04 -070038
39namespace llvm {
Zonr Change8c263a2010-10-12 00:35:29 +080040 class tool_output_file;
Shih-wei Liao9ef2f782010-10-01 12:31:37 -070041}
Shih-wei Liao462aefd2010-06-04 15:32:04 -070042
43namespace clang {
Logan Chien9207a2e2011-10-21 15:39:28 +080044 class ASTConsumer;
45 class ASTContext;
46 class Backend;
47 class CodeGenOptions;
Zonr Chang3a9ca1f2010-10-06 17:52:56 +080048 class Diagnostic;
Logan Chien9207a2e2011-10-21 15:39:28 +080049 class DiagnosticsEngine;
Zonr Chang3a9ca1f2010-10-06 17:52:56 +080050 class FileManager;
Shih-wei Liaodf5bcce2011-02-28 18:39:23 -080051 class FileSystemOptions;
zonr6315f762010-10-05 15:35:14 +080052 class LangOptions;
Zonr Chang3a9ca1f2010-10-06 17:52:56 +080053 class Preprocessor;
Logan Chien9207a2e2011-10-21 15:39:28 +080054 class SourceManager;
Zonr Chang3a9ca1f2010-10-06 17:52:56 +080055 class TargetInfo;
Stephen Hinese67239d2012-02-24 15:08:36 -080056} // namespace clang
Shih-wei Liao462aefd2010-06-04 15:32:04 -070057
58namespace slang {
59
Logan Chien9207a2e2011-10-21 15:39:28 +080060class Slang : public clang::ModuleLoader {
Shih-wei Liao9ef2f782010-10-01 12:31:37 -070061 static clang::LangOptions LangOpts;
62 static clang::CodeGenOptions CodeGenOpts;
Shih-wei Liao462aefd2010-06-04 15:32:04 -070063
Shih-wei Liao9ef2f782010-10-01 12:31:37 -070064 static bool GlobalInitialized;
Shih-wei Liao462aefd2010-06-04 15:32:04 -070065
Stephen Hines4b3f3ba2013-05-06 16:18:56 -070066 static void LLVMErrorHandler(void *UserData, const std::string &Message,
67 bool GenCrashDialog);
Shih-wei Liao462aefd2010-06-04 15:32:04 -070068
Zonr Chang3a9ca1f2010-10-06 17:52:56 +080069 public:
Logan Chien9207a2e2011-10-21 15:39:28 +080070 enum OutputType {
Stephen Hinescc0efad2010-10-04 16:13:02 -070071 OT_Dependency,
Zonr Chang3a9ca1f2010-10-06 17:52:56 +080072 OT_Assembly,
73 OT_LLVMAssembly,
74 OT_Bitcode,
75 OT_Nothing,
76 OT_Object,
77
78 OT_Default = OT_Bitcode
Logan Chien9207a2e2011-10-21 15:39:28 +080079 };
Zonr Chang3a9ca1f2010-10-06 17:52:56 +080080
Shih-wei Liao9ef2f782010-10-01 12:31:37 -070081 private:
Zonr Chang641558f2010-10-12 21:07:06 +080082 bool mInitialized;
83
Logan Chien9207a2e2011-10-21 15:39:28 +080084 // Diagnostics Mediator (An interface for both Producer and Consumer)
85 llvm::OwningPtr<clang::Diagnostic> mDiag;
86
Logan Chien9207a2e2011-10-21 15:39:28 +080087 // Diagnostics Engine (Producer and Diagnostics Reporter)
Stephen Hines8f4d9722011-12-05 14:14:42 -080088 clang::DiagnosticsEngine *mDiagEngine;
Logan Chien9207a2e2011-10-21 15:39:28 +080089
90 // Diagnostics Consumer
91 // NOTE: The ownership is taken by mDiagEngine after creation.
Zonr Chang3a9ca1f2010-10-06 17:52:56 +080092 DiagnosticBuffer *mDiagClient;
Logan Chien9207a2e2011-10-21 15:39:28 +080093
Shih-wei Liao9ef2f782010-10-01 12:31:37 -070094 // The target being compiled for
Stephen Hines23c43582013-01-09 20:02:04 -080095 llvm::IntrusiveRefCntPtr<clang::TargetOptions> mTargetOpts;
Shih-wei Liao9ef2f782010-10-01 12:31:37 -070096 llvm::OwningPtr<clang::TargetInfo> mTarget;
Logan Chien9207a2e2011-10-21 15:39:28 +080097 void createTarget(std::string const &Triple, std::string const &CPU,
98 std::vector<std::string> const &Features);
Shih-wei Liao462aefd2010-06-04 15:32:04 -070099
Shih-wei Liao462aefd2010-06-04 15:32:04 -0700100
Logan Chien9207a2e2011-10-21 15:39:28 +0800101 // File manager (for prepocessor doing the job such as header file search)
Shih-wei Liao9ef2f782010-10-01 12:31:37 -0700102 llvm::OwningPtr<clang::FileManager> mFileMgr;
Shih-wei Liaodf5bcce2011-02-28 18:39:23 -0800103 llvm::OwningPtr<clang::FileSystemOptions> mFileSysOpt;
Zonr Chang3a9ca1f2010-10-06 17:52:56 +0800104 void createFileManager();
Shih-wei Liao462aefd2010-06-04 15:32:04 -0700105
Logan Chien9207a2e2011-10-21 15:39:28 +0800106
107 // Source manager (responsible for the source code handling)
Shih-wei Liao9ef2f782010-10-01 12:31:37 -0700108 llvm::OwningPtr<clang::SourceManager> mSourceMgr;
Zonr Chang3a9ca1f2010-10-06 17:52:56 +0800109 void createSourceManager();
Shih-wei Liao462aefd2010-06-04 15:32:04 -0700110
Logan Chien9207a2e2011-10-21 15:39:28 +0800111
112 // Preprocessor (source code preprocessor)
Shih-wei Liao9ef2f782010-10-01 12:31:37 -0700113 llvm::OwningPtr<clang::Preprocessor> mPP;
114 void createPreprocessor();
Shih-wei Liao462aefd2010-06-04 15:32:04 -0700115
Logan Chien9207a2e2011-10-21 15:39:28 +0800116
117 // AST context (the context to hold long-lived AST nodes)
Shih-wei Liao9ef2f782010-10-01 12:31:37 -0700118 llvm::OwningPtr<clang::ASTContext> mASTContext;
Zonr Chang3a9ca1f2010-10-06 17:52:56 +0800119 void createASTContext();
Shih-wei Liao001fb6d2010-06-21 11:17:11 -0700120
Logan Chien9207a2e2011-10-21 15:39:28 +0800121
122 // AST consumer, responsible for code generation
Zonr Chang3a9ca1f2010-10-06 17:52:56 +0800123 llvm::OwningPtr<clang::ASTConsumer> mBackend;
Shih-wei Liao462aefd2010-06-04 15:32:04 -0700124
Logan Chien9207a2e2011-10-21 15:39:28 +0800125
126 // File names
Shih-wei Liao9ef2f782010-10-01 12:31:37 -0700127 std::string mInputFileName;
128 std::string mOutputFileName;
Shih-wei Liaob81c6a42010-10-10 14:15:00 -0700129
Stephen Hines0b7ef1a2010-10-07 16:36:59 -0700130 std::string mDepOutputFileName;
Stephen Hinescc0efad2010-10-04 16:13:02 -0700131 std::string mDepTargetBCFileName;
Shih-wei Liaob81c6a42010-10-10 14:15:00 -0700132 std::vector<std::string> mAdditionalDepTargets;
Stephen Hines4cc67fc2011-01-31 16:48:57 -0800133 std::vector<std::string> mGeneratedFileNames;
Shih-wei Liao462aefd2010-06-04 15:32:04 -0700134
Zonr Chang3a9ca1f2010-10-06 17:52:56 +0800135 OutputType mOT;
Shih-wei Liao462aefd2010-06-04 15:32:04 -0700136
Shih-wei Liao9ef2f782010-10-01 12:31:37 -0700137 // Output stream
Zonr Change8c263a2010-10-12 00:35:29 +0800138 llvm::OwningPtr<llvm::tool_output_file> mOS;
Logan Chien9207a2e2011-10-21 15:39:28 +0800139
Stephen Hines0b7ef1a2010-10-07 16:36:59 -0700140 // Dependency output stream
Zonr Change8c263a2010-10-12 00:35:29 +0800141 llvm::OwningPtr<llvm::tool_output_file> mDOS;
Shih-wei Liao462aefd2010-06-04 15:32:04 -0700142
Shih-wei Liao9ef2f782010-10-01 12:31:37 -0700143 std::vector<std::string> mIncludePaths;
Ying Wange2e522f2010-09-01 13:24:01 -0700144
Zonr Chang3a9ca1f2010-10-06 17:52:56 +0800145 protected:
146 PragmaList mPragmas;
147
Logan Chien9207a2e2011-10-21 15:39:28 +0800148 clang::DiagnosticsEngine &getDiagnostics() { return *mDiagEngine; }
149 clang::TargetInfo const &getTargetInfo() const { return *mTarget; }
150 clang::FileManager &getFileManager() { return *mFileMgr; }
151 clang::SourceManager &getSourceManager() { return *mSourceMgr; }
152 clang::Preprocessor &getPreprocessor() { return *mPP; }
153 clang::ASTContext &getASTContext() { return *mASTContext; }
Zonr Chang3a9ca1f2010-10-06 17:52:56 +0800154
Logan Chien9207a2e2011-10-21 15:39:28 +0800155 inline clang::TargetOptions const &getTargetOptions() const
Stephen Hines23c43582013-01-09 20:02:04 -0800156 { return *mTargetOpts.getPtr(); }
Zonr Chang3a9ca1f2010-10-06 17:52:56 +0800157
158 virtual void initDiagnostic() {}
159 virtual void initPreprocessor() {}
160 virtual void initASTContext() {}
161
Logan Chien9207a2e2011-10-21 15:39:28 +0800162 virtual clang::ASTConsumer *
163 createBackend(const clang::CodeGenOptions& CodeGenOpts,
164 llvm::raw_ostream *OS,
165 OutputType OT);
Zonr Chang3a9ca1f2010-10-06 17:52:56 +0800166
Shih-wei Liao9ef2f782010-10-01 12:31:37 -0700167 public:
Shih-wei Liao9ef2f782010-10-01 12:31:37 -0700168 static const llvm::StringRef PragmaMetadataName;
Shih-wei Liao462aefd2010-06-04 15:32:04 -0700169
Shih-wei Liaob81c6a42010-10-10 14:15:00 -0700170 static void GlobalInitialization();
171
Zonr Chang641558f2010-10-12 21:07:06 +0800172 Slang();
173
174 void init(const std::string &Triple, const std::string &CPU,
Stephen Hines8f4d9722011-12-05 14:14:42 -0800175 const std::vector<std::string> &Features,
176 clang::DiagnosticsEngine *DiagEngine,
177 DiagnosticBuffer *DiagClient);
Shih-wei Liao462aefd2010-06-04 15:32:04 -0700178
Stephen Hines23c43582013-01-09 20:02:04 -0800179 virtual clang::ModuleLoadResult loadModule(
180 clang::SourceLocation ImportLoc,
181 clang::ModuleIdPath Path,
182 clang::Module::NameVisibilityKind VK,
183 bool IsInclusionDirective);
Logan Chien9207a2e2011-10-21 15:39:28 +0800184
Zonr Chang3a9ca1f2010-10-06 17:52:56 +0800185 bool setInputSource(llvm::StringRef InputFile, const char *Text,
186 size_t TextLength);
Shih-wei Liao462aefd2010-06-04 15:32:04 -0700187
Zonr Chang3a9ca1f2010-10-06 17:52:56 +0800188 bool setInputSource(llvm::StringRef InputFile);
Shih-wei Liao462aefd2010-06-04 15:32:04 -0700189
Logan Chien9207a2e2011-10-21 15:39:28 +0800190 std::string const &getInputFileName() const { return mInputFileName; }
Ying Wange2e522f2010-09-01 13:24:01 -0700191
Logan Chien9207a2e2011-10-21 15:39:28 +0800192 void setIncludePaths(const std::vector<std::string> &IncludePaths) {
Shih-wei Liaob81c6a42010-10-10 14:15:00 -0700193 mIncludePaths = IncludePaths;
Shih-wei Liao9ef2f782010-10-01 12:31:37 -0700194 }
Shih-wei Liao462aefd2010-06-04 15:32:04 -0700195
Logan Chien9207a2e2011-10-21 15:39:28 +0800196 void setOutputType(OutputType OT) { mOT = OT; }
Shih-wei Liao462aefd2010-06-04 15:32:04 -0700197
Stephen Hines0b7ef1a2010-10-07 16:36:59 -0700198 bool setOutput(const char *OutputFile);
Logan Chien9207a2e2011-10-21 15:39:28 +0800199
200 std::string const &getOutputFileName() const {
Zonr Chang3a9ca1f2010-10-06 17:52:56 +0800201 return mOutputFileName;
Shih-wei Liao9ef2f782010-10-01 12:31:37 -0700202 }
Kirk Stewart1fd85792010-07-07 09:51:23 -0700203
Stephen Hines0b7ef1a2010-10-07 16:36:59 -0700204 bool setDepOutput(const char *OutputFile);
Logan Chien9207a2e2011-10-21 15:39:28 +0800205
206 void setDepTargetBC(const char *TargetBCFile) {
Shih-wei Liaob81c6a42010-10-10 14:15:00 -0700207 mDepTargetBCFileName = TargetBCFile;
208 }
Logan Chien9207a2e2011-10-21 15:39:28 +0800209
210 void setAdditionalDepTargets(
211 std::vector<std::string> const &AdditionalDepTargets) {
Shih-wei Liaob81c6a42010-10-10 14:15:00 -0700212 mAdditionalDepTargets = AdditionalDepTargets;
213 }
Logan Chien9207a2e2011-10-21 15:39:28 +0800214
215 void appendGeneratedFileName(std::string const &GeneratedFileName) {
Stephen Hines4cc67fc2011-01-31 16:48:57 -0800216 mGeneratedFileNames.push_back(GeneratedFileName);
217 }
Stephen Hinescc0efad2010-10-04 16:13:02 -0700218
219 int generateDepFile();
Logan Chien9207a2e2011-10-21 15:39:28 +0800220
Shih-wei Liao9ef2f782010-10-01 12:31:37 -0700221 int compile();
Shih-wei Liao462aefd2010-06-04 15:32:04 -0700222
Logan Chien9207a2e2011-10-21 15:39:28 +0800223 char const *getErrorMessage() { return mDiagClient->str().c_str(); }
Shih-wei Liao4c9f7422010-08-05 04:30:02 -0700224
mkopec1c460b372012-01-09 11:21:50 -0500225 void setDebugMetadataEmission(bool EmitDebug);
226
227 void setOptimizationLevel(llvm::CodeGenOpt::Level OptimizationLevel);
228
Shih-wei Liao9ef2f782010-10-01 12:31:37 -0700229 // Reset the slang compiler state such that it can be reused to compile
230 // another file
Zonr Chang3a9ca1f2010-10-06 17:52:56 +0800231 virtual void reset();
Shih-wei Liao462aefd2010-06-04 15:32:04 -0700232
Zonr Chang3a9ca1f2010-10-06 17:52:56 +0800233 virtual ~Slang();
Shih-wei Liao9ef2f782010-10-01 12:31:37 -0700234};
Shih-wei Liao462aefd2010-06-04 15:32:04 -0700235
Stephen Hinese639eb52010-11-08 19:27:20 -0800236} // namespace slang
237
238#endif // _FRAMEWORKS_COMPILE_SLANG_SLANG_H_ NOLINT