slang.cpp revision be27482cdeaf08576bc39b72a15d35d13014a636
1c383a500aa59423264811be3874461bf8adbfea0Zonr Chang/* 2c383a500aa59423264811be3874461bf8adbfea0Zonr Chang * Copyright 2010, The Android Open Source Project 3c383a500aa59423264811be3874461bf8adbfea0Zonr Chang * 4c383a500aa59423264811be3874461bf8adbfea0Zonr Chang * Licensed under the Apache License, Version 2.0 (the "License"); 5c383a500aa59423264811be3874461bf8adbfea0Zonr Chang * you may not use this file except in compliance with the License. 6c383a500aa59423264811be3874461bf8adbfea0Zonr Chang * You may obtain a copy of the License at 7c383a500aa59423264811be3874461bf8adbfea0Zonr Chang * 8c383a500aa59423264811be3874461bf8adbfea0Zonr Chang * http://www.apache.org/licenses/LICENSE-2.0 9c383a500aa59423264811be3874461bf8adbfea0Zonr Chang * 10c383a500aa59423264811be3874461bf8adbfea0Zonr Chang * Unless required by applicable law or agreed to in writing, software 11c383a500aa59423264811be3874461bf8adbfea0Zonr Chang * distributed under the License is distributed on an "AS IS" BASIS, 12c383a500aa59423264811be3874461bf8adbfea0Zonr Chang * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13c383a500aa59423264811be3874461bf8adbfea0Zonr Chang * See the License for the specific language governing permissions and 14c383a500aa59423264811be3874461bf8adbfea0Zonr Chang * limitations under the License. 15c383a500aa59423264811be3874461bf8adbfea0Zonr Chang */ 16c383a500aa59423264811be3874461bf8adbfea0Zonr Chang 176315f76e3cc6ff2d012d1183a0b030d4ff0dc808zonr#include "slang.h" 18462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 196315f76e3cc6ff2d012d1183a0b030d4ff0dc808zonr#include <stdlib.h> 20462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 21e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hines#include <string> 22e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hines#include <vector> 238c6d9b2d36ed2d6d811279fd9bddc05fffe16803Zonr Chang 24e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hines#include "clang/AST/ASTConsumer.h" 25e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hines#include "clang/AST/ASTContext.h" 26462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 27be27482cdeaf08576bc39b72a15d35d13014a636Logan#include "clang/Basic/DiagnosticIDs.h" 28e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hines#include "clang/Basic/FileManager.h" 29df5bcce1582d839eead432a5e24435236c90fb05Shih-wei Liao#include "clang/Basic/FileSystemOptions.h" 306315f76e3cc6ff2d012d1183a0b030d4ff0dc808zonr#include "clang/Basic/LangOptions.h" 313a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Chang#include "clang/Basic/SourceManager.h" 323a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Chang#include "clang/Basic/TargetInfo.h" 336315f76e3cc6ff2d012d1183a0b030d4ff0dc808zonr#include "clang/Basic/TargetOptions.h" 34462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 35e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hines#include "clang/Frontend/CodeGenOptions.h" 36e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hines#include "clang/Frontend/DiagnosticOptions.h" 37cc0efad052e944f64bb71cfdaa8a825e30192e78Stephen Hines#include "clang/Frontend/DependencyOutputOptions.h" 38cc0efad052e944f64bb71cfdaa8a825e30192e78Stephen Hines#include "clang/Frontend/FrontendDiagnostic.h" 39e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hines#include "clang/Frontend/TextDiagnosticPrinter.h" 40cc0efad052e944f64bb71cfdaa8a825e30192e78Stephen Hines#include "clang/Frontend/Utils.h" 41cc0efad052e944f64bb71cfdaa8a825e30192e78Stephen Hines 423a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Chang#include "clang/Lex/Preprocessor.h" 433a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Chang#include "clang/Lex/HeaderSearch.h" 443a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Chang 456315f76e3cc6ff2d012d1183a0b030d4ff0dc808zonr#include "clang/Parse/ParseAST.h" 466315f76e3cc6ff2d012d1183a0b030d4ff0dc808zonr 47be27482cdeaf08576bc39b72a15d35d13014a636Logan#include "llvm/ADT/IntrusiveRefCntPtr.h" 48be27482cdeaf08576bc39b72a15d35d13014a636Logan 49e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hines#include "llvm/Bitcode/ReaderWriter.h" 509ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 5108df36e5c0a990306d958c9f6d59a5de23b748f6Zonr Chang// More force linking 5208df36e5c0a990306d958c9f6d59a5de23b748f6Zonr Chang#include "llvm/Linker.h" 5308df36e5c0a990306d958c9f6d59a5de23b748f6Zonr Chang 54e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hines// Force linking all passes/vmcore stuffs to libslang.so 55e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hines#include "llvm/LinkAllPasses.h" 56e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hines#include "llvm/LinkAllVMCore.h" 57e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hines 58e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hines#include "llvm/Support/raw_ostream.h" 59e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hines#include "llvm/Support/MemoryBuffer.h" 60e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hines#include "llvm/Support/ErrorHandling.h" 61e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hines#include "llvm/Support/ManagedStatic.h" 62df5bcce1582d839eead432a5e24435236c90fb05Shih-wei Liao#include "llvm/Support/ToolOutputFile.h" 63be27482cdeaf08576bc39b72a15d35d13014a636Logan#include "llvm/Support/Path.h" 64e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hines 65e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hines#include "llvm/Target/TargetSelect.h" 66e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hines 676e6578a360497f78a181e63d7783422a9c9bfb15Stephen Hines#include "slang_assert.h" 68e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hines#include "slang_backend.h" 69e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hines#include "slang_utils.h" 70b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao 7108df36e5c0a990306d958c9f6d59a5de23b748f6Zonr Changnamespace { 7208df36e5c0a990306d958c9f6d59a5de23b748f6Zonr Chang 73e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hinesstruct ForceSlangLinking { 74e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hines ForceSlangLinking() { 75e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hines // We must reference the functions in such a way that compilers will not 76e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hines // delete it all as dead code, even with whole program optimization, 77e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hines // yet is effectively a NO-OP. As the compiler isn't smart enough 78e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hines // to know that getenv() never returns -1, this will do the job. 79e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hines if (std::getenv("bar") != reinterpret_cast<char*>(-1)) 80e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hines return; 81e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hines 82e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hines // llvm-rs-link needs following functions existing in libslang. 83e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hines llvm::ParseBitcodeFile(NULL, llvm::getGlobalContext(), NULL); 84e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hines llvm::Linker::LinkModules(NULL, NULL, NULL); 85e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hines 86e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hines // llvm-rs-cc need this. 87e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hines new clang::TextDiagnosticPrinter(llvm::errs(), 88e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hines clang::DiagnosticOptions()); 89e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hines } 90e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hines} ForceSlangLinking; 91e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hines 92e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hines} // namespace 93e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hines 94e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hinesnamespace slang { 959ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 96462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao#if defined(__arm__) 97462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao# define DEFAULT_TARGET_TRIPLE_STRING "armv7-none-linux-gnueabi" 98462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao#elif defined(__x86_64__) 99462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao# define DEFAULT_TARGET_TRIPLE_STRING "x86_64-unknown-linux" 100462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao#else 1019ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao// let's use x86 as default target 1029ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao# define DEFAULT_TARGET_TRIPLE_STRING "i686-unknown-linux" 103462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao#endif 104462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 105462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liaobool Slang::GlobalInitialized = false; 106462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 1079ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao// Language option (define the language feature for compiler such as C99) 1089ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liaoclang::LangOptions Slang::LangOpts; 109462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 1106315f76e3cc6ff2d012d1183a0b030d4ff0dc808zonr// Code generation option for the compiler 1119ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liaoclang::CodeGenOptions Slang::CodeGenOpts; 112462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 1139ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao// The named of metadata node that pragma resides (should be synced with 1149ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao// bcc.cpp) 115f52a620440fa62257dfdcf2583f0f9df5b855c76Shih-wei Liaoconst llvm::StringRef Slang::PragmaMetadataName = "#pragma"; 116462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 117e8c263a1c5df81594cf302ecadd813909c894487Zonr Changstatic inline llvm::tool_output_file *OpenOutputFile(const char *OutputFile, 118e8c263a1c5df81594cf302ecadd813909c894487Zonr Chang unsigned Flags, 119e8c263a1c5df81594cf302ecadd813909c894487Zonr Chang std::string* Error, 120e8c263a1c5df81594cf302ecadd813909c894487Zonr Chang clang::Diagnostic* Diag) { 1216e6578a360497f78a181e63d7783422a9c9bfb15Stephen Hines slangAssert((OutputFile != NULL) && (Error != NULL) && (Diag != NULL) && 1226e6578a360497f78a181e63d7783422a9c9bfb15Stephen Hines "Invalid parameter!"); 123e8c263a1c5df81594cf302ecadd813909c894487Zonr Chang 124e8c263a1c5df81594cf302ecadd813909c894487Zonr Chang llvm::sys::Path OutputFilePath(OutputFile); 125e8c263a1c5df81594cf302ecadd813909c894487Zonr Chang 126e8c263a1c5df81594cf302ecadd813909c894487Zonr Chang if (SlangUtils::CreateDirectoryWithParents(OutputFilePath.getDirname(), 127e8c263a1c5df81594cf302ecadd813909c894487Zonr Chang Error)) { 128e8c263a1c5df81594cf302ecadd813909c894487Zonr Chang llvm::tool_output_file *F = 129e8c263a1c5df81594cf302ecadd813909c894487Zonr Chang new llvm::tool_output_file(OutputFile, *Error, Flags); 130e8c263a1c5df81594cf302ecadd813909c894487Zonr Chang if (F != NULL) 131e8c263a1c5df81594cf302ecadd813909c894487Zonr Chang return F; 132e8c263a1c5df81594cf302ecadd813909c894487Zonr Chang } 133e8c263a1c5df81594cf302ecadd813909c894487Zonr Chang 134e8c263a1c5df81594cf302ecadd813909c894487Zonr Chang // Report error here. 135e8c263a1c5df81594cf302ecadd813909c894487Zonr Chang Diag->Report(clang::diag::err_fe_error_opening) << OutputFile << *Error; 136e8c263a1c5df81594cf302ecadd813909c894487Zonr Chang 137e8c263a1c5df81594cf302ecadd813909c894487Zonr Chang return NULL; 138e8c263a1c5df81594cf302ecadd813909c894487Zonr Chang} 139e8c263a1c5df81594cf302ecadd813909c894487Zonr Chang 140462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liaovoid Slang::GlobalInitialization() { 1419ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao if (!GlobalInitialized) { 1429ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao // We only support x86, x64 and ARM target 143462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 1449ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao // For ARM 1459ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao LLVMInitializeARMTargetInfo(); 1469ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao LLVMInitializeARMTarget(); 1479ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao LLVMInitializeARMAsmPrinter(); 148462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 1499ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao // For x86 and x64 1509ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao LLVMInitializeX86TargetInfo(); 1519ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao LLVMInitializeX86Target(); 1529ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao LLVMInitializeX86AsmPrinter(); 153462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 1543a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Chang // Please refer to include/clang/Basic/LangOptions.h to setup 1559ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao // the options. 1569ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao LangOpts.RTTI = 0; // Turn off the RTTI information support 1579ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao LangOpts.NeXTRuntime = 0; // Turn off the NeXT runtime uses 158245eba133628ef5b52c78d6f538c9268c9bc5828Shih-wei Liao LangOpts.C99 = 1; 159462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 1609ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao CodeGenOpts.OptimizationLevel = 3; /* -O3 */ 161462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 1629ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao GlobalInitialized = true; 1639ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao } 164462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 1659ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao return; 166462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao} 167462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 168462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liaovoid Slang::LLVMErrorHandler(void *UserData, const std::string &Message) { 1699ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao clang::Diagnostic* Diags = static_cast<clang::Diagnostic*>(UserData); 1709ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao Diags->Report(clang::diag::err_fe_error_backend) << Message; 1719ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao exit(1); 172462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao} 173462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 1743a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Changvoid Slang::createDiagnostic() { 1753a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Chang mDiagClient = new DiagnosticBuffer(); 176be27482cdeaf08576bc39b72a15d35d13014a636Logan mDiagIDs = new clang::DiagnosticIDs(); 177be27482cdeaf08576bc39b72a15d35d13014a636Logan mDiagnostics = new clang::Diagnostic(mDiagIDs, mDiagClient, true); 178641558f02fe6ce0ee3ae5076eb366c25e2ad5903Zonr Chang initDiagnostic(); 1793a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Chang return; 1803a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Chang} 1813a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Chang 182b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liaovoid Slang::createTarget(const std::string &Triple, const std::string &CPU, 183b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao const std::vector<std::string> &Features) { 184b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao if (!Triple.empty()) 1859ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao mTargetOpts.Triple = Triple; 1869ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao else 1879ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao mTargetOpts.Triple = DEFAULT_TARGET_TRIPLE_STRING; 188462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 189b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao if (!CPU.empty()) 1909ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao mTargetOpts.CPU = CPU; 191462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 192b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao if (!Features.empty()) 193b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao mTargetOpts.Features = Features; 194b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao 1959ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao mTarget.reset(clang::TargetInfo::CreateTargetInfo(*mDiagnostics, 1969ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao mTargetOpts)); 197462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 198b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao return; 199462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao} 200462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 2013a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Changvoid Slang::createFileManager() { 202df5bcce1582d839eead432a5e24435236c90fb05Shih-wei Liao mFileSysOpt.reset(new clang::FileSystemOptions()); 203be27482cdeaf08576bc39b72a15d35d13014a636Logan mFileMgr.reset(new clang::FileManager(*mFileSysOpt)); 2043a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Chang} 2053a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Chang 2063a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Changvoid Slang::createSourceManager() { 207be27482cdeaf08576bc39b72a15d35d13014a636Logan mSourceMgr.reset(new clang::SourceManager(*mDiagnostics, *mFileMgr)); 2083a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Chang return; 2093a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Chang} 2103a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Chang 21168e8e9f98730b3672fb96d49e33b9db70a90ed3fShih-wei Liaovoid Slang::createPreprocessor() { 2129ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao // Default only search header file in current dir 213be27482cdeaf08576bc39b72a15d35d13014a636Logan clang::HeaderSearch *HS = new clang::HeaderSearch(*mFileMgr); 2149ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 2159ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao mPP.reset(new clang::Preprocessor(*mDiagnostics, 2169ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao LangOpts, 2179ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao *mTarget, 2189ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao *mSourceMgr, 2199ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao *HS, 2209ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao NULL, 2213a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Chang /* OwnsHeaderSearch = */true)); 2223fd0a94a5cf1656569b1aea07043cc63939dcb46Stephen Hines // Initialize the preprocessor 22368e8e9f98730b3672fb96d49e33b9db70a90ed3fShih-wei Liao mPragmas.clear(); 2243fd0a94a5cf1656569b1aea07043cc63939dcb46Stephen Hines mPP->AddPragmaHandler(new PragmaRecorder(&mPragmas)); 22568e8e9f98730b3672fb96d49e33b9db70a90ed3fShih-wei Liao 2269ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao std::vector<clang::DirectoryLookup> SearchList; 2273a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Chang for (unsigned i = 0, e = mIncludePaths.size(); i != e; i++) { 2289ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao if (const clang::DirectoryEntry *DE = 229be27482cdeaf08576bc39b72a15d35d13014a636Logan mFileMgr->getDirectory(mIncludePaths[i])) { 2309ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao SearchList.push_back(clang::DirectoryLookup(DE, 2319ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao clang::SrcMgr::C_System, 2329ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao false, 2339ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao false)); 2349ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao } 2359089828a995422a5ed3beeed0890b755c4abe188Shih-wei Liao } 2369089828a995422a5ed3beeed0890b755c4abe188Shih-wei Liao 2379089828a995422a5ed3beeed0890b755c4abe188Shih-wei Liao HS->SetSearchPaths(SearchList, 1, false); 2389089828a995422a5ed3beeed0890b755c4abe188Shih-wei Liao 2393a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Chang initPreprocessor(); 24068e8e9f98730b3672fb96d49e33b9db70a90ed3fShih-wei Liao return; 24168e8e9f98730b3672fb96d49e33b9db70a90ed3fShih-wei Liao} 24268e8e9f98730b3672fb96d49e33b9db70a90ed3fShih-wei Liao 2433a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Changvoid Slang::createASTContext() { 2443a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Chang mASTContext.reset(new clang::ASTContext(LangOpts, 2453a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Chang *mSourceMgr, 2463a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Chang *mTarget, 2473a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Chang mPP->getIdentifierTable(), 2483a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Chang mPP->getSelectorTable(), 2493a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Chang mPP->getBuiltinInfo(), 2503a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Chang /* size_reserve = */0)); 2513a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Chang initASTContext(); 2523a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Chang return; 2533a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Chang} 2543a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Chang 2553a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Changclang::ASTConsumer 2563a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Chang*Slang::createBackend(const clang::CodeGenOptions& CodeGenOpts, 2573a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Chang llvm::raw_ostream *OS, 2583a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Chang OutputType OT) { 259e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hines return new Backend(mDiagnostics.getPtr(), 2603a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Chang CodeGenOpts, 2613a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Chang mTargetOpts, 2623fd0a94a5cf1656569b1aea07043cc63939dcb46Stephen Hines &mPragmas, 2633a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Chang OS, 2643a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Chang OT); 2653a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Chang} 2663a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Chang 267641558f02fe6ce0ee3ae5076eb366c25e2ad5903Zonr ChangSlang::Slang() : mInitialized(false), mDiagClient(NULL), mOT(OT_Default) { 2689ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao GlobalInitialization(); 269641558f02fe6ce0ee3ae5076eb366c25e2ad5903Zonr Chang return; 270641558f02fe6ce0ee3ae5076eb366c25e2ad5903Zonr Chang} 271641558f02fe6ce0ee3ae5076eb366c25e2ad5903Zonr Chang 272641558f02fe6ce0ee3ae5076eb366c25e2ad5903Zonr Changvoid Slang::init(const std::string &Triple, const std::string &CPU, 273641558f02fe6ce0ee3ae5076eb366c25e2ad5903Zonr Chang const std::vector<std::string> &Features) { 274641558f02fe6ce0ee3ae5076eb366c25e2ad5903Zonr Chang if (mInitialized) 275641558f02fe6ce0ee3ae5076eb366c25e2ad5903Zonr Chang return; 276462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 2779ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao createDiagnostic(); 2783a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Chang llvm::install_fatal_error_handler(LLVMErrorHandler, mDiagnostics.getPtr()); 279462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 2809ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao createTarget(Triple, CPU, Features); 2819ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao createFileManager(); 2829ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao createSourceManager(); 283462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 284641558f02fe6ce0ee3ae5076eb366c25e2ad5903Zonr Chang mInitialized = true; 285641558f02fe6ce0ee3ae5076eb366c25e2ad5903Zonr Chang 2869ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao return; 287462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao} 288462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 2893a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Changbool Slang::setInputSource(llvm::StringRef InputFile, 2903a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Chang const char *Text, 2913a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Chang size_t TextLength) { 2923a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Chang mInputFileName = InputFile.str(); 293462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 2949ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao // Reset the ID tables if we are reusing the SourceManager 2959ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao mSourceMgr->clearIDTables(); 296462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 2979ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao // Load the source 2986315f76e3cc6ff2d012d1183a0b030d4ff0dc808zonr llvm::MemoryBuffer *SB = 2993a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Chang llvm::MemoryBuffer::getMemBuffer(Text, Text + TextLength); 3009ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao mSourceMgr->createMainFileIDForMemBuffer(SB); 301462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 3029ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao if (mSourceMgr->getMainFileID().isInvalid()) { 3033a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Chang mDiagnostics->Report(clang::diag::err_fe_error_reading) << InputFile; 3049ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao return false; 3059ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao } 3069ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao return true; 307462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao} 308462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 3093a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Changbool Slang::setInputSource(llvm::StringRef InputFile) { 3103a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Chang mInputFileName = InputFile.str(); 311462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 3129ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao mSourceMgr->clearIDTables(); 313462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 314be27482cdeaf08576bc39b72a15d35d13014a636Logan const clang::FileEntry *File = mFileMgr->getFile(InputFile); 3159ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao if (File) 3169ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao mSourceMgr->createMainFileID(File); 317462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 3189ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao if (mSourceMgr->getMainFileID().isInvalid()) { 3193a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Chang mDiagnostics->Report(clang::diag::err_fe_error_reading) << InputFile; 3209ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao return false; 3219ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao } 322462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 3239ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao return true; 324462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao} 325462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 3263a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Changbool Slang::setOutput(const char *OutputFile) { 3278c6d9b2d36ed2d6d811279fd9bddc05fffe16803Zonr Chang llvm::sys::Path OutputFilePath(OutputFile); 3289ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao std::string Error; 329e8c263a1c5df81594cf302ecadd813909c894487Zonr Chang llvm::tool_output_file *OS = NULL; 330462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 3313a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Chang switch (mOT) { 332cc0efad052e944f64bb71cfdaa8a825e30192e78Stephen Hines case OT_Dependency: 3333a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Chang case OT_Assembly: 3343a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Chang case OT_LLVMAssembly: { 335e8c263a1c5df81594cf302ecadd813909c894487Zonr Chang OS = OpenOutputFile(OutputFile, 0, &Error, mDiagnostics.getPtr()); 3369ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao break; 337462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao } 3383a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Chang case OT_Nothing: { 3399ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao break; 340462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao } 3413a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Chang case OT_Object: 342cc0efad052e944f64bb71cfdaa8a825e30192e78Stephen Hines case OT_Bitcode: { 343e8c263a1c5df81594cf302ecadd813909c894487Zonr Chang OS = OpenOutputFile(OutputFile, 344e8c263a1c5df81594cf302ecadd813909c894487Zonr Chang llvm::raw_fd_ostream::F_Binary, 345e8c263a1c5df81594cf302ecadd813909c894487Zonr Chang &Error, 346e8c263a1c5df81594cf302ecadd813909c894487Zonr Chang mDiagnostics.getPtr()); 3479ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao break; 3489ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao } 3498c6d9b2d36ed2d6d811279fd9bddc05fffe16803Zonr Chang default: { 350cc0efad052e944f64bb71cfdaa8a825e30192e78Stephen Hines llvm_unreachable("Unknown compiler output type"); 3518c6d9b2d36ed2d6d811279fd9bddc05fffe16803Zonr Chang } 3529ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao } 353462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 354e8c263a1c5df81594cf302ecadd813909c894487Zonr Chang if (!Error.empty()) 3559ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao return false; 356e8c263a1c5df81594cf302ecadd813909c894487Zonr Chang 357e8c263a1c5df81594cf302ecadd813909c894487Zonr Chang mOS.reset(OS); 3589ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 3593a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Chang mOutputFileName = OutputFile; 360462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 3619ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao return true; 362462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao} 363462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 3640b7ef1a176b9ddd1e0d437efdce20743373fd7dbStephen Hinesbool Slang::setDepOutput(const char *OutputFile) { 3658c6d9b2d36ed2d6d811279fd9bddc05fffe16803Zonr Chang llvm::sys::Path OutputFilePath(OutputFile); 3660b7ef1a176b9ddd1e0d437efdce20743373fd7dbStephen Hines std::string Error; 3678c6d9b2d36ed2d6d811279fd9bddc05fffe16803Zonr Chang 368e8c263a1c5df81594cf302ecadd813909c894487Zonr Chang mDOS.reset(OpenOutputFile(OutputFile, 0, &Error, mDiagnostics.getPtr())); 369e8c263a1c5df81594cf302ecadd813909c894487Zonr Chang if (!Error.empty() || (mDOS.get() == NULL)) 3700b7ef1a176b9ddd1e0d437efdce20743373fd7dbStephen Hines return false; 3710b7ef1a176b9ddd1e0d437efdce20743373fd7dbStephen Hines 3720b7ef1a176b9ddd1e0d437efdce20743373fd7dbStephen Hines mDepOutputFileName = OutputFile; 3730b7ef1a176b9ddd1e0d437efdce20743373fd7dbStephen Hines 3740b7ef1a176b9ddd1e0d437efdce20743373fd7dbStephen Hines return true; 3750b7ef1a176b9ddd1e0d437efdce20743373fd7dbStephen Hines} 3760b7ef1a176b9ddd1e0d437efdce20743373fd7dbStephen Hines 377cc0efad052e944f64bb71cfdaa8a825e30192e78Stephen Hinesint Slang::generateDepFile() { 378be27482cdeaf08576bc39b72a15d35d13014a636Logan if (mDiagnostics->hasErrorOccurred()) 379be27482cdeaf08576bc39b72a15d35d13014a636Logan return 1; 3800b7ef1a176b9ddd1e0d437efdce20743373fd7dbStephen Hines if (mDOS.get() == NULL) 381f7de85223c8728d5dc147e8a19ddf039da72b431Stephen Hines return 1; 382cc0efad052e944f64bb71cfdaa8a825e30192e78Stephen Hines 383e8c263a1c5df81594cf302ecadd813909c894487Zonr Chang // Initialize options for generating dependency file 384cc0efad052e944f64bb71cfdaa8a825e30192e78Stephen Hines clang::DependencyOutputOptions DepOpts; 385cc0efad052e944f64bb71cfdaa8a825e30192e78Stephen Hines DepOpts.IncludeSystemHeaders = 1; 3860b7ef1a176b9ddd1e0d437efdce20743373fd7dbStephen Hines DepOpts.OutputFile = mDepOutputFileName; 387b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao DepOpts.Targets = mAdditionalDepTargets; 388cc0efad052e944f64bb71cfdaa8a825e30192e78Stephen Hines DepOpts.Targets.push_back(mDepTargetBCFileName); 3894cc67fce91f43215d61b2695746eab102a3db516Stephen Hines for (std::vector<std::string>::const_iterator 3904cc67fce91f43215d61b2695746eab102a3db516Stephen Hines I = mGeneratedFileNames.begin(), E = mGeneratedFileNames.end(); 3914cc67fce91f43215d61b2695746eab102a3db516Stephen Hines I != E; 3924cc67fce91f43215d61b2695746eab102a3db516Stephen Hines I++) { 3934cc67fce91f43215d61b2695746eab102a3db516Stephen Hines DepOpts.Targets.push_back(*I); 3944cc67fce91f43215d61b2695746eab102a3db516Stephen Hines } 3954cc67fce91f43215d61b2695746eab102a3db516Stephen Hines mGeneratedFileNames.clear(); 396cc0efad052e944f64bb71cfdaa8a825e30192e78Stephen Hines 397e8c263a1c5df81594cf302ecadd813909c894487Zonr Chang // Per-compilation needed initialization 398cc0efad052e944f64bb71cfdaa8a825e30192e78Stephen Hines createPreprocessor(); 399cc0efad052e944f64bb71cfdaa8a825e30192e78Stephen Hines AttachDependencyFileGen(*mPP.get(), DepOpts); 400cc0efad052e944f64bb71cfdaa8a825e30192e78Stephen Hines 401e8c263a1c5df81594cf302ecadd813909c894487Zonr Chang // Inform the diagnostic client we are processing a source file 402cc0efad052e944f64bb71cfdaa8a825e30192e78Stephen Hines mDiagClient->BeginSourceFile(LangOpts, mPP.get()); 403cc0efad052e944f64bb71cfdaa8a825e30192e78Stephen Hines 404e8c263a1c5df81594cf302ecadd813909c894487Zonr Chang // Go through the source file (no operations necessary) 405cc0efad052e944f64bb71cfdaa8a825e30192e78Stephen Hines clang::Token Tok; 406cc0efad052e944f64bb71cfdaa8a825e30192e78Stephen Hines mPP->EnterMainSourceFile(); 407cc0efad052e944f64bb71cfdaa8a825e30192e78Stephen Hines do { 408cc0efad052e944f64bb71cfdaa8a825e30192e78Stephen Hines mPP->Lex(Tok); 409cc0efad052e944f64bb71cfdaa8a825e30192e78Stephen Hines } while (Tok.isNot(clang::tok::eof)); 410cc0efad052e944f64bb71cfdaa8a825e30192e78Stephen Hines 411cc0efad052e944f64bb71cfdaa8a825e30192e78Stephen Hines mPP->EndSourceFile(); 412cc0efad052e944f64bb71cfdaa8a825e30192e78Stephen Hines 413e8c263a1c5df81594cf302ecadd813909c894487Zonr Chang // Declare success if no error 414be27482cdeaf08576bc39b72a15d35d13014a636Logan if (!mDiagnostics->hasErrorOccurred()) 415e8c263a1c5df81594cf302ecadd813909c894487Zonr Chang mDOS->keep(); 416e8c263a1c5df81594cf302ecadd813909c894487Zonr Chang 417e8c263a1c5df81594cf302ecadd813909c894487Zonr Chang // Clean up after compilation 418cc0efad052e944f64bb71cfdaa8a825e30192e78Stephen Hines mPP.reset(); 419e8c263a1c5df81594cf302ecadd813909c894487Zonr Chang mDOS.reset(); 420cc0efad052e944f64bb71cfdaa8a825e30192e78Stephen Hines 421be27482cdeaf08576bc39b72a15d35d13014a636Logan return mDiagnostics->hasErrorOccurred() ? 1 : 0; 422cc0efad052e944f64bb71cfdaa8a825e30192e78Stephen Hines} 423cc0efad052e944f64bb71cfdaa8a825e30192e78Stephen Hines 424462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liaoint Slang::compile() { 425be27482cdeaf08576bc39b72a15d35d13014a636Logan if (mDiagnostics->hasErrorOccurred()) 426be27482cdeaf08576bc39b72a15d35d13014a636Logan return 1; 427f7de85223c8728d5dc147e8a19ddf039da72b431Stephen Hines if (mOS.get() == NULL) 428f7de85223c8728d5dc147e8a19ddf039da72b431Stephen Hines return 1; 429462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 4309ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao // Here is per-compilation needed initialization 4319ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao createPreprocessor(); 4329ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao createASTContext(); 4333a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Chang 434df5bcce1582d839eead432a5e24435236c90fb05Shih-wei Liao mBackend.reset(createBackend(CodeGenOpts, &mOS->os(), mOT)); 435462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 4369ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao // Inform the diagnostic client we are processing a source file 4379ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao mDiagClient->BeginSourceFile(LangOpts, mPP.get()); 438462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 4399ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao // The core of the slang compiler 4409ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao ParseAST(*mPP, mBackend.get(), *mASTContext); 441462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 442e8c263a1c5df81594cf302ecadd813909c894487Zonr Chang // Inform the diagnostic client we are done with previous source file 443e8c263a1c5df81594cf302ecadd813909c894487Zonr Chang mDiagClient->EndSourceFile(); 444e8c263a1c5df81594cf302ecadd813909c894487Zonr Chang 445e8c263a1c5df81594cf302ecadd813909c894487Zonr Chang // Declare success if no error 446be27482cdeaf08576bc39b72a15d35d13014a636Logan if (!mDiagnostics->hasErrorOccurred()) 447e8c263a1c5df81594cf302ecadd813909c894487Zonr Chang mOS->keep(); 448e8c263a1c5df81594cf302ecadd813909c894487Zonr Chang 4493a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Chang // The compilation ended, clear 4509ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao mBackend.reset(); 4519ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao mASTContext.reset(); 4529ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao mPP.reset(); 453e8c263a1c5df81594cf302ecadd813909c894487Zonr Chang mOS.reset(); 454462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 455be27482cdeaf08576bc39b72a15d35d13014a636Logan return mDiagnostics->hasErrorOccurred() ? 1 : 0; 456462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao} 457462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 4583a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Changvoid Slang::reset() { 4593a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Chang mDiagnostics->Reset(); 4603a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Chang mDiagClient->reset(); 4619ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao return; 462462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao} 463462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 464462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei LiaoSlang::~Slang() { 4659ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao llvm::llvm_shutdown(); 4669ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao return; 467462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao} 468e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hines 469e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hines} // namespace slang 470