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