blob: 6b162f402de2300651bbb5566b266acba8b4190a [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
zonr6315f762010-10-05 15:35:14 +080031#include "slang_diagnostic_buffer.h"
Stephen Hinese639eb52010-11-08 19:27:20 -080032#include "slang_pragma_recorder.h"
Shih-wei Liao462aefd2010-06-04 15:32:04 -070033
34namespace llvm {
Zonr Change8c263a2010-10-12 00:35:29 +080035 class tool_output_file;
Shih-wei Liao9ef2f782010-10-01 12:31:37 -070036}
Shih-wei Liao462aefd2010-06-04 15:32:04 -070037
38namespace clang {
Logan Chien9207a2e2011-10-21 15:39:28 +080039 class ASTConsumer;
40 class ASTContext;
41 class Backend;
42 class CodeGenOptions;
Zonr Chang3a9ca1f2010-10-06 17:52:56 +080043 class Diagnostic;
Logan Chien9207a2e2011-10-21 15:39:28 +080044 class DiagnosticsEngine;
Zonr Chang3a9ca1f2010-10-06 17:52:56 +080045 class FileManager;
Shih-wei Liaodf5bcce2011-02-28 18:39:23 -080046 class FileSystemOptions;
zonr6315f762010-10-05 15:35:14 +080047 class LangOptions;
Zonr Chang3a9ca1f2010-10-06 17:52:56 +080048 class Preprocessor;
Logan Chien9207a2e2011-10-21 15:39:28 +080049 class SourceManager;
Zonr Chang3a9ca1f2010-10-06 17:52:56 +080050 class TargetInfo;
Logan Chien9207a2e2011-10-21 15:39:28 +080051 class TargetOptions;
Stephen Hinese67239d2012-02-24 15:08:36 -080052} // namespace clang
Shih-wei Liao462aefd2010-06-04 15:32:04 -070053
54namespace slang {
55
Logan Chien9207a2e2011-10-21 15:39:28 +080056class Slang : public clang::ModuleLoader {
Shih-wei Liao9ef2f782010-10-01 12:31:37 -070057 static clang::LangOptions LangOpts;
58 static clang::CodeGenOptions CodeGenOpts;
Shih-wei Liao462aefd2010-06-04 15:32:04 -070059
Shih-wei Liao9ef2f782010-10-01 12:31:37 -070060 static bool GlobalInitialized;
Shih-wei Liao462aefd2010-06-04 15:32:04 -070061
Shih-wei Liao9ef2f782010-10-01 12:31:37 -070062 static void LLVMErrorHandler(void *UserData, const std::string &Message);
Shih-wei Liao462aefd2010-06-04 15:32:04 -070063
Zonr Chang3a9ca1f2010-10-06 17:52:56 +080064 public:
Logan Chien9207a2e2011-10-21 15:39:28 +080065 enum OutputType {
Stephen Hinescc0efad2010-10-04 16:13:02 -070066 OT_Dependency,
Zonr Chang3a9ca1f2010-10-06 17:52:56 +080067 OT_Assembly,
68 OT_LLVMAssembly,
69 OT_Bitcode,
70 OT_Nothing,
71 OT_Object,
72
73 OT_Default = OT_Bitcode
Logan Chien9207a2e2011-10-21 15:39:28 +080074 };
Zonr Chang3a9ca1f2010-10-06 17:52:56 +080075
Shih-wei Liao9ef2f782010-10-01 12:31:37 -070076 private:
Zonr Chang641558f2010-10-12 21:07:06 +080077 bool mInitialized;
78
Logan Chien9207a2e2011-10-21 15:39:28 +080079 // Diagnostics Mediator (An interface for both Producer and Consumer)
80 llvm::OwningPtr<clang::Diagnostic> mDiag;
81
Logan Chien9207a2e2011-10-21 15:39:28 +080082 // Diagnostics Engine (Producer and Diagnostics Reporter)
Stephen Hines8f4d9722011-12-05 14:14:42 -080083 clang::DiagnosticsEngine *mDiagEngine;
Logan Chien9207a2e2011-10-21 15:39:28 +080084
85 // Diagnostics Consumer
86 // NOTE: The ownership is taken by mDiagEngine after creation.
Zonr Chang3a9ca1f2010-10-06 17:52:56 +080087 DiagnosticBuffer *mDiagClient;
Logan Chien9207a2e2011-10-21 15:39:28 +080088
Shih-wei Liao9ef2f782010-10-01 12:31:37 -070089 // The target being compiled for
90 clang::TargetOptions mTargetOpts;
91 llvm::OwningPtr<clang::TargetInfo> mTarget;
Logan Chien9207a2e2011-10-21 15:39:28 +080092 void createTarget(std::string const &Triple, std::string const &CPU,
93 std::vector<std::string> const &Features);
Shih-wei Liao462aefd2010-06-04 15:32:04 -070094
Shih-wei Liao462aefd2010-06-04 15:32:04 -070095
Logan Chien9207a2e2011-10-21 15:39:28 +080096 // File manager (for prepocessor doing the job such as header file search)
Shih-wei Liao9ef2f782010-10-01 12:31:37 -070097 llvm::OwningPtr<clang::FileManager> mFileMgr;
Shih-wei Liaodf5bcce2011-02-28 18:39:23 -080098 llvm::OwningPtr<clang::FileSystemOptions> mFileSysOpt;
Zonr Chang3a9ca1f2010-10-06 17:52:56 +080099 void createFileManager();
Shih-wei Liao462aefd2010-06-04 15:32:04 -0700100
Logan Chien9207a2e2011-10-21 15:39:28 +0800101
102 // Source manager (responsible for the source code handling)
Shih-wei Liao9ef2f782010-10-01 12:31:37 -0700103 llvm::OwningPtr<clang::SourceManager> mSourceMgr;
Zonr Chang3a9ca1f2010-10-06 17:52:56 +0800104 void createSourceManager();
Shih-wei Liao462aefd2010-06-04 15:32:04 -0700105
Logan Chien9207a2e2011-10-21 15:39:28 +0800106
107 // Preprocessor (source code preprocessor)
Shih-wei Liao9ef2f782010-10-01 12:31:37 -0700108 llvm::OwningPtr<clang::Preprocessor> mPP;
109 void createPreprocessor();
Shih-wei Liao462aefd2010-06-04 15:32:04 -0700110
Logan Chien9207a2e2011-10-21 15:39:28 +0800111
112 // AST context (the context to hold long-lived AST nodes)
Shih-wei Liao9ef2f782010-10-01 12:31:37 -0700113 llvm::OwningPtr<clang::ASTContext> mASTContext;
Zonr Chang3a9ca1f2010-10-06 17:52:56 +0800114 void createASTContext();
Shih-wei Liao001fb6d2010-06-21 11:17:11 -0700115
Logan Chien9207a2e2011-10-21 15:39:28 +0800116
117 // AST consumer, responsible for code generation
Zonr Chang3a9ca1f2010-10-06 17:52:56 +0800118 llvm::OwningPtr<clang::ASTConsumer> mBackend;
Shih-wei Liao462aefd2010-06-04 15:32:04 -0700119
Logan Chien9207a2e2011-10-21 15:39:28 +0800120
121 // File names
Shih-wei Liao9ef2f782010-10-01 12:31:37 -0700122 std::string mInputFileName;
123 std::string mOutputFileName;
Shih-wei Liaob81c6a42010-10-10 14:15:00 -0700124
Stephen Hines0b7ef1a2010-10-07 16:36:59 -0700125 std::string mDepOutputFileName;
Stephen Hinescc0efad2010-10-04 16:13:02 -0700126 std::string mDepTargetBCFileName;
Shih-wei Liaob81c6a42010-10-10 14:15:00 -0700127 std::vector<std::string> mAdditionalDepTargets;
Stephen Hines4cc67fc2011-01-31 16:48:57 -0800128 std::vector<std::string> mGeneratedFileNames;
Shih-wei Liao462aefd2010-06-04 15:32:04 -0700129
Zonr Chang3a9ca1f2010-10-06 17:52:56 +0800130 OutputType mOT;
Shih-wei Liao462aefd2010-06-04 15:32:04 -0700131
Shih-wei Liao9ef2f782010-10-01 12:31:37 -0700132 // Output stream
Zonr Change8c263a2010-10-12 00:35:29 +0800133 llvm::OwningPtr<llvm::tool_output_file> mOS;
Logan Chien9207a2e2011-10-21 15:39:28 +0800134
Stephen Hines0b7ef1a2010-10-07 16:36:59 -0700135 // Dependency output stream
Zonr Change8c263a2010-10-12 00:35:29 +0800136 llvm::OwningPtr<llvm::tool_output_file> mDOS;
Shih-wei Liao462aefd2010-06-04 15:32:04 -0700137
Shih-wei Liao9ef2f782010-10-01 12:31:37 -0700138 std::vector<std::string> mIncludePaths;
Ying Wange2e522f2010-09-01 13:24:01 -0700139
Zonr Chang3a9ca1f2010-10-06 17:52:56 +0800140 protected:
141 PragmaList mPragmas;
142
Logan Chien9207a2e2011-10-21 15:39:28 +0800143 clang::DiagnosticsEngine &getDiagnostics() { return *mDiagEngine; }
144 clang::TargetInfo const &getTargetInfo() const { return *mTarget; }
145 clang::FileManager &getFileManager() { return *mFileMgr; }
146 clang::SourceManager &getSourceManager() { return *mSourceMgr; }
147 clang::Preprocessor &getPreprocessor() { return *mPP; }
148 clang::ASTContext &getASTContext() { return *mASTContext; }
Zonr Chang3a9ca1f2010-10-06 17:52:56 +0800149
Logan Chien9207a2e2011-10-21 15:39:28 +0800150 inline clang::TargetOptions const &getTargetOptions() const
Zonr Chang3a9ca1f2010-10-06 17:52:56 +0800151 { return mTargetOpts; }
152
153 virtual void initDiagnostic() {}
154 virtual void initPreprocessor() {}
155 virtual void initASTContext() {}
156
Logan Chien9207a2e2011-10-21 15:39:28 +0800157 virtual clang::ASTConsumer *
158 createBackend(const clang::CodeGenOptions& CodeGenOpts,
159 llvm::raw_ostream *OS,
160 OutputType OT);
Zonr Chang3a9ca1f2010-10-06 17:52:56 +0800161
Shih-wei Liao9ef2f782010-10-01 12:31:37 -0700162 public:
Shih-wei Liao9ef2f782010-10-01 12:31:37 -0700163 static const llvm::StringRef PragmaMetadataName;
Shih-wei Liao462aefd2010-06-04 15:32:04 -0700164
Shih-wei Liaob81c6a42010-10-10 14:15:00 -0700165 static void GlobalInitialization();
166
Zonr Chang641558f2010-10-12 21:07:06 +0800167 Slang();
168
169 void init(const std::string &Triple, const std::string &CPU,
Stephen Hines8f4d9722011-12-05 14:14:42 -0800170 const std::vector<std::string> &Features,
171 clang::DiagnosticsEngine *DiagEngine,
172 DiagnosticBuffer *DiagClient);
Shih-wei Liao462aefd2010-06-04 15:32:04 -0700173
Logan Chienac4e1852011-12-16 13:37:10 +0800174 virtual clang::Module *loadModule(clang::SourceLocation ImportLoc,
175 clang::ModuleIdPath Path,
176 clang::Module::NameVisibilityKind VK,
177 bool IsInclusionDirective);
Logan Chien9207a2e2011-10-21 15:39:28 +0800178
Zonr Chang3a9ca1f2010-10-06 17:52:56 +0800179 bool setInputSource(llvm::StringRef InputFile, const char *Text,
180 size_t TextLength);
Shih-wei Liao462aefd2010-06-04 15:32:04 -0700181
Zonr Chang3a9ca1f2010-10-06 17:52:56 +0800182 bool setInputSource(llvm::StringRef InputFile);
Shih-wei Liao462aefd2010-06-04 15:32:04 -0700183
Logan Chien9207a2e2011-10-21 15:39:28 +0800184 std::string const &getInputFileName() const { return mInputFileName; }
Ying Wange2e522f2010-09-01 13:24:01 -0700185
Logan Chien9207a2e2011-10-21 15:39:28 +0800186 void setIncludePaths(const std::vector<std::string> &IncludePaths) {
Shih-wei Liaob81c6a42010-10-10 14:15:00 -0700187 mIncludePaths = IncludePaths;
Shih-wei Liao9ef2f782010-10-01 12:31:37 -0700188 }
Shih-wei Liao462aefd2010-06-04 15:32:04 -0700189
Logan Chien9207a2e2011-10-21 15:39:28 +0800190 void setOutputType(OutputType OT) { mOT = OT; }
Shih-wei Liao462aefd2010-06-04 15:32:04 -0700191
Stephen Hines0b7ef1a2010-10-07 16:36:59 -0700192 bool setOutput(const char *OutputFile);
Logan Chien9207a2e2011-10-21 15:39:28 +0800193
194 std::string const &getOutputFileName() const {
Zonr Chang3a9ca1f2010-10-06 17:52:56 +0800195 return mOutputFileName;
Shih-wei Liao9ef2f782010-10-01 12:31:37 -0700196 }
Kirk Stewart1fd85792010-07-07 09:51:23 -0700197
Stephen Hines0b7ef1a2010-10-07 16:36:59 -0700198 bool setDepOutput(const char *OutputFile);
Logan Chien9207a2e2011-10-21 15:39:28 +0800199
200 void setDepTargetBC(const char *TargetBCFile) {
Shih-wei Liaob81c6a42010-10-10 14:15:00 -0700201 mDepTargetBCFileName = TargetBCFile;
202 }
Logan Chien9207a2e2011-10-21 15:39:28 +0800203
204 void setAdditionalDepTargets(
205 std::vector<std::string> const &AdditionalDepTargets) {
Shih-wei Liaob81c6a42010-10-10 14:15:00 -0700206 mAdditionalDepTargets = AdditionalDepTargets;
207 }
Logan Chien9207a2e2011-10-21 15:39:28 +0800208
209 void appendGeneratedFileName(std::string const &GeneratedFileName) {
Stephen Hines4cc67fc2011-01-31 16:48:57 -0800210 mGeneratedFileNames.push_back(GeneratedFileName);
211 }
Stephen Hinescc0efad2010-10-04 16:13:02 -0700212
213 int generateDepFile();
Logan Chien9207a2e2011-10-21 15:39:28 +0800214
Shih-wei Liao9ef2f782010-10-01 12:31:37 -0700215 int compile();
Shih-wei Liao462aefd2010-06-04 15:32:04 -0700216
Logan Chien9207a2e2011-10-21 15:39:28 +0800217 char const *getErrorMessage() { return mDiagClient->str().c_str(); }
Shih-wei Liao4c9f7422010-08-05 04:30:02 -0700218
Shih-wei Liao9ef2f782010-10-01 12:31:37 -0700219 // Reset the slang compiler state such that it can be reused to compile
220 // another file
Zonr Chang3a9ca1f2010-10-06 17:52:56 +0800221 virtual void reset();
Shih-wei Liao462aefd2010-06-04 15:32:04 -0700222
Zonr Chang3a9ca1f2010-10-06 17:52:56 +0800223 virtual ~Slang();
Shih-wei Liao9ef2f782010-10-01 12:31:37 -0700224};
Shih-wei Liao462aefd2010-06-04 15:32:04 -0700225
Stephen Hinese639eb52010-11-08 19:27:20 -0800226} // namespace slang
227
228#endif // _FRAMEWORKS_COMPILE_SLANG_SLANG_H_ NOLINT