slang.cpp revision 641558f02fe6ce0ee3ae5076eb366c25e2ad5903
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 2108df36e5c0a990306d958c9f6d59a5de23b748f6Zonr Chang// Force linking all passes/vmcore stuffs to libslang.so 2208df36e5c0a990306d958c9f6d59a5de23b748f6Zonr Chang#include "llvm/LinkAllPasses.h" 2308df36e5c0a990306d958c9f6d59a5de23b748f6Zonr Chang#include "llvm/LinkAllVMCore.h" 2408df36e5c0a990306d958c9f6d59a5de23b748f6Zonr Chang 256315f76e3cc6ff2d012d1183a0b030d4ff0dc808zonr#include "llvm/Target/TargetSelect.h" 26462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 278c6d9b2d36ed2d6d811279fd9bddc05fffe16803Zonr Chang#include "llvm/System/Path.h" 288c6d9b2d36ed2d6d811279fd9bddc05fffe16803Zonr Chang 293a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Chang#include "llvm/Support/raw_ostream.h" 306315f76e3cc6ff2d012d1183a0b030d4ff0dc808zonr#include "llvm/Support/MemoryBuffer.h" 316315f76e3cc6ff2d012d1183a0b030d4ff0dc808zonr#include "llvm/Support/ErrorHandling.h" 326315f76e3cc6ff2d012d1183a0b030d4ff0dc808zonr#include "llvm/Support/ManagedStatic.h" 33462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 346315f76e3cc6ff2d012d1183a0b030d4ff0dc808zonr#include "clang/Basic/LangOptions.h" 353a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Chang#include "clang/Basic/SourceManager.h" 363a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Chang#include "clang/Basic/TargetInfo.h" 376315f76e3cc6ff2d012d1183a0b030d4ff0dc808zonr#include "clang/Basic/TargetOptions.h" 38462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 39cc0efad052e944f64bb71cfdaa8a825e30192e78Stephen Hines#include "clang/Frontend/DependencyOutputOptions.h" 40cc0efad052e944f64bb71cfdaa8a825e30192e78Stephen Hines#include "clang/Frontend/FrontendDiagnostic.h" 41cc0efad052e944f64bb71cfdaa8a825e30192e78Stephen Hines#include "clang/Frontend/Utils.h" 42cc0efad052e944f64bb71cfdaa8a825e30192e78Stephen Hines 433a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Chang#include "clang/Lex/Preprocessor.h" 443a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Chang#include "clang/Lex/HeaderSearch.h" 453a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Chang 463a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Chang#include "clang/AST/ASTConsumer.h" 473a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Chang#include "clang/AST/ASTContext.h" 483a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Chang 493a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Chang#include "clang/Basic/FileManager.h" 503a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Chang 513a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Chang#include "clang/Frontend/CodeGenOptions.h" 526315f76e3cc6ff2d012d1183a0b030d4ff0dc808zonr#include "clang/Frontend/FrontendDiagnostic.h" 53462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 546315f76e3cc6ff2d012d1183a0b030d4ff0dc808zonr#include "clang/Parse/ParseAST.h" 556315f76e3cc6ff2d012d1183a0b030d4ff0dc808zonr 568c6d9b2d36ed2d6d811279fd9bddc05fffe16803Zonr Chang#include "slang_utils.h" 573a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Chang#include "slang_backend.h" 589ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 5908df36e5c0a990306d958c9f6d59a5de23b748f6Zonr Chang// More force linking 6008df36e5c0a990306d958c9f6d59a5de23b748f6Zonr Chang#include "llvm/Linker.h" 6108df36e5c0a990306d958c9f6d59a5de23b748f6Zonr Chang#include "llvm/Bitcode/ReaderWriter.h" 6208df36e5c0a990306d958c9f6d59a5de23b748f6Zonr Chang 63b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao#include "clang/Frontend/DiagnosticOptions.h" 64b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao#include "clang/Frontend/TextDiagnosticPrinter.h" 65b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao 6608df36e5c0a990306d958c9f6d59a5de23b748f6Zonr Changnamespace { 6708df36e5c0a990306d958c9f6d59a5de23b748f6Zonr Chang struct ForceSlangLinking { 6808df36e5c0a990306d958c9f6d59a5de23b748f6Zonr Chang ForceSlangLinking() { 6908df36e5c0a990306d958c9f6d59a5de23b748f6Zonr Chang // We must reference the functions in such a way that compilers will not 7008df36e5c0a990306d958c9f6d59a5de23b748f6Zonr Chang // delete it all as dead code, even with whole program optimization, 7108df36e5c0a990306d958c9f6d59a5de23b748f6Zonr Chang // yet is effectively a NO-OP. As the compiler isn't smart enough 7208df36e5c0a990306d958c9f6d59a5de23b748f6Zonr Chang // to know that getenv() never returns -1, this will do the job. 7308df36e5c0a990306d958c9f6d59a5de23b748f6Zonr Chang if (std::getenv("bar") != reinterpret_cast<char*>(-1)) 7408df36e5c0a990306d958c9f6d59a5de23b748f6Zonr Chang return; 7508df36e5c0a990306d958c9f6d59a5de23b748f6Zonr Chang 7608df36e5c0a990306d958c9f6d59a5de23b748f6Zonr Chang // llvm-rs-link needs following functions existing in libslang. 7708df36e5c0a990306d958c9f6d59a5de23b748f6Zonr Chang llvm::ParseBitcodeFile(NULL, llvm::getGlobalContext(), NULL); 7808df36e5c0a990306d958c9f6d59a5de23b748f6Zonr Chang llvm::Linker::LinkModules(NULL, NULL, NULL); 79b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao 80b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao // llvm-rs-cc need this. 81b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao new clang::TextDiagnosticPrinter(llvm::errs(), 82b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao clang::DiagnosticOptions()); 8308df36e5c0a990306d958c9f6d59a5de23b748f6Zonr Chang } 8408df36e5c0a990306d958c9f6d59a5de23b748f6Zonr Chang } ForceSlangLinking; 8508df36e5c0a990306d958c9f6d59a5de23b748f6Zonr Chang} 8608df36e5c0a990306d958c9f6d59a5de23b748f6Zonr Chang 879ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liaousing namespace slang; 889ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 89462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao#if defined(__arm__) 90462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao# define DEFAULT_TARGET_TRIPLE_STRING "armv7-none-linux-gnueabi" 91462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao#elif defined(__x86_64__) 92462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao# define DEFAULT_TARGET_TRIPLE_STRING "x86_64-unknown-linux" 93462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao#else 949ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao// let's use x86 as default target 959ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao# define DEFAULT_TARGET_TRIPLE_STRING "i686-unknown-linux" 96462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao#endif 97462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 98462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liaobool Slang::GlobalInitialized = false; 99462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 1009ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao// Language option (define the language feature for compiler such as C99) 1019ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liaoclang::LangOptions Slang::LangOpts; 102462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 1036315f76e3cc6ff2d012d1183a0b030d4ff0dc808zonr// Code generation option for the compiler 1049ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liaoclang::CodeGenOptions Slang::CodeGenOpts; 105462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 1066315f76e3cc6ff2d012d1183a0b030d4ff0dc808zonrconst std::string Slang::TargetDescription = 1076315f76e3cc6ff2d012d1183a0b030d4ff0dc808zonr "e-" // little-endian 1086315f76e3cc6ff2d012d1183a0b030d4ff0dc808zonr "p:32:32:32-" // 32-bit pointer 1096315f76e3cc6ff2d012d1183a0b030d4ff0dc808zonr "i1:8:8-" 1106315f76e3cc6ff2d012d1183a0b030d4ff0dc808zonr "i8:8:8-" 1116315f76e3cc6ff2d012d1183a0b030d4ff0dc808zonr "i16:16:16-" 1126315f76e3cc6ff2d012d1183a0b030d4ff0dc808zonr "i32:32:32-" 1136315f76e3cc6ff2d012d1183a0b030d4ff0dc808zonr "i64:64:64-" 1146315f76e3cc6ff2d012d1183a0b030d4ff0dc808zonr "f32:32:32-" 1156315f76e3cc6ff2d012d1183a0b030d4ff0dc808zonr "f64:64:64-" 1166315f76e3cc6ff2d012d1183a0b030d4ff0dc808zonr "v64:64:64-" // 64-bit vector (e.g. float2, int2, short4) 1176315f76e3cc6ff2d012d1183a0b030d4ff0dc808zonr "v128:128:128-" 1186315f76e3cc6ff2d012d1183a0b030d4ff0dc808zonr "a0:0:64-" 1196315f76e3cc6ff2d012d1183a0b030d4ff0dc808zonr "n32"; // native CPU only support 32-bit integer width. 120462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 1219ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao// The named of metadata node that pragma resides (should be synced with 1229ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao// bcc.cpp) 123f52a620440fa62257dfdcf2583f0f9df5b855c76Shih-wei Liaoconst llvm::StringRef Slang::PragmaMetadataName = "#pragma"; 124462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 125e8c263a1c5df81594cf302ecadd813909c894487Zonr Changstatic inline llvm::tool_output_file *OpenOutputFile(const char *OutputFile, 126e8c263a1c5df81594cf302ecadd813909c894487Zonr Chang unsigned Flags, 127e8c263a1c5df81594cf302ecadd813909c894487Zonr Chang std::string* Error, 128e8c263a1c5df81594cf302ecadd813909c894487Zonr Chang clang::Diagnostic* Diag) { 129e8c263a1c5df81594cf302ecadd813909c894487Zonr Chang assert((OutputFile != NULL) && (Error != NULL) && (Diag != NULL) && 130e8c263a1c5df81594cf302ecadd813909c894487Zonr Chang "Invalid parameter!"); 131e8c263a1c5df81594cf302ecadd813909c894487Zonr Chang 132e8c263a1c5df81594cf302ecadd813909c894487Zonr Chang llvm::sys::Path OutputFilePath(OutputFile); 133e8c263a1c5df81594cf302ecadd813909c894487Zonr Chang 134e8c263a1c5df81594cf302ecadd813909c894487Zonr Chang if (SlangUtils::CreateDirectoryWithParents(OutputFilePath.getDirname(), 135e8c263a1c5df81594cf302ecadd813909c894487Zonr Chang Error)) { 136e8c263a1c5df81594cf302ecadd813909c894487Zonr Chang llvm::tool_output_file *F = 137e8c263a1c5df81594cf302ecadd813909c894487Zonr Chang new llvm::tool_output_file(OutputFile, *Error, Flags); 138e8c263a1c5df81594cf302ecadd813909c894487Zonr Chang if (F != NULL) 139e8c263a1c5df81594cf302ecadd813909c894487Zonr Chang return F; 140e8c263a1c5df81594cf302ecadd813909c894487Zonr Chang } 141e8c263a1c5df81594cf302ecadd813909c894487Zonr Chang 142e8c263a1c5df81594cf302ecadd813909c894487Zonr Chang // Report error here. 143e8c263a1c5df81594cf302ecadd813909c894487Zonr Chang Diag->Report(clang::diag::err_fe_error_opening) << OutputFile << *Error; 144e8c263a1c5df81594cf302ecadd813909c894487Zonr Chang 145e8c263a1c5df81594cf302ecadd813909c894487Zonr Chang return NULL; 146e8c263a1c5df81594cf302ecadd813909c894487Zonr Chang} 147e8c263a1c5df81594cf302ecadd813909c894487Zonr Chang 148462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liaovoid Slang::GlobalInitialization() { 1499ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao if (!GlobalInitialized) { 1509ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao // We only support x86, x64 and ARM target 151462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 1529ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao // For ARM 1539ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao LLVMInitializeARMTargetInfo(); 1549ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao LLVMInitializeARMTarget(); 1559ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao LLVMInitializeARMAsmPrinter(); 156462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 1579ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao // For x86 and x64 1589ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao LLVMInitializeX86TargetInfo(); 1599ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao LLVMInitializeX86Target(); 1609ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao LLVMInitializeX86AsmPrinter(); 161462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 1623a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Chang // Please refer to include/clang/Basic/LangOptions.h to setup 1639ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao // the options. 1649ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao LangOpts.RTTI = 0; // Turn off the RTTI information support 1659ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao LangOpts.NeXTRuntime = 0; // Turn off the NeXT runtime uses 1669ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao LangOpts.Bool = 1; // Turn on 'bool', 'true', 'false' keywords 167462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 1689ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao CodeGenOpts.OptimizationLevel = 3; /* -O3 */ 169462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 1709ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao GlobalInitialized = true; 1719ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao } 172462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 1739ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao return; 174462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao} 175462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 176462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liaovoid Slang::LLVMErrorHandler(void *UserData, const std::string &Message) { 1779ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao clang::Diagnostic* Diags = static_cast<clang::Diagnostic*>(UserData); 1789ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao Diags->Report(clang::diag::err_fe_error_backend) << Message; 1799ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao exit(1); 180462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao} 181462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 1823a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Changvoid Slang::createDiagnostic() { 1833a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Chang mDiagnostics = 1843a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Chang llvm::IntrusiveRefCntPtr<clang::Diagnostic>(new clang::Diagnostic()); 1853a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Chang mDiagClient = new DiagnosticBuffer(); 1863a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Chang // This takes the ownership of mDiagClient. 1873a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Chang mDiagnostics->setClient(mDiagClient); 188641558f02fe6ce0ee3ae5076eb366c25e2ad5903Zonr Chang initDiagnostic(); 1893a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Chang return; 1903a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Chang} 1913a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Chang 192b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liaovoid Slang::createTarget(const std::string &Triple, const std::string &CPU, 193b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao const std::vector<std::string> &Features) { 194b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao if (!Triple.empty()) 1959ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao mTargetOpts.Triple = Triple; 1969ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao else 1979ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao mTargetOpts.Triple = DEFAULT_TARGET_TRIPLE_STRING; 198462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 199b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao if (!CPU.empty()) 2009ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao mTargetOpts.CPU = CPU; 201462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 202b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao if (!Features.empty()) 203b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao mTargetOpts.Features = Features; 204b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao 2059ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao mTarget.reset(clang::TargetInfo::CreateTargetInfo(*mDiagnostics, 2069ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao mTargetOpts)); 207462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 208b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao return; 209462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao} 210462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 2113a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Changvoid Slang::createFileManager() { 2123a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Chang mFileMgr.reset(new clang::FileManager()); 2133a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Chang} 2143a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Chang 2153a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Changvoid Slang::createSourceManager() { 2163a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Chang mSourceMgr.reset(new clang::SourceManager(*mDiagnostics)); 2173a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Chang return; 2183a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Chang} 2193a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Chang 22068e8e9f98730b3672fb96d49e33b9db70a90ed3fShih-wei Liaovoid Slang::createPreprocessor() { 2219ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao // Default only search header file in current dir 2229ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao clang::HeaderSearch *HS = new clang::HeaderSearch(*mFileMgr); 2239ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 2249ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao mPP.reset(new clang::Preprocessor(*mDiagnostics, 2259ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao LangOpts, 2269ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao *mTarget, 2279ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao *mSourceMgr, 2289ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao *HS, 2299ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao NULL, 2303a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Chang /* OwnsHeaderSearch = */true)); 2319ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao // Initialize the prepocessor 23268e8e9f98730b3672fb96d49e33b9db70a90ed3fShih-wei Liao mPragmas.clear(); 233f52a620440fa62257dfdcf2583f0f9df5b855c76Shih-wei Liao mPP->AddPragmaHandler(new PragmaRecorder(mPragmas)); 23468e8e9f98730b3672fb96d49e33b9db70a90ed3fShih-wei Liao 2359ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao std::vector<clang::DirectoryLookup> SearchList; 2363a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Chang for (unsigned i = 0, e = mIncludePaths.size(); i != e; i++) { 2379ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao if (const clang::DirectoryEntry *DE = 2383a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Chang mFileMgr->getDirectory(mIncludePaths[i])) { 2399ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao SearchList.push_back(clang::DirectoryLookup(DE, 2409ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao clang::SrcMgr::C_System, 2419ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao false, 2429ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao false)); 2439ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao } 2449089828a995422a5ed3beeed0890b755c4abe188Shih-wei Liao } 2459089828a995422a5ed3beeed0890b755c4abe188Shih-wei Liao 2469089828a995422a5ed3beeed0890b755c4abe188Shih-wei Liao HS->SetSearchPaths(SearchList, 1, false); 2479089828a995422a5ed3beeed0890b755c4abe188Shih-wei Liao 2483a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Chang initPreprocessor(); 24968e8e9f98730b3672fb96d49e33b9db70a90ed3fShih-wei Liao return; 25068e8e9f98730b3672fb96d49e33b9db70a90ed3fShih-wei Liao} 25168e8e9f98730b3672fb96d49e33b9db70a90ed3fShih-wei Liao 2523a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Changvoid Slang::createASTContext() { 2533a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Chang mASTContext.reset(new clang::ASTContext(LangOpts, 2543a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Chang *mSourceMgr, 2553a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Chang *mTarget, 2563a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Chang mPP->getIdentifierTable(), 2573a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Chang mPP->getSelectorTable(), 2583a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Chang mPP->getBuiltinInfo(), 2593a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Chang /* size_reserve = */0)); 2603a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Chang initASTContext(); 2613a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Chang return; 2623a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Chang} 2633a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Chang 2643a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Changclang::ASTConsumer 2653a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Chang*Slang::createBackend(const clang::CodeGenOptions& CodeGenOpts, 2663a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Chang llvm::raw_ostream *OS, 2673a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Chang OutputType OT) { 2683a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Chang return new Backend(*mDiagnostics, 2693a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Chang CodeGenOpts, 2703a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Chang mTargetOpts, 2713a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Chang mPragmas, 2723a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Chang OS, 2733a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Chang OT); 2743a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Chang} 2753a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Chang 276641558f02fe6ce0ee3ae5076eb366c25e2ad5903Zonr ChangSlang::Slang() : mInitialized(false), mDiagClient(NULL), mOT(OT_Default) { 2779ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao GlobalInitialization(); 278641558f02fe6ce0ee3ae5076eb366c25e2ad5903Zonr Chang return; 279641558f02fe6ce0ee3ae5076eb366c25e2ad5903Zonr Chang} 280641558f02fe6ce0ee3ae5076eb366c25e2ad5903Zonr Chang 281641558f02fe6ce0ee3ae5076eb366c25e2ad5903Zonr Changvoid Slang::init(const std::string &Triple, const std::string &CPU, 282641558f02fe6ce0ee3ae5076eb366c25e2ad5903Zonr Chang const std::vector<std::string> &Features) { 283641558f02fe6ce0ee3ae5076eb366c25e2ad5903Zonr Chang if (mInitialized) 284641558f02fe6ce0ee3ae5076eb366c25e2ad5903Zonr Chang return; 285462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 2869ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao createDiagnostic(); 2873a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Chang llvm::install_fatal_error_handler(LLVMErrorHandler, mDiagnostics.getPtr()); 288462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 2899ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao createTarget(Triple, CPU, Features); 2909ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao createFileManager(); 2919ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao createSourceManager(); 292462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 293641558f02fe6ce0ee3ae5076eb366c25e2ad5903Zonr Chang mInitialized = true; 294641558f02fe6ce0ee3ae5076eb366c25e2ad5903Zonr Chang 2959ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao return; 296462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao} 297462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 2983a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Changbool Slang::setInputSource(llvm::StringRef InputFile, 2993a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Chang const char *Text, 3003a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Chang size_t TextLength) { 3013a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Chang mInputFileName = InputFile.str(); 302462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 3039ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao // Reset the ID tables if we are reusing the SourceManager 3049ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao mSourceMgr->clearIDTables(); 305462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 3069ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao // Load the source 3076315f76e3cc6ff2d012d1183a0b030d4ff0dc808zonr llvm::MemoryBuffer *SB = 3083a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Chang llvm::MemoryBuffer::getMemBuffer(Text, Text + TextLength); 3099ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao mSourceMgr->createMainFileIDForMemBuffer(SB); 310462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 3119ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao if (mSourceMgr->getMainFileID().isInvalid()) { 3123a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Chang mDiagnostics->Report(clang::diag::err_fe_error_reading) << InputFile; 3139ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao return false; 3149ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao } 3159ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao return true; 316462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao} 317462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 3183a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Changbool Slang::setInputSource(llvm::StringRef InputFile) { 3193a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Chang mInputFileName = InputFile.str(); 320462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 3219ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao mSourceMgr->clearIDTables(); 322462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 3233a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Chang const clang::FileEntry *File = mFileMgr->getFile(InputFile); 3249ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao if (File) 3259ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao mSourceMgr->createMainFileID(File); 326462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 3279ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao if (mSourceMgr->getMainFileID().isInvalid()) { 3283a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Chang mDiagnostics->Report(clang::diag::err_fe_error_reading) << InputFile; 3299ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao return false; 3309ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao } 331462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 3329ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao return true; 333462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao} 334462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 3353a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Changbool Slang::setOutput(const char *OutputFile) { 3368c6d9b2d36ed2d6d811279fd9bddc05fffe16803Zonr Chang llvm::sys::Path OutputFilePath(OutputFile); 3379ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao std::string Error; 338e8c263a1c5df81594cf302ecadd813909c894487Zonr Chang llvm::tool_output_file *OS = NULL; 339462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 3403a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Chang switch (mOT) { 341cc0efad052e944f64bb71cfdaa8a825e30192e78Stephen Hines case OT_Dependency: 3423a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Chang case OT_Assembly: 3433a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Chang case OT_LLVMAssembly: { 344e8c263a1c5df81594cf302ecadd813909c894487Zonr Chang OS = OpenOutputFile(OutputFile, 0, &Error, mDiagnostics.getPtr()); 3459ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao break; 346462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao } 3473a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Chang case OT_Nothing: { 3489ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao break; 349462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao } 3503a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Chang case OT_Object: 351cc0efad052e944f64bb71cfdaa8a825e30192e78Stephen Hines case OT_Bitcode: { 352e8c263a1c5df81594cf302ecadd813909c894487Zonr Chang OS = OpenOutputFile(OutputFile, 353e8c263a1c5df81594cf302ecadd813909c894487Zonr Chang llvm::raw_fd_ostream::F_Binary, 354e8c263a1c5df81594cf302ecadd813909c894487Zonr Chang &Error, 355e8c263a1c5df81594cf302ecadd813909c894487Zonr Chang mDiagnostics.getPtr()); 3569ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao break; 3579ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao } 3588c6d9b2d36ed2d6d811279fd9bddc05fffe16803Zonr Chang default: { 359cc0efad052e944f64bb71cfdaa8a825e30192e78Stephen Hines llvm_unreachable("Unknown compiler output type"); 3608c6d9b2d36ed2d6d811279fd9bddc05fffe16803Zonr Chang } 3619ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao } 362462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 363e8c263a1c5df81594cf302ecadd813909c894487Zonr Chang if (!Error.empty()) 3649ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao return false; 365e8c263a1c5df81594cf302ecadd813909c894487Zonr Chang 366e8c263a1c5df81594cf302ecadd813909c894487Zonr Chang mOS.reset(OS); 3679ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 3683a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Chang mOutputFileName = OutputFile; 369462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 3709ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao return true; 371462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao} 372462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 3730b7ef1a176b9ddd1e0d437efdce20743373fd7dbStephen Hinesbool Slang::setDepOutput(const char *OutputFile) { 3748c6d9b2d36ed2d6d811279fd9bddc05fffe16803Zonr Chang llvm::sys::Path OutputFilePath(OutputFile); 3750b7ef1a176b9ddd1e0d437efdce20743373fd7dbStephen Hines std::string Error; 3768c6d9b2d36ed2d6d811279fd9bddc05fffe16803Zonr Chang 377e8c263a1c5df81594cf302ecadd813909c894487Zonr Chang mDOS.reset(OpenOutputFile(OutputFile, 0, &Error, mDiagnostics.getPtr())); 378e8c263a1c5df81594cf302ecadd813909c894487Zonr Chang if (!Error.empty() || (mDOS.get() == NULL)) 3790b7ef1a176b9ddd1e0d437efdce20743373fd7dbStephen Hines return false; 3800b7ef1a176b9ddd1e0d437efdce20743373fd7dbStephen Hines 3810b7ef1a176b9ddd1e0d437efdce20743373fd7dbStephen Hines mDepOutputFileName = OutputFile; 3820b7ef1a176b9ddd1e0d437efdce20743373fd7dbStephen Hines 3830b7ef1a176b9ddd1e0d437efdce20743373fd7dbStephen Hines return true; 3840b7ef1a176b9ddd1e0d437efdce20743373fd7dbStephen Hines} 3850b7ef1a176b9ddd1e0d437efdce20743373fd7dbStephen Hines 386cc0efad052e944f64bb71cfdaa8a825e30192e78Stephen Hinesint Slang::generateDepFile() { 387b257301a1c711ba81458a4f8bf3c99c91c91a047Zonr Chang if (mDiagnostics->getNumErrors() > 0) 388cc0efad052e944f64bb71cfdaa8a825e30192e78Stephen Hines return mDiagnostics->getNumErrors(); 3890b7ef1a176b9ddd1e0d437efdce20743373fd7dbStephen Hines if (mDOS.get() == NULL) 390f7de85223c8728d5dc147e8a19ddf039da72b431Stephen Hines return 1; 391cc0efad052e944f64bb71cfdaa8a825e30192e78Stephen Hines 392e8c263a1c5df81594cf302ecadd813909c894487Zonr Chang // Initialize options for generating dependency file 393cc0efad052e944f64bb71cfdaa8a825e30192e78Stephen Hines clang::DependencyOutputOptions DepOpts; 394cc0efad052e944f64bb71cfdaa8a825e30192e78Stephen Hines DepOpts.IncludeSystemHeaders = 1; 3950b7ef1a176b9ddd1e0d437efdce20743373fd7dbStephen Hines DepOpts.OutputFile = mDepOutputFileName; 396b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao DepOpts.Targets = mAdditionalDepTargets; 397cc0efad052e944f64bb71cfdaa8a825e30192e78Stephen Hines DepOpts.Targets.push_back(mDepTargetBCFileName); 398cc0efad052e944f64bb71cfdaa8a825e30192e78Stephen Hines 399e8c263a1c5df81594cf302ecadd813909c894487Zonr Chang // Per-compilation needed initialization 400cc0efad052e944f64bb71cfdaa8a825e30192e78Stephen Hines createPreprocessor(); 401cc0efad052e944f64bb71cfdaa8a825e30192e78Stephen Hines AttachDependencyFileGen(*mPP.get(), DepOpts); 402cc0efad052e944f64bb71cfdaa8a825e30192e78Stephen Hines 403e8c263a1c5df81594cf302ecadd813909c894487Zonr Chang // Inform the diagnostic client we are processing a source file 404cc0efad052e944f64bb71cfdaa8a825e30192e78Stephen Hines mDiagClient->BeginSourceFile(LangOpts, mPP.get()); 405cc0efad052e944f64bb71cfdaa8a825e30192e78Stephen Hines 406e8c263a1c5df81594cf302ecadd813909c894487Zonr Chang // Go through the source file (no operations necessary) 407cc0efad052e944f64bb71cfdaa8a825e30192e78Stephen Hines clang::Token Tok; 408cc0efad052e944f64bb71cfdaa8a825e30192e78Stephen Hines mPP->EnterMainSourceFile(); 409cc0efad052e944f64bb71cfdaa8a825e30192e78Stephen Hines do { 410cc0efad052e944f64bb71cfdaa8a825e30192e78Stephen Hines mPP->Lex(Tok); 411cc0efad052e944f64bb71cfdaa8a825e30192e78Stephen Hines } while (Tok.isNot(clang::tok::eof)); 412cc0efad052e944f64bb71cfdaa8a825e30192e78Stephen Hines 413cc0efad052e944f64bb71cfdaa8a825e30192e78Stephen Hines mPP->EndSourceFile(); 414cc0efad052e944f64bb71cfdaa8a825e30192e78Stephen Hines 415e8c263a1c5df81594cf302ecadd813909c894487Zonr Chang // Declare success if no error 416e8c263a1c5df81594cf302ecadd813909c894487Zonr Chang if (mDiagnostics->getNumErrors() == 0) 417e8c263a1c5df81594cf302ecadd813909c894487Zonr Chang mDOS->keep(); 418e8c263a1c5df81594cf302ecadd813909c894487Zonr Chang 419e8c263a1c5df81594cf302ecadd813909c894487Zonr Chang // Clean up after compilation 420cc0efad052e944f64bb71cfdaa8a825e30192e78Stephen Hines mPP.reset(); 421e8c263a1c5df81594cf302ecadd813909c894487Zonr Chang mDOS.reset(); 422cc0efad052e944f64bb71cfdaa8a825e30192e78Stephen Hines 423cc0efad052e944f64bb71cfdaa8a825e30192e78Stephen Hines return mDiagnostics->getNumErrors(); 424cc0efad052e944f64bb71cfdaa8a825e30192e78Stephen Hines} 425cc0efad052e944f64bb71cfdaa8a825e30192e78Stephen Hines 426462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liaoint Slang::compile() { 427f7de85223c8728d5dc147e8a19ddf039da72b431Stephen Hines if (mDiagnostics->getNumErrors() > 0) 4289ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao return mDiagnostics->getNumErrors(); 429f7de85223c8728d5dc147e8a19ddf039da72b431Stephen Hines if (mOS.get() == NULL) 430f7de85223c8728d5dc147e8a19ddf039da72b431Stephen Hines return 1; 431462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 4329ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao // Here is per-compilation needed initialization 4339ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao createPreprocessor(); 4349ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao createASTContext(); 4353a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Chang 436e8c263a1c5df81594cf302ecadd813909c894487Zonr Chang mBackend.reset(createBackend(CodeGenOpts, mOS.get(), mOT)); 437462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 4389ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao // Inform the diagnostic client we are processing a source file 4399ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao mDiagClient->BeginSourceFile(LangOpts, mPP.get()); 440462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 4419ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao // The core of the slang compiler 4429ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao ParseAST(*mPP, mBackend.get(), *mASTContext); 443462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 444e8c263a1c5df81594cf302ecadd813909c894487Zonr Chang // Inform the diagnostic client we are done with previous source file 445e8c263a1c5df81594cf302ecadd813909c894487Zonr Chang mDiagClient->EndSourceFile(); 446e8c263a1c5df81594cf302ecadd813909c894487Zonr Chang 447e8c263a1c5df81594cf302ecadd813909c894487Zonr Chang // Declare success if no error 448e8c263a1c5df81594cf302ecadd813909c894487Zonr Chang if (mDiagnostics->getNumErrors() == 0) 449e8c263a1c5df81594cf302ecadd813909c894487Zonr Chang mOS->keep(); 450e8c263a1c5df81594cf302ecadd813909c894487Zonr Chang 4513a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Chang // The compilation ended, clear 4529ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao mBackend.reset(); 4539ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao mASTContext.reset(); 4549ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao mPP.reset(); 455e8c263a1c5df81594cf302ecadd813909c894487Zonr Chang mOS.reset(); 456462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 4579ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao return mDiagnostics->getNumErrors(); 458462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao} 459462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 4603a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Changvoid Slang::reset() { 4613a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Chang mDiagnostics->Reset(); 4623a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Chang mDiagClient->reset(); 4639ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao return; 464462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao} 465462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 466462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei LiaoSlang::~Slang() { 4679ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao llvm::llvm_shutdown(); 4689ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao return; 469462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao} 470