blob: 440278eba1acc58e771c556d24d319c0a91dfc7a [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;
Shih-wei Liao9ef2f782010-10-01 12:31:37 -070054}
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
84 // Diagnostics ID
Loganbe274822011-02-16 22:02:54 +080085 llvm::IntrusiveRefCntPtr<clang::DiagnosticIDs> mDiagIDs;
Logan Chien9207a2e2011-10-21 15:39:28 +080086
87 // Diagnostics Engine (Producer and Diagnostics Reporter)
88 llvm::IntrusiveRefCntPtr<clang::DiagnosticsEngine> mDiagEngine;
89
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
Zonr Chang3a9ca1f2010-10-06 17:52:56 +080094 void createDiagnostic();
Shih-wei Liao462aefd2010-06-04 15:32:04 -070095
Logan Chien9207a2e2011-10-21 15:39:28 +080096
Shih-wei Liao9ef2f782010-10-01 12:31:37 -070097 // The target being compiled for
98 clang::TargetOptions mTargetOpts;
99 llvm::OwningPtr<clang::TargetInfo> mTarget;
Logan Chien9207a2e2011-10-21 15:39:28 +0800100 void createTarget(std::string const &Triple, std::string const &CPU,
101 std::vector<std::string> const &Features);
Shih-wei Liao462aefd2010-06-04 15:32:04 -0700102
Shih-wei Liao462aefd2010-06-04 15:32:04 -0700103
Logan Chien9207a2e2011-10-21 15:39:28 +0800104 // File manager (for prepocessor doing the job such as header file search)
Shih-wei Liao9ef2f782010-10-01 12:31:37 -0700105 llvm::OwningPtr<clang::FileManager> mFileMgr;
Shih-wei Liaodf5bcce2011-02-28 18:39:23 -0800106 llvm::OwningPtr<clang::FileSystemOptions> mFileSysOpt;
Zonr Chang3a9ca1f2010-10-06 17:52:56 +0800107 void createFileManager();
Shih-wei Liao462aefd2010-06-04 15:32:04 -0700108
Logan Chien9207a2e2011-10-21 15:39:28 +0800109
110 // Source manager (responsible for the source code handling)
Shih-wei Liao9ef2f782010-10-01 12:31:37 -0700111 llvm::OwningPtr<clang::SourceManager> mSourceMgr;
Zonr Chang3a9ca1f2010-10-06 17:52:56 +0800112 void createSourceManager();
Shih-wei Liao462aefd2010-06-04 15:32:04 -0700113
Logan Chien9207a2e2011-10-21 15:39:28 +0800114
115 // Preprocessor (source code preprocessor)
Shih-wei Liao9ef2f782010-10-01 12:31:37 -0700116 llvm::OwningPtr<clang::Preprocessor> mPP;
117 void createPreprocessor();
Shih-wei Liao462aefd2010-06-04 15:32:04 -0700118
Logan Chien9207a2e2011-10-21 15:39:28 +0800119
120 // AST context (the context to hold long-lived AST nodes)
Shih-wei Liao9ef2f782010-10-01 12:31:37 -0700121 llvm::OwningPtr<clang::ASTContext> mASTContext;
Zonr Chang3a9ca1f2010-10-06 17:52:56 +0800122 void createASTContext();
Shih-wei Liao001fb6d2010-06-21 11:17:11 -0700123
Logan Chien9207a2e2011-10-21 15:39:28 +0800124
125 // AST consumer, responsible for code generation
Zonr Chang3a9ca1f2010-10-06 17:52:56 +0800126 llvm::OwningPtr<clang::ASTConsumer> mBackend;
Shih-wei Liao462aefd2010-06-04 15:32:04 -0700127
Logan Chien9207a2e2011-10-21 15:39:28 +0800128
129 // File names
Shih-wei Liao9ef2f782010-10-01 12:31:37 -0700130 std::string mInputFileName;
131 std::string mOutputFileName;
Shih-wei Liaob81c6a42010-10-10 14:15:00 -0700132
Stephen Hines0b7ef1a2010-10-07 16:36:59 -0700133 std::string mDepOutputFileName;
Stephen Hinescc0efad2010-10-04 16:13:02 -0700134 std::string mDepTargetBCFileName;
Shih-wei Liaob81c6a42010-10-10 14:15:00 -0700135 std::vector<std::string> mAdditionalDepTargets;
Stephen Hines4cc67fc2011-01-31 16:48:57 -0800136 std::vector<std::string> mGeneratedFileNames;
Shih-wei Liao462aefd2010-06-04 15:32:04 -0700137
Zonr Chang3a9ca1f2010-10-06 17:52:56 +0800138 OutputType mOT;
Shih-wei Liao462aefd2010-06-04 15:32:04 -0700139
Shih-wei Liao9ef2f782010-10-01 12:31:37 -0700140 // Output stream
Zonr Change8c263a2010-10-12 00:35:29 +0800141 llvm::OwningPtr<llvm::tool_output_file> mOS;
Logan Chien9207a2e2011-10-21 15:39:28 +0800142
Stephen Hines0b7ef1a2010-10-07 16:36:59 -0700143 // Dependency output stream
Zonr Change8c263a2010-10-12 00:35:29 +0800144 llvm::OwningPtr<llvm::tool_output_file> mDOS;
Shih-wei Liao462aefd2010-06-04 15:32:04 -0700145
Shih-wei Liao9ef2f782010-10-01 12:31:37 -0700146 std::vector<std::string> mIncludePaths;
Ying Wange2e522f2010-09-01 13:24:01 -0700147
Zonr Chang3a9ca1f2010-10-06 17:52:56 +0800148 protected:
149 PragmaList mPragmas;
150
Logan Chien9207a2e2011-10-21 15:39:28 +0800151 clang::DiagnosticsEngine &getDiagnostics() { return *mDiagEngine; }
152 clang::TargetInfo const &getTargetInfo() const { return *mTarget; }
153 clang::FileManager &getFileManager() { return *mFileMgr; }
154 clang::SourceManager &getSourceManager() { return *mSourceMgr; }
155 clang::Preprocessor &getPreprocessor() { return *mPP; }
156 clang::ASTContext &getASTContext() { return *mASTContext; }
Zonr Chang3a9ca1f2010-10-06 17:52:56 +0800157
Logan Chien9207a2e2011-10-21 15:39:28 +0800158 inline clang::TargetOptions const &getTargetOptions() const
Zonr Chang3a9ca1f2010-10-06 17:52:56 +0800159 { return mTargetOpts; }
160
161 virtual void initDiagnostic() {}
162 virtual void initPreprocessor() {}
163 virtual void initASTContext() {}
164
Logan Chien9207a2e2011-10-21 15:39:28 +0800165 virtual clang::ASTConsumer *
166 createBackend(const clang::CodeGenOptions& CodeGenOpts,
167 llvm::raw_ostream *OS,
168 OutputType OT);
Zonr Chang3a9ca1f2010-10-06 17:52:56 +0800169
Shih-wei Liao9ef2f782010-10-01 12:31:37 -0700170 public:
Shih-wei Liao9ef2f782010-10-01 12:31:37 -0700171 static const llvm::StringRef PragmaMetadataName;
Shih-wei Liao462aefd2010-06-04 15:32:04 -0700172
Shih-wei Liaob81c6a42010-10-10 14:15:00 -0700173 static void GlobalInitialization();
174
Zonr Chang641558f2010-10-12 21:07:06 +0800175 Slang();
176
177 void init(const std::string &Triple, const std::string &CPU,
178 const std::vector<std::string> &Features);
Shih-wei Liao462aefd2010-06-04 15:32:04 -0700179
Logan Chien9207a2e2011-10-21 15:39:28 +0800180 virtual clang::ModuleKey loadModule(clang::SourceLocation ImportLoc,
181 clang::IdentifierInfo &ModuleName,
182 clang::SourceLocation ModuleNameLoc);
183
Zonr Chang3a9ca1f2010-10-06 17:52:56 +0800184 bool setInputSource(llvm::StringRef InputFile, const char *Text,
185 size_t TextLength);
Shih-wei Liao462aefd2010-06-04 15:32:04 -0700186
Zonr Chang3a9ca1f2010-10-06 17:52:56 +0800187 bool setInputSource(llvm::StringRef InputFile);
Shih-wei Liao462aefd2010-06-04 15:32:04 -0700188
Logan Chien9207a2e2011-10-21 15:39:28 +0800189 std::string const &getInputFileName() const { return mInputFileName; }
Ying Wange2e522f2010-09-01 13:24:01 -0700190
Logan Chien9207a2e2011-10-21 15:39:28 +0800191 void setIncludePaths(const std::vector<std::string> &IncludePaths) {
Shih-wei Liaob81c6a42010-10-10 14:15:00 -0700192 mIncludePaths = IncludePaths;
Shih-wei Liao9ef2f782010-10-01 12:31:37 -0700193 }
Shih-wei Liao462aefd2010-06-04 15:32:04 -0700194
Logan Chien9207a2e2011-10-21 15:39:28 +0800195 void setOutputType(OutputType OT) { mOT = OT; }
Shih-wei Liao462aefd2010-06-04 15:32:04 -0700196
Stephen Hines0b7ef1a2010-10-07 16:36:59 -0700197 bool setOutput(const char *OutputFile);
Logan Chien9207a2e2011-10-21 15:39:28 +0800198
199 std::string const &getOutputFileName() const {
Zonr Chang3a9ca1f2010-10-06 17:52:56 +0800200 return mOutputFileName;
Shih-wei Liao9ef2f782010-10-01 12:31:37 -0700201 }
Kirk Stewart1fd85792010-07-07 09:51:23 -0700202
Stephen Hines0b7ef1a2010-10-07 16:36:59 -0700203 bool setDepOutput(const char *OutputFile);
Logan Chien9207a2e2011-10-21 15:39:28 +0800204
205 void setDepTargetBC(const char *TargetBCFile) {
Shih-wei Liaob81c6a42010-10-10 14:15:00 -0700206 mDepTargetBCFileName = TargetBCFile;
207 }
Logan Chien9207a2e2011-10-21 15:39:28 +0800208
209 void setAdditionalDepTargets(
210 std::vector<std::string> const &AdditionalDepTargets) {
Shih-wei Liaob81c6a42010-10-10 14:15:00 -0700211 mAdditionalDepTargets = AdditionalDepTargets;
212 }
Logan Chien9207a2e2011-10-21 15:39:28 +0800213
214 void appendGeneratedFileName(std::string const &GeneratedFileName) {
Stephen Hines4cc67fc2011-01-31 16:48:57 -0800215 mGeneratedFileNames.push_back(GeneratedFileName);
216 }
Stephen Hinescc0efad2010-10-04 16:13:02 -0700217
218 int generateDepFile();
Logan Chien9207a2e2011-10-21 15:39:28 +0800219
Shih-wei Liao9ef2f782010-10-01 12:31:37 -0700220 int compile();
Shih-wei Liao462aefd2010-06-04 15:32:04 -0700221
Logan Chien9207a2e2011-10-21 15:39:28 +0800222 char const *getErrorMessage() { return mDiagClient->str().c_str(); }
Shih-wei Liao4c9f7422010-08-05 04:30:02 -0700223
mkopec1c460b372012-01-09 11:21:50 -0500224 void setDebugMetadataEmission(bool EmitDebug);
225
226 void setOptimizationLevel(llvm::CodeGenOpt::Level OptimizationLevel);
227
Shih-wei Liao9ef2f782010-10-01 12:31:37 -0700228 // Reset the slang compiler state such that it can be reused to compile
229 // another file
Zonr Chang3a9ca1f2010-10-06 17:52:56 +0800230 virtual void reset();
Shih-wei Liao462aefd2010-06-04 15:32:04 -0700231
Zonr Chang3a9ca1f2010-10-06 17:52:56 +0800232 virtual ~Slang();
Shih-wei Liao9ef2f782010-10-01 12:31:37 -0700233};
Shih-wei Liao462aefd2010-06-04 15:32:04 -0700234
Stephen Hinese639eb52010-11-08 19:27:20 -0800235} // namespace slang
236
237#endif // _FRAMEWORKS_COMPILE_SLANG_SLANG_H_ NOLINT