slang.cpp revision ac4e18584b8768b3f68535fa5f16232e03974323
1c383a500aa59423264811be3874461bf8adbfea0Zonr Chang/*
2c383a500aa59423264811be3874461bf8adbfea0Zonr Chang * Copyright 2010, The Android Open Source Project
3c383a500aa59423264811be3874461bf8adbfea0Zonr Chang *
4c383a500aa59423264811be3874461bf8adbfea0Zonr Chang * Licensed under the Apache License, Version 2.0 (the "License");
5c383a500aa59423264811be3874461bf8adbfea0Zonr Chang * you may not use this file except in compliance with the License.
6c383a500aa59423264811be3874461bf8adbfea0Zonr Chang * You may obtain a copy of the License at
7c383a500aa59423264811be3874461bf8adbfea0Zonr Chang *
8c383a500aa59423264811be3874461bf8adbfea0Zonr Chang *     http://www.apache.org/licenses/LICENSE-2.0
9c383a500aa59423264811be3874461bf8adbfea0Zonr Chang *
10c383a500aa59423264811be3874461bf8adbfea0Zonr Chang * Unless required by applicable law or agreed to in writing, software
11c383a500aa59423264811be3874461bf8adbfea0Zonr Chang * distributed under the License is distributed on an "AS IS" BASIS,
12c383a500aa59423264811be3874461bf8adbfea0Zonr Chang * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13c383a500aa59423264811be3874461bf8adbfea0Zonr Chang * See the License for the specific language governing permissions and
14c383a500aa59423264811be3874461bf8adbfea0Zonr Chang * limitations under the License.
15c383a500aa59423264811be3874461bf8adbfea0Zonr Chang */
16c383a500aa59423264811be3874461bf8adbfea0Zonr Chang
176315f76e3cc6ff2d012d1183a0b030d4ff0dc808zonr#include "slang.h"
18462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
196315f76e3cc6ff2d012d1183a0b030d4ff0dc808zonr#include <stdlib.h>
20462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
21e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hines#include <string>
22e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hines#include <vector>
238c6d9b2d36ed2d6d811279fd9bddc05fffe16803Zonr Chang
24e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hines#include "clang/AST/ASTConsumer.h"
25e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hines#include "clang/AST/ASTContext.h"
26462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
27be27482cdeaf08576bc39b72a15d35d13014a636Logan#include "clang/Basic/DiagnosticIDs.h"
28e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hines#include "clang/Basic/FileManager.h"
29df5bcce1582d839eead432a5e24435236c90fb05Shih-wei Liao#include "clang/Basic/FileSystemOptions.h"
306315f76e3cc6ff2d012d1183a0b030d4ff0dc808zonr#include "clang/Basic/LangOptions.h"
313a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Chang#include "clang/Basic/SourceManager.h"
323a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Chang#include "clang/Basic/TargetInfo.h"
336315f76e3cc6ff2d012d1183a0b030d4ff0dc808zonr#include "clang/Basic/TargetOptions.h"
34462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
35e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hines#include "clang/Frontend/CodeGenOptions.h"
36e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hines#include "clang/Frontend/DiagnosticOptions.h"
37cc0efad052e944f64bb71cfdaa8a825e30192e78Stephen Hines#include "clang/Frontend/DependencyOutputOptions.h"
38cc0efad052e944f64bb71cfdaa8a825e30192e78Stephen Hines#include "clang/Frontend/FrontendDiagnostic.h"
39e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hines#include "clang/Frontend/TextDiagnosticPrinter.h"
40cc0efad052e944f64bb71cfdaa8a825e30192e78Stephen Hines#include "clang/Frontend/Utils.h"
41cc0efad052e944f64bb71cfdaa8a825e30192e78Stephen Hines
423a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Chang#include "clang/Lex/Preprocessor.h"
433a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Chang#include "clang/Lex/HeaderSearch.h"
443a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Chang
456315f76e3cc6ff2d012d1183a0b030d4ff0dc808zonr#include "clang/Parse/ParseAST.h"
466315f76e3cc6ff2d012d1183a0b030d4ff0dc808zonr
47be27482cdeaf08576bc39b72a15d35d13014a636Logan#include "llvm/ADT/IntrusiveRefCntPtr.h"
48be27482cdeaf08576bc39b72a15d35d13014a636Logan
49e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hines#include "llvm/Bitcode/ReaderWriter.h"
509ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
5108df36e5c0a990306d958c9f6d59a5de23b748f6Zonr Chang// More force linking
5208df36e5c0a990306d958c9f6d59a5de23b748f6Zonr Chang#include "llvm/Linker.h"
5308df36e5c0a990306d958c9f6d59a5de23b748f6Zonr Chang
54e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hines// Force linking all passes/vmcore stuffs to libslang.so
55e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hines#include "llvm/LinkAllPasses.h"
56e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hines#include "llvm/LinkAllVMCore.h"
57e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hines
58e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hines#include "llvm/Support/raw_ostream.h"
59e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hines#include "llvm/Support/MemoryBuffer.h"
60e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hines#include "llvm/Support/ErrorHandling.h"
61e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hines#include "llvm/Support/ManagedStatic.h"
62be27482cdeaf08576bc39b72a15d35d13014a636Logan#include "llvm/Support/Path.h"
639207a2e495c8363606861e4f034504ec5c153dabLogan Chien#include "llvm/Support/TargetSelect.h"
649207a2e495c8363606861e4f034504ec5c153dabLogan Chien#include "llvm/Support/ToolOutputFile.h"
65e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hines
666e6578a360497f78a181e63d7783422a9c9bfb15Stephen Hines#include "slang_assert.h"
67e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hines#include "slang_backend.h"
68e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hines#include "slang_utils.h"
69b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao
7008df36e5c0a990306d958c9f6d59a5de23b748f6Zonr Changnamespace {
7108df36e5c0a990306d958c9f6d59a5de23b748f6Zonr Chang
72e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hinesstruct ForceSlangLinking {
73e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hines  ForceSlangLinking() {
74e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hines    // We must reference the functions in such a way that compilers will not
75e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hines    // delete it all as dead code, even with whole program optimization,
76e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hines    // yet is effectively a NO-OP. As the compiler isn't smart enough
77e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hines    // to know that getenv() never returns -1, this will do the job.
78e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hines    if (std::getenv("bar") != reinterpret_cast<char*>(-1))
79e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hines      return;
80e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hines
81e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hines    // llvm-rs-link needs following functions existing in libslang.
82e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hines    llvm::ParseBitcodeFile(NULL, llvm::getGlobalContext(), NULL);
839207a2e495c8363606861e4f034504ec5c153dabLogan Chien    llvm::Linker::LinkModules(NULL, NULL, 0, NULL);
84e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hines
85e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hines    // llvm-rs-cc need this.
86e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hines    new clang::TextDiagnosticPrinter(llvm::errs(),
87e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hines                                     clang::DiagnosticOptions());
88e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hines  }
89e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hines} ForceSlangLinking;
90e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hines
91e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hines}  // namespace
92e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hines
93e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hinesnamespace slang {
949ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
95462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao#if defined(__arm__)
96462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao#   define DEFAULT_TARGET_TRIPLE_STRING "armv7-none-linux-gnueabi"
97462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao#elif defined(__x86_64__)
98462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao#   define DEFAULT_TARGET_TRIPLE_STRING "x86_64-unknown-linux"
99462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao#else
1009ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao// let's use x86 as default target
1019ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao#   define DEFAULT_TARGET_TRIPLE_STRING "i686-unknown-linux"
102462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao#endif
103462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
104462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liaobool Slang::GlobalInitialized = false;
105462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
1069ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao// Language option (define the language feature for compiler such as C99)
1079ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liaoclang::LangOptions Slang::LangOpts;
108462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
1096315f76e3cc6ff2d012d1183a0b030d4ff0dc808zonr// Code generation option for the compiler
1109ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liaoclang::CodeGenOptions Slang::CodeGenOpts;
111462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
1129ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao// The named of metadata node that pragma resides (should be synced with
1139ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao// bcc.cpp)
114f52a620440fa62257dfdcf2583f0f9df5b855c76Shih-wei Liaoconst llvm::StringRef Slang::PragmaMetadataName = "#pragma";
115462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
1169207a2e495c8363606861e4f034504ec5c153dabLogan Chienstatic inline llvm::tool_output_file *
1179207a2e495c8363606861e4f034504ec5c153dabLogan ChienOpenOutputFile(const char *OutputFile,
1189207a2e495c8363606861e4f034504ec5c153dabLogan Chien               unsigned Flags,
1199207a2e495c8363606861e4f034504ec5c153dabLogan Chien               std::string* Error,
1209207a2e495c8363606861e4f034504ec5c153dabLogan Chien               clang::DiagnosticsEngine *DiagEngine)
1219207a2e495c8363606861e4f034504ec5c153dabLogan Chien{
1229207a2e495c8363606861e4f034504ec5c153dabLogan Chien  slangAssert((OutputFile != NULL) && (Error != NULL) &&
1239207a2e495c8363606861e4f034504ec5c153dabLogan Chien              (DiagEngine != NULL) && "Invalid parameter!");
124e8c263a1c5df81594cf302ecadd813909c894487Zonr Chang
1256f4e0a9955a53a6f715af7e674e68ed15270a47cLogan Chien  if (SlangUtils::CreateDirectoryWithParents(
1266f4e0a9955a53a6f715af7e674e68ed15270a47cLogan Chien                        llvm::sys::path::parent_path(OutputFile), Error)) {
127e8c263a1c5df81594cf302ecadd813909c894487Zonr Chang    llvm::tool_output_file *F =
128e8c263a1c5df81594cf302ecadd813909c894487Zonr Chang          new llvm::tool_output_file(OutputFile, *Error, Flags);
129e8c263a1c5df81594cf302ecadd813909c894487Zonr Chang    if (F != NULL)
130e8c263a1c5df81594cf302ecadd813909c894487Zonr Chang      return F;
131e8c263a1c5df81594cf302ecadd813909c894487Zonr Chang  }
132e8c263a1c5df81594cf302ecadd813909c894487Zonr Chang
133e8c263a1c5df81594cf302ecadd813909c894487Zonr Chang  // Report error here.
1349207a2e495c8363606861e4f034504ec5c153dabLogan Chien  DiagEngine->Report(clang::diag::err_fe_error_opening)
1359207a2e495c8363606861e4f034504ec5c153dabLogan Chien    << OutputFile << *Error;
136e8c263a1c5df81594cf302ecadd813909c894487Zonr Chang
137e8c263a1c5df81594cf302ecadd813909c894487Zonr Chang  return NULL;
138e8c263a1c5df81594cf302ecadd813909c894487Zonr Chang}
139e8c263a1c5df81594cf302ecadd813909c894487Zonr Chang
140462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liaovoid Slang::GlobalInitialization() {
1419ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  if (!GlobalInitialized) {
1429ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    // We only support x86, x64 and ARM target
143462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
1449ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    // For ARM
1459ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    LLVMInitializeARMTargetInfo();
1469ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    LLVMInitializeARMTarget();
1479ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    LLVMInitializeARMAsmPrinter();
148462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
1499ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    // For x86 and x64
1509ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    LLVMInitializeX86TargetInfo();
1519ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    LLVMInitializeX86Target();
1529ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    LLVMInitializeX86AsmPrinter();
153462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
1543a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Chang    // Please refer to include/clang/Basic/LangOptions.h to setup
1559ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    // the options.
1569ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    LangOpts.RTTI = 0;  // Turn off the RTTI information support
1579ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    LangOpts.NeXTRuntime = 0;   // Turn off the NeXT runtime uses
158245eba133628ef5b52c78d6f538c9268c9bc5828Shih-wei Liao    LangOpts.C99 = 1;
159462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
1609ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    CodeGenOpts.OptimizationLevel = 3;  /* -O3 */
161462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
1629ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    GlobalInitialized = true;
1639ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  }
164462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao}
165462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
166462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liaovoid Slang::LLVMErrorHandler(void *UserData, const std::string &Message) {
1679207a2e495c8363606861e4f034504ec5c153dabLogan Chien  clang::DiagnosticsEngine* DiagEngine =
1689207a2e495c8363606861e4f034504ec5c153dabLogan Chien    static_cast<clang::DiagnosticsEngine *>(UserData);
1699207a2e495c8363606861e4f034504ec5c153dabLogan Chien
1709207a2e495c8363606861e4f034504ec5c153dabLogan Chien  DiagEngine->Report(clang::diag::err_fe_error_backend) << Message;
1719ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  exit(1);
172462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao}
173462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
174b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liaovoid Slang::createTarget(const std::string &Triple, const std::string &CPU,
175b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao                         const std::vector<std::string> &Features) {
176b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao  if (!Triple.empty())
1779ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    mTargetOpts.Triple = Triple;
1789ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  else
1799ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    mTargetOpts.Triple = DEFAULT_TARGET_TRIPLE_STRING;
180462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
181b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao  if (!CPU.empty())
1829ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    mTargetOpts.CPU = CPU;
183462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
184b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao  if (!Features.empty())
185b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao    mTargetOpts.Features = Features;
186b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao
1879207a2e495c8363606861e4f034504ec5c153dabLogan Chien  mTarget.reset(clang::TargetInfo::CreateTargetInfo(*mDiagEngine,
1889ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao                                                    mTargetOpts));
189462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao}
190462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
1913a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Changvoid Slang::createFileManager() {
192df5bcce1582d839eead432a5e24435236c90fb05Shih-wei Liao  mFileSysOpt.reset(new clang::FileSystemOptions());
193be27482cdeaf08576bc39b72a15d35d13014a636Logan  mFileMgr.reset(new clang::FileManager(*mFileSysOpt));
1943a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Chang}
1953a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Chang
1963a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Changvoid Slang::createSourceManager() {
1979207a2e495c8363606861e4f034504ec5c153dabLogan Chien  mSourceMgr.reset(new clang::SourceManager(*mDiagEngine, *mFileMgr));
1983a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Chang}
1993a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Chang
20068e8e9f98730b3672fb96d49e33b9db70a90ed3fShih-wei Liaovoid Slang::createPreprocessor() {
2019ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  // Default only search header file in current dir
2024c622e0953afe3dca4da0aee364a811f3ccb61d9Stephen Hines  clang::HeaderSearch *HeaderInfo = new clang::HeaderSearch(*mFileMgr,
2034c622e0953afe3dca4da0aee364a811f3ccb61d9Stephen Hines                                                            *mDiagEngine);
2049ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
2059207a2e495c8363606861e4f034504ec5c153dabLogan Chien  mPP.reset(new clang::Preprocessor(*mDiagEngine,
2069ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao                                    LangOpts,
2079207a2e495c8363606861e4f034504ec5c153dabLogan Chien                                    mTarget.get(),
2089ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao                                    *mSourceMgr,
2099207a2e495c8363606861e4f034504ec5c153dabLogan Chien                                    *HeaderInfo,
2109207a2e495c8363606861e4f034504ec5c153dabLogan Chien                                    *this,
2119ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao                                    NULL,
2123a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Chang                                    /* OwnsHeaderSearch = */true));
2133fd0a94a5cf1656569b1aea07043cc63939dcb46Stephen Hines  // Initialize the preprocessor
21468e8e9f98730b3672fb96d49e33b9db70a90ed3fShih-wei Liao  mPragmas.clear();
2153fd0a94a5cf1656569b1aea07043cc63939dcb46Stephen Hines  mPP->AddPragmaHandler(new PragmaRecorder(&mPragmas));
21668e8e9f98730b3672fb96d49e33b9db70a90ed3fShih-wei Liao
2179ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  std::vector<clang::DirectoryLookup> SearchList;
2183a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Chang  for (unsigned i = 0, e = mIncludePaths.size(); i != e; i++) {
2199ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    if (const clang::DirectoryEntry *DE =
220be27482cdeaf08576bc39b72a15d35d13014a636Logan            mFileMgr->getDirectory(mIncludePaths[i])) {
2219ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao      SearchList.push_back(clang::DirectoryLookup(DE,
2229ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao                                                  clang::SrcMgr::C_System,
2239ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao                                                  false,
2249ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao                                                  false));
2259ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    }
2269089828a995422a5ed3beeed0890b755c4abe188Shih-wei Liao  }
2279089828a995422a5ed3beeed0890b755c4abe188Shih-wei Liao
2289207a2e495c8363606861e4f034504ec5c153dabLogan Chien  HeaderInfo->SetSearchPaths(SearchList,
2299207a2e495c8363606861e4f034504ec5c153dabLogan Chien                             /* angledDirIdx = */1,
2309207a2e495c8363606861e4f034504ec5c153dabLogan Chien                             /* systemDixIdx = */1,
2319207a2e495c8363606861e4f034504ec5c153dabLogan Chien                             /* noCurDirSearch = */false);
2329089828a995422a5ed3beeed0890b755c4abe188Shih-wei Liao
2333a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Chang  initPreprocessor();
23468e8e9f98730b3672fb96d49e33b9db70a90ed3fShih-wei Liao}
23568e8e9f98730b3672fb96d49e33b9db70a90ed3fShih-wei Liao
2363a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Changvoid Slang::createASTContext() {
2373a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Chang  mASTContext.reset(new clang::ASTContext(LangOpts,
2383a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Chang                                          *mSourceMgr,
2399207a2e495c8363606861e4f034504ec5c153dabLogan Chien                                          mTarget.get(),
2403a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Chang                                          mPP->getIdentifierTable(),
2413a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Chang                                          mPP->getSelectorTable(),
2423a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Chang                                          mPP->getBuiltinInfo(),
2433a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Chang                                          /* size_reserve = */0));
2443a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Chang  initASTContext();
2453a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Chang}
2463a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Chang
2479207a2e495c8363606861e4f034504ec5c153dabLogan Chienclang::ASTConsumer *
2489207a2e495c8363606861e4f034504ec5c153dabLogan ChienSlang::createBackend(const clang::CodeGenOptions& CodeGenOpts,
2499207a2e495c8363606861e4f034504ec5c153dabLogan Chien                     llvm::raw_ostream *OS, OutputType OT) {
2508f4d972ef6c6796ffdde603e456979a7004d1e20Stephen Hines  return new Backend(mDiagEngine, CodeGenOpts, mTargetOpts,
2519207a2e495c8363606861e4f034504ec5c153dabLogan Chien                     &mPragmas, OS, OT);
2523a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Chang}
2533a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Chang
254641558f02fe6ce0ee3ae5076eb366c25e2ad5903Zonr ChangSlang::Slang() : mInitialized(false), mDiagClient(NULL), mOT(OT_Default) {
2559ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  GlobalInitialization();
256641558f02fe6ce0ee3ae5076eb366c25e2ad5903Zonr Chang}
257641558f02fe6ce0ee3ae5076eb366c25e2ad5903Zonr Chang
258641558f02fe6ce0ee3ae5076eb366c25e2ad5903Zonr Changvoid Slang::init(const std::string &Triple, const std::string &CPU,
2598f4d972ef6c6796ffdde603e456979a7004d1e20Stephen Hines                 const std::vector<std::string> &Features,
2608f4d972ef6c6796ffdde603e456979a7004d1e20Stephen Hines                 clang::DiagnosticsEngine *DiagEngine,
2618f4d972ef6c6796ffdde603e456979a7004d1e20Stephen Hines                 DiagnosticBuffer *DiagClient) {
262641558f02fe6ce0ee3ae5076eb366c25e2ad5903Zonr Chang  if (mInitialized)
263641558f02fe6ce0ee3ae5076eb366c25e2ad5903Zonr Chang    return;
264462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
2658f4d972ef6c6796ffdde603e456979a7004d1e20Stephen Hines  mDiagEngine = DiagEngine;
2668f4d972ef6c6796ffdde603e456979a7004d1e20Stephen Hines  mDiagClient = DiagClient;
2678f4d972ef6c6796ffdde603e456979a7004d1e20Stephen Hines  mDiag.reset(new clang::Diagnostic(mDiagEngine));
2688f4d972ef6c6796ffdde603e456979a7004d1e20Stephen Hines  initDiagnostic();
2698f4d972ef6c6796ffdde603e456979a7004d1e20Stephen Hines  llvm::install_fatal_error_handler(LLVMErrorHandler, mDiagEngine);
270462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
2719ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  createTarget(Triple, CPU, Features);
2729ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  createFileManager();
2739ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  createSourceManager();
274462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
275641558f02fe6ce0ee3ae5076eb366c25e2ad5903Zonr Chang  mInitialized = true;
2769207a2e495c8363606861e4f034504ec5c153dabLogan Chien}
277641558f02fe6ce0ee3ae5076eb366c25e2ad5903Zonr Chang
278ac4e18584b8768b3f68535fa5f16232e03974323Logan Chienclang::Module *Slang::loadModule(clang::SourceLocation ImportLoc,
279ac4e18584b8768b3f68535fa5f16232e03974323Logan Chien                                 clang::ModuleIdPath Path,
280ac4e18584b8768b3f68535fa5f16232e03974323Logan Chien                                 clang::Module::NameVisibilityKind Visibility,
281ac4e18584b8768b3f68535fa5f16232e03974323Logan Chien                                 bool IsInclusionDirective) {
2829207a2e495c8363606861e4f034504ec5c153dabLogan Chien  //FIXME: Don't we have to implement this?
2839207a2e495c8363606861e4f034504ec5c153dabLogan Chien  slangAssert(0 && "Not implemented");
2849207a2e495c8363606861e4f034504ec5c153dabLogan Chien  return NULL;
285462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao}
286462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
2873a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Changbool Slang::setInputSource(llvm::StringRef InputFile,
2883a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Chang                           const char *Text,
2893a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Chang                           size_t TextLength) {
2903a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Chang  mInputFileName = InputFile.str();
291462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
2929ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  // Reset the ID tables if we are reusing the SourceManager
2939ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  mSourceMgr->clearIDTables();
294462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
2959ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  // Load the source
2966315f76e3cc6ff2d012d1183a0b030d4ff0dc808zonr  llvm::MemoryBuffer *SB =
2973a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Chang      llvm::MemoryBuffer::getMemBuffer(Text, Text + TextLength);
2989ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  mSourceMgr->createMainFileIDForMemBuffer(SB);
299462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
3009ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  if (mSourceMgr->getMainFileID().isInvalid()) {
3019207a2e495c8363606861e4f034504ec5c153dabLogan Chien    mDiagEngine->Report(clang::diag::err_fe_error_reading) << InputFile;
3029ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    return false;
3039ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  }
3049ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  return true;
305462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao}
306462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
3073a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Changbool Slang::setInputSource(llvm::StringRef InputFile) {
3083a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Chang  mInputFileName = InputFile.str();
309462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
3109ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  mSourceMgr->clearIDTables();
311462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
312be27482cdeaf08576bc39b72a15d35d13014a636Logan  const clang::FileEntry *File = mFileMgr->getFile(InputFile);
3139ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  if (File)
3149ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    mSourceMgr->createMainFileID(File);
315462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
3169ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  if (mSourceMgr->getMainFileID().isInvalid()) {
3179207a2e495c8363606861e4f034504ec5c153dabLogan Chien    mDiagEngine->Report(clang::diag::err_fe_error_reading) << InputFile;
3189ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    return false;
3199ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  }
320462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
3219ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  return true;
322462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao}
323462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
3243a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Changbool Slang::setOutput(const char *OutputFile) {
3258c6d9b2d36ed2d6d811279fd9bddc05fffe16803Zonr Chang  llvm::sys::Path OutputFilePath(OutputFile);
3269ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  std::string Error;
327e8c263a1c5df81594cf302ecadd813909c894487Zonr Chang  llvm::tool_output_file *OS = NULL;
328462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
3293a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Chang  switch (mOT) {
330cc0efad052e944f64bb71cfdaa8a825e30192e78Stephen Hines    case OT_Dependency:
3313a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Chang    case OT_Assembly:
3323a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Chang    case OT_LLVMAssembly: {
3338f4d972ef6c6796ffdde603e456979a7004d1e20Stephen Hines      OS = OpenOutputFile(OutputFile, 0, &Error, mDiagEngine);
3349ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao      break;
335462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    }
3363a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Chang    case OT_Nothing: {
3379ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao      break;
338462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    }
3393a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Chang    case OT_Object:
340cc0efad052e944f64bb71cfdaa8a825e30192e78Stephen Hines    case OT_Bitcode: {
3419207a2e495c8363606861e4f034504ec5c153dabLogan Chien      OS = OpenOutputFile(OutputFile, llvm::raw_fd_ostream::F_Binary,
3428f4d972ef6c6796ffdde603e456979a7004d1e20Stephen Hines                          &Error, mDiagEngine);
3439ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao      break;
3449ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    }
3458c6d9b2d36ed2d6d811279fd9bddc05fffe16803Zonr Chang    default: {
346cc0efad052e944f64bb71cfdaa8a825e30192e78Stephen Hines      llvm_unreachable("Unknown compiler output type");
3478c6d9b2d36ed2d6d811279fd9bddc05fffe16803Zonr Chang    }
3489ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  }
349462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
350e8c263a1c5df81594cf302ecadd813909c894487Zonr Chang  if (!Error.empty())
3519ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    return false;
352e8c263a1c5df81594cf302ecadd813909c894487Zonr Chang
353e8c263a1c5df81594cf302ecadd813909c894487Zonr Chang  mOS.reset(OS);
3549ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
3553a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Chang  mOutputFileName = OutputFile;
356462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
3579ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  return true;
358462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao}
359462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
3600b7ef1a176b9ddd1e0d437efdce20743373fd7dbStephen Hinesbool Slang::setDepOutput(const char *OutputFile) {
3618c6d9b2d36ed2d6d811279fd9bddc05fffe16803Zonr Chang  llvm::sys::Path OutputFilePath(OutputFile);
3620b7ef1a176b9ddd1e0d437efdce20743373fd7dbStephen Hines  std::string Error;
3638c6d9b2d36ed2d6d811279fd9bddc05fffe16803Zonr Chang
3648f4d972ef6c6796ffdde603e456979a7004d1e20Stephen Hines  mDOS.reset(OpenOutputFile(OutputFile, 0, &Error, mDiagEngine));
365e8c263a1c5df81594cf302ecadd813909c894487Zonr Chang  if (!Error.empty() || (mDOS.get() == NULL))
3660b7ef1a176b9ddd1e0d437efdce20743373fd7dbStephen Hines    return false;
3670b7ef1a176b9ddd1e0d437efdce20743373fd7dbStephen Hines
3680b7ef1a176b9ddd1e0d437efdce20743373fd7dbStephen Hines  mDepOutputFileName = OutputFile;
3690b7ef1a176b9ddd1e0d437efdce20743373fd7dbStephen Hines
3700b7ef1a176b9ddd1e0d437efdce20743373fd7dbStephen Hines  return true;
3710b7ef1a176b9ddd1e0d437efdce20743373fd7dbStephen Hines}
3720b7ef1a176b9ddd1e0d437efdce20743373fd7dbStephen Hines
373cc0efad052e944f64bb71cfdaa8a825e30192e78Stephen Hinesint Slang::generateDepFile() {
3749207a2e495c8363606861e4f034504ec5c153dabLogan Chien  if (mDiagEngine->hasErrorOccurred())
375be27482cdeaf08576bc39b72a15d35d13014a636Logan    return 1;
3760b7ef1a176b9ddd1e0d437efdce20743373fd7dbStephen Hines  if (mDOS.get() == NULL)
377f7de85223c8728d5dc147e8a19ddf039da72b431Stephen Hines    return 1;
378cc0efad052e944f64bb71cfdaa8a825e30192e78Stephen Hines
379e8c263a1c5df81594cf302ecadd813909c894487Zonr Chang  // Initialize options for generating dependency file
380cc0efad052e944f64bb71cfdaa8a825e30192e78Stephen Hines  clang::DependencyOutputOptions DepOpts;
381cc0efad052e944f64bb71cfdaa8a825e30192e78Stephen Hines  DepOpts.IncludeSystemHeaders = 1;
3820b7ef1a176b9ddd1e0d437efdce20743373fd7dbStephen Hines  DepOpts.OutputFile = mDepOutputFileName;
383b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao  DepOpts.Targets = mAdditionalDepTargets;
384cc0efad052e944f64bb71cfdaa8a825e30192e78Stephen Hines  DepOpts.Targets.push_back(mDepTargetBCFileName);
3854cc67fce91f43215d61b2695746eab102a3db516Stephen Hines  for (std::vector<std::string>::const_iterator
3864cc67fce91f43215d61b2695746eab102a3db516Stephen Hines           I = mGeneratedFileNames.begin(), E = mGeneratedFileNames.end();
3874cc67fce91f43215d61b2695746eab102a3db516Stephen Hines       I != E;
3884cc67fce91f43215d61b2695746eab102a3db516Stephen Hines       I++) {
3894cc67fce91f43215d61b2695746eab102a3db516Stephen Hines    DepOpts.Targets.push_back(*I);
3904cc67fce91f43215d61b2695746eab102a3db516Stephen Hines  }
3914cc67fce91f43215d61b2695746eab102a3db516Stephen Hines  mGeneratedFileNames.clear();
392cc0efad052e944f64bb71cfdaa8a825e30192e78Stephen Hines
393e8c263a1c5df81594cf302ecadd813909c894487Zonr Chang  // Per-compilation needed initialization
394cc0efad052e944f64bb71cfdaa8a825e30192e78Stephen Hines  createPreprocessor();
395cc0efad052e944f64bb71cfdaa8a825e30192e78Stephen Hines  AttachDependencyFileGen(*mPP.get(), DepOpts);
396cc0efad052e944f64bb71cfdaa8a825e30192e78Stephen Hines
397e8c263a1c5df81594cf302ecadd813909c894487Zonr Chang  // Inform the diagnostic client we are processing a source file
398cc0efad052e944f64bb71cfdaa8a825e30192e78Stephen Hines  mDiagClient->BeginSourceFile(LangOpts, mPP.get());
399cc0efad052e944f64bb71cfdaa8a825e30192e78Stephen Hines
400e8c263a1c5df81594cf302ecadd813909c894487Zonr Chang  // Go through the source file (no operations necessary)
401cc0efad052e944f64bb71cfdaa8a825e30192e78Stephen Hines  clang::Token Tok;
402cc0efad052e944f64bb71cfdaa8a825e30192e78Stephen Hines  mPP->EnterMainSourceFile();
403cc0efad052e944f64bb71cfdaa8a825e30192e78Stephen Hines  do {
404cc0efad052e944f64bb71cfdaa8a825e30192e78Stephen Hines    mPP->Lex(Tok);
405cc0efad052e944f64bb71cfdaa8a825e30192e78Stephen Hines  } while (Tok.isNot(clang::tok::eof));
406cc0efad052e944f64bb71cfdaa8a825e30192e78Stephen Hines
407cc0efad052e944f64bb71cfdaa8a825e30192e78Stephen Hines  mPP->EndSourceFile();
408cc0efad052e944f64bb71cfdaa8a825e30192e78Stephen Hines
409e8c263a1c5df81594cf302ecadd813909c894487Zonr Chang  // Declare success if no error
4109207a2e495c8363606861e4f034504ec5c153dabLogan Chien  if (!mDiagEngine->hasErrorOccurred())
411e8c263a1c5df81594cf302ecadd813909c894487Zonr Chang    mDOS->keep();
412e8c263a1c5df81594cf302ecadd813909c894487Zonr Chang
413e8c263a1c5df81594cf302ecadd813909c894487Zonr Chang  // Clean up after compilation
414cc0efad052e944f64bb71cfdaa8a825e30192e78Stephen Hines  mPP.reset();
415e8c263a1c5df81594cf302ecadd813909c894487Zonr Chang  mDOS.reset();
416cc0efad052e944f64bb71cfdaa8a825e30192e78Stephen Hines
4179207a2e495c8363606861e4f034504ec5c153dabLogan Chien  return mDiagEngine->hasErrorOccurred() ? 1 : 0;
418cc0efad052e944f64bb71cfdaa8a825e30192e78Stephen Hines}
419cc0efad052e944f64bb71cfdaa8a825e30192e78Stephen Hines
420462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liaoint Slang::compile() {
4219207a2e495c8363606861e4f034504ec5c153dabLogan Chien  if (mDiagEngine->hasErrorOccurred())
422be27482cdeaf08576bc39b72a15d35d13014a636Logan    return 1;
423f7de85223c8728d5dc147e8a19ddf039da72b431Stephen Hines  if (mOS.get() == NULL)
424f7de85223c8728d5dc147e8a19ddf039da72b431Stephen Hines    return 1;
425462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
4269ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  // Here is per-compilation needed initialization
4279ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  createPreprocessor();
4289ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  createASTContext();
4293a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Chang
430df5bcce1582d839eead432a5e24435236c90fb05Shih-wei Liao  mBackend.reset(createBackend(CodeGenOpts, &mOS->os(), mOT));
431462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
4329ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  // Inform the diagnostic client we are processing a source file
4339ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  mDiagClient->BeginSourceFile(LangOpts, mPP.get());
434462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
4359ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  // The core of the slang compiler
4369ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  ParseAST(*mPP, mBackend.get(), *mASTContext);
437462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
438e8c263a1c5df81594cf302ecadd813909c894487Zonr Chang  // Inform the diagnostic client we are done with previous source file
439e8c263a1c5df81594cf302ecadd813909c894487Zonr Chang  mDiagClient->EndSourceFile();
440e8c263a1c5df81594cf302ecadd813909c894487Zonr Chang
441e8c263a1c5df81594cf302ecadd813909c894487Zonr Chang  // Declare success if no error
4429207a2e495c8363606861e4f034504ec5c153dabLogan Chien  if (!mDiagEngine->hasErrorOccurred())
443e8c263a1c5df81594cf302ecadd813909c894487Zonr Chang    mOS->keep();
444e8c263a1c5df81594cf302ecadd813909c894487Zonr Chang
4453a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Chang  // The compilation ended, clear
4469ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  mBackend.reset();
4479ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  mASTContext.reset();
4489ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  mPP.reset();
449e8c263a1c5df81594cf302ecadd813909c894487Zonr Chang  mOS.reset();
450462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
4519207a2e495c8363606861e4f034504ec5c153dabLogan Chien  return mDiagEngine->hasErrorOccurred() ? 1 : 0;
452462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao}
453462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
4543a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Changvoid Slang::reset() {
455c632be206ac4fe49a5db05cfa54942d774329dbeStephen Hines  llvm::errs() << mDiagClient->str();
4569207a2e495c8363606861e4f034504ec5c153dabLogan Chien  mDiagEngine->Reset();
4573a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Chang  mDiagClient->reset();
458462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao}
459462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
460462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei LiaoSlang::~Slang() {
4619ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  llvm::llvm_shutdown();
462462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao}
463e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hines
464e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hines}  // namespace slang
465