blob: 770d37b86f93d6e242c0c34f57d9ddfc18a406c2 [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 Chang8c6d9b22010-10-07 18:01:19 +08007#include "llvm/System/Path.h"
8
Zonr Chang3a9ca1f2010-10-06 17:52:56 +08009#include "llvm/Support/raw_ostream.h"
zonr6315f762010-10-05 15:35:14 +080010#include "llvm/Support/MemoryBuffer.h"
11#include "llvm/Support/ErrorHandling.h"
12#include "llvm/Support/ManagedStatic.h"
13
zonr6315f762010-10-05 15:35:14 +080014#include "clang/Basic/LangOptions.h"
Zonr Chang3a9ca1f2010-10-06 17:52:56 +080015#include "clang/Basic/SourceManager.h"
16#include "clang/Basic/TargetInfo.h"
zonr6315f762010-10-05 15:35:14 +080017#include "clang/Basic/TargetOptions.h"
18
Stephen Hinescc0efad2010-10-04 16:13:02 -070019#include "clang/Frontend/DependencyOutputOptions.h"
20#include "clang/Frontend/FrontendDiagnostic.h"
21#include "clang/Frontend/Utils.h"
22
Zonr Chang3a9ca1f2010-10-06 17:52:56 +080023#include "clang/Lex/Preprocessor.h"
24#include "clang/Lex/HeaderSearch.h"
25
26#include "clang/AST/ASTConsumer.h"
27#include "clang/AST/ASTContext.h"
28
29#include "clang/Basic/FileManager.h"
30
31#include "clang/Frontend/CodeGenOptions.h"
zonr6315f762010-10-05 15:35:14 +080032#include "clang/Frontend/FrontendDiagnostic.h"
33
34#include "clang/Parse/ParseAST.h"
35
Zonr Chang8c6d9b22010-10-07 18:01:19 +080036#include "slang_utils.h"
Zonr Chang3a9ca1f2010-10-06 17:52:56 +080037#include "slang_backend.h"
zonr6315f762010-10-05 15:35:14 +080038
Shih-wei Liao9ef2f782010-10-01 12:31:37 -070039using namespace slang;
40
Shih-wei Liao462aefd2010-06-04 15:32:04 -070041#if defined(__arm__)
42# define DEFAULT_TARGET_TRIPLE_STRING "armv7-none-linux-gnueabi"
43#elif defined(__x86_64__)
44# define DEFAULT_TARGET_TRIPLE_STRING "x86_64-unknown-linux"
45#else
Shih-wei Liao9ef2f782010-10-01 12:31:37 -070046// let's use x86 as default target
47# define DEFAULT_TARGET_TRIPLE_STRING "i686-unknown-linux"
Shih-wei Liao462aefd2010-06-04 15:32:04 -070048#endif
49
Shih-wei Liao462aefd2010-06-04 15:32:04 -070050bool Slang::GlobalInitialized = false;
51
Shih-wei Liao9ef2f782010-10-01 12:31:37 -070052// Language option (define the language feature for compiler such as C99)
53clang::LangOptions Slang::LangOpts;
Shih-wei Liao462aefd2010-06-04 15:32:04 -070054
zonr6315f762010-10-05 15:35:14 +080055// Code generation option for the compiler
Shih-wei Liao9ef2f782010-10-01 12:31:37 -070056clang::CodeGenOptions Slang::CodeGenOpts;
Shih-wei Liao462aefd2010-06-04 15:32:04 -070057
zonr6315f762010-10-05 15:35:14 +080058const std::string Slang::TargetDescription =
59 "e-" // little-endian
60 "p:32:32:32-" // 32-bit pointer
61 "i1:8:8-"
62 "i8:8:8-"
63 "i16:16:16-"
64 "i32:32:32-"
65 "i64:64:64-"
66 "f32:32:32-"
67 "f64:64:64-"
68 "v64:64:64-" // 64-bit vector (e.g. float2, int2, short4)
69 "v128:128:128-"
70 "a0:0:64-"
71 "n32"; // native CPU only support 32-bit integer width.
Shih-wei Liao462aefd2010-06-04 15:32:04 -070072
Shih-wei Liao9ef2f782010-10-01 12:31:37 -070073// The named of metadata node that pragma resides (should be synced with
74// bcc.cpp)
Shih-wei Liaof52a6202010-09-10 17:40:53 -070075const llvm::StringRef Slang::PragmaMetadataName = "#pragma";
Shih-wei Liao462aefd2010-06-04 15:32:04 -070076
77void Slang::GlobalInitialization() {
Shih-wei Liao9ef2f782010-10-01 12:31:37 -070078 if (!GlobalInitialized) {
79 // We only support x86, x64 and ARM target
Shih-wei Liao462aefd2010-06-04 15:32:04 -070080
Shih-wei Liao9ef2f782010-10-01 12:31:37 -070081 // For ARM
82 LLVMInitializeARMTargetInfo();
83 LLVMInitializeARMTarget();
84 LLVMInitializeARMAsmPrinter();
Shih-wei Liao462aefd2010-06-04 15:32:04 -070085
Shih-wei Liao9ef2f782010-10-01 12:31:37 -070086 // For x86 and x64
87 LLVMInitializeX86TargetInfo();
88 LLVMInitializeX86Target();
89 LLVMInitializeX86AsmPrinter();
Shih-wei Liao462aefd2010-06-04 15:32:04 -070090
Zonr Chang3a9ca1f2010-10-06 17:52:56 +080091 // Please refer to include/clang/Basic/LangOptions.h to setup
Shih-wei Liao9ef2f782010-10-01 12:31:37 -070092 // the options.
93 LangOpts.RTTI = 0; // Turn off the RTTI information support
94 LangOpts.NeXTRuntime = 0; // Turn off the NeXT runtime uses
95 LangOpts.Bool = 1; // Turn on 'bool', 'true', 'false' keywords
Shih-wei Liao462aefd2010-06-04 15:32:04 -070096
Shih-wei Liao9ef2f782010-10-01 12:31:37 -070097 CodeGenOpts.OptimizationLevel = 3; /* -O3 */
Shih-wei Liao462aefd2010-06-04 15:32:04 -070098
Shih-wei Liao9ef2f782010-10-01 12:31:37 -070099 GlobalInitialized = true;
100 }
Shih-wei Liao462aefd2010-06-04 15:32:04 -0700101
Shih-wei Liao9ef2f782010-10-01 12:31:37 -0700102 return;
Shih-wei Liao462aefd2010-06-04 15:32:04 -0700103}
104
105void Slang::LLVMErrorHandler(void *UserData, const std::string &Message) {
Shih-wei Liao9ef2f782010-10-01 12:31:37 -0700106 clang::Diagnostic* Diags = static_cast<clang::Diagnostic*>(UserData);
107 Diags->Report(clang::diag::err_fe_error_backend) << Message;
108 exit(1);
Shih-wei Liao462aefd2010-06-04 15:32:04 -0700109}
110
Zonr Chang3a9ca1f2010-10-06 17:52:56 +0800111void Slang::createDiagnostic() {
112 mDiagnostics =
113 llvm::IntrusiveRefCntPtr<clang::Diagnostic>(new clang::Diagnostic());
114 mDiagClient = new DiagnosticBuffer();
115 // This takes the ownership of mDiagClient.
116 mDiagnostics->setClient(mDiagClient);
117 return;
118}
119
Shih-wei Liao9ef2f782010-10-01 12:31:37 -0700120void Slang::createTarget(const char* Triple, const char* CPU,
121 const char** Features) {
122 if (Triple != NULL)
123 mTargetOpts.Triple = Triple;
124 else
125 mTargetOpts.Triple = DEFAULT_TARGET_TRIPLE_STRING;
Shih-wei Liao462aefd2010-06-04 15:32:04 -0700126
Shih-wei Liao9ef2f782010-10-01 12:31:37 -0700127 if (CPU != NULL)
128 mTargetOpts.CPU = CPU;
Shih-wei Liao462aefd2010-06-04 15:32:04 -0700129
Shih-wei Liao9ef2f782010-10-01 12:31:37 -0700130 mTarget.reset(clang::TargetInfo::CreateTargetInfo(*mDiagnostics,
131 mTargetOpts));
Shih-wei Liao462aefd2010-06-04 15:32:04 -0700132
Shih-wei Liao9ef2f782010-10-01 12:31:37 -0700133 if (Features != NULL)
zonr6315f762010-10-05 15:35:14 +0800134 for (int i = 0; Features[i] != NULL; i++)
Shih-wei Liao9ef2f782010-10-01 12:31:37 -0700135 mTargetOpts.Features.push_back(Features[i]);
Shih-wei Liao462aefd2010-06-04 15:32:04 -0700136
137 return;
138}
139
Zonr Chang3a9ca1f2010-10-06 17:52:56 +0800140void Slang::createFileManager() {
141 mFileMgr.reset(new clang::FileManager());
142}
143
144void Slang::createSourceManager() {
145 mSourceMgr.reset(new clang::SourceManager(*mDiagnostics));
146 return;
147}
148
Shih-wei Liao68e8e9f2010-07-18 18:46:49 -0700149void Slang::createPreprocessor() {
Shih-wei Liao9ef2f782010-10-01 12:31:37 -0700150 // Default only search header file in current dir
151 clang::HeaderSearch *HS = new clang::HeaderSearch(*mFileMgr);
Shih-wei Liao68e8e9f2010-07-18 18:46:49 -0700152
Shih-wei Liao9ef2f782010-10-01 12:31:37 -0700153 mPP.reset(new clang::Preprocessor(*mDiagnostics,
154 LangOpts,
155 *mTarget,
156 *mSourceMgr,
157 *HS,
158 NULL,
Zonr Chang3a9ca1f2010-10-06 17:52:56 +0800159 /* OwnsHeaderSearch = */true));
Shih-wei Liao9ef2f782010-10-01 12:31:37 -0700160 // Initialize the prepocessor
Shih-wei Liao68e8e9f2010-07-18 18:46:49 -0700161 mPragmas.clear();
Shih-wei Liaof52a6202010-09-10 17:40:53 -0700162 mPP->AddPragmaHandler(new PragmaRecorder(mPragmas));
Shih-wei Liao68e8e9f2010-07-18 18:46:49 -0700163
Shih-wei Liao9ef2f782010-10-01 12:31:37 -0700164 std::vector<clang::DirectoryLookup> SearchList;
Zonr Chang3a9ca1f2010-10-06 17:52:56 +0800165 for (unsigned i = 0, e = mIncludePaths.size(); i != e; i++) {
Shih-wei Liao9ef2f782010-10-01 12:31:37 -0700166 if (const clang::DirectoryEntry *DE =
Zonr Chang3a9ca1f2010-10-06 17:52:56 +0800167 mFileMgr->getDirectory(mIncludePaths[i])) {
Shih-wei Liao9ef2f782010-10-01 12:31:37 -0700168 SearchList.push_back(clang::DirectoryLookup(DE,
169 clang::SrcMgr::C_System,
170 false,
171 false));
172 }
Shih-wei Liao90898282010-07-19 18:38:57 -0700173 }
174
175 HS->SetSearchPaths(SearchList, 1, false);
176
Zonr Chang3a9ca1f2010-10-06 17:52:56 +0800177 initPreprocessor();
Shih-wei Liao68e8e9f2010-07-18 18:46:49 -0700178 return;
179}
180
Zonr Chang3a9ca1f2010-10-06 17:52:56 +0800181void Slang::createASTContext() {
182 mASTContext.reset(new clang::ASTContext(LangOpts,
183 *mSourceMgr,
184 *mTarget,
185 mPP->getIdentifierTable(),
186 mPP->getSelectorTable(),
187 mPP->getBuiltinInfo(),
188 /* size_reserve = */0));
189 initASTContext();
190 return;
191}
192
193clang::ASTConsumer
194*Slang::createBackend(const clang::CodeGenOptions& CodeGenOpts,
195 llvm::raw_ostream *OS,
196 OutputType OT) {
197 return new Backend(*mDiagnostics,
198 CodeGenOpts,
199 mTargetOpts,
200 mPragmas,
201 OS,
202 OT);
203}
204
zonr6315f762010-10-05 15:35:14 +0800205Slang::Slang(const char *Triple, const char *CPU, const char **Features)
Zonr Chang3a9ca1f2010-10-06 17:52:56 +0800206 : mDiagClient(NULL),
207 mOT(OT_Default) {
Shih-wei Liao9ef2f782010-10-01 12:31:37 -0700208 GlobalInitialization();
Shih-wei Liao462aefd2010-06-04 15:32:04 -0700209
Shih-wei Liao9ef2f782010-10-01 12:31:37 -0700210 createDiagnostic();
Zonr Chang3a9ca1f2010-10-06 17:52:56 +0800211 llvm::install_fatal_error_handler(LLVMErrorHandler, mDiagnostics.getPtr());
Shih-wei Liao462aefd2010-06-04 15:32:04 -0700212
Shih-wei Liao9ef2f782010-10-01 12:31:37 -0700213 createTarget(Triple, CPU, Features);
214 createFileManager();
215 createSourceManager();
Shih-wei Liao462aefd2010-06-04 15:32:04 -0700216
Shih-wei Liao9ef2f782010-10-01 12:31:37 -0700217 return;
Shih-wei Liao462aefd2010-06-04 15:32:04 -0700218}
219
Zonr Chang3a9ca1f2010-10-06 17:52:56 +0800220bool Slang::setInputSource(llvm::StringRef InputFile,
221 const char *Text,
222 size_t TextLength) {
223 mInputFileName = InputFile.str();
Shih-wei Liao462aefd2010-06-04 15:32:04 -0700224
Shih-wei Liao9ef2f782010-10-01 12:31:37 -0700225 // Reset the ID tables if we are reusing the SourceManager
226 mSourceMgr->clearIDTables();
Shih-wei Liao462aefd2010-06-04 15:32:04 -0700227
Shih-wei Liao9ef2f782010-10-01 12:31:37 -0700228 // Load the source
zonr6315f762010-10-05 15:35:14 +0800229 llvm::MemoryBuffer *SB =
Zonr Chang3a9ca1f2010-10-06 17:52:56 +0800230 llvm::MemoryBuffer::getMemBuffer(Text, Text + TextLength);
Shih-wei Liao9ef2f782010-10-01 12:31:37 -0700231 mSourceMgr->createMainFileIDForMemBuffer(SB);
Shih-wei Liao462aefd2010-06-04 15:32:04 -0700232
Shih-wei Liao9ef2f782010-10-01 12:31:37 -0700233 if (mSourceMgr->getMainFileID().isInvalid()) {
Zonr Chang3a9ca1f2010-10-06 17:52:56 +0800234 mDiagnostics->Report(clang::diag::err_fe_error_reading) << InputFile;
Shih-wei Liao9ef2f782010-10-01 12:31:37 -0700235 return false;
236 }
237 return true;
Shih-wei Liao462aefd2010-06-04 15:32:04 -0700238}
239
Zonr Chang3a9ca1f2010-10-06 17:52:56 +0800240bool Slang::setInputSource(llvm::StringRef InputFile) {
241 mInputFileName = InputFile.str();
Shih-wei Liao462aefd2010-06-04 15:32:04 -0700242
Shih-wei Liao9ef2f782010-10-01 12:31:37 -0700243 mSourceMgr->clearIDTables();
Shih-wei Liao462aefd2010-06-04 15:32:04 -0700244
Zonr Chang3a9ca1f2010-10-06 17:52:56 +0800245 const clang::FileEntry *File = mFileMgr->getFile(InputFile);
Shih-wei Liao9ef2f782010-10-01 12:31:37 -0700246 if (File)
247 mSourceMgr->createMainFileID(File);
Shih-wei Liao462aefd2010-06-04 15:32:04 -0700248
Shih-wei Liao9ef2f782010-10-01 12:31:37 -0700249 if (mSourceMgr->getMainFileID().isInvalid()) {
Zonr Chang3a9ca1f2010-10-06 17:52:56 +0800250 mDiagnostics->Report(clang::diag::err_fe_error_reading) << InputFile;
Shih-wei Liao9ef2f782010-10-01 12:31:37 -0700251 return false;
252 }
Shih-wei Liao462aefd2010-06-04 15:32:04 -0700253
Shih-wei Liao9ef2f782010-10-01 12:31:37 -0700254 return true;
Shih-wei Liao462aefd2010-06-04 15:32:04 -0700255}
256
Zonr Chang3a9ca1f2010-10-06 17:52:56 +0800257bool Slang::setOutput(const char *OutputFile) {
Zonr Chang8c6d9b22010-10-07 18:01:19 +0800258 llvm::sys::Path OutputFilePath(OutputFile);
Shih-wei Liao9ef2f782010-10-01 12:31:37 -0700259 std::string Error;
Shih-wei Liao462aefd2010-06-04 15:32:04 -0700260
Zonr Chang3a9ca1f2010-10-06 17:52:56 +0800261 switch (mOT) {
Stephen Hinescc0efad2010-10-04 16:13:02 -0700262 case OT_Dependency:
Zonr Chang3a9ca1f2010-10-06 17:52:56 +0800263 case OT_Assembly:
264 case OT_LLVMAssembly: {
Zonr Chang8c6d9b22010-10-07 18:01:19 +0800265 if (!SlangUtils::CreateDirectoryWithParents(OutputFilePath.getDirname(),
266 &Error))
267 mDiagnostics->Report(clang::diag::err_fe_error_opening) << OutputFile
268 << Error;
269 mOS.reset(new llvm::tool_output_file(OutputFile, Error, 0));
Shih-wei Liao9ef2f782010-10-01 12:31:37 -0700270 break;
Shih-wei Liao462aefd2010-06-04 15:32:04 -0700271 }
Zonr Chang3a9ca1f2010-10-06 17:52:56 +0800272 case OT_Nothing: {
Shih-wei Liao9ef2f782010-10-01 12:31:37 -0700273 mOS.reset();
274 break;
Shih-wei Liao462aefd2010-06-04 15:32:04 -0700275 }
Zonr Chang3a9ca1f2010-10-06 17:52:56 +0800276 case OT_Object:
Stephen Hinescc0efad2010-10-04 16:13:02 -0700277 case OT_Bitcode: {
Zonr Chang8c6d9b22010-10-07 18:01:19 +0800278 if (!SlangUtils::CreateDirectoryWithParents(OutputFilePath.getDirname(),
279 &Error))
280 mDiagnostics->Report(clang::diag::err_fe_error_opening) << OutputFile
281 << Error;
282 mOS.reset(new llvm::tool_output_file(OutputFile,
283 Error,
284 llvm::raw_fd_ostream::F_Binary));
Shih-wei Liao9ef2f782010-10-01 12:31:37 -0700285 break;
286 }
Zonr Chang8c6d9b22010-10-07 18:01:19 +0800287 default: {
Stephen Hinescc0efad2010-10-04 16:13:02 -0700288 llvm_unreachable("Unknown compiler output type");
Zonr Chang8c6d9b22010-10-07 18:01:19 +0800289 }
Shih-wei Liao9ef2f782010-10-01 12:31:37 -0700290 }
Shih-wei Liao462aefd2010-06-04 15:32:04 -0700291
Shih-wei Liao9ef2f782010-10-01 12:31:37 -0700292 if (!Error.empty()) {
293 mOS.reset();
Zonr Chang3a9ca1f2010-10-06 17:52:56 +0800294 mDiagnostics->Report(clang::diag::err_fe_error_opening) << OutputFile
Shih-wei Liao9ef2f782010-10-01 12:31:37 -0700295 << Error;
296 return false;
297 }
Shih-wei Liao462aefd2010-06-04 15:32:04 -0700298
Zonr Chang3a9ca1f2010-10-06 17:52:56 +0800299 mOutputFileName = OutputFile;
Shih-wei Liao9ef2f782010-10-01 12:31:37 -0700300
301 return true;
Shih-wei Liao462aefd2010-06-04 15:32:04 -0700302}
303
Stephen Hines0b7ef1a2010-10-07 16:36:59 -0700304bool Slang::setDepOutput(const char *OutputFile) {
Zonr Chang8c6d9b22010-10-07 18:01:19 +0800305 llvm::sys::Path OutputFilePath(OutputFile);
Stephen Hines0b7ef1a2010-10-07 16:36:59 -0700306 std::string Error;
Zonr Chang8c6d9b22010-10-07 18:01:19 +0800307
308 if (!SlangUtils::CreateDirectoryWithParents(OutputFilePath.getDirname(),
309 &Error))
310 mDiagnostics->Report(clang::diag::err_fe_error_opening) << OutputFile
311 << Error;
Stephen Hines0b7ef1a2010-10-07 16:36:59 -0700312 mDOS.reset(new llvm::raw_fd_ostream(OutputFile, Error, 0));
313
314 if (!Error.empty()) {
315 mDOS.reset();
316 mDiagnostics->Report(clang::diag::err_fe_error_opening) << OutputFile
317 << Error;
318 return false;
319 }
320
321 mDepOutputFileName = OutputFile;
322
323 return true;
324}
325
326bool Slang::setDepTargetBC(const char *TargetBCFile) {
327 mDepTargetBCFileName = TargetBCFile;
Stephen Hinescc0efad2010-10-04 16:13:02 -0700328
329 return true;
330}
331
Ying Wang54572312010-10-07 18:27:09 -0700332bool Slang::setAdditionalDepTarget(const char* AdditionalDepTargetFileName) {
333 mAdditionalDepTargetFileName = AdditionalDepTargetFileName;
334}
335
Stephen Hinescc0efad2010-10-04 16:13:02 -0700336int Slang::generateDepFile() {
Stephen Hinesf7de8522010-10-06 11:46:18 -0700337 if(mDiagnostics->getNumErrors() > 0)
Stephen Hinescc0efad2010-10-04 16:13:02 -0700338 return mDiagnostics->getNumErrors();
Stephen Hines0b7ef1a2010-10-07 16:36:59 -0700339 if (mDOS.get() == NULL)
Stephen Hinesf7de8522010-10-06 11:46:18 -0700340 return 1;
Stephen Hinescc0efad2010-10-04 16:13:02 -0700341
342 /* Initialize options for generating dependency file */
343 clang::DependencyOutputOptions DepOpts;
344 DepOpts.IncludeSystemHeaders = 1;
Stephen Hines0b7ef1a2010-10-07 16:36:59 -0700345 DepOpts.OutputFile = mDepOutputFileName;
Ying Wang54572312010-10-07 18:27:09 -0700346 if (!mAdditionalDepTargetFileName.empty()) {
347 DepOpts.Targets.push_back(mAdditionalDepTargetFileName);
348 }
Stephen Hinescc0efad2010-10-04 16:13:02 -0700349 DepOpts.Targets.push_back(mDepTargetBCFileName);
350
351 /* Per-compilation needed initialization */
352 createPreprocessor();
353 AttachDependencyFileGen(*mPP.get(), DepOpts);
354
355 /* Inform the diagnostic client we are processing a source file */
356 mDiagClient->BeginSourceFile(LangOpts, mPP.get());
357
358 /* Go through the source file (no operations necessary) */
359 clang::Token Tok;
360 mPP->EnterMainSourceFile();
361 do {
362 mPP->Lex(Tok);
363 } while (Tok.isNot(clang::tok::eof));
364
365 mPP->EndSourceFile();
366
367 /* Clean up after compilation */
368 mPP.reset();
369
370 return mDiagnostics->getNumErrors();
371}
372
Shih-wei Liao462aefd2010-06-04 15:32:04 -0700373int Slang::compile() {
Stephen Hinesf7de8522010-10-06 11:46:18 -0700374 if (mDiagnostics->getNumErrors() > 0)
Shih-wei Liao462aefd2010-06-04 15:32:04 -0700375 return mDiagnostics->getNumErrors();
Stephen Hinesf7de8522010-10-06 11:46:18 -0700376 if (mOS.get() == NULL)
377 return 1;
Shih-wei Liao9ef2f782010-10-01 12:31:37 -0700378
379 // Here is per-compilation needed initialization
380 createPreprocessor();
381 createASTContext();
Zonr Chang3a9ca1f2010-10-06 17:52:56 +0800382
383 mBackend.reset(createBackend(CodeGenOpts, mOS.take(), mOT));
Shih-wei Liao9ef2f782010-10-01 12:31:37 -0700384
385 // Inform the diagnostic client we are processing a source file
386 mDiagClient->BeginSourceFile(LangOpts, mPP.get());
387
388 // The core of the slang compiler
389 ParseAST(*mPP, mBackend.get(), *mASTContext);
390
Zonr Chang3a9ca1f2010-10-06 17:52:56 +0800391 // The compilation ended, clear
Shih-wei Liao9ef2f782010-10-01 12:31:37 -0700392 mBackend.reset();
Shih-wei Liao9ef2f782010-10-01 12:31:37 -0700393 mASTContext.reset();
394 mPP.reset();
395
396 // Inform the diagnostic client we are done with previous source file
397 mDiagClient->EndSourceFile();
398
399 return mDiagnostics->getNumErrors();
Shih-wei Liao462aefd2010-06-04 15:32:04 -0700400}
401
Zonr Chang3a9ca1f2010-10-06 17:52:56 +0800402void Slang::reset() {
403 mDiagnostics->Reset();
404 mDiagClient->reset();
Shih-wei Liao9ef2f782010-10-01 12:31:37 -0700405 return;
Shih-wei Liao462aefd2010-06-04 15:32:04 -0700406}
407
408Slang::~Slang() {
Shih-wei Liao9ef2f782010-10-01 12:31:37 -0700409 llvm::llvm_shutdown();
410 return;
Shih-wei Liao462aefd2010-06-04 15:32:04 -0700411}