blob: cffe2cf5a180104e22a68a7ac15e6448dd66c679 [file] [log] [blame]
zonr6315f762010-10-05 15:35:14 +08001#include "slang.h"
Shih-wei Liao462aefd2010-06-04 15:32:04 -07002
Shih-wei Liao9ef2f782010-10-01 12:31:37 -07003#include <stdlib.h>
4
zonr6315f762010-10-05 15:35:14 +08005#include "llvm/Target/TargetSelect.h"
6
Zonr Chang3a9ca1f2010-10-06 17:52:56 +08007#include "llvm/Support/raw_ostream.h"
zonr6315f762010-10-05 15:35:14 +08008#include "llvm/Support/MemoryBuffer.h"
9#include "llvm/Support/ErrorHandling.h"
10#include "llvm/Support/ManagedStatic.h"
11
zonr6315f762010-10-05 15:35:14 +080012#include "clang/Basic/LangOptions.h"
Zonr Chang3a9ca1f2010-10-06 17:52:56 +080013#include "clang/Basic/SourceManager.h"
14#include "clang/Basic/TargetInfo.h"
zonr6315f762010-10-05 15:35:14 +080015#include "clang/Basic/TargetOptions.h"
16
Stephen Hinescc0efad2010-10-04 16:13:02 -070017#include "clang/Frontend/DependencyOutputOptions.h"
18#include "clang/Frontend/FrontendDiagnostic.h"
19#include "clang/Frontend/Utils.h"
20
Zonr Chang3a9ca1f2010-10-06 17:52:56 +080021#include "clang/Lex/Preprocessor.h"
22#include "clang/Lex/HeaderSearch.h"
23
24#include "clang/AST/ASTConsumer.h"
25#include "clang/AST/ASTContext.h"
26
27#include "clang/Basic/FileManager.h"
28
29#include "clang/Frontend/CodeGenOptions.h"
zonr6315f762010-10-05 15:35:14 +080030#include "clang/Frontend/FrontendDiagnostic.h"
31
32#include "clang/Parse/ParseAST.h"
33
Zonr Chang3a9ca1f2010-10-06 17:52:56 +080034#include "slang_backend.h"
zonr6315f762010-10-05 15:35:14 +080035
Shih-wei Liao9ef2f782010-10-01 12:31:37 -070036using namespace slang;
37
Shih-wei Liao462aefd2010-06-04 15:32:04 -070038#if defined(__arm__)
39# define DEFAULT_TARGET_TRIPLE_STRING "armv7-none-linux-gnueabi"
40#elif defined(__x86_64__)
41# define DEFAULT_TARGET_TRIPLE_STRING "x86_64-unknown-linux"
42#else
Shih-wei Liao9ef2f782010-10-01 12:31:37 -070043// let's use x86 as default target
44# define DEFAULT_TARGET_TRIPLE_STRING "i686-unknown-linux"
Shih-wei Liao462aefd2010-06-04 15:32:04 -070045#endif
46
Shih-wei Liao462aefd2010-06-04 15:32:04 -070047bool Slang::GlobalInitialized = false;
48
Shih-wei Liao9ef2f782010-10-01 12:31:37 -070049// Language option (define the language feature for compiler such as C99)
50clang::LangOptions Slang::LangOpts;
Shih-wei Liao462aefd2010-06-04 15:32:04 -070051
zonr6315f762010-10-05 15:35:14 +080052// Code generation option for the compiler
Shih-wei Liao9ef2f782010-10-01 12:31:37 -070053clang::CodeGenOptions Slang::CodeGenOpts;
Shih-wei Liao462aefd2010-06-04 15:32:04 -070054
zonr6315f762010-10-05 15:35:14 +080055const std::string Slang::TargetDescription =
56 "e-" // little-endian
57 "p:32:32:32-" // 32-bit pointer
58 "i1:8:8-"
59 "i8:8:8-"
60 "i16:16:16-"
61 "i32:32:32-"
62 "i64:64:64-"
63 "f32:32:32-"
64 "f64:64:64-"
65 "v64:64:64-" // 64-bit vector (e.g. float2, int2, short4)
66 "v128:128:128-"
67 "a0:0:64-"
68 "n32"; // native CPU only support 32-bit integer width.
Shih-wei Liao462aefd2010-06-04 15:32:04 -070069
Shih-wei Liao9ef2f782010-10-01 12:31:37 -070070// The named of metadata node that pragma resides (should be synced with
71// bcc.cpp)
Shih-wei Liaof52a6202010-09-10 17:40:53 -070072const llvm::StringRef Slang::PragmaMetadataName = "#pragma";
Shih-wei Liao462aefd2010-06-04 15:32:04 -070073
74void Slang::GlobalInitialization() {
Shih-wei Liao9ef2f782010-10-01 12:31:37 -070075 if (!GlobalInitialized) {
76 // We only support x86, x64 and ARM target
Shih-wei Liao462aefd2010-06-04 15:32:04 -070077
Shih-wei Liao9ef2f782010-10-01 12:31:37 -070078 // For ARM
79 LLVMInitializeARMTargetInfo();
80 LLVMInitializeARMTarget();
81 LLVMInitializeARMAsmPrinter();
Shih-wei Liao462aefd2010-06-04 15:32:04 -070082
Shih-wei Liao9ef2f782010-10-01 12:31:37 -070083 // For x86 and x64
84 LLVMInitializeX86TargetInfo();
85 LLVMInitializeX86Target();
86 LLVMInitializeX86AsmPrinter();
Shih-wei Liao462aefd2010-06-04 15:32:04 -070087
Zonr Chang3a9ca1f2010-10-06 17:52:56 +080088 // Please refer to include/clang/Basic/LangOptions.h to setup
Shih-wei Liao9ef2f782010-10-01 12:31:37 -070089 // the options.
90 LangOpts.RTTI = 0; // Turn off the RTTI information support
91 LangOpts.NeXTRuntime = 0; // Turn off the NeXT runtime uses
92 LangOpts.Bool = 1; // Turn on 'bool', 'true', 'false' keywords
Shih-wei Liao462aefd2010-06-04 15:32:04 -070093
Shih-wei Liao9ef2f782010-10-01 12:31:37 -070094 CodeGenOpts.OptimizationLevel = 3; /* -O3 */
Shih-wei Liao462aefd2010-06-04 15:32:04 -070095
Shih-wei Liao9ef2f782010-10-01 12:31:37 -070096 GlobalInitialized = true;
97 }
Shih-wei Liao462aefd2010-06-04 15:32:04 -070098
Shih-wei Liao9ef2f782010-10-01 12:31:37 -070099 return;
Shih-wei Liao462aefd2010-06-04 15:32:04 -0700100}
101
102void Slang::LLVMErrorHandler(void *UserData, const std::string &Message) {
Shih-wei Liao9ef2f782010-10-01 12:31:37 -0700103 clang::Diagnostic* Diags = static_cast<clang::Diagnostic*>(UserData);
104 Diags->Report(clang::diag::err_fe_error_backend) << Message;
105 exit(1);
Shih-wei Liao462aefd2010-06-04 15:32:04 -0700106}
107
Zonr Chang3a9ca1f2010-10-06 17:52:56 +0800108void Slang::createDiagnostic() {
109 mDiagnostics =
110 llvm::IntrusiveRefCntPtr<clang::Diagnostic>(new clang::Diagnostic());
111 mDiagClient = new DiagnosticBuffer();
112 // This takes the ownership of mDiagClient.
113 mDiagnostics->setClient(mDiagClient);
114 return;
115}
116
Shih-wei Liao9ef2f782010-10-01 12:31:37 -0700117void Slang::createTarget(const char* Triple, const char* CPU,
118 const char** Features) {
119 if (Triple != NULL)
120 mTargetOpts.Triple = Triple;
121 else
122 mTargetOpts.Triple = DEFAULT_TARGET_TRIPLE_STRING;
Shih-wei Liao462aefd2010-06-04 15:32:04 -0700123
Shih-wei Liao9ef2f782010-10-01 12:31:37 -0700124 if (CPU != NULL)
125 mTargetOpts.CPU = CPU;
Shih-wei Liao462aefd2010-06-04 15:32:04 -0700126
Shih-wei Liao9ef2f782010-10-01 12:31:37 -0700127 mTarget.reset(clang::TargetInfo::CreateTargetInfo(*mDiagnostics,
128 mTargetOpts));
Shih-wei Liao462aefd2010-06-04 15:32:04 -0700129
Shih-wei Liao9ef2f782010-10-01 12:31:37 -0700130 if (Features != NULL)
zonr6315f762010-10-05 15:35:14 +0800131 for (int i = 0; Features[i] != NULL; i++)
Shih-wei Liao9ef2f782010-10-01 12:31:37 -0700132 mTargetOpts.Features.push_back(Features[i]);
Shih-wei Liao462aefd2010-06-04 15:32:04 -0700133
134 return;
135}
136
Zonr Chang3a9ca1f2010-10-06 17:52:56 +0800137void Slang::createFileManager() {
138 mFileMgr.reset(new clang::FileManager());
139}
140
141void Slang::createSourceManager() {
142 mSourceMgr.reset(new clang::SourceManager(*mDiagnostics));
143 return;
144}
145
Shih-wei Liao68e8e9f2010-07-18 18:46:49 -0700146void Slang::createPreprocessor() {
Shih-wei Liao9ef2f782010-10-01 12:31:37 -0700147 // Default only search header file in current dir
148 clang::HeaderSearch *HS = new clang::HeaderSearch(*mFileMgr);
Shih-wei Liao68e8e9f2010-07-18 18:46:49 -0700149
Shih-wei Liao9ef2f782010-10-01 12:31:37 -0700150 mPP.reset(new clang::Preprocessor(*mDiagnostics,
151 LangOpts,
152 *mTarget,
153 *mSourceMgr,
154 *HS,
155 NULL,
Zonr Chang3a9ca1f2010-10-06 17:52:56 +0800156 /* OwnsHeaderSearch = */true));
Shih-wei Liao9ef2f782010-10-01 12:31:37 -0700157 // Initialize the prepocessor
Shih-wei Liao68e8e9f2010-07-18 18:46:49 -0700158 mPragmas.clear();
Shih-wei Liaof52a6202010-09-10 17:40:53 -0700159 mPP->AddPragmaHandler(new PragmaRecorder(mPragmas));
Shih-wei Liao68e8e9f2010-07-18 18:46:49 -0700160
Shih-wei Liao9ef2f782010-10-01 12:31:37 -0700161 std::vector<clang::DirectoryLookup> SearchList;
Zonr Chang3a9ca1f2010-10-06 17:52:56 +0800162 for (unsigned i = 0, e = mIncludePaths.size(); i != e; i++) {
Shih-wei Liao9ef2f782010-10-01 12:31:37 -0700163 if (const clang::DirectoryEntry *DE =
Zonr Chang3a9ca1f2010-10-06 17:52:56 +0800164 mFileMgr->getDirectory(mIncludePaths[i])) {
Shih-wei Liao9ef2f782010-10-01 12:31:37 -0700165 SearchList.push_back(clang::DirectoryLookup(DE,
166 clang::SrcMgr::C_System,
167 false,
168 false));
169 }
Shih-wei Liao90898282010-07-19 18:38:57 -0700170 }
171
172 HS->SetSearchPaths(SearchList, 1, false);
173
Zonr Chang3a9ca1f2010-10-06 17:52:56 +0800174 initPreprocessor();
Shih-wei Liao68e8e9f2010-07-18 18:46:49 -0700175 return;
176}
177
Zonr Chang3a9ca1f2010-10-06 17:52:56 +0800178void Slang::createASTContext() {
179 mASTContext.reset(new clang::ASTContext(LangOpts,
180 *mSourceMgr,
181 *mTarget,
182 mPP->getIdentifierTable(),
183 mPP->getSelectorTable(),
184 mPP->getBuiltinInfo(),
185 /* size_reserve = */0));
186 initASTContext();
187 return;
188}
189
190clang::ASTConsumer
191*Slang::createBackend(const clang::CodeGenOptions& CodeGenOpts,
192 llvm::raw_ostream *OS,
193 OutputType OT) {
194 return new Backend(*mDiagnostics,
195 CodeGenOpts,
196 mTargetOpts,
197 mPragmas,
198 OS,
199 OT);
200}
201
zonr6315f762010-10-05 15:35:14 +0800202Slang::Slang(const char *Triple, const char *CPU, const char **Features)
Zonr Chang3a9ca1f2010-10-06 17:52:56 +0800203 : mDiagClient(NULL),
204 mOT(OT_Default) {
Shih-wei Liao9ef2f782010-10-01 12:31:37 -0700205 GlobalInitialization();
Shih-wei Liao462aefd2010-06-04 15:32:04 -0700206
Shih-wei Liao9ef2f782010-10-01 12:31:37 -0700207 createDiagnostic();
Zonr Chang3a9ca1f2010-10-06 17:52:56 +0800208 llvm::install_fatal_error_handler(LLVMErrorHandler, mDiagnostics.getPtr());
Shih-wei Liao462aefd2010-06-04 15:32:04 -0700209
Shih-wei Liao9ef2f782010-10-01 12:31:37 -0700210 createTarget(Triple, CPU, Features);
211 createFileManager();
212 createSourceManager();
Shih-wei Liao462aefd2010-06-04 15:32:04 -0700213
Shih-wei Liao9ef2f782010-10-01 12:31:37 -0700214 return;
Shih-wei Liao462aefd2010-06-04 15:32:04 -0700215}
216
Zonr Chang3a9ca1f2010-10-06 17:52:56 +0800217bool Slang::setInputSource(llvm::StringRef InputFile,
218 const char *Text,
219 size_t TextLength) {
220 mInputFileName = InputFile.str();
Shih-wei Liao462aefd2010-06-04 15:32:04 -0700221
Shih-wei Liao9ef2f782010-10-01 12:31:37 -0700222 // Reset the ID tables if we are reusing the SourceManager
223 mSourceMgr->clearIDTables();
Shih-wei Liao462aefd2010-06-04 15:32:04 -0700224
Shih-wei Liao9ef2f782010-10-01 12:31:37 -0700225 // Load the source
zonr6315f762010-10-05 15:35:14 +0800226 llvm::MemoryBuffer *SB =
Zonr Chang3a9ca1f2010-10-06 17:52:56 +0800227 llvm::MemoryBuffer::getMemBuffer(Text, Text + TextLength);
Shih-wei Liao9ef2f782010-10-01 12:31:37 -0700228 mSourceMgr->createMainFileIDForMemBuffer(SB);
Shih-wei Liao462aefd2010-06-04 15:32:04 -0700229
Shih-wei Liao9ef2f782010-10-01 12:31:37 -0700230 if (mSourceMgr->getMainFileID().isInvalid()) {
Zonr Chang3a9ca1f2010-10-06 17:52:56 +0800231 mDiagnostics->Report(clang::diag::err_fe_error_reading) << InputFile;
Shih-wei Liao9ef2f782010-10-01 12:31:37 -0700232 return false;
233 }
234 return true;
Shih-wei Liao462aefd2010-06-04 15:32:04 -0700235}
236
Zonr Chang3a9ca1f2010-10-06 17:52:56 +0800237bool Slang::setInputSource(llvm::StringRef InputFile) {
238 mInputFileName = InputFile.str();
Shih-wei Liao462aefd2010-06-04 15:32:04 -0700239
Shih-wei Liao9ef2f782010-10-01 12:31:37 -0700240 mSourceMgr->clearIDTables();
Shih-wei Liao462aefd2010-06-04 15:32:04 -0700241
Zonr Chang3a9ca1f2010-10-06 17:52:56 +0800242 const clang::FileEntry *File = mFileMgr->getFile(InputFile);
Shih-wei Liao9ef2f782010-10-01 12:31:37 -0700243 if (File)
244 mSourceMgr->createMainFileID(File);
Shih-wei Liao462aefd2010-06-04 15:32:04 -0700245
Shih-wei Liao9ef2f782010-10-01 12:31:37 -0700246 if (mSourceMgr->getMainFileID().isInvalid()) {
Zonr Chang3a9ca1f2010-10-06 17:52:56 +0800247 mDiagnostics->Report(clang::diag::err_fe_error_reading) << InputFile;
Shih-wei Liao9ef2f782010-10-01 12:31:37 -0700248 return false;
249 }
Shih-wei Liao462aefd2010-06-04 15:32:04 -0700250
Shih-wei Liao9ef2f782010-10-01 12:31:37 -0700251 return true;
Shih-wei Liao462aefd2010-06-04 15:32:04 -0700252}
253
Shih-wei Liaob55d7ef2010-07-16 00:19:38 -0700254static void _mkdir_given_a_file(const char *file) {
Shih-wei Liao9ef2f782010-10-01 12:31:37 -0700255 char buf[256];
256 char *tmp, *p = NULL;
257 size_t len = strlen(file);
Shih-wei Liaob55d7ef2010-07-16 00:19:38 -0700258
Shih-wei Liao9ef2f782010-10-01 12:31:37 -0700259 if (len + 1 <= sizeof(buf))
260 tmp = buf;
261 else
zonr6315f762010-10-05 15:35:14 +0800262 tmp = new char[len + 1];
Che-Liang Chiou807a0ea2010-07-16 17:53:52 -0700263
Shih-wei Liao9ef2f782010-10-01 12:31:37 -0700264 strcpy(tmp, file);
Shih-wei Liaob55d7ef2010-07-16 00:19:38 -0700265
Shih-wei Liao9ef2f782010-10-01 12:31:37 -0700266 if (tmp[len - 1] == '/')
267 tmp[len - 1] = 0;
Shih-wei Liaob55d7ef2010-07-16 00:19:38 -0700268
Shih-wei Liao9ef2f782010-10-01 12:31:37 -0700269 for (p = tmp + 1; *p; p++) {
270 if (*p == '/') {
271 *p = 0;
272 mkdir(tmp, S_IRWXU);
273 *p = '/';
Shih-wei Liaob55d7ef2010-07-16 00:19:38 -0700274 }
Shih-wei Liao9ef2f782010-10-01 12:31:37 -0700275 }
Che-Liang Chiou807a0ea2010-07-16 17:53:52 -0700276
Shih-wei Liao9ef2f782010-10-01 12:31:37 -0700277 if (tmp != buf)
278 delete[] tmp;
Shih-wei Liaob55d7ef2010-07-16 00:19:38 -0700279}
280
Zonr Chang3a9ca1f2010-10-06 17:52:56 +0800281bool Slang::setOutput(const char *OutputFile) {
Shih-wei Liao9ef2f782010-10-01 12:31:37 -0700282 std::string Error;
Shih-wei Liao462aefd2010-06-04 15:32:04 -0700283
Zonr Chang3a9ca1f2010-10-06 17:52:56 +0800284 switch (mOT) {
Stephen Hinescc0efad2010-10-04 16:13:02 -0700285 case OT_Dependency:
Zonr Chang3a9ca1f2010-10-06 17:52:56 +0800286 case OT_Assembly:
287 case OT_LLVMAssembly: {
Stephen Hinescc0efad2010-10-04 16:13:02 -0700288 _mkdir_given_a_file(OutputFile);
Zonr Chang3a9ca1f2010-10-06 17:52:56 +0800289 mOS.reset(new llvm::raw_fd_ostream(OutputFile, Error, 0));
Shih-wei Liao9ef2f782010-10-01 12:31:37 -0700290 break;
Shih-wei Liao462aefd2010-06-04 15:32:04 -0700291 }
Zonr Chang3a9ca1f2010-10-06 17:52:56 +0800292 case OT_Nothing: {
Shih-wei Liao9ef2f782010-10-01 12:31:37 -0700293 mOS.reset();
294 break;
Shih-wei Liao462aefd2010-06-04 15:32:04 -0700295 }
Zonr Chang3a9ca1f2010-10-06 17:52:56 +0800296 case OT_Object:
Stephen Hinescc0efad2010-10-04 16:13:02 -0700297 case OT_Bitcode: {
298 _mkdir_given_a_file(OutputFile);
Zonr Chang3a9ca1f2010-10-06 17:52:56 +0800299 mOS.reset(new llvm::raw_fd_ostream(OutputFile,
Shih-wei Liao9ef2f782010-10-01 12:31:37 -0700300 Error,
301 llvm::raw_fd_ostream::F_Binary));
302 break;
303 }
Stephen Hinescc0efad2010-10-04 16:13:02 -0700304 default:
305 llvm_unreachable("Unknown compiler output type");
306 break;
Shih-wei Liao9ef2f782010-10-01 12:31:37 -0700307 }
Shih-wei Liao462aefd2010-06-04 15:32:04 -0700308
Shih-wei Liao9ef2f782010-10-01 12:31:37 -0700309 if (!Error.empty()) {
310 mOS.reset();
Zonr Chang3a9ca1f2010-10-06 17:52:56 +0800311 mDiagnostics->Report(clang::diag::err_fe_error_opening) << OutputFile
Shih-wei Liao9ef2f782010-10-01 12:31:37 -0700312 << Error;
313 return false;
314 }
Shih-wei Liao462aefd2010-06-04 15:32:04 -0700315
Zonr Chang3a9ca1f2010-10-06 17:52:56 +0800316 mOutputFileName = OutputFile;
Shih-wei Liao9ef2f782010-10-01 12:31:37 -0700317
318 return true;
Shih-wei Liao462aefd2010-06-04 15:32:04 -0700319}
320
Stephen Hines0b7ef1a2010-10-07 16:36:59 -0700321bool Slang::setDepOutput(const char *OutputFile) {
322 std::string Error;
323 _mkdir_given_a_file(OutputFile);
324 mDOS.reset(new llvm::raw_fd_ostream(OutputFile, Error, 0));
325
326 if (!Error.empty()) {
327 mDOS.reset();
328 mDiagnostics->Report(clang::diag::err_fe_error_opening) << OutputFile
329 << Error;
330 return false;
331 }
332
333 mDepOutputFileName = OutputFile;
334
335 return true;
336}
337
338bool Slang::setDepTargetBC(const char *TargetBCFile) {
339 mDepTargetBCFileName = TargetBCFile;
Stephen Hinescc0efad2010-10-04 16:13:02 -0700340
341 return true;
342}
343
Ying Wang54572312010-10-07 18:27:09 -0700344bool Slang::setAdditionalDepTarget(const char* AdditionalDepTargetFileName) {
345 mAdditionalDepTargetFileName = AdditionalDepTargetFileName;
346}
347
Stephen Hinescc0efad2010-10-04 16:13:02 -0700348int Slang::generateDepFile() {
Stephen Hinesf7de8522010-10-06 11:46:18 -0700349 if(mDiagnostics->getNumErrors() > 0)
Stephen Hinescc0efad2010-10-04 16:13:02 -0700350 return mDiagnostics->getNumErrors();
Stephen Hines0b7ef1a2010-10-07 16:36:59 -0700351 if (mDOS.get() == NULL)
Stephen Hinesf7de8522010-10-06 11:46:18 -0700352 return 1;
Stephen Hinescc0efad2010-10-04 16:13:02 -0700353
354 /* Initialize options for generating dependency file */
355 clang::DependencyOutputOptions DepOpts;
356 DepOpts.IncludeSystemHeaders = 1;
Stephen Hines0b7ef1a2010-10-07 16:36:59 -0700357 DepOpts.OutputFile = mDepOutputFileName;
Ying Wang54572312010-10-07 18:27:09 -0700358 if (!mAdditionalDepTargetFileName.empty()) {
359 DepOpts.Targets.push_back(mAdditionalDepTargetFileName);
360 }
Stephen Hinescc0efad2010-10-04 16:13:02 -0700361 DepOpts.Targets.push_back(mDepTargetBCFileName);
362
363 /* Per-compilation needed initialization */
364 createPreprocessor();
365 AttachDependencyFileGen(*mPP.get(), DepOpts);
366
367 /* Inform the diagnostic client we are processing a source file */
368 mDiagClient->BeginSourceFile(LangOpts, mPP.get());
369
370 /* Go through the source file (no operations necessary) */
371 clang::Token Tok;
372 mPP->EnterMainSourceFile();
373 do {
374 mPP->Lex(Tok);
375 } while (Tok.isNot(clang::tok::eof));
376
377 mPP->EndSourceFile();
378
379 /* Clean up after compilation */
380 mPP.reset();
381
382 return mDiagnostics->getNumErrors();
383}
384
Shih-wei Liao462aefd2010-06-04 15:32:04 -0700385int Slang::compile() {
Stephen Hinesf7de8522010-10-06 11:46:18 -0700386 if (mDiagnostics->getNumErrors() > 0)
Shih-wei Liao462aefd2010-06-04 15:32:04 -0700387 return mDiagnostics->getNumErrors();
Stephen Hinesf7de8522010-10-06 11:46:18 -0700388 if (mOS.get() == NULL)
389 return 1;
Shih-wei Liao9ef2f782010-10-01 12:31:37 -0700390
391 // Here is per-compilation needed initialization
392 createPreprocessor();
393 createASTContext();
Zonr Chang3a9ca1f2010-10-06 17:52:56 +0800394
395 mBackend.reset(createBackend(CodeGenOpts, mOS.take(), mOT));
Shih-wei Liao9ef2f782010-10-01 12:31:37 -0700396
397 // Inform the diagnostic client we are processing a source file
398 mDiagClient->BeginSourceFile(LangOpts, mPP.get());
399
400 // The core of the slang compiler
401 ParseAST(*mPP, mBackend.get(), *mASTContext);
402
Zonr Chang3a9ca1f2010-10-06 17:52:56 +0800403 // The compilation ended, clear
Shih-wei Liao9ef2f782010-10-01 12:31:37 -0700404 mBackend.reset();
Shih-wei Liao9ef2f782010-10-01 12:31:37 -0700405 mASTContext.reset();
406 mPP.reset();
407
408 // Inform the diagnostic client we are done with previous source file
409 mDiagClient->EndSourceFile();
410
411 return mDiagnostics->getNumErrors();
Shih-wei Liao462aefd2010-06-04 15:32:04 -0700412}
413
Zonr Chang3a9ca1f2010-10-06 17:52:56 +0800414void Slang::reset() {
415 mDiagnostics->Reset();
416 mDiagClient->reset();
Shih-wei Liao9ef2f782010-10-01 12:31:37 -0700417 return;
Shih-wei Liao462aefd2010-06-04 15:32:04 -0700418}
419
420Slang::~Slang() {
Shih-wei Liao9ef2f782010-10-01 12:31:37 -0700421 llvm::llvm_shutdown();
422 return;
Shih-wei Liao462aefd2010-06-04 15:32:04 -0700423}