slang.cpp revision 3eb819ad8beec566a73b288204f9b75c2bb1d4e6
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" 390e4ee65a2ba6b32fcd16c5d4a57fc7542d4032b4Stephen Hines#include "clang/Frontend/FrontendOptions.h" 40e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hines#include "clang/Frontend/TextDiagnosticPrinter.h" 41cc0efad052e944f64bb71cfdaa8a825e30192e78Stephen Hines#include "clang/Frontend/Utils.h" 42cc0efad052e944f64bb71cfdaa8a825e30192e78Stephen Hines 433a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Chang#include "clang/Lex/Preprocessor.h" 4423c4358f12bd9d0ba7166eceebd683db95a41b3fStephen Hines#include "clang/Lex/PreprocessorOptions.h" 453a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Chang#include "clang/Lex/HeaderSearch.h" 4623c4358f12bd9d0ba7166eceebd683db95a41b3fStephen Hines#include "clang/Lex/HeaderSearchOptions.h" 473a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Chang 486315f76e3cc6ff2d012d1183a0b030d4ff0dc808zonr#include "clang/Parse/ParseAST.h" 496315f76e3cc6ff2d012d1183a0b030d4ff0dc808zonr 50be27482cdeaf08576bc39b72a15d35d13014a636Logan#include "llvm/ADT/IntrusiveRefCntPtr.h" 51be27482cdeaf08576bc39b72a15d35d13014a636Logan 52e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hines#include "llvm/Bitcode/ReaderWriter.h" 539ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 5408df36e5c0a990306d958c9f6d59a5de23b748f6Zonr Chang// More force linking 55ee4016d1247d3fbe50822de279d3da273d8aef4cTim Murray#include "llvm/Linker/Linker.h" 5608df36e5c0a990306d958c9f6d59a5de23b748f6Zonr Chang 57e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hines// Force linking all passes/vmcore stuffs to libslang.so 580da7f6c8201b27938d3b9f048d71fd784cd1df9aStephen Hines#include "llvm/LinkAllIR.h" 59e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hines#include "llvm/LinkAllPasses.h" 60e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hines 61e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hines#include "llvm/Support/raw_ostream.h" 62e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hines#include "llvm/Support/MemoryBuffer.h" 63e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hines#include "llvm/Support/ErrorHandling.h" 64e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hines#include "llvm/Support/ManagedStatic.h" 65be27482cdeaf08576bc39b72a15d35d13014a636Logan#include "llvm/Support/Path.h" 669207a2e495c8363606861e4f034504ec5c153dabLogan Chien#include "llvm/Support/TargetSelect.h" 679207a2e495c8363606861e4f034504ec5c153dabLogan Chien#include "llvm/Support/ToolOutputFile.h" 68e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hines 696e6578a360497f78a181e63d7783422a9c9bfb15Stephen Hines#include "slang_assert.h" 70e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hines#include "slang_backend.h" 71b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao 7208df36e5c0a990306d958c9f6d59a5de23b748f6Zonr Changnamespace { 7308df36e5c0a990306d958c9f6d59a5de23b748f6Zonr Chang 749ae18b2bbee0b08afd400542e863dd665ff76059Stephen Hinesstatic const char *kRSTriple32 = "armv7-none-linux-gnueabi"; 759ae18b2bbee0b08afd400542e863dd665ff76059Stephen Hinesstatic const char *kRSTriple64 = "aarch64-none-linux-gnueabi"; 769ae18b2bbee0b08afd400542e863dd665ff76059Stephen Hines 77e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hines} // namespace 78e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hines 79e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hinesnamespace slang { 809ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 81462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liaobool Slang::GlobalInitialized = false; 82462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 839ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao// Language option (define the language feature for compiler such as C99) 849ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liaoclang::LangOptions Slang::LangOpts; 85462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 866315f76e3cc6ff2d012d1183a0b030d4ff0dc808zonr// Code generation option for the compiler 879ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liaoclang::CodeGenOptions Slang::CodeGenOpts; 88462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 899ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao// The named of metadata node that pragma resides (should be synced with 909ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao// bcc.cpp) 91f52a620440fa62257dfdcf2583f0f9df5b855c76Shih-wei Liaoconst llvm::StringRef Slang::PragmaMetadataName = "#pragma"; 92462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 939207a2e495c8363606861e4f034504ec5c153dabLogan Chienstatic inline llvm::tool_output_file * 949207a2e495c8363606861e4f034504ec5c153dabLogan ChienOpenOutputFile(const char *OutputFile, 95a1f95ee8df425089100148a42954cf61dc285015Stephen Hines llvm::sys::fs::OpenFlags Flags, 963eb819ad8beec566a73b288204f9b75c2bb1d4e6Stephen Hines std::error_code &EC, 97e67239de8d94975e7e2216ee6860ae2e6cb8b15aStephen Hines clang::DiagnosticsEngine *DiagEngine) { 983eb819ad8beec566a73b288204f9b75c2bb1d4e6Stephen Hines slangAssert((OutputFile != nullptr) && 995abbe0e9ca2508260b627ffef2bf01e2554e8357Chris Wailes (DiagEngine != nullptr) && "Invalid parameter!"); 100e8c263a1c5df81594cf302ecadd813909c894487Zonr Chang 1013eb819ad8beec566a73b288204f9b75c2bb1d4e6Stephen Hines EC = llvm::sys::fs::create_directories( 1023eb819ad8beec566a73b288204f9b75c2bb1d4e6Stephen Hines llvm::sys::path::parent_path(OutputFile)); 1033eb819ad8beec566a73b288204f9b75c2bb1d4e6Stephen Hines if (!EC) { 104e8c263a1c5df81594cf302ecadd813909c894487Zonr Chang llvm::tool_output_file *F = 1053eb819ad8beec566a73b288204f9b75c2bb1d4e6Stephen Hines new llvm::tool_output_file(OutputFile, EC, Flags); 1065abbe0e9ca2508260b627ffef2bf01e2554e8357Chris Wailes if (F != nullptr) 107e8c263a1c5df81594cf302ecadd813909c894487Zonr Chang return F; 108e8c263a1c5df81594cf302ecadd813909c894487Zonr Chang } 109e8c263a1c5df81594cf302ecadd813909c894487Zonr Chang 110e8c263a1c5df81594cf302ecadd813909c894487Zonr Chang // Report error here. 1119207a2e495c8363606861e4f034504ec5c153dabLogan Chien DiagEngine->Report(clang::diag::err_fe_error_opening) 1123eb819ad8beec566a73b288204f9b75c2bb1d4e6Stephen Hines << OutputFile << EC.message(); 113e8c263a1c5df81594cf302ecadd813909c894487Zonr Chang 1145abbe0e9ca2508260b627ffef2bf01e2554e8357Chris Wailes return nullptr; 115e8c263a1c5df81594cf302ecadd813909c894487Zonr Chang} 116e8c263a1c5df81594cf302ecadd813909c894487Zonr Chang 117462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liaovoid Slang::GlobalInitialization() { 1189ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao if (!GlobalInitialized) { 1199ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao // We only support x86, x64 and ARM target 120462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 1219ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao // For ARM 1229ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao LLVMInitializeARMTargetInfo(); 1239ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao LLVMInitializeARMTarget(); 1249ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao LLVMInitializeARMAsmPrinter(); 125462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 1269ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao // For x86 and x64 1279ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao LLVMInitializeX86TargetInfo(); 1289ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao LLVMInitializeX86Target(); 1299ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao LLVMInitializeX86AsmPrinter(); 130462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 1313a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Chang // Please refer to include/clang/Basic/LangOptions.h to setup 1329ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao // the options. 1339ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao LangOpts.RTTI = 0; // Turn off the RTTI information support 134245eba133628ef5b52c78d6f538c9268c9bc5828Shih-wei Liao LangOpts.C99 = 1; 13552d132c53a57c3bb4b517f87ec4f0148ef8a4216Stephen Hines LangOpts.Renderscript = 1; 136f64e76657a98f66c0f3f26014c0a51f55204dc1cStephen Hines LangOpts.LaxVectorConversions = 0; // Do not bitcast vectors! 137194d4039a37861368d0774682b6d104f10bcc262Stephen Hines LangOpts.CharIsSigned = 1; // Signed char is our default. 138462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 139c460b37ffb50819a32c2a8967754b6f784b28263mkopec CodeGenOpts.OptimizationLevel = 3; 140462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 1419ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao GlobalInitialized = true; 1429ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao } 143462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao} 144462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 1454b3f3bada7155de983e7d92fa8b20091629b3bb3Stephen Hinesvoid Slang::LLVMErrorHandler(void *UserData, const std::string &Message, 1464b3f3bada7155de983e7d92fa8b20091629b3bb3Stephen Hines bool GenCrashDialog) { 1479207a2e495c8363606861e4f034504ec5c153dabLogan Chien clang::DiagnosticsEngine* DiagEngine = 1489207a2e495c8363606861e4f034504ec5c153dabLogan Chien static_cast<clang::DiagnosticsEngine *>(UserData); 1499207a2e495c8363606861e4f034504ec5c153dabLogan Chien 1509207a2e495c8363606861e4f034504ec5c153dabLogan Chien DiagEngine->Report(clang::diag::err_fe_error_backend) << Message; 1519ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao exit(1); 152462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao} 153462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 1549ae18b2bbee0b08afd400542e863dd665ff76059Stephen Hinesvoid Slang::createTarget(uint32_t BitWidth) { 1559ae18b2bbee0b08afd400542e863dd665ff76059Stephen Hines std::vector<std::string> features; 156462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 1579ae18b2bbee0b08afd400542e863dd665ff76059Stephen Hines if (BitWidth == 64) { 1589ae18b2bbee0b08afd400542e863dd665ff76059Stephen Hines mTargetOpts->Triple = kRSTriple64; 1599ae18b2bbee0b08afd400542e863dd665ff76059Stephen Hines } else { 1609ae18b2bbee0b08afd400542e863dd665ff76059Stephen Hines mTargetOpts->Triple = kRSTriple32; 1619ae18b2bbee0b08afd400542e863dd665ff76059Stephen Hines // Treat long as a 64-bit type for our 32-bit RS code. 1629ae18b2bbee0b08afd400542e863dd665ff76059Stephen Hines features.push_back("+long64"); 1639ae18b2bbee0b08afd400542e863dd665ff76059Stephen Hines mTargetOpts->FeaturesAsWritten = features; 1649ae18b2bbee0b08afd400542e863dd665ff76059Stephen Hines } 165b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao 1669207a2e495c8363606861e4f034504ec5c153dabLogan Chien mTarget.reset(clang::TargetInfo::CreateTargetInfo(*mDiagEngine, 1677ac9d0de26d325071ad3f26f8d34514efca2d3d6Stephen Hines mTargetOpts)); 168462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao} 169462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 1703a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Changvoid Slang::createFileManager() { 171df5bcce1582d839eead432a5e24435236c90fb05Shih-wei Liao mFileSysOpt.reset(new clang::FileSystemOptions()); 172be27482cdeaf08576bc39b72a15d35d13014a636Logan mFileMgr.reset(new clang::FileManager(*mFileSysOpt)); 1733a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Chang} 1743a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Chang 1753a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Changvoid Slang::createSourceManager() { 1769207a2e495c8363606861e4f034504ec5c153dabLogan Chien mSourceMgr.reset(new clang::SourceManager(*mDiagEngine, *mFileMgr)); 1773a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Chang} 1783a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Chang 17968e8e9f98730b3672fb96d49e33b9db70a90ed3fShih-wei Liaovoid Slang::createPreprocessor() { 1809ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao // Default only search header file in current dir 18123c4358f12bd9d0ba7166eceebd683db95a41b3fStephen Hines llvm::IntrusiveRefCntPtr<clang::HeaderSearchOptions> HSOpts = 18223c4358f12bd9d0ba7166eceebd683db95a41b3fStephen Hines new clang::HeaderSearchOptions(); 18323c4358f12bd9d0ba7166eceebd683db95a41b3fStephen Hines clang::HeaderSearch *HeaderInfo = new clang::HeaderSearch(HSOpts, 184eeb251e8db802b836af7461d0f6eb1252c527ab8Stephen Hines *mSourceMgr, 1850444de0c0e7cfc8d8f8fed6f64cd97812bdd6a41Stephen Hines *mDiagEngine, 1860444de0c0e7cfc8d8f8fed6f64cd97812bdd6a41Stephen Hines LangOpts, 1870444de0c0e7cfc8d8f8fed6f64cd97812bdd6a41Stephen Hines mTarget.get()); 1889ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 18923c4358f12bd9d0ba7166eceebd683db95a41b3fStephen Hines llvm::IntrusiveRefCntPtr<clang::PreprocessorOptions> PPOpts = 19023c4358f12bd9d0ba7166eceebd683db95a41b3fStephen Hines new clang::PreprocessorOptions(); 19123c4358f12bd9d0ba7166eceebd683db95a41b3fStephen Hines mPP.reset(new clang::Preprocessor(PPOpts, 19223c4358f12bd9d0ba7166eceebd683db95a41b3fStephen Hines *mDiagEngine, 1939ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao LangOpts, 1949ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao *mSourceMgr, 1959207a2e495c8363606861e4f034504ec5c153dabLogan Chien *HeaderInfo, 1969207a2e495c8363606861e4f034504ec5c153dabLogan Chien *this, 1975abbe0e9ca2508260b627ffef2bf01e2554e8357Chris Wailes nullptr, 1983a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Chang /* OwnsHeaderSearch = */true)); 1993fd0a94a5cf1656569b1aea07043cc63939dcb46Stephen Hines // Initialize the preprocessor 20075d471819f1810e0e65224d6e57fe1106af0d340Stephen Hines mPP->Initialize(getTargetInfo()); 2010e4ee65a2ba6b32fcd16c5d4a57fc7542d4032b4Stephen Hines clang::FrontendOptions FEOpts; 2027ac9d0de26d325071ad3f26f8d34514efca2d3d6Stephen Hines clang::InitializePreprocessor(*mPP, *PPOpts, FEOpts); 2030e4ee65a2ba6b32fcd16c5d4a57fc7542d4032b4Stephen Hines 20468e8e9f98730b3672fb96d49e33b9db70a90ed3fShih-wei Liao mPragmas.clear(); 2053fd0a94a5cf1656569b1aea07043cc63939dcb46Stephen Hines mPP->AddPragmaHandler(new PragmaRecorder(&mPragmas)); 20668e8e9f98730b3672fb96d49e33b9db70a90ed3fShih-wei Liao 2079ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao std::vector<clang::DirectoryLookup> SearchList; 2083a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Chang for (unsigned i = 0, e = mIncludePaths.size(); i != e; i++) { 2099ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao if (const clang::DirectoryEntry *DE = 210be27482cdeaf08576bc39b72a15d35d13014a636Logan mFileMgr->getDirectory(mIncludePaths[i])) { 2119ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao SearchList.push_back(clang::DirectoryLookup(DE, 2129ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao clang::SrcMgr::C_System, 2139ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao false)); 2149ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao } 2159089828a995422a5ed3beeed0890b755c4abe188Shih-wei Liao } 2169089828a995422a5ed3beeed0890b755c4abe188Shih-wei Liao 2179207a2e495c8363606861e4f034504ec5c153dabLogan Chien HeaderInfo->SetSearchPaths(SearchList, 2189207a2e495c8363606861e4f034504ec5c153dabLogan Chien /* angledDirIdx = */1, 2199207a2e495c8363606861e4f034504ec5c153dabLogan Chien /* systemDixIdx = */1, 2209207a2e495c8363606861e4f034504ec5c153dabLogan Chien /* noCurDirSearch = */false); 2219089828a995422a5ed3beeed0890b755c4abe188Shih-wei Liao 2223a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Chang initPreprocessor(); 22368e8e9f98730b3672fb96d49e33b9db70a90ed3fShih-wei Liao} 22468e8e9f98730b3672fb96d49e33b9db70a90ed3fShih-wei Liao 2253a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Changvoid Slang::createASTContext() { 2263a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Chang mASTContext.reset(new clang::ASTContext(LangOpts, 2273a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Chang *mSourceMgr, 2283a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Chang mPP->getIdentifierTable(), 2293a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Chang mPP->getSelectorTable(), 23075d471819f1810e0e65224d6e57fe1106af0d340Stephen Hines mPP->getBuiltinInfo())); 23175d471819f1810e0e65224d6e57fe1106af0d340Stephen Hines mASTContext->InitBuiltinTypes(getTargetInfo()); 2323a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Chang initASTContext(); 2333a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Chang} 2343a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Chang 2359207a2e495c8363606861e4f034504ec5c153dabLogan Chienclang::ASTConsumer * 2369207a2e495c8363606861e4f034504ec5c153dabLogan ChienSlang::createBackend(const clang::CodeGenOptions& CodeGenOpts, 2379207a2e495c8363606861e4f034504ec5c153dabLogan Chien llvm::raw_ostream *OS, OutputType OT) { 23823c4358f12bd9d0ba7166eceebd683db95a41b3fStephen Hines return new Backend(mDiagEngine, CodeGenOpts, getTargetOptions(), 2399207a2e495c8363606861e4f034504ec5c153dabLogan Chien &mPragmas, OS, OT); 2403a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Chang} 2413a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Chang 2425abbe0e9ca2508260b627ffef2bf01e2554e8357Chris WailesSlang::Slang() : mInitialized(false), mDiagClient(nullptr), 2437ac9d0de26d325071ad3f26f8d34514efca2d3d6Stephen Hines mTargetOpts(new clang::TargetOptions()), mOT(OT_Default) { 2449ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao GlobalInitialization(); 245641558f02fe6ce0ee3ae5076eb366c25e2ad5903Zonr Chang} 246641558f02fe6ce0ee3ae5076eb366c25e2ad5903Zonr Chang 2479ae18b2bbee0b08afd400542e863dd665ff76059Stephen Hinesvoid Slang::init(uint32_t BitWidth, clang::DiagnosticsEngine *DiagEngine, 2488f4d972ef6c6796ffdde603e456979a7004d1e20Stephen Hines DiagnosticBuffer *DiagClient) { 249641558f02fe6ce0ee3ae5076eb366c25e2ad5903Zonr Chang if (mInitialized) 250641558f02fe6ce0ee3ae5076eb366c25e2ad5903Zonr Chang return; 251462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 2528f4d972ef6c6796ffdde603e456979a7004d1e20Stephen Hines mDiagEngine = DiagEngine; 2538f4d972ef6c6796ffdde603e456979a7004d1e20Stephen Hines mDiagClient = DiagClient; 2548f4d972ef6c6796ffdde603e456979a7004d1e20Stephen Hines mDiag.reset(new clang::Diagnostic(mDiagEngine)); 2558f4d972ef6c6796ffdde603e456979a7004d1e20Stephen Hines initDiagnostic(); 2568f4d972ef6c6796ffdde603e456979a7004d1e20Stephen Hines llvm::install_fatal_error_handler(LLVMErrorHandler, mDiagEngine); 257462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 2589ae18b2bbee0b08afd400542e863dd665ff76059Stephen Hines createTarget(BitWidth); 2599ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao createFileManager(); 2609ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao createSourceManager(); 261462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 262641558f02fe6ce0ee3ae5076eb366c25e2ad5903Zonr Chang mInitialized = true; 2639207a2e495c8363606861e4f034504ec5c153dabLogan Chien} 264641558f02fe6ce0ee3ae5076eb366c25e2ad5903Zonr Chang 26523c4358f12bd9d0ba7166eceebd683db95a41b3fStephen Hinesclang::ModuleLoadResult Slang::loadModule( 26623c4358f12bd9d0ba7166eceebd683db95a41b3fStephen Hines clang::SourceLocation ImportLoc, 26723c4358f12bd9d0ba7166eceebd683db95a41b3fStephen Hines clang::ModuleIdPath Path, 26823c4358f12bd9d0ba7166eceebd683db95a41b3fStephen Hines clang::Module::NameVisibilityKind Visibility, 26923c4358f12bd9d0ba7166eceebd683db95a41b3fStephen Hines bool IsInclusionDirective) { 2709207a2e495c8363606861e4f034504ec5c153dabLogan Chien slangAssert(0 && "Not implemented"); 27123c4358f12bd9d0ba7166eceebd683db95a41b3fStephen Hines return clang::ModuleLoadResult(); 272462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao} 273462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 2743a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Changbool Slang::setInputSource(llvm::StringRef InputFile, 2753a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Chang const char *Text, 2763a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Chang size_t TextLength) { 2773a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Chang mInputFileName = InputFile.str(); 278462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 2799ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao // Reset the ID tables if we are reusing the SourceManager 2809ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao mSourceMgr->clearIDTables(); 281462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 2829ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao // Load the source 2833eb819ad8beec566a73b288204f9b75c2bb1d4e6Stephen Hines std::unique_ptr<llvm::MemoryBuffer> SB = 2843a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Chang llvm::MemoryBuffer::getMemBuffer(Text, Text + TextLength); 2853eb819ad8beec566a73b288204f9b75c2bb1d4e6Stephen Hines mSourceMgr->setMainFileID(mSourceMgr->createFileID(std::move(SB))); 286462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 2879ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao if (mSourceMgr->getMainFileID().isInvalid()) { 2889207a2e495c8363606861e4f034504ec5c153dabLogan Chien mDiagEngine->Report(clang::diag::err_fe_error_reading) << InputFile; 2899ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao return false; 2909ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao } 2919ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao return true; 292462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao} 293462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 2943a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Changbool Slang::setInputSource(llvm::StringRef InputFile) { 2953a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Chang mInputFileName = InputFile.str(); 296462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 2979ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao mSourceMgr->clearIDTables(); 298462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 299be27482cdeaf08576bc39b72a15d35d13014a636Logan const clang::FileEntry *File = mFileMgr->getFile(InputFile); 30075d471819f1810e0e65224d6e57fe1106af0d340Stephen Hines if (File) { 30175d471819f1810e0e65224d6e57fe1106af0d340Stephen Hines mSourceMgr->setMainFileID(mSourceMgr->createFileID(File, 30275d471819f1810e0e65224d6e57fe1106af0d340Stephen Hines clang::SourceLocation(), clang::SrcMgr::C_User)); 30375d471819f1810e0e65224d6e57fe1106af0d340Stephen Hines } 304462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 3059ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao if (mSourceMgr->getMainFileID().isInvalid()) { 3069207a2e495c8363606861e4f034504ec5c153dabLogan Chien mDiagEngine->Report(clang::diag::err_fe_error_reading) << InputFile; 3079ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao return false; 3089ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao } 309462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 3109ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao return true; 311462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao} 312462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 3133a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Changbool Slang::setOutput(const char *OutputFile) { 3143eb819ad8beec566a73b288204f9b75c2bb1d4e6Stephen Hines std::error_code EC; 3155abbe0e9ca2508260b627ffef2bf01e2554e8357Chris Wailes llvm::tool_output_file *OS = nullptr; 316462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 3173a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Chang switch (mOT) { 318cc0efad052e944f64bb71cfdaa8a825e30192e78Stephen Hines case OT_Dependency: 3193a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Chang case OT_Assembly: 3203a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Chang case OT_LLVMAssembly: { 3213eb819ad8beec566a73b288204f9b75c2bb1d4e6Stephen Hines OS = OpenOutputFile(OutputFile, llvm::sys::fs::F_Text, EC, mDiagEngine); 3229ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao break; 323462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao } 3243a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Chang case OT_Nothing: { 3259ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao break; 326462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao } 3273a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Chang case OT_Object: 328cc0efad052e944f64bb71cfdaa8a825e30192e78Stephen Hines case OT_Bitcode: { 3293eb819ad8beec566a73b288204f9b75c2bb1d4e6Stephen Hines OS = OpenOutputFile(OutputFile, llvm::sys::fs::F_None, EC, mDiagEngine); 3309ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao break; 3319ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao } 3328c6d9b2d36ed2d6d811279fd9bddc05fffe16803Zonr Chang default: { 333cc0efad052e944f64bb71cfdaa8a825e30192e78Stephen Hines llvm_unreachable("Unknown compiler output type"); 3348c6d9b2d36ed2d6d811279fd9bddc05fffe16803Zonr Chang } 3359ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao } 336462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 3373eb819ad8beec566a73b288204f9b75c2bb1d4e6Stephen Hines if (EC) 3389ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao return false; 339e8c263a1c5df81594cf302ecadd813909c894487Zonr Chang 340e8c263a1c5df81594cf302ecadd813909c894487Zonr Chang mOS.reset(OS); 3419ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 3423a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Chang mOutputFileName = OutputFile; 343462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 3449ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao return true; 345462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao} 346462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 3470b7ef1a176b9ddd1e0d437efdce20743373fd7dbStephen Hinesbool Slang::setDepOutput(const char *OutputFile) { 3483eb819ad8beec566a73b288204f9b75c2bb1d4e6Stephen Hines std::error_code EC; 3498c6d9b2d36ed2d6d811279fd9bddc05fffe16803Zonr Chang 350a1f95ee8df425089100148a42954cf61dc285015Stephen Hines mDOS.reset( 3513eb819ad8beec566a73b288204f9b75c2bb1d4e6Stephen Hines OpenOutputFile(OutputFile, llvm::sys::fs::F_Text, EC, mDiagEngine)); 3523eb819ad8beec566a73b288204f9b75c2bb1d4e6Stephen Hines if (EC || (mDOS.get() == nullptr)) 3530b7ef1a176b9ddd1e0d437efdce20743373fd7dbStephen Hines return false; 3540b7ef1a176b9ddd1e0d437efdce20743373fd7dbStephen Hines 3550b7ef1a176b9ddd1e0d437efdce20743373fd7dbStephen Hines mDepOutputFileName = OutputFile; 3560b7ef1a176b9ddd1e0d437efdce20743373fd7dbStephen Hines 3570b7ef1a176b9ddd1e0d437efdce20743373fd7dbStephen Hines return true; 3580b7ef1a176b9ddd1e0d437efdce20743373fd7dbStephen Hines} 3590b7ef1a176b9ddd1e0d437efdce20743373fd7dbStephen Hines 360cc0efad052e944f64bb71cfdaa8a825e30192e78Stephen Hinesint Slang::generateDepFile() { 3619207a2e495c8363606861e4f034504ec5c153dabLogan Chien if (mDiagEngine->hasErrorOccurred()) 362be27482cdeaf08576bc39b72a15d35d13014a636Logan return 1; 3635abbe0e9ca2508260b627ffef2bf01e2554e8357Chris Wailes if (mDOS.get() == nullptr) 364f7de85223c8728d5dc147e8a19ddf039da72b431Stephen Hines return 1; 365cc0efad052e944f64bb71cfdaa8a825e30192e78Stephen Hines 366e8c263a1c5df81594cf302ecadd813909c894487Zonr Chang // Initialize options for generating dependency file 367cc0efad052e944f64bb71cfdaa8a825e30192e78Stephen Hines clang::DependencyOutputOptions DepOpts; 368cc0efad052e944f64bb71cfdaa8a825e30192e78Stephen Hines DepOpts.IncludeSystemHeaders = 1; 3690b7ef1a176b9ddd1e0d437efdce20743373fd7dbStephen Hines DepOpts.OutputFile = mDepOutputFileName; 370b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao DepOpts.Targets = mAdditionalDepTargets; 371cc0efad052e944f64bb71cfdaa8a825e30192e78Stephen Hines DepOpts.Targets.push_back(mDepTargetBCFileName); 3724cc67fce91f43215d61b2695746eab102a3db516Stephen Hines for (std::vector<std::string>::const_iterator 3734cc67fce91f43215d61b2695746eab102a3db516Stephen Hines I = mGeneratedFileNames.begin(), E = mGeneratedFileNames.end(); 3744cc67fce91f43215d61b2695746eab102a3db516Stephen Hines I != E; 3754cc67fce91f43215d61b2695746eab102a3db516Stephen Hines I++) { 3764cc67fce91f43215d61b2695746eab102a3db516Stephen Hines DepOpts.Targets.push_back(*I); 3774cc67fce91f43215d61b2695746eab102a3db516Stephen Hines } 3784cc67fce91f43215d61b2695746eab102a3db516Stephen Hines mGeneratedFileNames.clear(); 379cc0efad052e944f64bb71cfdaa8a825e30192e78Stephen Hines 380e8c263a1c5df81594cf302ecadd813909c894487Zonr Chang // Per-compilation needed initialization 381cc0efad052e944f64bb71cfdaa8a825e30192e78Stephen Hines createPreprocessor(); 382ee4016d1247d3fbe50822de279d3da273d8aef4cTim Murray clang::DependencyFileGenerator::CreateAndAttachToPreprocessor(*mPP.get(), DepOpts); 383cc0efad052e944f64bb71cfdaa8a825e30192e78Stephen Hines 384e8c263a1c5df81594cf302ecadd813909c894487Zonr Chang // Inform the diagnostic client we are processing a source file 385cc0efad052e944f64bb71cfdaa8a825e30192e78Stephen Hines mDiagClient->BeginSourceFile(LangOpts, mPP.get()); 386cc0efad052e944f64bb71cfdaa8a825e30192e78Stephen Hines 387e8c263a1c5df81594cf302ecadd813909c894487Zonr Chang // Go through the source file (no operations necessary) 388cc0efad052e944f64bb71cfdaa8a825e30192e78Stephen Hines clang::Token Tok; 389cc0efad052e944f64bb71cfdaa8a825e30192e78Stephen Hines mPP->EnterMainSourceFile(); 390cc0efad052e944f64bb71cfdaa8a825e30192e78Stephen Hines do { 391cc0efad052e944f64bb71cfdaa8a825e30192e78Stephen Hines mPP->Lex(Tok); 392cc0efad052e944f64bb71cfdaa8a825e30192e78Stephen Hines } while (Tok.isNot(clang::tok::eof)); 393cc0efad052e944f64bb71cfdaa8a825e30192e78Stephen Hines 394cc0efad052e944f64bb71cfdaa8a825e30192e78Stephen Hines mPP->EndSourceFile(); 395cc0efad052e944f64bb71cfdaa8a825e30192e78Stephen Hines 396e8c263a1c5df81594cf302ecadd813909c894487Zonr Chang // Declare success if no error 3979207a2e495c8363606861e4f034504ec5c153dabLogan Chien if (!mDiagEngine->hasErrorOccurred()) 398e8c263a1c5df81594cf302ecadd813909c894487Zonr Chang mDOS->keep(); 399e8c263a1c5df81594cf302ecadd813909c894487Zonr Chang 400e8c263a1c5df81594cf302ecadd813909c894487Zonr Chang // Clean up after compilation 401cc0efad052e944f64bb71cfdaa8a825e30192e78Stephen Hines mPP.reset(); 402e8c263a1c5df81594cf302ecadd813909c894487Zonr Chang mDOS.reset(); 403cc0efad052e944f64bb71cfdaa8a825e30192e78Stephen Hines 4049207a2e495c8363606861e4f034504ec5c153dabLogan Chien return mDiagEngine->hasErrorOccurred() ? 1 : 0; 405cc0efad052e944f64bb71cfdaa8a825e30192e78Stephen Hines} 406cc0efad052e944f64bb71cfdaa8a825e30192e78Stephen Hines 407462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liaoint Slang::compile() { 4089207a2e495c8363606861e4f034504ec5c153dabLogan Chien if (mDiagEngine->hasErrorOccurred()) 409be27482cdeaf08576bc39b72a15d35d13014a636Logan return 1; 4105abbe0e9ca2508260b627ffef2bf01e2554e8357Chris Wailes if (mOS.get() == nullptr) 411f7de85223c8728d5dc147e8a19ddf039da72b431Stephen Hines return 1; 412462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 4139ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao // Here is per-compilation needed initialization 4149ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao createPreprocessor(); 4159ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao createASTContext(); 4163a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Chang 417df5bcce1582d839eead432a5e24435236c90fb05Shih-wei Liao mBackend.reset(createBackend(CodeGenOpts, &mOS->os(), mOT)); 418462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 4199ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao // Inform the diagnostic client we are processing a source file 4209ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao mDiagClient->BeginSourceFile(LangOpts, mPP.get()); 421462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 4229ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao // The core of the slang compiler 4239ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao ParseAST(*mPP, mBackend.get(), *mASTContext); 424462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 425e8c263a1c5df81594cf302ecadd813909c894487Zonr Chang // Inform the diagnostic client we are done with previous source file 426e8c263a1c5df81594cf302ecadd813909c894487Zonr Chang mDiagClient->EndSourceFile(); 427e8c263a1c5df81594cf302ecadd813909c894487Zonr Chang 428e8c263a1c5df81594cf302ecadd813909c894487Zonr Chang // Declare success if no error 4299207a2e495c8363606861e4f034504ec5c153dabLogan Chien if (!mDiagEngine->hasErrorOccurred()) 430e8c263a1c5df81594cf302ecadd813909c894487Zonr Chang mOS->keep(); 431e8c263a1c5df81594cf302ecadd813909c894487Zonr Chang 4323a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Chang // The compilation ended, clear 4339ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao mBackend.reset(); 434e8c263a1c5df81594cf302ecadd813909c894487Zonr Chang mOS.reset(); 435462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 4369207a2e495c8363606861e4f034504ec5c153dabLogan Chien return mDiagEngine->hasErrorOccurred() ? 1 : 0; 437462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao} 438462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 439c460b37ffb50819a32c2a8967754b6f784b28263mkopecvoid Slang::setDebugMetadataEmission(bool EmitDebug) { 44043730fe3c839af391efe6bdf56b0479860121924Shih-wei Liao if (EmitDebug) 44123c4358f12bd9d0ba7166eceebd683db95a41b3fStephen Hines CodeGenOpts.setDebugInfo(clang::CodeGenOptions::FullDebugInfo); 44243730fe3c839af391efe6bdf56b0479860121924Shih-wei Liao else 44323c4358f12bd9d0ba7166eceebd683db95a41b3fStephen Hines CodeGenOpts.setDebugInfo(clang::CodeGenOptions::NoDebugInfo); 444c460b37ffb50819a32c2a8967754b6f784b28263mkopec} 445c460b37ffb50819a32c2a8967754b6f784b28263mkopec 446c460b37ffb50819a32c2a8967754b6f784b28263mkopecvoid Slang::setOptimizationLevel(llvm::CodeGenOpt::Level OptimizationLevel) { 447c460b37ffb50819a32c2a8967754b6f784b28263mkopec CodeGenOpts.OptimizationLevel = OptimizationLevel; 448c460b37ffb50819a32c2a8967754b6f784b28263mkopec} 449c460b37ffb50819a32c2a8967754b6f784b28263mkopec 4502d504fd03c66be56ac3b4bb62c78cc72c75dd8b6Stephen Hinesvoid Slang::reset(bool SuppressWarnings) { 4512d504fd03c66be56ac3b4bb62c78cc72c75dd8b6Stephen Hines // Always print diagnostics if we had an error occur, but don't print 4522d504fd03c66be56ac3b4bb62c78cc72c75dd8b6Stephen Hines // warnings if we suppressed them (i.e. we are doing the 64-bit compile after 4532d504fd03c66be56ac3b4bb62c78cc72c75dd8b6Stephen Hines // an existing 32-bit compile). 4542d504fd03c66be56ac3b4bb62c78cc72c75dd8b6Stephen Hines // 4552d504fd03c66be56ac3b4bb62c78cc72c75dd8b6Stephen Hines // TODO: This should really be removing duplicate identical warnings between 4562d504fd03c66be56ac3b4bb62c78cc72c75dd8b6Stephen Hines // the 32-bit and 64-bit compiles, but that is a more substantial feature. 4572d504fd03c66be56ac3b4bb62c78cc72c75dd8b6Stephen Hines // Bug: 17052573 4582d504fd03c66be56ac3b4bb62c78cc72c75dd8b6Stephen Hines if (!SuppressWarnings || mDiagEngine->hasErrorOccurred()) { 4592d504fd03c66be56ac3b4bb62c78cc72c75dd8b6Stephen Hines llvm::errs() << mDiagClient->str(); 4602d504fd03c66be56ac3b4bb62c78cc72c75dd8b6Stephen Hines } 4619207a2e495c8363606861e4f034504ec5c153dabLogan Chien mDiagEngine->Reset(); 4623a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Chang mDiagClient->reset(); 463462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao} 464462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 465462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei LiaoSlang::~Slang() { 466462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao} 467e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hines 468e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hines} // namespace slang 469