slang.cpp revision eeb251e8db802b836af7461d0f6eb1252c527ab8
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" 2823c4358f12bd9d0ba7166eceebd683db95a41b3fStephen Hines#include "clang/Basic/DiagnosticOptions.h" 29e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hines#include "clang/Basic/FileManager.h" 30df5bcce1582d839eead432a5e24435236c90fb05Shih-wei Liao#include "clang/Basic/FileSystemOptions.h" 316315f76e3cc6ff2d012d1183a0b030d4ff0dc808zonr#include "clang/Basic/LangOptions.h" 323a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Chang#include "clang/Basic/SourceManager.h" 333a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Chang#include "clang/Basic/TargetInfo.h" 346315f76e3cc6ff2d012d1183a0b030d4ff0dc808zonr#include "clang/Basic/TargetOptions.h" 35462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 36e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hines#include "clang/Frontend/CodeGenOptions.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" 4323c4358f12bd9d0ba7166eceebd683db95a41b3fStephen Hines#include "clang/Lex/PreprocessorOptions.h" 443a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Chang#include "clang/Lex/HeaderSearch.h" 4523c4358f12bd9d0ba7166eceebd683db95a41b3fStephen Hines#include "clang/Lex/HeaderSearchOptions.h" 463a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Chang 476315f76e3cc6ff2d012d1183a0b030d4ff0dc808zonr#include "clang/Parse/ParseAST.h" 486315f76e3cc6ff2d012d1183a0b030d4ff0dc808zonr 49be27482cdeaf08576bc39b72a15d35d13014a636Logan#include "llvm/ADT/IntrusiveRefCntPtr.h" 50be27482cdeaf08576bc39b72a15d35d13014a636Logan 51e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hines#include "llvm/Bitcode/ReaderWriter.h" 529ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 5308df36e5c0a990306d958c9f6d59a5de23b748f6Zonr Chang// More force linking 5408df36e5c0a990306d958c9f6d59a5de23b748f6Zonr Chang#include "llvm/Linker.h" 5508df36e5c0a990306d958c9f6d59a5de23b748f6Zonr Chang 56e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hines// Force linking all passes/vmcore stuffs to libslang.so 570da7f6c8201b27938d3b9f048d71fd784cd1df9aStephen Hines#include "llvm/LinkAllIR.h" 58e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hines#include "llvm/LinkAllPasses.h" 59e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hines 60e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hines#include "llvm/Support/raw_ostream.h" 61e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hines#include "llvm/Support/MemoryBuffer.h" 62e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hines#include "llvm/Support/ErrorHandling.h" 63e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hines#include "llvm/Support/ManagedStatic.h" 64be27482cdeaf08576bc39b72a15d35d13014a636Logan#include "llvm/Support/Path.h" 659207a2e495c8363606861e4f034504ec5c153dabLogan Chien#include "llvm/Support/TargetSelect.h" 669207a2e495c8363606861e4f034504ec5c153dabLogan Chien#include "llvm/Support/ToolOutputFile.h" 67e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hines 686e6578a360497f78a181e63d7783422a9c9bfb15Stephen Hines#include "slang_assert.h" 69e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hines#include "slang_backend.h" 70e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hines#include "slang_utils.h" 71b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao 7208df36e5c0a990306d958c9f6d59a5de23b748f6Zonr Changnamespace { 7308df36e5c0a990306d958c9f6d59a5de23b748f6Zonr Chang 74e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hinesstruct ForceSlangLinking { 75e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hines ForceSlangLinking() { 76e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hines // We must reference the functions in such a way that compilers will not 77e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hines // delete it all as dead code, even with whole program optimization, 78e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hines // yet is effectively a NO-OP. As the compiler isn't smart enough 79e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hines // to know that getenv() never returns -1, this will do the job. 80e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hines if (std::getenv("bar") != reinterpret_cast<char*>(-1)) 81e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hines return; 82e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hines 83e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hines // llvm-rs-link needs following functions existing in libslang. 84e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hines llvm::ParseBitcodeFile(NULL, llvm::getGlobalContext(), NULL); 859207a2e495c8363606861e4f034504ec5c153dabLogan Chien llvm::Linker::LinkModules(NULL, NULL, 0, NULL); 86e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hines 87e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hines // llvm-rs-cc need this. 88e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hines new clang::TextDiagnosticPrinter(llvm::errs(), 8923c4358f12bd9d0ba7166eceebd683db95a41b3fStephen Hines new clang::DiagnosticOptions()); 90e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hines } 91e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hines} ForceSlangLinking; 92e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hines 93e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hines} // namespace 94e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hines 95e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hinesnamespace slang { 969ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 97462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao#if defined(__arm__) 98462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao# define DEFAULT_TARGET_TRIPLE_STRING "armv7-none-linux-gnueabi" 99462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao#elif defined(__x86_64__) 100462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao# define DEFAULT_TARGET_TRIPLE_STRING "x86_64-unknown-linux" 101462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao#else 1029ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao// let's use x86 as default target 1039ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao# define DEFAULT_TARGET_TRIPLE_STRING "i686-unknown-linux" 104462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao#endif 105462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 106462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liaobool Slang::GlobalInitialized = false; 107462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 1089ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao// Language option (define the language feature for compiler such as C99) 1099ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liaoclang::LangOptions Slang::LangOpts; 110462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 1116315f76e3cc6ff2d012d1183a0b030d4ff0dc808zonr// Code generation option for the compiler 1129ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liaoclang::CodeGenOptions Slang::CodeGenOpts; 113462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 1149ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao// The named of metadata node that pragma resides (should be synced with 1159ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao// bcc.cpp) 116f52a620440fa62257dfdcf2583f0f9df5b855c76Shih-wei Liaoconst llvm::StringRef Slang::PragmaMetadataName = "#pragma"; 117462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 1189207a2e495c8363606861e4f034504ec5c153dabLogan Chienstatic inline llvm::tool_output_file * 1199207a2e495c8363606861e4f034504ec5c153dabLogan ChienOpenOutputFile(const char *OutputFile, 120a1f95ee8df425089100148a42954cf61dc285015Stephen Hines llvm::sys::fs::OpenFlags Flags, 1219207a2e495c8363606861e4f034504ec5c153dabLogan Chien std::string* Error, 122e67239de8d94975e7e2216ee6860ae2e6cb8b15aStephen Hines clang::DiagnosticsEngine *DiagEngine) { 1239207a2e495c8363606861e4f034504ec5c153dabLogan Chien slangAssert((OutputFile != NULL) && (Error != NULL) && 1249207a2e495c8363606861e4f034504ec5c153dabLogan Chien (DiagEngine != NULL) && "Invalid parameter!"); 125e8c263a1c5df81594cf302ecadd813909c894487Zonr Chang 1266f4e0a9955a53a6f715af7e674e68ed15270a47cLogan Chien if (SlangUtils::CreateDirectoryWithParents( 1276f4e0a9955a53a6f715af7e674e68ed15270a47cLogan Chien llvm::sys::path::parent_path(OutputFile), 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. 1359207a2e495c8363606861e4f034504ec5c153dabLogan Chien DiagEngine->Report(clang::diag::err_fe_error_opening) 1369207a2e495c8363606861e4f034504ec5c153dabLogan Chien << OutputFile << *Error; 137e8c263a1c5df81594cf302ecadd813909c894487Zonr Chang 138e8c263a1c5df81594cf302ecadd813909c894487Zonr Chang return NULL; 139e8c263a1c5df81594cf302ecadd813909c894487Zonr Chang} 140e8c263a1c5df81594cf302ecadd813909c894487Zonr Chang 141462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liaovoid Slang::GlobalInitialization() { 1429ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao if (!GlobalInitialized) { 1439ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao // We only support x86, x64 and ARM target 144462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 1459ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao // For ARM 1469ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao LLVMInitializeARMTargetInfo(); 1479ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao LLVMInitializeARMTarget(); 1489ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao LLVMInitializeARMAsmPrinter(); 149462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 1509ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao // For x86 and x64 1519ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao LLVMInitializeX86TargetInfo(); 1529ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao LLVMInitializeX86Target(); 1539ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao LLVMInitializeX86AsmPrinter(); 154462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 1553a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Chang // Please refer to include/clang/Basic/LangOptions.h to setup 1569ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao // the options. 1579ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao LangOpts.RTTI = 0; // Turn off the RTTI information support 158245eba133628ef5b52c78d6f538c9268c9bc5828Shih-wei Liao LangOpts.C99 = 1; 15952d132c53a57c3bb4b517f87ec4f0148ef8a4216Stephen Hines LangOpts.Renderscript = 1; 160f64e76657a98f66c0f3f26014c0a51f55204dc1cStephen Hines LangOpts.LaxVectorConversions = 0; // Do not bitcast vectors! 161194d4039a37861368d0774682b6d104f10bcc262Stephen Hines LangOpts.CharIsSigned = 1; // Signed char is our default. 162462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 163c460b37ffb50819a32c2a8967754b6f784b28263mkopec CodeGenOpts.OptimizationLevel = 3; 164462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 1659ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao GlobalInitialized = true; 1669ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao } 167462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao} 168462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 1694b3f3bada7155de983e7d92fa8b20091629b3bb3Stephen Hinesvoid Slang::LLVMErrorHandler(void *UserData, const std::string &Message, 1704b3f3bada7155de983e7d92fa8b20091629b3bb3Stephen Hines bool GenCrashDialog) { 1719207a2e495c8363606861e4f034504ec5c153dabLogan Chien clang::DiagnosticsEngine* DiagEngine = 1729207a2e495c8363606861e4f034504ec5c153dabLogan Chien static_cast<clang::DiagnosticsEngine *>(UserData); 1739207a2e495c8363606861e4f034504ec5c153dabLogan Chien 1749207a2e495c8363606861e4f034504ec5c153dabLogan Chien DiagEngine->Report(clang::diag::err_fe_error_backend) << Message; 1759ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao exit(1); 176462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao} 177462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 178b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liaovoid Slang::createTarget(const std::string &Triple, const std::string &CPU, 179b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao const std::vector<std::string> &Features) { 180b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao if (!Triple.empty()) 18123c4358f12bd9d0ba7166eceebd683db95a41b3fStephen Hines mTargetOpts->Triple = Triple; 1829ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao else 18323c4358f12bd9d0ba7166eceebd683db95a41b3fStephen Hines mTargetOpts->Triple = DEFAULT_TARGET_TRIPLE_STRING; 184462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 185b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao if (!CPU.empty()) 18623c4358f12bd9d0ba7166eceebd683db95a41b3fStephen Hines mTargetOpts->CPU = CPU; 187462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 188b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao if (!Features.empty()) 18923c4358f12bd9d0ba7166eceebd683db95a41b3fStephen Hines mTargetOpts->FeaturesAsWritten = Features; 190b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao 1919207a2e495c8363606861e4f034504ec5c153dabLogan Chien mTarget.reset(clang::TargetInfo::CreateTargetInfo(*mDiagEngine, 19223c4358f12bd9d0ba7166eceebd683db95a41b3fStephen Hines mTargetOpts.getPtr())); 193462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao} 194462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 1953a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Changvoid Slang::createFileManager() { 196df5bcce1582d839eead432a5e24435236c90fb05Shih-wei Liao mFileSysOpt.reset(new clang::FileSystemOptions()); 197be27482cdeaf08576bc39b72a15d35d13014a636Logan mFileMgr.reset(new clang::FileManager(*mFileSysOpt)); 1983a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Chang} 1993a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Chang 2003a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Changvoid Slang::createSourceManager() { 2019207a2e495c8363606861e4f034504ec5c153dabLogan Chien mSourceMgr.reset(new clang::SourceManager(*mDiagEngine, *mFileMgr)); 2023a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Chang} 2033a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Chang 20468e8e9f98730b3672fb96d49e33b9db70a90ed3fShih-wei Liaovoid Slang::createPreprocessor() { 2059ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao // Default only search header file in current dir 20623c4358f12bd9d0ba7166eceebd683db95a41b3fStephen Hines llvm::IntrusiveRefCntPtr<clang::HeaderSearchOptions> HSOpts = 20723c4358f12bd9d0ba7166eceebd683db95a41b3fStephen Hines new clang::HeaderSearchOptions(); 20823c4358f12bd9d0ba7166eceebd683db95a41b3fStephen Hines clang::HeaderSearch *HeaderInfo = new clang::HeaderSearch(HSOpts, 209eeb251e8db802b836af7461d0f6eb1252c527ab8Stephen Hines *mSourceMgr, 2100444de0c0e7cfc8d8f8fed6f64cd97812bdd6a41Stephen Hines *mDiagEngine, 2110444de0c0e7cfc8d8f8fed6f64cd97812bdd6a41Stephen Hines LangOpts, 2120444de0c0e7cfc8d8f8fed6f64cd97812bdd6a41Stephen Hines mTarget.get()); 2139ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 21423c4358f12bd9d0ba7166eceebd683db95a41b3fStephen Hines llvm::IntrusiveRefCntPtr<clang::PreprocessorOptions> PPOpts = 21523c4358f12bd9d0ba7166eceebd683db95a41b3fStephen Hines new clang::PreprocessorOptions(); 21623c4358f12bd9d0ba7166eceebd683db95a41b3fStephen Hines mPP.reset(new clang::Preprocessor(PPOpts, 21723c4358f12bd9d0ba7166eceebd683db95a41b3fStephen Hines *mDiagEngine, 2189ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao LangOpts, 2199207a2e495c8363606861e4f034504ec5c153dabLogan Chien mTarget.get(), 2209ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao *mSourceMgr, 2219207a2e495c8363606861e4f034504ec5c153dabLogan Chien *HeaderInfo, 2229207a2e495c8363606861e4f034504ec5c153dabLogan Chien *this, 2239ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao NULL, 2243a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Chang /* OwnsHeaderSearch = */true)); 2253fd0a94a5cf1656569b1aea07043cc63939dcb46Stephen Hines // Initialize the preprocessor 22668e8e9f98730b3672fb96d49e33b9db70a90ed3fShih-wei Liao mPragmas.clear(); 2273fd0a94a5cf1656569b1aea07043cc63939dcb46Stephen Hines mPP->AddPragmaHandler(new PragmaRecorder(&mPragmas)); 22868e8e9f98730b3672fb96d49e33b9db70a90ed3fShih-wei Liao 2299ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao std::vector<clang::DirectoryLookup> SearchList; 2303a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Chang for (unsigned i = 0, e = mIncludePaths.size(); i != e; i++) { 2319ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao if (const clang::DirectoryEntry *DE = 232be27482cdeaf08576bc39b72a15d35d13014a636Logan mFileMgr->getDirectory(mIncludePaths[i])) { 2339ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao SearchList.push_back(clang::DirectoryLookup(DE, 2349ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao clang::SrcMgr::C_System, 2359ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao false)); 2369ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao } 2379089828a995422a5ed3beeed0890b755c4abe188Shih-wei Liao } 2389089828a995422a5ed3beeed0890b755c4abe188Shih-wei Liao 2399207a2e495c8363606861e4f034504ec5c153dabLogan Chien HeaderInfo->SetSearchPaths(SearchList, 2409207a2e495c8363606861e4f034504ec5c153dabLogan Chien /* angledDirIdx = */1, 2419207a2e495c8363606861e4f034504ec5c153dabLogan Chien /* systemDixIdx = */1, 2429207a2e495c8363606861e4f034504ec5c153dabLogan Chien /* noCurDirSearch = */false); 2439089828a995422a5ed3beeed0890b755c4abe188Shih-wei Liao 2443a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Chang initPreprocessor(); 24568e8e9f98730b3672fb96d49e33b9db70a90ed3fShih-wei Liao} 24668e8e9f98730b3672fb96d49e33b9db70a90ed3fShih-wei Liao 2473a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Changvoid Slang::createASTContext() { 2483a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Chang mASTContext.reset(new clang::ASTContext(LangOpts, 2493a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Chang *mSourceMgr, 2509207a2e495c8363606861e4f034504ec5c153dabLogan Chien mTarget.get(), 2513a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Chang mPP->getIdentifierTable(), 2523a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Chang mPP->getSelectorTable(), 2533a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Chang mPP->getBuiltinInfo(), 2543a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Chang /* size_reserve = */0)); 2553a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Chang initASTContext(); 2563a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Chang} 2573a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Chang 2589207a2e495c8363606861e4f034504ec5c153dabLogan Chienclang::ASTConsumer * 2599207a2e495c8363606861e4f034504ec5c153dabLogan ChienSlang::createBackend(const clang::CodeGenOptions& CodeGenOpts, 2609207a2e495c8363606861e4f034504ec5c153dabLogan Chien llvm::raw_ostream *OS, OutputType OT) { 26123c4358f12bd9d0ba7166eceebd683db95a41b3fStephen Hines return new Backend(mDiagEngine, CodeGenOpts, getTargetOptions(), 2629207a2e495c8363606861e4f034504ec5c153dabLogan Chien &mPragmas, OS, OT); 2633a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Chang} 2643a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Chang 265641558f02fe6ce0ee3ae5076eb366c25e2ad5903Zonr ChangSlang::Slang() : mInitialized(false), mDiagClient(NULL), mOT(OT_Default) { 26623c4358f12bd9d0ba7166eceebd683db95a41b3fStephen Hines mTargetOpts = new clang::TargetOptions(); 2679ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao GlobalInitialization(); 268641558f02fe6ce0ee3ae5076eb366c25e2ad5903Zonr Chang} 269641558f02fe6ce0ee3ae5076eb366c25e2ad5903Zonr Chang 270641558f02fe6ce0ee3ae5076eb366c25e2ad5903Zonr Changvoid Slang::init(const std::string &Triple, const std::string &CPU, 2718f4d972ef6c6796ffdde603e456979a7004d1e20Stephen Hines const std::vector<std::string> &Features, 2728f4d972ef6c6796ffdde603e456979a7004d1e20Stephen Hines clang::DiagnosticsEngine *DiagEngine, 2738f4d972ef6c6796ffdde603e456979a7004d1e20Stephen Hines DiagnosticBuffer *DiagClient) { 274641558f02fe6ce0ee3ae5076eb366c25e2ad5903Zonr Chang if (mInitialized) 275641558f02fe6ce0ee3ae5076eb366c25e2ad5903Zonr Chang return; 276462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 2778f4d972ef6c6796ffdde603e456979a7004d1e20Stephen Hines mDiagEngine = DiagEngine; 2788f4d972ef6c6796ffdde603e456979a7004d1e20Stephen Hines mDiagClient = DiagClient; 2798f4d972ef6c6796ffdde603e456979a7004d1e20Stephen Hines mDiag.reset(new clang::Diagnostic(mDiagEngine)); 2808f4d972ef6c6796ffdde603e456979a7004d1e20Stephen Hines initDiagnostic(); 2818f4d972ef6c6796ffdde603e456979a7004d1e20Stephen Hines llvm::install_fatal_error_handler(LLVMErrorHandler, mDiagEngine); 282462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 2839ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao createTarget(Triple, CPU, Features); 2849ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao createFileManager(); 2859ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao createSourceManager(); 286462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 287641558f02fe6ce0ee3ae5076eb366c25e2ad5903Zonr Chang mInitialized = true; 2889207a2e495c8363606861e4f034504ec5c153dabLogan Chien} 289641558f02fe6ce0ee3ae5076eb366c25e2ad5903Zonr Chang 29023c4358f12bd9d0ba7166eceebd683db95a41b3fStephen Hinesclang::ModuleLoadResult Slang::loadModule( 29123c4358f12bd9d0ba7166eceebd683db95a41b3fStephen Hines clang::SourceLocation ImportLoc, 29223c4358f12bd9d0ba7166eceebd683db95a41b3fStephen Hines clang::ModuleIdPath Path, 29323c4358f12bd9d0ba7166eceebd683db95a41b3fStephen Hines clang::Module::NameVisibilityKind Visibility, 29423c4358f12bd9d0ba7166eceebd683db95a41b3fStephen Hines bool IsInclusionDirective) { 2959207a2e495c8363606861e4f034504ec5c153dabLogan Chien slangAssert(0 && "Not implemented"); 29623c4358f12bd9d0ba7166eceebd683db95a41b3fStephen Hines return clang::ModuleLoadResult(); 297462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao} 298462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 2993a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Changbool Slang::setInputSource(llvm::StringRef InputFile, 3003a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Chang const char *Text, 3013a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Chang size_t TextLength) { 3023a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Chang mInputFileName = InputFile.str(); 303462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 3049ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao // Reset the ID tables if we are reusing the SourceManager 3059ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao mSourceMgr->clearIDTables(); 306462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 3079ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao // Load the source 3086315f76e3cc6ff2d012d1183a0b030d4ff0dc808zonr llvm::MemoryBuffer *SB = 3093a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Chang llvm::MemoryBuffer::getMemBuffer(Text, Text + TextLength); 3109ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao mSourceMgr->createMainFileIDForMemBuffer(SB); 311462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 3129ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao if (mSourceMgr->getMainFileID().isInvalid()) { 3139207a2e495c8363606861e4f034504ec5c153dabLogan Chien mDiagEngine->Report(clang::diag::err_fe_error_reading) << InputFile; 3149ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao return false; 3159ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao } 3169ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao return true; 317462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao} 318462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 3193a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Changbool Slang::setInputSource(llvm::StringRef InputFile) { 3203a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Chang mInputFileName = InputFile.str(); 321462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 3229ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao mSourceMgr->clearIDTables(); 323462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 324be27482cdeaf08576bc39b72a15d35d13014a636Logan const clang::FileEntry *File = mFileMgr->getFile(InputFile); 3259ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao if (File) 3269ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao mSourceMgr->createMainFileID(File); 327462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 3289ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao if (mSourceMgr->getMainFileID().isInvalid()) { 3299207a2e495c8363606861e4f034504ec5c153dabLogan Chien mDiagEngine->Report(clang::diag::err_fe_error_reading) << InputFile; 3309ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao return false; 3319ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao } 332462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 3339ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao return true; 334462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao} 335462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 3363a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Changbool Slang::setOutput(const char *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: { 344a1f95ee8df425089100148a42954cf61dc285015Stephen Hines OS = OpenOutputFile(OutputFile, llvm::sys::fs::F_None, &Error, 345a1f95ee8df425089100148a42954cf61dc285015Stephen Hines mDiagEngine); 3469ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao break; 347462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao } 3483a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Chang case OT_Nothing: { 3499ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao break; 350462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao } 3513a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Chang case OT_Object: 352cc0efad052e944f64bb71cfdaa8a825e30192e78Stephen Hines case OT_Bitcode: { 353a1f95ee8df425089100148a42954cf61dc285015Stephen Hines OS = OpenOutputFile(OutputFile, llvm::sys::fs::F_Binary, 3548f4d972ef6c6796ffdde603e456979a7004d1e20Stephen Hines &Error, mDiagEngine); 3559ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao break; 3569ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao } 3578c6d9b2d36ed2d6d811279fd9bddc05fffe16803Zonr Chang default: { 358cc0efad052e944f64bb71cfdaa8a825e30192e78Stephen Hines llvm_unreachable("Unknown compiler output type"); 3598c6d9b2d36ed2d6d811279fd9bddc05fffe16803Zonr Chang } 3609ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao } 361462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 362e8c263a1c5df81594cf302ecadd813909c894487Zonr Chang if (!Error.empty()) 3639ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao return false; 364e8c263a1c5df81594cf302ecadd813909c894487Zonr Chang 365e8c263a1c5df81594cf302ecadd813909c894487Zonr Chang mOS.reset(OS); 3669ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 3673a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Chang mOutputFileName = OutputFile; 368462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 3699ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao return true; 370462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao} 371462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 3720b7ef1a176b9ddd1e0d437efdce20743373fd7dbStephen Hinesbool Slang::setDepOutput(const char *OutputFile) { 3730b7ef1a176b9ddd1e0d437efdce20743373fd7dbStephen Hines std::string Error; 3748c6d9b2d36ed2d6d811279fd9bddc05fffe16803Zonr Chang 375a1f95ee8df425089100148a42954cf61dc285015Stephen Hines mDOS.reset( 376a1f95ee8df425089100148a42954cf61dc285015Stephen Hines OpenOutputFile(OutputFile, llvm::sys::fs::F_None, &Error, mDiagEngine)); 377e8c263a1c5df81594cf302ecadd813909c894487Zonr Chang if (!Error.empty() || (mDOS.get() == NULL)) 3780b7ef1a176b9ddd1e0d437efdce20743373fd7dbStephen Hines return false; 3790b7ef1a176b9ddd1e0d437efdce20743373fd7dbStephen Hines 3800b7ef1a176b9ddd1e0d437efdce20743373fd7dbStephen Hines mDepOutputFileName = OutputFile; 3810b7ef1a176b9ddd1e0d437efdce20743373fd7dbStephen Hines 3820b7ef1a176b9ddd1e0d437efdce20743373fd7dbStephen Hines return true; 3830b7ef1a176b9ddd1e0d437efdce20743373fd7dbStephen Hines} 3840b7ef1a176b9ddd1e0d437efdce20743373fd7dbStephen Hines 385cc0efad052e944f64bb71cfdaa8a825e30192e78Stephen Hinesint Slang::generateDepFile() { 3869207a2e495c8363606861e4f034504ec5c153dabLogan Chien if (mDiagEngine->hasErrorOccurred()) 387be27482cdeaf08576bc39b72a15d35d13014a636Logan return 1; 3880b7ef1a176b9ddd1e0d437efdce20743373fd7dbStephen Hines if (mDOS.get() == NULL) 389f7de85223c8728d5dc147e8a19ddf039da72b431Stephen Hines return 1; 390cc0efad052e944f64bb71cfdaa8a825e30192e78Stephen Hines 391e8c263a1c5df81594cf302ecadd813909c894487Zonr Chang // Initialize options for generating dependency file 392cc0efad052e944f64bb71cfdaa8a825e30192e78Stephen Hines clang::DependencyOutputOptions DepOpts; 393cc0efad052e944f64bb71cfdaa8a825e30192e78Stephen Hines DepOpts.IncludeSystemHeaders = 1; 3940b7ef1a176b9ddd1e0d437efdce20743373fd7dbStephen Hines DepOpts.OutputFile = mDepOutputFileName; 395b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao DepOpts.Targets = mAdditionalDepTargets; 396cc0efad052e944f64bb71cfdaa8a825e30192e78Stephen Hines DepOpts.Targets.push_back(mDepTargetBCFileName); 3974cc67fce91f43215d61b2695746eab102a3db516Stephen Hines for (std::vector<std::string>::const_iterator 3984cc67fce91f43215d61b2695746eab102a3db516Stephen Hines I = mGeneratedFileNames.begin(), E = mGeneratedFileNames.end(); 3994cc67fce91f43215d61b2695746eab102a3db516Stephen Hines I != E; 4004cc67fce91f43215d61b2695746eab102a3db516Stephen Hines I++) { 4014cc67fce91f43215d61b2695746eab102a3db516Stephen Hines DepOpts.Targets.push_back(*I); 4024cc67fce91f43215d61b2695746eab102a3db516Stephen Hines } 4034cc67fce91f43215d61b2695746eab102a3db516Stephen Hines mGeneratedFileNames.clear(); 404cc0efad052e944f64bb71cfdaa8a825e30192e78Stephen Hines 405e8c263a1c5df81594cf302ecadd813909c894487Zonr Chang // Per-compilation needed initialization 406cc0efad052e944f64bb71cfdaa8a825e30192e78Stephen Hines createPreprocessor(); 407cc0efad052e944f64bb71cfdaa8a825e30192e78Stephen Hines AttachDependencyFileGen(*mPP.get(), DepOpts); 408cc0efad052e944f64bb71cfdaa8a825e30192e78Stephen Hines 409e8c263a1c5df81594cf302ecadd813909c894487Zonr Chang // Inform the diagnostic client we are processing a source file 410cc0efad052e944f64bb71cfdaa8a825e30192e78Stephen Hines mDiagClient->BeginSourceFile(LangOpts, mPP.get()); 411cc0efad052e944f64bb71cfdaa8a825e30192e78Stephen Hines 412e8c263a1c5df81594cf302ecadd813909c894487Zonr Chang // Go through the source file (no operations necessary) 413cc0efad052e944f64bb71cfdaa8a825e30192e78Stephen Hines clang::Token Tok; 414cc0efad052e944f64bb71cfdaa8a825e30192e78Stephen Hines mPP->EnterMainSourceFile(); 415cc0efad052e944f64bb71cfdaa8a825e30192e78Stephen Hines do { 416cc0efad052e944f64bb71cfdaa8a825e30192e78Stephen Hines mPP->Lex(Tok); 417cc0efad052e944f64bb71cfdaa8a825e30192e78Stephen Hines } while (Tok.isNot(clang::tok::eof)); 418cc0efad052e944f64bb71cfdaa8a825e30192e78Stephen Hines 419cc0efad052e944f64bb71cfdaa8a825e30192e78Stephen Hines mPP->EndSourceFile(); 420cc0efad052e944f64bb71cfdaa8a825e30192e78Stephen Hines 421e8c263a1c5df81594cf302ecadd813909c894487Zonr Chang // Declare success if no error 4229207a2e495c8363606861e4f034504ec5c153dabLogan Chien if (!mDiagEngine->hasErrorOccurred()) 423e8c263a1c5df81594cf302ecadd813909c894487Zonr Chang mDOS->keep(); 424e8c263a1c5df81594cf302ecadd813909c894487Zonr Chang 425e8c263a1c5df81594cf302ecadd813909c894487Zonr Chang // Clean up after compilation 426cc0efad052e944f64bb71cfdaa8a825e30192e78Stephen Hines mPP.reset(); 427e8c263a1c5df81594cf302ecadd813909c894487Zonr Chang mDOS.reset(); 428cc0efad052e944f64bb71cfdaa8a825e30192e78Stephen Hines 4299207a2e495c8363606861e4f034504ec5c153dabLogan Chien return mDiagEngine->hasErrorOccurred() ? 1 : 0; 430cc0efad052e944f64bb71cfdaa8a825e30192e78Stephen Hines} 431cc0efad052e944f64bb71cfdaa8a825e30192e78Stephen Hines 432462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liaoint Slang::compile() { 4339207a2e495c8363606861e4f034504ec5c153dabLogan Chien if (mDiagEngine->hasErrorOccurred()) 434be27482cdeaf08576bc39b72a15d35d13014a636Logan return 1; 435f7de85223c8728d5dc147e8a19ddf039da72b431Stephen Hines if (mOS.get() == NULL) 436f7de85223c8728d5dc147e8a19ddf039da72b431Stephen Hines return 1; 437462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 4389ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao // Here is per-compilation needed initialization 4399ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao createPreprocessor(); 4409ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao createASTContext(); 4413a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Chang 442df5bcce1582d839eead432a5e24435236c90fb05Shih-wei Liao mBackend.reset(createBackend(CodeGenOpts, &mOS->os(), mOT)); 443462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 4449ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao // Inform the diagnostic client we are processing a source file 4459ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao mDiagClient->BeginSourceFile(LangOpts, mPP.get()); 446462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 4479ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao // The core of the slang compiler 4489ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao ParseAST(*mPP, mBackend.get(), *mASTContext); 449462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 450e8c263a1c5df81594cf302ecadd813909c894487Zonr Chang // Inform the diagnostic client we are done with previous source file 451e8c263a1c5df81594cf302ecadd813909c894487Zonr Chang mDiagClient->EndSourceFile(); 452e8c263a1c5df81594cf302ecadd813909c894487Zonr Chang 453e8c263a1c5df81594cf302ecadd813909c894487Zonr Chang // Declare success if no error 4549207a2e495c8363606861e4f034504ec5c153dabLogan Chien if (!mDiagEngine->hasErrorOccurred()) 455e8c263a1c5df81594cf302ecadd813909c894487Zonr Chang mOS->keep(); 456e8c263a1c5df81594cf302ecadd813909c894487Zonr Chang 4573a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Chang // The compilation ended, clear 4589ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao mBackend.reset(); 4599ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao mASTContext.reset(); 4609ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao mPP.reset(); 461e8c263a1c5df81594cf302ecadd813909c894487Zonr Chang mOS.reset(); 462462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 4639207a2e495c8363606861e4f034504ec5c153dabLogan Chien return mDiagEngine->hasErrorOccurred() ? 1 : 0; 464462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao} 465462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 466c460b37ffb50819a32c2a8967754b6f784b28263mkopecvoid Slang::setDebugMetadataEmission(bool EmitDebug) { 46743730fe3c839af391efe6bdf56b0479860121924Shih-wei Liao if (EmitDebug) 46823c4358f12bd9d0ba7166eceebd683db95a41b3fStephen Hines CodeGenOpts.setDebugInfo(clang::CodeGenOptions::FullDebugInfo); 46943730fe3c839af391efe6bdf56b0479860121924Shih-wei Liao else 47023c4358f12bd9d0ba7166eceebd683db95a41b3fStephen Hines CodeGenOpts.setDebugInfo(clang::CodeGenOptions::NoDebugInfo); 471c460b37ffb50819a32c2a8967754b6f784b28263mkopec} 472c460b37ffb50819a32c2a8967754b6f784b28263mkopec 473c460b37ffb50819a32c2a8967754b6f784b28263mkopecvoid Slang::setOptimizationLevel(llvm::CodeGenOpt::Level OptimizationLevel) { 474c460b37ffb50819a32c2a8967754b6f784b28263mkopec CodeGenOpts.OptimizationLevel = OptimizationLevel; 475c460b37ffb50819a32c2a8967754b6f784b28263mkopec} 476c460b37ffb50819a32c2a8967754b6f784b28263mkopec 4773a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Changvoid Slang::reset() { 478c632be206ac4fe49a5db05cfa54942d774329dbeStephen Hines llvm::errs() << mDiagClient->str(); 4799207a2e495c8363606861e4f034504ec5c153dabLogan Chien mDiagEngine->Reset(); 4803a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Chang mDiagClient->reset(); 481462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao} 482462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 483462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei LiaoSlang::~Slang() { 4849ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao llvm::llvm_shutdown(); 485462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao} 486e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hines 487e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hines} // namespace slang 488