12a79e162a3fde25c1941151a67966830d873f2dbDaniel Dunbar//===--- CompilerInstance.cpp ---------------------------------------------===//
22a79e162a3fde25c1941151a67966830d873f2dbDaniel Dunbar//
32a79e162a3fde25c1941151a67966830d873f2dbDaniel Dunbar//                     The LLVM Compiler Infrastructure
42a79e162a3fde25c1941151a67966830d873f2dbDaniel Dunbar//
52a79e162a3fde25c1941151a67966830d873f2dbDaniel Dunbar// This file is distributed under the University of Illinois Open Source
62a79e162a3fde25c1941151a67966830d873f2dbDaniel Dunbar// License. See LICENSE.TXT for details.
72a79e162a3fde25c1941151a67966830d873f2dbDaniel Dunbar//
82a79e162a3fde25c1941151a67966830d873f2dbDaniel Dunbar//===----------------------------------------------------------------------===//
92a79e162a3fde25c1941151a67966830d873f2dbDaniel Dunbar
102a79e162a3fde25c1941151a67966830d873f2dbDaniel Dunbar#include "clang/Frontend/CompilerInstance.h"
1112ce6943aae499225708ecf364c5a8b0a3269c87Daniel Dunbar#include "clang/AST/ASTConsumer.h"
125eb810024dc8a1d12d5f066c02c978f07c4fcb00Daniel Dunbar#include "clang/AST/ASTContext.h"
1393ebfa6139bbca4d446c7343e3afc8e5ec777484Douglas Gregor#include "clang/AST/Decl.h"
142a79e162a3fde25c1941151a67966830d873f2dbDaniel Dunbar#include "clang/Basic/Diagnostic.h"
1516b7449d86b843d0926b04f87104cf3fff7149feDaniel Dunbar#include "clang/Basic/FileManager.h"
1616b7449d86b843d0926b04f87104cf3fff7149feDaniel Dunbar#include "clang/Basic/SourceManager.h"
172a79e162a3fde25c1941151a67966830d873f2dbDaniel Dunbar#include "clang/Basic/TargetInfo.h"
180397af277e3bba16da1fd125ddba07415686b429Daniel Dunbar#include "clang/Basic/Version.h"
19c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines#include "clang/Config/config.h"
204e85b8ae413fa00fa42aa3e625c2db3b1932f8d3David Blaikie#include "clang/Frontend/ChainedDiagnosticConsumer.h"
210397af277e3bba16da1fd125ddba07415686b429Daniel Dunbar#include "clang/Frontend/FrontendAction.h"
2221cae2059a06f7d89eee169409c9266def1b1acaDouglas Gregor#include "clang/Frontend/FrontendActions.h"
23c2f484f1f05216a9a427ac84b5773789a4661111Daniel Dunbar#include "clang/Frontend/FrontendDiagnostic.h"
249df23493f5b8a223dfbc491e4b7de3850797c2e7Daniel Dunbar#include "clang/Frontend/LogDiagnosticPrinter.h"
257800212ef29be314d55814e8dcc568ff8beed106Ted Kremenek#include "clang/Frontend/SerializedDiagnosticPrinter.h"
260fbb3d9a9cdd2201848be9eb017c54cd78538122Daniel Dunbar#include "clang/Frontend/TextDiagnosticPrinter.h"
2722dacfacacf5559028550ba6ddfbaa4ea6cb3944Daniel Dunbar#include "clang/Frontend/Utils.h"
2855fc873017f10f6f566b182b70f6fc22aefa3464Chandler Carruth#include "clang/Frontend/VerifyDiagnosticConsumer.h"
2955fc873017f10f6f566b182b70f6fc22aefa3464Chandler Carruth#include "clang/Lex/HeaderSearch.h"
3055fc873017f10f6f566b182b70f6fc22aefa3464Chandler Carruth#include "clang/Lex/PTHManager.h"
3155fc873017f10f6f566b182b70f6fc22aefa3464Chandler Carruth#include "clang/Lex/Preprocessor.h"
32c2f484f1f05216a9a427ac84b5773789a4661111Daniel Dunbar#include "clang/Sema/CodeCompleteConsumer.h"
3355fc873017f10f6f566b182b70f6fc22aefa3464Chandler Carruth#include "clang/Sema/Sema.h"
3455fc873017f10f6f566b182b70f6fc22aefa3464Chandler Carruth#include "clang/Serialization/ASTReader.h"
356bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines#include "clang/Serialization/GlobalModuleIndex.h"
3695dd5583e3900443a1d7970d557d8c54aa320601Douglas Gregor#include "llvm/ADT/Statistic.h"
3755fc873017f10f6f566b182b70f6fc22aefa3464Chandler Carruth#include "llvm/Support/CrashRecoveryContext.h"
38c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines#include "llvm/Support/Errc.h"
3955fc873017f10f6f566b182b70f6fc22aefa3464Chandler Carruth#include "llvm/Support/FileSystem.h"
4003013fa9a0bf1ef4b907f5fec006c8f4000fdd21Michael J. Spencer#include "llvm/Support/Host.h"
4152f127297c9dca0f8fbb3a28144de4db1d1db9e2Douglas Gregor#include "llvm/Support/LockFileManager.h"
4255fc873017f10f6f566b182b70f6fc22aefa3464Chandler Carruth#include "llvm/Support/MemoryBuffer.h"
4303013fa9a0bf1ef4b907f5fec006c8f4000fdd21Michael J. Spencer#include "llvm/Support/Path.h"
4403013fa9a0bf1ef4b907f5fec006c8f4000fdd21Michael J. Spencer#include "llvm/Support/Program.h"
4503013fa9a0bf1ef4b907f5fec006c8f4000fdd21Michael J. Spencer#include "llvm/Support/Signals.h"
4655fc873017f10f6f566b182b70f6fc22aefa3464Chandler Carruth#include "llvm/Support/Timer.h"
4755fc873017f10f6f566b182b70f6fc22aefa3464Chandler Carruth#include "llvm/Support/raw_ostream.h"
48d44d2872b2ebe58237de4dbc350b82cab944ccc5Douglas Gregor#include <sys/stat.h>
49c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines#include <system_error>
5087ab066c70006d998a6d358d272e00c8345b0f26Douglas Gregor#include <time.h>
514967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar#include <utility>
522bc750700487163e31e4f67cd0e0886868209e3cDouglas Gregor
532a79e162a3fde25c1941151a67966830d873f2dbDaniel Dunbarusing namespace clang;
542a79e162a3fde25c1941151a67966830d873f2dbDaniel Dunbar
5587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga NainarCompilerInstance::CompilerInstance(
5687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar    std::shared_ptr<PCHContainerOperations> PCHContainerOps,
5787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar    bool BuildingModule)
5887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar    : ModuleLoader(BuildingModule), Invocation(new CompilerInvocation()),
594967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      ModuleManager(nullptr),
604967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      ThePCHContainerOperations(std::move(PCHContainerOps)),
6187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar      BuildGlobalModuleIndex(false), HaveFullGlobalModuleIndex(false),
6287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar      ModuleBuildFailed(false) {}
632a79e162a3fde25c1941151a67966830d873f2dbDaniel Dunbar
642a79e162a3fde25c1941151a67966830d873f2dbDaniel DunbarCompilerInstance::~CompilerInstance() {
65ac447fce02d119fb70f0aab885d836dea43e7f26Benjamin Kramer  assert(OutputFiles.empty() && "Still output files in flight?");
6642e9f8e4983d50f896ec716207817b9d96e7e79cDaniel Dunbar}
6742e9f8e4983d50f896ec716207817b9d96e7e79cDaniel Dunbar
686228ca00121669ec06a19df4fad87d5049c097cfDaniel Dunbarvoid CompilerInstance::setInvocation(CompilerInvocation *Value) {
694f32786ac45210143654390177105eb749b614e9Ted Kremenek  Invocation = Value;
706228ca00121669ec06a19df4fad87d5049c097cfDaniel Dunbar}
716228ca00121669ec06a19df4fad87d5049c097cfDaniel Dunbar
72f575d6e7c3b887ea4c5394d2c7e322c7a929a57eDouglas Gregorbool CompilerInstance::shouldBuildGlobalModuleIndex() const {
731a49d97d762570027863e9209af81d445e4f1502Douglas Gregor  return (BuildGlobalModuleIndex ||
74ed2fc2a311065ee5f6c20adb1655702aff86ae8aDouglas Gregor          (ModuleManager && ModuleManager->isGlobalIndexUnavailable() &&
75ed2fc2a311065ee5f6c20adb1655702aff86ae8aDouglas Gregor           getFrontendOpts().GenerateGlobalModuleIndex)) &&
761a49d97d762570027863e9209af81d445e4f1502Douglas Gregor         !ModuleBuildFailed;
77f575d6e7c3b887ea4c5394d2c7e322c7a929a57eDouglas Gregor}
78f575d6e7c3b887ea4c5394d2c7e322c7a929a57eDouglas Gregor
79d6471f7c1921c7802804ce3ff6fe9768310f72b9David Blaikievoid CompilerInstance::setDiagnostics(DiagnosticsEngine *Value) {
8028019772db70d4547be05a042eb950bc910f134fDouglas Gregor  Diagnostics = Value;
818a9f569262860b8d03203327afd6047be2a9b5a6Daniel Dunbar}
828a9f569262860b8d03203327afd6047be2a9b5a6Daniel Dunbar
8387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainarvoid CompilerInstance::setTarget(TargetInfo *Value) { Target = Value; }
8487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainarvoid CompilerInstance::setAuxTarget(TargetInfo *Value) { AuxTarget = Value; }
858a9f569262860b8d03203327afd6047be2a9b5a6Daniel Dunbar
868a9f569262860b8d03203327afd6047be2a9b5a6Daniel Dunbarvoid CompilerInstance::setFileManager(FileManager *Value) {
874f32786ac45210143654390177105eb749b614e9Ted Kremenek  FileMgr = Value;
88651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  if (Value)
89651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    VirtualFileSystem = Value->getVirtualFileSystem();
90651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  else
91651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    VirtualFileSystem.reset();
928a9f569262860b8d03203327afd6047be2a9b5a6Daniel Dunbar}
938a9f569262860b8d03203327afd6047be2a9b5a6Daniel Dunbar
94a789ca9b967abe47b84df83bcf4afb150856a8d9NAKAMURA Takumivoid CompilerInstance::setSourceManager(SourceManager *Value) {
954f32786ac45210143654390177105eb749b614e9Ted Kremenek  SourceMgr = Value;
968a9f569262860b8d03203327afd6047be2a9b5a6Daniel Dunbar}
978a9f569262860b8d03203327afd6047be2a9b5a6Daniel Dunbar
984f32786ac45210143654390177105eb749b614e9Ted Kremenekvoid CompilerInstance::setPreprocessor(Preprocessor *Value) { PP = Value; }
998a9f569262860b8d03203327afd6047be2a9b5a6Daniel Dunbar
10087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainarvoid CompilerInstance::setASTContext(ASTContext *Value) {
10187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  Context = Value;
10287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar
10387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  if (Context && Consumer)
10487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar    getASTConsumer().Initialize(getASTContext());
10587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar}
10612ce6943aae499225708ecf364c5a8b0a3269c87Daniel Dunbar
107f18d0d8b39e891460d50f8a8b85029885b264986Douglas Gregorvoid CompilerInstance::setSema(Sema *S) {
108f18d0d8b39e891460d50f8a8b85029885b264986Douglas Gregor  TheSema.reset(S);
109f18d0d8b39e891460d50f8a8b85029885b264986Douglas Gregor}
110f18d0d8b39e891460d50f8a8b85029885b264986Douglas Gregor
111176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hinesvoid CompilerInstance::setASTConsumer(std::unique_ptr<ASTConsumer> Value) {
112176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  Consumer = std::move(Value);
11387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar
11487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  if (Context && Consumer)
11587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar    getASTConsumer().Initialize(getASTContext());
1168a9f569262860b8d03203327afd6047be2a9b5a6Daniel Dunbar}
1178a9f569262860b8d03203327afd6047be2a9b5a6Daniel Dunbar
1188a9f569262860b8d03203327afd6047be2a9b5a6Daniel Dunbarvoid CompilerInstance::setCodeCompletionConsumer(CodeCompleteConsumer *Value) {
1198a9f569262860b8d03203327afd6047be2a9b5a6Daniel Dunbar  CompletionConsumer.reset(Value);
1208a9f569262860b8d03203327afd6047be2a9b5a6Daniel Dunbar}
121176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines
122176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hinesstd::unique_ptr<Sema> CompilerInstance::takeSema() {
123176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  return std::move(TheSema);
124176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines}
125176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines
126651f13cea278ec967336033dd032faef0e9fc2ecStephen HinesIntrusiveRefCntPtr<ASTReader> CompilerInstance::getModuleManager() const {
127651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  return ModuleManager;
128651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines}
129651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesvoid CompilerInstance::setModuleManager(IntrusiveRefCntPtr<ASTReader> Reader) {
1304967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  ModuleManager = std::move(Reader);
131651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines}
1328a9f569262860b8d03203327afd6047be2a9b5a6Daniel Dunbar
133c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hinesstd::shared_ptr<ModuleDependencyCollector>
134c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen HinesCompilerInstance::getModuleDepCollector() const {
135c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  return ModuleDepCollector;
136c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines}
137c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines
138c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hinesvoid CompilerInstance::setModuleDepCollector(
139c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines    std::shared_ptr<ModuleDependencyCollector> Collector) {
1404967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  ModuleDepCollector = std::move(Collector);
141c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines}
142c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines
1430fbb3d9a9cdd2201848be9eb017c54cd78538122Daniel Dunbar// Diagnostics
14402c23ebf41ae2f70da0ba7337e05c51fbfe35f7fDouglas Gregorstatic void SetUpDiagnosticLog(DiagnosticOptions *DiagOpts,
145b6534bbee90bf73f364072051d10b60352d43c3eDaniel Dunbar                               const CodeGenOptions *CodeGenOpts,
146d6471f7c1921c7802804ce3ff6fe9768310f72b9David Blaikie                               DiagnosticsEngine &Diags) {
147176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  std::error_code EC;
148176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  std::unique_ptr<raw_ostream> StreamOwner;
1495f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner  raw_ostream *OS = &llvm::errs();
15002c23ebf41ae2f70da0ba7337e05c51fbfe35f7fDouglas Gregor  if (DiagOpts->DiagnosticLogFile != "-") {
1519df23493f5b8a223dfbc491e4b7de3850797c2e7Daniel Dunbar    // Create the output stream.
152176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    auto FileOS = llvm::make_unique<llvm::raw_fd_ostream>(
153176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines        DiagOpts->DiagnosticLogFile, EC,
154176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines        llvm::sys::fs::F_Append | llvm::sys::fs::F_Text);
155176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    if (EC) {
1569df23493f5b8a223dfbc491e4b7de3850797c2e7Daniel Dunbar      Diags.Report(diag::warn_fe_cc_log_diagnostics_failure)
157176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines          << DiagOpts->DiagnosticLogFile << EC.message();
1589df23493f5b8a223dfbc491e4b7de3850797c2e7Daniel Dunbar    } else {
1599df23493f5b8a223dfbc491e4b7de3850797c2e7Daniel Dunbar      FileOS->SetUnbuffered();
160176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines      OS = FileOS.get();
161176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines      StreamOwner = std::move(FileOS);
1629df23493f5b8a223dfbc491e4b7de3850797c2e7Daniel Dunbar    }
1639df23493f5b8a223dfbc491e4b7de3850797c2e7Daniel Dunbar  }
1649df23493f5b8a223dfbc491e4b7de3850797c2e7Daniel Dunbar
1659df23493f5b8a223dfbc491e4b7de3850797c2e7Daniel Dunbar  // Chain in the diagnostic client which will log the diagnostics.
166176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  auto Logger = llvm::make_unique<LogDiagnosticPrinter>(*OS, DiagOpts,
167176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines                                                        std::move(StreamOwner));
168b6534bbee90bf73f364072051d10b60352d43c3eDaniel Dunbar  if (CodeGenOpts)
169b6534bbee90bf73f364072051d10b60352d43c3eDaniel Dunbar    Logger->setDwarfDebugFlags(CodeGenOpts->DwarfDebugFlags);
170176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  assert(Diags.ownsClient());
171176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  Diags.setClient(
172176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines      new ChainedDiagnosticConsumer(Diags.takeClient(), std::move(Logger)));
1739df23493f5b8a223dfbc491e4b7de3850797c2e7Daniel Dunbar}
1749df23493f5b8a223dfbc491e4b7de3850797c2e7Daniel Dunbar
17502c23ebf41ae2f70da0ba7337e05c51fbfe35f7fDouglas Gregorstatic void SetupSerializedDiagnostics(DiagnosticOptions *DiagOpts,
1767800212ef29be314d55814e8dcc568ff8beed106Ted Kremenek                                       DiagnosticsEngine &Diags,
1777800212ef29be314d55814e8dcc568ff8beed106Ted Kremenek                                       StringRef OutputFile) {
178176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  auto SerializedConsumer =
179176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines      clang::serialized_diags::create(OutputFile, DiagOpts);
180d965f95daa97097c8ddc5e1165ceae585a888719Rafael Espindola
181176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  if (Diags.ownsClient()) {
182176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    Diags.setClient(new ChainedDiagnosticConsumer(
183176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines        Diags.takeClient(), std::move(SerializedConsumer)));
184176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  } else {
185176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    Diags.setClient(new ChainedDiagnosticConsumer(
186176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines        Diags.getClient(), std::move(SerializedConsumer)));
1877800212ef29be314d55814e8dcc568ff8beed106Ted Kremenek  }
1887800212ef29be314d55814e8dcc568ff8beed106Ted Kremenek}
1897800212ef29be314d55814e8dcc568ff8beed106Ted Kremenek
190d47afb96a3f988e6d21a92fe4dfe875ab227c7c0Sean Silvavoid CompilerInstance::createDiagnostics(DiagnosticConsumer *Client,
191cc2b653c319599f502425d2c3de29865d47bb9e4Douglas Gregor                                         bool ShouldOwnClient) {
192d47afb96a3f988e6d21a92fe4dfe875ab227c7c0Sean Silva  Diagnostics = createDiagnostics(&getDiagnosticOpts(), Client,
193cc2b653c319599f502425d2c3de29865d47bb9e4Douglas Gregor                                  ShouldOwnClient, &getCodeGenOpts());
1940fbb3d9a9cdd2201848be9eb017c54cd78538122Daniel Dunbar}
1950fbb3d9a9cdd2201848be9eb017c54cd78538122Daniel Dunbar
196c93dc7889644293e318e19d82830ea2acc45b678Dylan NoblesmithIntrusiveRefCntPtr<DiagnosticsEngine>
19702c23ebf41ae2f70da0ba7337e05c51fbfe35f7fDouglas GregorCompilerInstance::createDiagnostics(DiagnosticOptions *Opts,
19878ad0b98848c17a0a11847fa1d456e2dfec8aa2fDavid Blaikie                                    DiagnosticConsumer *Client,
19978243658c533168d51fd076fba328437932ba6f1Douglas Gregor                                    bool ShouldOwnClient,
200b6534bbee90bf73f364072051d10b60352d43c3eDaniel Dunbar                                    const CodeGenOptions *CodeGenOpts) {
201c93dc7889644293e318e19d82830ea2acc45b678Dylan Noblesmith  IntrusiveRefCntPtr<DiagnosticIDs> DiagID(new DiagnosticIDs());
202c93dc7889644293e318e19d82830ea2acc45b678Dylan Noblesmith  IntrusiveRefCntPtr<DiagnosticsEngine>
20302c23ebf41ae2f70da0ba7337e05c51fbfe35f7fDouglas Gregor      Diags(new DiagnosticsEngine(DiagID, Opts));
204221c7211c507482a91e97ede1bf6cf65a456ff67Daniel Dunbar
2050fbb3d9a9cdd2201848be9eb017c54cd78538122Daniel Dunbar  // Create the diagnostic client for reporting errors or for
2060fbb3d9a9cdd2201848be9eb017c54cd78538122Daniel Dunbar  // implementing -verify.
207aee526e77657afd1600276450e9c346953ad51d7Douglas Gregor  if (Client) {
208cc2b653c319599f502425d2c3de29865d47bb9e4Douglas Gregor    Diags->setClient(Client, ShouldOwnClient);
209aee526e77657afd1600276450e9c346953ad51d7Douglas Gregor  } else
210e47be3e9682e82da15059006f43c7f3c021e4fffDouglas Gregor    Diags->setClient(new TextDiagnosticPrinter(llvm::errs(), Opts));
211f79dced038c63572965c016b969cfa870670d16eDaniel Dunbar
212f79dced038c63572965c016b969cfa870670d16eDaniel Dunbar  // Chain in -verify checker, if requested.
21302c23ebf41ae2f70da0ba7337e05c51fbfe35f7fDouglas Gregor  if (Opts->VerifyDiagnostics)
214621bc69624599da62abd9bc9e5edd8a63ac99fe6David Blaikie    Diags->setClient(new VerifyDiagnosticConsumer(*Diags));
2150fbb3d9a9cdd2201848be9eb017c54cd78538122Daniel Dunbar
2169df23493f5b8a223dfbc491e4b7de3850797c2e7Daniel Dunbar  // Chain in -diagnostic-log-file dumper, if requested.
21702c23ebf41ae2f70da0ba7337e05c51fbfe35f7fDouglas Gregor  if (!Opts->DiagnosticLogFile.empty())
218b6534bbee90bf73f364072051d10b60352d43c3eDaniel Dunbar    SetUpDiagnosticLog(Opts, CodeGenOpts, *Diags);
219a789ca9b967abe47b84df83bcf4afb150856a8d9NAKAMURA Takumi
22002c23ebf41ae2f70da0ba7337e05c51fbfe35f7fDouglas Gregor  if (!Opts->DiagnosticSerializationFile.empty())
2217800212ef29be314d55814e8dcc568ff8beed106Ted Kremenek    SetupSerializedDiagnostics(Opts, *Diags,
22202c23ebf41ae2f70da0ba7337e05c51fbfe35f7fDouglas Gregor                               Opts->DiagnosticSerializationFile);
2237800212ef29be314d55814e8dcc568ff8beed106Ted Kremenek
2240fbb3d9a9cdd2201848be9eb017c54cd78538122Daniel Dunbar  // Configure our handling of diagnostics.
22502c23ebf41ae2f70da0ba7337e05c51fbfe35f7fDouglas Gregor  ProcessWarningOptions(*Diags, *Opts);
2260fbb3d9a9cdd2201848be9eb017c54cd78538122Daniel Dunbar
22728019772db70d4547be05a042eb950bc910f134fDouglas Gregor  return Diags;
2280fbb3d9a9cdd2201848be9eb017c54cd78538122Daniel Dunbar}
2290fbb3d9a9cdd2201848be9eb017c54cd78538122Daniel Dunbar
2300fbb3d9a9cdd2201848be9eb017c54cd78538122Daniel Dunbar// File Manager
2310fbb3d9a9cdd2201848be9eb017c54cd78538122Daniel Dunbar
23216b7449d86b843d0926b04f87104cf3fff7149feDaniel Dunbarvoid CompilerInstance::createFileManager() {
233651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  if (!hasVirtualFileSystem()) {
234651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    // TODO: choose the virtual file system based on the CompilerInvocation.
235651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    setVirtualFileSystem(vfs::getRealFileSystem());
236651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  }
237651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  FileMgr = new FileManager(getFileSystemOpts(), VirtualFileSystem);
23816b7449d86b843d0926b04f87104cf3fff7149feDaniel Dunbar}
23916b7449d86b843d0926b04f87104cf3fff7149feDaniel Dunbar
2400fbb3d9a9cdd2201848be9eb017c54cd78538122Daniel Dunbar// Source Manager
2410fbb3d9a9cdd2201848be9eb017c54cd78538122Daniel Dunbar
24239b49bcaaddb1049234fca9500c0ac02c088e23dChris Lattnervoid CompilerInstance::createSourceManager(FileManager &FileMgr) {
2434f32786ac45210143654390177105eb749b614e9Ted Kremenek  SourceMgr = new SourceManager(getDiagnostics(), FileMgr);
24416b7449d86b843d0926b04f87104cf3fff7149feDaniel Dunbar}
24522dacfacacf5559028550ba6ddfbaa4ea6cb3944Daniel Dunbar
246c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines// Initialize the remapping of files to alternative contents, e.g.,
247c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines// those specified through other files.
248c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hinesstatic void InitializeFileRemapping(DiagnosticsEngine &Diags,
249c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines                                    SourceManager &SourceMgr,
250c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines                                    FileManager &FileMgr,
251c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines                                    const PreprocessorOptions &InitOpts) {
252c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  // Remap files in the source manager (with buffers).
253c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  for (const auto &RB : InitOpts.RemappedFileBuffers) {
254c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines    // Create the file entry for the file that we're mapping from.
255c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines    const FileEntry *FromFile =
256c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines        FileMgr.getVirtualFile(RB.first, RB.second->getBufferSize(), 0);
257c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines    if (!FromFile) {
258c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines      Diags.Report(diag::err_fe_remap_missing_from_file) << RB.first;
259c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines      if (!InitOpts.RetainRemappedFileBuffers)
260c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines        delete RB.second;
261c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines      continue;
262c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines    }
263c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines
264c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines    // Override the contents of the "from" file with the contents of
265c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines    // the "to" file.
266c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines    SourceMgr.overrideFileContents(FromFile, RB.second,
267c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines                                   InitOpts.RetainRemappedFileBuffers);
268c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  }
269c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines
270c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  // Remap files in the source manager (with other files).
271c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  for (const auto &RF : InitOpts.RemappedFiles) {
272c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines    // Find the file that we're mapping to.
273c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines    const FileEntry *ToFile = FileMgr.getFile(RF.second);
274c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines    if (!ToFile) {
275c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines      Diags.Report(diag::err_fe_remap_missing_to_file) << RF.first << RF.second;
276c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines      continue;
277c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines    }
278c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines
279c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines    // Create the file entry for the file that we're mapping from.
280c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines    const FileEntry *FromFile =
281c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines        FileMgr.getVirtualFile(RF.first, ToFile->getSize(), 0);
282c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines    if (!FromFile) {
283c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines      Diags.Report(diag::err_fe_remap_missing_from_file) << RF.first;
284c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines      continue;
285c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines    }
286c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines
287c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines    // Override the contents of the "from" file with the contents of
288c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines    // the "to" file.
289c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines    SourceMgr.overrideFileContents(FromFile, ToFile);
290c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  }
291c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines
292c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  SourceMgr.setOverridenFilesKeepOriginalName(
293c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines      InitOpts.RemappedFilesKeepOriginalName);
294c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines}
295c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines
2960fbb3d9a9cdd2201848be9eb017c54cd78538122Daniel Dunbar// Preprocessor
2970fbb3d9a9cdd2201848be9eb017c54cd78538122Daniel Dunbar
298651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesvoid CompilerInstance::createPreprocessor(TranslationUnitKind TUKind) {
2996aa52ec6b969faabf3764baf79d89810b8249a7eDouglas Gregor  const PreprocessorOptions &PPOpts = getPreprocessorOpts();
300a789ca9b967abe47b84df83bcf4afb150856a8d9NAKAMURA Takumi
30122dacfacacf5559028550ba6ddfbaa4ea6cb3944Daniel Dunbar  // Create a PTH manager if we are using some form of a token cache.
3026bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  PTHManager *PTHMgr = nullptr;
303049d3a06ea9f8fc03582488a2b7f24512565a335Daniel Dunbar  if (!PPOpts.TokenCache.empty())
3046aa52ec6b969faabf3764baf79d89810b8249a7eDouglas Gregor    PTHMgr = PTHManager::Create(PPOpts.TokenCache, getDiagnostics());
305a789ca9b967abe47b84df83bcf4afb150856a8d9NAKAMURA Takumi
30622dacfacacf5559028550ba6ddfbaa4ea6cb3944Daniel Dunbar  // Create the Preprocessor.
307c042edd54face617a3b9d0b4b9d5a3ff229d0f48Douglas Gregor  HeaderSearch *HeaderInfo = new HeaderSearch(&getHeaderSearchOpts(),
308ee0cd37fe4a9f4e2ee73ae34cf93c410cb299a82Manuel Klimek                                              getSourceManager(),
30951f564f80d9f71e175635b452ffeeeff899e9bf1Douglas Gregor                                              getDiagnostics(),
310dc58aa71026cce539ca9b5c2c52cc4efc7bd77feDouglas Gregor                                              getLangOpts(),
311dc58aa71026cce539ca9b5c2c52cc4efc7bd77feDouglas Gregor                                              &getTarget());
3126bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  PP = new Preprocessor(&getPreprocessorOpts(), getDiagnostics(), getLangOpts(),
3136aa52ec6b969faabf3764baf79d89810b8249a7eDouglas Gregor                        getSourceManager(), *HeaderInfo, *this, PTHMgr,
3146bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines                        /*OwnsHeaderSearch=*/true, TUKind);
31587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  PP->Initialize(getTarget(), getAuxTarget());
316a789ca9b967abe47b84df83bcf4afb150856a8d9NAKAMURA Takumi
31722dacfacacf5559028550ba6ddfbaa4ea6cb3944Daniel Dunbar  // Note that this is different then passing PTHMgr to Preprocessor's ctor.
31822dacfacacf5559028550ba6ddfbaa4ea6cb3944Daniel Dunbar  // That argument is used as the IdentifierInfoLookup argument to
31922dacfacacf5559028550ba6ddfbaa4ea6cb3944Daniel Dunbar  // IdentifierTable's ctor.
32022dacfacacf5559028550ba6ddfbaa4ea6cb3944Daniel Dunbar  if (PTHMgr) {
3216aa52ec6b969faabf3764baf79d89810b8249a7eDouglas Gregor    PTHMgr->setPreprocessor(&*PP);
32222dacfacacf5559028550ba6ddfbaa4ea6cb3944Daniel Dunbar    PP->setPTHManager(PTHMgr);
32322dacfacacf5559028550ba6ddfbaa4ea6cb3944Daniel Dunbar  }
324a789ca9b967abe47b84df83bcf4afb150856a8d9NAKAMURA Takumi
32594dc8f640ebea52241412512ed48601626edbc58Douglas Gregor  if (PPOpts.DetailedRecord)
32637ed12720a35b7bfa1c4de73ad6f1c6c1c88ee17Argyrios Kyrtzidis    PP->createPreprocessingRecord();
327a789ca9b967abe47b84df83bcf4afb150856a8d9NAKAMURA Takumi
328c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  // Apply remappings to the source manager.
329c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  InitializeFileRemapping(PP->getDiagnostics(), PP->getSourceManager(),
330c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines                          PP->getFileManager(), PPOpts);
331c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines
332c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  // Predefine macros and configure the preprocessor.
33387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  InitializePreprocessor(*PP, PPOpts, getPCHContainerReader(),
33487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar                         getFrontendOpts());
335c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines
336c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  // Initialize the header search object.
337c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  ApplyHeaderSearchOptions(PP->getHeaderSearchInfo(), getHeaderSearchOpts(),
338c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines                           PP->getLangOpts(), PP->getTargetInfo().getTriple());
339a789ca9b967abe47b84df83bcf4afb150856a8d9NAKAMURA Takumi
34074c2498bb9e339345ee32bdd095e76157cec3b86Jordan Rose  PP->setPreprocessedOutput(getPreprocessorOutputOpts().ShowCPP);
34174c2498bb9e339345ee32bdd095e76157cec3b86Jordan Rose
34287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  if (PP->getLangOpts().Modules && PP->getLangOpts().ImplicitModules)
34358878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar    PP->getHeaderSearchInfo().setModuleCachePath(getSpecificModuleCachePath());
344a789ca9b967abe47b84df83bcf4afb150856a8d9NAKAMURA Takumi
34522dacfacacf5559028550ba6ddfbaa4ea6cb3944Daniel Dunbar  // Handle generating dependencies, if requested.
3466aa52ec6b969faabf3764baf79d89810b8249a7eDouglas Gregor  const DependencyOutputOptions &DepOpts = getDependencyOutputOpts();
34722dacfacacf5559028550ba6ddfbaa4ea6cb3944Daniel Dunbar  if (!DepOpts.OutputFile.empty())
348651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    TheDependencyFileGenerator.reset(
349651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines        DependencyFileGenerator::CreateAndAttachToPreprocessor(*PP, DepOpts));
350773303a505c23d73da624f1e6abcf41a393dad2bDouglas Gregor  if (!DepOpts.DOTOutputFile.empty())
351773303a505c23d73da624f1e6abcf41a393dad2bDouglas Gregor    AttachDependencyGraphGen(*PP, DepOpts.DOTOutputFile,
352c69a181049ab52da29f8f69316a34c90c3ea3b8eDouglas Gregor                             getHeaderSearchOpts().Sysroot);
353a789ca9b967abe47b84df83bcf4afb150856a8d9NAKAMURA Takumi
354c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  // If we don't have a collector, but we are collecting module dependencies,
355c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  // then we're the top level compiler instance and need to create one.
3564967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  if (!ModuleDepCollector && !DepOpts.ModuleDependencyOutputDir.empty()) {
357c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines    ModuleDepCollector = std::make_shared<ModuleDependencyCollector>(
358c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines        DepOpts.ModuleDependencyOutputDir);
3594967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  }
3604967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
3614967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  if (ModuleDepCollector)
3624967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    addDependencyCollector(ModuleDepCollector);
3634967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
3644967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  for (auto &Listener : DependencyCollectors)
3654967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    Listener->attachToPreprocessor(*PP);
366708002ede3938256a6223d153a0c040f7a40f5ccHans Wennborg
367eef63e0997e0f6d6436736ea919b851cfe34955aDaniel Dunbar  // Handle generating header include information, if requested.
368eef63e0997e0f6d6436736ea919b851cfe34955aDaniel Dunbar  if (DepOpts.ShowHeaderIncludes)
3694967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    AttachHeaderIncludeGen(*PP, DepOpts);
370b34d69b9292534c1c574f168f0ac10aea652adcaDaniel Dunbar  if (!DepOpts.HeaderIncludeOutputFile.empty()) {
3715f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner    StringRef OutputPath = DepOpts.HeaderIncludeOutputFile;
372b34d69b9292534c1c574f168f0ac10aea652adcaDaniel Dunbar    if (OutputPath == "-")
373b34d69b9292534c1c574f168f0ac10aea652adcaDaniel Dunbar      OutputPath = "";
3744967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    AttachHeaderIncludeGen(*PP, DepOpts,
37587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar                           /*ShowAllHeaders=*/true, OutputPath,
376da60885cb4ee85d167cf704061f10b758067cf5aDaniel Dunbar                           /*ShowDepth=*/false);
377b34d69b9292534c1c574f168f0ac10aea652adcaDaniel Dunbar  }
378708002ede3938256a6223d153a0c040f7a40f5ccHans Wennborg
379708002ede3938256a6223d153a0c040f7a40f5ccHans Wennborg  if (DepOpts.PrintShowIncludes) {
3804967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    AttachHeaderIncludeGen(*PP, DepOpts,
3814967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                           /*ShowAllHeaders=*/true, /*OutputPath=*/"",
382708002ede3938256a6223d153a0c040f7a40f5ccHans Wennborg                           /*ShowDepth=*/true, /*MSStyle=*/true);
383708002ede3938256a6223d153a0c040f7a40f5ccHans Wennborg  }
38422dacfacacf5559028550ba6ddfbaa4ea6cb3944Daniel Dunbar}
3855eb810024dc8a1d12d5f066c02c978f07c4fcb00Daniel Dunbar
3860e2c34f92f00628d48968dfea096d36381f494cbStephen Hinesstd::string CompilerInstance::getSpecificModuleCachePath() {
3870e2c34f92f00628d48968dfea096d36381f494cbStephen Hines  // Set up the module path, including the hash for the
3880e2c34f92f00628d48968dfea096d36381f494cbStephen Hines  // module-creation options.
38987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  SmallString<256> SpecificModuleCache(getHeaderSearchOpts().ModuleCachePath);
39087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  if (!SpecificModuleCache.empty() && !getHeaderSearchOpts().DisableModuleHash)
3910e2c34f92f00628d48968dfea096d36381f494cbStephen Hines    llvm::sys::path::append(SpecificModuleCache,
3920e2c34f92f00628d48968dfea096d36381f494cbStephen Hines                            getInvocation().getModuleHash());
3930e2c34f92f00628d48968dfea096d36381f494cbStephen Hines  return SpecificModuleCache.str();
3940e2c34f92f00628d48968dfea096d36381f494cbStephen Hines}
3950e2c34f92f00628d48968dfea096d36381f494cbStephen Hines
3965eb810024dc8a1d12d5f066c02c978f07c4fcb00Daniel Dunbar// ASTContext
3975eb810024dc8a1d12d5f066c02c978f07c4fcb00Daniel Dunbar
3985eb810024dc8a1d12d5f066c02c978f07c4fcb00Daniel Dunbarvoid CompilerInstance::createASTContext() {
3995eb810024dc8a1d12d5f066c02c978f07c4fcb00Daniel Dunbar  Preprocessor &PP = getPreprocessor();
40087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  auto *Context = new ASTContext(getLangOpts(), PP.getSourceManager(),
40187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar                                 PP.getIdentifierTable(), PP.getSelectorTable(),
40287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar                                 PP.getBuiltinInfo());
40387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  Context->InitBuiltinTypes(getTarget(), getAuxTarget());
40487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  setASTContext(Context);
4055eb810024dc8a1d12d5f066c02c978f07c4fcb00Daniel Dunbar}
4060f800391ffbfe3820e1c60246a09a97e5f065179Daniel Dunbar
4070f800391ffbfe3820e1c60246a09a97e5f065179Daniel Dunbar// ExternalASTSource
4080f800391ffbfe3820e1c60246a09a97e5f065179Daniel Dunbar
4096bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hinesvoid CompilerInstance::createPCHExternalASTSource(
4106bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    StringRef Path, bool DisablePCHValidation, bool AllowPCHWithCompilerErrors,
4116bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    void *DeserializationListener, bool OwnDeserializationListener) {
4121d9f1fe7173e3084325f43c78af812a36d8a2a7cSebastian Redl  bool Preamble = getPreprocessorOpts().PrecompiledPreambleBytes.first != 0;
4130e2c34f92f00628d48968dfea096d36381f494cbStephen Hines  ModuleManager = createPCHExternalASTSource(
4146bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines      Path, getHeaderSearchOpts().Sysroot, DisablePCHValidation,
4156bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines      AllowPCHWithCompilerErrors, getPreprocessor(), getASTContext(),
41687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar      getPCHContainerReader(),
41787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar      getFrontendOpts().ModuleFileExtensions,
41887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar      DeserializationListener,
41987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar      OwnDeserializationListener, Preamble,
4206bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines      getFrontendOpts().UseGlobalModuleIndex);
4210f800391ffbfe3820e1c60246a09a97e5f065179Daniel Dunbar}
4220f800391ffbfe3820e1c60246a09a97e5f065179Daniel Dunbar
4230e2c34f92f00628d48968dfea096d36381f494cbStephen HinesIntrusiveRefCntPtr<ASTReader> CompilerInstance::createPCHExternalASTSource(
42487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar    StringRef Path, StringRef Sysroot, bool DisablePCHValidation,
4256bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    bool AllowPCHWithCompilerErrors, Preprocessor &PP, ASTContext &Context,
42687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar    const PCHContainerReader &PCHContainerRdr,
42787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar    ArrayRef<IntrusiveRefCntPtr<ModuleFileExtension>> Extensions,
4286bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    void *DeserializationListener, bool OwnDeserializationListener,
4296bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    bool Preamble, bool UseGlobalModuleIndex) {
430651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  HeaderSearchOptions &HSOpts = PP.getHeaderSearchInfo().getHeaderSearchOpts();
431651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
43287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  IntrusiveRefCntPtr<ASTReader> Reader(new ASTReader(
43387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar      PP, Context, PCHContainerRdr, Extensions,
43487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar      Sysroot.empty() ? "" : Sysroot.data(), DisablePCHValidation,
43587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar      AllowPCHWithCompilerErrors, /*AllowConfigurationMismatch*/ false,
43687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar      HSOpts.ModulesValidateSystemHeaders, UseGlobalModuleIndex));
4370e2c34f92f00628d48968dfea096d36381f494cbStephen Hines
4380e2c34f92f00628d48968dfea096d36381f494cbStephen Hines  // We need the external source to be set up before we read the AST, because
4390e2c34f92f00628d48968dfea096d36381f494cbStephen Hines  // eagerly-deserialized declarations may use it.
4400e2c34f92f00628d48968dfea096d36381f494cbStephen Hines  Context.setExternalSource(Reader.get());
4410f800391ffbfe3820e1c60246a09a97e5f065179Daniel Dunbar
442ffaab3e2bb13991bb3357e80f14bcae3745b2347Sebastian Redl  Reader->setDeserializationListener(
4436bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines      static_cast<ASTDeserializationListener *>(DeserializationListener),
4446bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines      /*TakeOwnership=*/OwnDeserializationListener);
445a789ca9b967abe47b84df83bcf4afb150856a8d9NAKAMURA Takumi  switch (Reader->ReadAST(Path,
446a789ca9b967abe47b84df83bcf4afb150856a8d9NAKAMURA Takumi                          Preamble ? serialization::MK_Preamble
44738295beb73db5f90bfcf31625fb81dbc3b96290aDouglas Gregor                                   : serialization::MK_PCH,
448958bcaf3d4e0c1ae46de3e84e7c2a7638c3c5286Argyrios Kyrtzidis                          SourceLocation(),
44938295beb73db5f90bfcf31625fb81dbc3b96290aDouglas Gregor                          ASTReader::ARR_None)) {
450c43b54cbc10654ed59de797898042e1a05265246Sebastian Redl  case ASTReader::Success:
4510f800391ffbfe3820e1c60246a09a97e5f065179Daniel Dunbar    // Set the predefines buffer as suggested by the PCH reader. Typically, the
4520f800391ffbfe3820e1c60246a09a97e5f065179Daniel Dunbar    // predefines buffer will be empty.
4530f800391ffbfe3820e1c60246a09a97e5f065179Daniel Dunbar    PP.setPredefines(Reader->getSuggestedPredefines());
4540e2c34f92f00628d48968dfea096d36381f494cbStephen Hines    return Reader;
4550f800391ffbfe3820e1c60246a09a97e5f065179Daniel Dunbar
456c43b54cbc10654ed59de797898042e1a05265246Sebastian Redl  case ASTReader::Failure:
4570f800391ffbfe3820e1c60246a09a97e5f065179Daniel Dunbar    // Unrecoverable failure: don't even try to process the input file.
4580f800391ffbfe3820e1c60246a09a97e5f065179Daniel Dunbar    break;
4590f800391ffbfe3820e1c60246a09a97e5f065179Daniel Dunbar
460677e15ffee2ecc9c1c8f46fd77cab4b5afb59640Douglas Gregor  case ASTReader::Missing:
4614825fd7fbb3fe87cdf8da9bccc1361fac45bdf2dDouglas Gregor  case ASTReader::OutOfDate:
4624825fd7fbb3fe87cdf8da9bccc1361fac45bdf2dDouglas Gregor  case ASTReader::VersionMismatch:
4634825fd7fbb3fe87cdf8da9bccc1361fac45bdf2dDouglas Gregor  case ASTReader::ConfigurationMismatch:
4644825fd7fbb3fe87cdf8da9bccc1361fac45bdf2dDouglas Gregor  case ASTReader::HadErrors:
4650f800391ffbfe3820e1c60246a09a97e5f065179Daniel Dunbar    // No suitable PCH file could be found. Return an error.
4660f800391ffbfe3820e1c60246a09a97e5f065179Daniel Dunbar    break;
4670f800391ffbfe3820e1c60246a09a97e5f065179Daniel Dunbar  }
4680f800391ffbfe3820e1c60246a09a97e5f065179Daniel Dunbar
4690e2c34f92f00628d48968dfea096d36381f494cbStephen Hines  Context.setExternalSource(nullptr);
4706bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  return nullptr;
4710f800391ffbfe3820e1c60246a09a97e5f065179Daniel Dunbar}
472c2f484f1f05216a9a427ac84b5773789a4661111Daniel Dunbar
473c2f484f1f05216a9a427ac84b5773789a4661111Daniel Dunbar// Code Completion
474c2f484f1f05216a9a427ac84b5773789a4661111Daniel Dunbar
475a789ca9b967abe47b84df83bcf4afb150856a8d9NAKAMURA Takumistatic bool EnableCodeCompletion(Preprocessor &PP,
4764967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                                 StringRef Filename,
4771abc6bca3d7fb0e7b1e40fbcad6cfb5e10594548Douglas Gregor                                 unsigned Line,
4781abc6bca3d7fb0e7b1e40fbcad6cfb5e10594548Douglas Gregor                                 unsigned Column) {
4791abc6bca3d7fb0e7b1e40fbcad6cfb5e10594548Douglas Gregor  // Tell the source manager to chop off the given file at a specific
4801abc6bca3d7fb0e7b1e40fbcad6cfb5e10594548Douglas Gregor  // line and column.
48139b49bcaaddb1049234fca9500c0ac02c088e23dChris Lattner  const FileEntry *Entry = PP.getFileManager().getFile(Filename);
4821abc6bca3d7fb0e7b1e40fbcad6cfb5e10594548Douglas Gregor  if (!Entry) {
4831abc6bca3d7fb0e7b1e40fbcad6cfb5e10594548Douglas Gregor    PP.getDiagnostics().Report(diag::err_fe_invalid_code_complete_file)
4841abc6bca3d7fb0e7b1e40fbcad6cfb5e10594548Douglas Gregor      << Filename;
4851abc6bca3d7fb0e7b1e40fbcad6cfb5e10594548Douglas Gregor    return true;
4861abc6bca3d7fb0e7b1e40fbcad6cfb5e10594548Douglas Gregor  }
4871abc6bca3d7fb0e7b1e40fbcad6cfb5e10594548Douglas Gregor
4881abc6bca3d7fb0e7b1e40fbcad6cfb5e10594548Douglas Gregor  // Truncate the named file at the given line/column.
4891abc6bca3d7fb0e7b1e40fbcad6cfb5e10594548Douglas Gregor  PP.SetCodeCompletionPoint(Entry, Line, Column);
4901abc6bca3d7fb0e7b1e40fbcad6cfb5e10594548Douglas Gregor  return false;
4911abc6bca3d7fb0e7b1e40fbcad6cfb5e10594548Douglas Gregor}
4921abc6bca3d7fb0e7b1e40fbcad6cfb5e10594548Douglas Gregor
493c2f484f1f05216a9a427ac84b5773789a4661111Daniel Dunbarvoid CompilerInstance::createCodeCompletionConsumer() {
494c2f484f1f05216a9a427ac84b5773789a4661111Daniel Dunbar  const ParsedSourceLocation &Loc = getFrontendOpts().CodeCompletionAt;
4951abc6bca3d7fb0e7b1e40fbcad6cfb5e10594548Douglas Gregor  if (!CompletionConsumer) {
4969bc0c290a79a6aca46367626e3463077147e7e76Erik Verbruggen    setCodeCompletionConsumer(
4971abc6bca3d7fb0e7b1e40fbcad6cfb5e10594548Douglas Gregor      createCodeCompletionConsumer(getPreprocessor(),
4981abc6bca3d7fb0e7b1e40fbcad6cfb5e10594548Douglas Gregor                                   Loc.FileName, Loc.Line, Loc.Column,
499d99ef536b241071b6f4c01db6525dc03242ac30bDmitri Gribenko                                   getFrontendOpts().CodeCompleteOpts,
5001abc6bca3d7fb0e7b1e40fbcad6cfb5e10594548Douglas Gregor                                   llvm::outs()));
5011abc6bca3d7fb0e7b1e40fbcad6cfb5e10594548Douglas Gregor    if (!CompletionConsumer)
5021abc6bca3d7fb0e7b1e40fbcad6cfb5e10594548Douglas Gregor      return;
5031abc6bca3d7fb0e7b1e40fbcad6cfb5e10594548Douglas Gregor  } else if (EnableCodeCompletion(getPreprocessor(), Loc.FileName,
5041abc6bca3d7fb0e7b1e40fbcad6cfb5e10594548Douglas Gregor                                  Loc.Line, Loc.Column)) {
5056bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    setCodeCompletionConsumer(nullptr);
506c3d43b783dfb1a1502aa8b31ab1985cf237b1f77Douglas Gregor    return;
5071abc6bca3d7fb0e7b1e40fbcad6cfb5e10594548Douglas Gregor  }
5082b4074f1d3919e77cb33ca49c960521dea27afabDouglas Gregor
5092b4074f1d3919e77cb33ca49c960521dea27afabDouglas Gregor  if (CompletionConsumer->isOutputBinary() &&
510a603569515eea06e54e6e041b1c690d33086f375Rafael Espindola      llvm::sys::ChangeStdoutToBinary()) {
5112b4074f1d3919e77cb33ca49c960521dea27afabDouglas Gregor    getPreprocessor().getDiagnostics().Report(diag::err_fe_stdout_binary);
5126bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    setCodeCompletionConsumer(nullptr);
5132b4074f1d3919e77cb33ca49c960521dea27afabDouglas Gregor  }
514c2f484f1f05216a9a427ac84b5773789a4661111Daniel Dunbar}
515c2f484f1f05216a9a427ac84b5773789a4661111Daniel Dunbar
516f79bafa608a5d7c49ec40ad199af5e32f3038b47Kovarththanan Rajaratnamvoid CompilerInstance::createFrontendTimer() {
51787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  FrontendTimerGroup.reset(new llvm::TimerGroup("Clang front-end time report"));
51887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  FrontendTimer.reset(
51987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar      new llvm::Timer("Clang front-end timer", *FrontendTimerGroup));
520f79bafa608a5d7c49ec40ad199af5e32f3038b47Kovarththanan Rajaratnam}
521f79bafa608a5d7c49ec40ad199af5e32f3038b47Kovarththanan Rajaratnam
522c2f484f1f05216a9a427ac84b5773789a4661111Daniel DunbarCodeCompleteConsumer *
523c2f484f1f05216a9a427ac84b5773789a4661111Daniel DunbarCompilerInstance::createCodeCompletionConsumer(Preprocessor &PP,
52487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar                                               StringRef Filename,
525c2f484f1f05216a9a427ac84b5773789a4661111Daniel Dunbar                                               unsigned Line,
526c2f484f1f05216a9a427ac84b5773789a4661111Daniel Dunbar                                               unsigned Column,
527d99ef536b241071b6f4c01db6525dc03242ac30bDmitri Gribenko                                               const CodeCompleteOptions &Opts,
5285f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner                                               raw_ostream &OS) {
5291abc6bca3d7fb0e7b1e40fbcad6cfb5e10594548Douglas Gregor  if (EnableCodeCompletion(PP, Filename, Line, Column))
5306bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    return nullptr;
531c2f484f1f05216a9a427ac84b5773789a4661111Daniel Dunbar
532c2f484f1f05216a9a427ac84b5773789a4661111Daniel Dunbar  // Set up the creation routine for code-completion.
533d99ef536b241071b6f4c01db6525dc03242ac30bDmitri Gribenko  return new PrintingCodeCompleteConsumer(Opts, OS);
534c2f484f1f05216a9a427ac84b5773789a4661111Daniel Dunbar}
535a9204831639e31474b927681b97c46781b758a1aDaniel Dunbar
536467dc88512b4ba4bb16e274ea3771dc1415d31daDouglas Gregorvoid CompilerInstance::createSema(TranslationUnitKind TUKind,
537f18d0d8b39e891460d50f8a8b85029885b264986Douglas Gregor                                  CodeCompleteConsumer *CompletionConsumer) {
538f18d0d8b39e891460d50f8a8b85029885b264986Douglas Gregor  TheSema.reset(new Sema(getPreprocessor(), getASTContext(), getASTConsumer(),
539467dc88512b4ba4bb16e274ea3771dc1415d31daDouglas Gregor                         TUKind, CompletionConsumer));
540f18d0d8b39e891460d50f8a8b85029885b264986Douglas Gregor}
541f18d0d8b39e891460d50f8a8b85029885b264986Douglas Gregor
542a9204831639e31474b927681b97c46781b758a1aDaniel Dunbar// Output Files
543a9204831639e31474b927681b97c46781b758a1aDaniel Dunbar
54458878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainarvoid CompilerInstance::addOutputFile(OutputFile &&OutFile) {
545dc24572a44575e07a5d8bb6de52641a69f1bab27Argyrios Kyrtzidis  assert(OutFile.OS && "Attempt to add empty stream to output list!");
54658878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar  OutputFiles.push_back(std::move(OutFile));
547a9204831639e31474b927681b97c46781b758a1aDaniel Dunbar}
548a9204831639e31474b927681b97c46781b758a1aDaniel Dunbar
549e51dd7be67808d52c80c09b832d875e9655ce6e0Kovarththanan Rajaratnamvoid CompilerInstance::clearOutputFiles(bool EraseFiles) {
55058878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar  for (OutputFile &OF : OutputFiles) {
55158878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar    // Manually close the stream before we rename it.
55258878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar    OF.OS.reset();
55358878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar
55458878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar    if (!OF.TempFilename.empty()) {
555af036a6c25f540a9daf51e721485ae6d0e645bd8Anders Carlsson      if (EraseFiles) {
55658878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar        llvm::sys::fs::remove(OF.TempFilename);
557af036a6c25f540a9daf51e721485ae6d0e645bd8Anders Carlsson      } else {
55858878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar        SmallString<128> NewOutFile(OF.Filename);
559af036a6c25f540a9daf51e721485ae6d0e645bd8Anders Carlsson
560389db16c63eec6ecfa9b235155252d8da766e94eArgyrios Kyrtzidis        // If '-working-directory' was passed, the output filename should be
561389db16c63eec6ecfa9b235155252d8da766e94eArgyrios Kyrtzidis        // relative to that.
5622e2468e2d2ccbb9a38fe3b6b754009af7e5d39a9Anders Carlsson        FileMgr->FixupRelativePath(NewOutFile);
563c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines        if (std::error_code ec =
56458878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar                llvm::sys::fs::rename(OF.TempFilename, NewOutFile)) {
565832a2aac5766dd78f113e0f03a0c62fd0eacbc97Manuel Klimek          getDiagnostics().Report(diag::err_unable_to_rename_temp)
56658878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar            << OF.TempFilename << OF.Filename << ec.message();
567af036a6c25f540a9daf51e721485ae6d0e645bd8Anders Carlsson
56858878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar          llvm::sys::fs::remove(OF.TempFilename);
569dc24572a44575e07a5d8bb6de52641a69f1bab27Argyrios Kyrtzidis        }
570dc24572a44575e07a5d8bb6de52641a69f1bab27Argyrios Kyrtzidis      }
57158878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar    } else if (!OF.Filename.empty() && EraseFiles)
57258878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar      llvm::sys::fs::remove(OF.Filename);
573a789ca9b967abe47b84df83bcf4afb150856a8d9NAKAMURA Takumi
574a9204831639e31474b927681b97c46781b758a1aDaniel Dunbar  }
575a9204831639e31474b927681b97c46781b758a1aDaniel Dunbar  OutputFiles.clear();
57658878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar  NonSeekStream.reset();
577a9204831639e31474b927681b97c46781b758a1aDaniel Dunbar}
578a9204831639e31474b927681b97c46781b758a1aDaniel Dunbar
57958878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainarraw_pwrite_stream *
58058878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga NainarCompilerInstance::createDefaultOutputFile(bool Binary, StringRef InFile,
5815f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner                                          StringRef Extension) {
582f482d59386dbc70716f7a5f65adb37ff86b501e6Daniel Dunbar  return createOutputFile(getFrontendOpts().OutputFile, Binary,
583e21dd284d8209a89137a03a0d63f2bd57be9e660Daniel Dunbar                          /*RemoveFileOnSignal=*/true, InFile, Extension,
584e21dd284d8209a89137a03a0d63f2bd57be9e660Daniel Dunbar                          /*UseTemporary=*/true);
585f482d59386dbc70716f7a5f65adb37ff86b501e6Daniel Dunbar}
586f482d59386dbc70716f7a5f65adb37ff86b501e6Daniel Dunbar
587c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hinesllvm::raw_null_ostream *CompilerInstance::createNullOutputFile() {
58858878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar  auto OS = llvm::make_unique<llvm::raw_null_ostream>();
58958878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar  llvm::raw_null_ostream *Ret = OS.get();
59058878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar  addOutputFile(OutputFile("", "", std::move(OS)));
59158878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar  return Ret;
592c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines}
593c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines
59458878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainarraw_pwrite_stream *
59558878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga NainarCompilerInstance::createOutputFile(StringRef OutputPath, bool Binary,
59658878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar                                   bool RemoveFileOnSignal, StringRef InFile,
59758878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar                                   StringRef Extension, bool UseTemporary,
59812f28ab8a53d7743081d607617309891fa8156f3Daniel Dunbar                                   bool CreateMissingDirectories) {
599176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  std::string OutputPathName, TempPathName;
600176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  std::error_code EC;
60158878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar  std::unique_ptr<raw_pwrite_stream> OS = createOutputFile(
602176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines      OutputPath, EC, Binary, RemoveFileOnSignal, InFile, Extension,
603176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines      UseTemporary, CreateMissingDirectories, &OutputPathName, &TempPathName);
604f482d59386dbc70716f7a5f65adb37ff86b501e6Daniel Dunbar  if (!OS) {
605176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    getDiagnostics().Report(diag::err_fe_unable_to_open_output) << OutputPath
606176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines                                                                << EC.message();
6076bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    return nullptr;
608f482d59386dbc70716f7a5f65adb37ff86b501e6Daniel Dunbar  }
609f482d59386dbc70716f7a5f65adb37ff86b501e6Daniel Dunbar
61058878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar  raw_pwrite_stream *Ret = OS.get();
611f482d59386dbc70716f7a5f65adb37ff86b501e6Daniel Dunbar  // Add the output file -- but don't try to remove "-", since this means we are
612f482d59386dbc70716f7a5f65adb37ff86b501e6Daniel Dunbar  // using stdin.
613dc24572a44575e07a5d8bb6de52641a69f1bab27Argyrios Kyrtzidis  addOutputFile(OutputFile((OutputPathName != "-") ? OutputPathName : "",
61458878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar                           TempPathName, std::move(OS)));
615f482d59386dbc70716f7a5f65adb37ff86b501e6Daniel Dunbar
61658878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar  return Ret;
617f482d59386dbc70716f7a5f65adb37ff86b501e6Daniel Dunbar}
618f482d59386dbc70716f7a5f65adb37ff86b501e6Daniel Dunbar
61958878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainarstd::unique_ptr<llvm::raw_pwrite_stream> CompilerInstance::createOutputFile(
620176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    StringRef OutputPath, std::error_code &Error, bool Binary,
621176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    bool RemoveFileOnSignal, StringRef InFile, StringRef Extension,
622176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    bool UseTemporary, bool CreateMissingDirectories,
623176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    std::string *ResultPathName, std::string *TempPathName) {
62412f28ab8a53d7743081d607617309891fa8156f3Daniel Dunbar  assert((!CreateMissingDirectories || UseTemporary) &&
62512f28ab8a53d7743081d607617309891fa8156f3Daniel Dunbar         "CreateMissingDirectories is only allowed when using temporary files");
62612f28ab8a53d7743081d607617309891fa8156f3Daniel Dunbar
627dc24572a44575e07a5d8bb6de52641a69f1bab27Argyrios Kyrtzidis  std::string OutFile, TempFile;
628f482d59386dbc70716f7a5f65adb37ff86b501e6Daniel Dunbar  if (!OutputPath.empty()) {
629f482d59386dbc70716f7a5f65adb37ff86b501e6Daniel Dunbar    OutFile = OutputPath;
630f482d59386dbc70716f7a5f65adb37ff86b501e6Daniel Dunbar  } else if (InFile == "-") {
631f482d59386dbc70716f7a5f65adb37ff86b501e6Daniel Dunbar    OutFile = "-";
632f482d59386dbc70716f7a5f65adb37ff86b501e6Daniel Dunbar  } else if (!Extension.empty()) {
63348955f8119261c47cac564d1b6976c8f6441800aRafael Espindola    SmallString<128> Path(InFile);
63448955f8119261c47cac564d1b6976c8f6441800aRafael Espindola    llvm::sys::path::replace_extension(Path, Extension);
635f482d59386dbc70716f7a5f65adb37ff86b501e6Daniel Dunbar    OutFile = Path.str();
636f482d59386dbc70716f7a5f65adb37ff86b501e6Daniel Dunbar  } else {
637f482d59386dbc70716f7a5f65adb37ff86b501e6Daniel Dunbar    OutFile = "-";
638f482d59386dbc70716f7a5f65adb37ff86b501e6Daniel Dunbar  }
6397e90985df09855dc309ed888a5b16a0ae684f8e3Argyrios Kyrtzidis
640651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  std::unique_ptr<llvm::raw_fd_ostream> OS;
6417e90985df09855dc309ed888a5b16a0ae684f8e3Argyrios Kyrtzidis  std::string OSFile;
6427e90985df09855dc309ed888a5b16a0ae684f8e3Argyrios Kyrtzidis
643375a4f519eb85d37e702c90498ef9816aeda4c3eRafael Espindola  if (UseTemporary) {
644375a4f519eb85d37e702c90498ef9816aeda4c3eRafael Espindola    if (OutFile == "-")
645375a4f519eb85d37e702c90498ef9816aeda4c3eRafael Espindola      UseTemporary = false;
646375a4f519eb85d37e702c90498ef9816aeda4c3eRafael Espindola    else {
647375a4f519eb85d37e702c90498ef9816aeda4c3eRafael Espindola      llvm::sys::fs::file_status Status;
648375a4f519eb85d37e702c90498ef9816aeda4c3eRafael Espindola      llvm::sys::fs::status(OutputPath, Status);
649375a4f519eb85d37e702c90498ef9816aeda4c3eRafael Espindola      if (llvm::sys::fs::exists(Status)) {
650375a4f519eb85d37e702c90498ef9816aeda4c3eRafael Espindola        // Fail early if we can't write to the final destination.
65187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar        if (!llvm::sys::fs::can_write(OutputPath)) {
65287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar          Error = make_error_code(llvm::errc::operation_not_permitted);
6536bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines          return nullptr;
65487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar        }
655375a4f519eb85d37e702c90498ef9816aeda4c3eRafael Espindola
656375a4f519eb85d37e702c90498ef9816aeda4c3eRafael Espindola        // Don't use a temporary if the output is a special file. This handles
657375a4f519eb85d37e702c90498ef9816aeda4c3eRafael Espindola        // things like '-o /dev/null'
658375a4f519eb85d37e702c90498ef9816aeda4c3eRafael Espindola        if (!llvm::sys::fs::is_regular_file(Status))
659375a4f519eb85d37e702c90498ef9816aeda4c3eRafael Espindola          UseTemporary = false;
660375a4f519eb85d37e702c90498ef9816aeda4c3eRafael Espindola      }
661375a4f519eb85d37e702c90498ef9816aeda4c3eRafael Espindola    }
662375a4f519eb85d37e702c90498ef9816aeda4c3eRafael Espindola  }
663375a4f519eb85d37e702c90498ef9816aeda4c3eRafael Espindola
664375a4f519eb85d37e702c90498ef9816aeda4c3eRafael Espindola  if (UseTemporary) {
665375a4f519eb85d37e702c90498ef9816aeda4c3eRafael Espindola    // Create a temporary file.
666375a4f519eb85d37e702c90498ef9816aeda4c3eRafael Espindola    SmallString<128> TempPath;
667375a4f519eb85d37e702c90498ef9816aeda4c3eRafael Espindola    TempPath = OutFile;
668375a4f519eb85d37e702c90498ef9816aeda4c3eRafael Espindola    TempPath += "-%%%%%%%%";
669375a4f519eb85d37e702c90498ef9816aeda4c3eRafael Espindola    int fd;
670c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines    std::error_code EC =
6713ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar        llvm::sys::fs::createUniqueFile(TempPath, fd, TempPath);
6728ffd0a4eb8875f452e407effe49d86d1620a4499Rafael Espindola
6738ffd0a4eb8875f452e407effe49d86d1620a4499Rafael Espindola    if (CreateMissingDirectories &&
674abab18373808f2a179a97b00d574e306970934d7Rafael Espindola        EC == llvm::errc::no_such_file_or_directory) {
6758ffd0a4eb8875f452e407effe49d86d1620a4499Rafael Espindola      StringRef Parent = llvm::sys::path::parent_path(OutputPath);
6768ffd0a4eb8875f452e407effe49d86d1620a4499Rafael Espindola      EC = llvm::sys::fs::create_directories(Parent);
6778ffd0a4eb8875f452e407effe49d86d1620a4499Rafael Espindola      if (!EC) {
6783ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar        EC = llvm::sys::fs::createUniqueFile(TempPath, fd, TempPath);
6798ffd0a4eb8875f452e407effe49d86d1620a4499Rafael Espindola      }
6808ffd0a4eb8875f452e407effe49d86d1620a4499Rafael Espindola    }
6818ffd0a4eb8875f452e407effe49d86d1620a4499Rafael Espindola
6828ffd0a4eb8875f452e407effe49d86d1620a4499Rafael Espindola    if (!EC) {
683375a4f519eb85d37e702c90498ef9816aeda4c3eRafael Espindola      OS.reset(new llvm::raw_fd_ostream(fd, /*shouldClose=*/true));
684375a4f519eb85d37e702c90498ef9816aeda4c3eRafael Espindola      OSFile = TempFile = TempPath.str();
685dc24572a44575e07a5d8bb6de52641a69f1bab27Argyrios Kyrtzidis    }
686375a4f519eb85d37e702c90498ef9816aeda4c3eRafael Espindola    // If we failed to create the temporary, fallback to writing to the file
687375a4f519eb85d37e702c90498ef9816aeda4c3eRafael Espindola    // directly. This handles the corner case where we cannot write to the
688375a4f519eb85d37e702c90498ef9816aeda4c3eRafael Espindola    // directory, but can write to the file.
689dc24572a44575e07a5d8bb6de52641a69f1bab27Argyrios Kyrtzidis  }
690dc24572a44575e07a5d8bb6de52641a69f1bab27Argyrios Kyrtzidis
6917e90985df09855dc309ed888a5b16a0ae684f8e3Argyrios Kyrtzidis  if (!OS) {
6927e90985df09855dc309ed888a5b16a0ae684f8e3Argyrios Kyrtzidis    OSFile = OutFile;
693d965f95daa97097c8ddc5e1165ceae585a888719Rafael Espindola    OS.reset(new llvm::raw_fd_ostream(
694176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines        OSFile, Error,
695651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines        (Binary ? llvm::sys::fs::F_None : llvm::sys::fs::F_Text)));
696176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    if (Error)
6976bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines      return nullptr;
6987e90985df09855dc309ed888a5b16a0ae684f8e3Argyrios Kyrtzidis  }
699f482d59386dbc70716f7a5f65adb37ff86b501e6Daniel Dunbar
700dc24572a44575e07a5d8bb6de52641a69f1bab27Argyrios Kyrtzidis  // Make sure the out stream file gets removed if we crash.
701ff9cd968cd5b623e3ec7e5f862b598cd22f7ec79Daniel Dunbar  if (RemoveFileOnSignal)
7026f2e23b25d9be365266be43ffa1cf6f850b6027eRafael Espindola    llvm::sys::RemoveFileOnSignal(OSFile);
703dc24572a44575e07a5d8bb6de52641a69f1bab27Argyrios Kyrtzidis
704f482d59386dbc70716f7a5f65adb37ff86b501e6Daniel Dunbar  if (ResultPathName)
705f482d59386dbc70716f7a5f65adb37ff86b501e6Daniel Dunbar    *ResultPathName = OutFile;
706dc24572a44575e07a5d8bb6de52641a69f1bab27Argyrios Kyrtzidis  if (TempPathName)
707dc24572a44575e07a5d8bb6de52641a69f1bab27Argyrios Kyrtzidis    *TempPathName = TempFile;
708f482d59386dbc70716f7a5f65adb37ff86b501e6Daniel Dunbar
70958878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar  if (!Binary || OS->supportsSeeking())
71058878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar    return std::move(OS);
71158878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar
71258878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar  auto B = llvm::make_unique<llvm::buffer_ostream>(*OS);
71358878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar  assert(!NonSeekStream);
71458878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar  NonSeekStream = std::move(OS);
71558878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar  return std::move(B);
716f482d59386dbc70716f7a5f65adb37ff86b501e6Daniel Dunbar}
717ccb6cb6fd9e48697564d536b07397b95dfc28d5bDaniel Dunbar
718ccb6cb6fd9e48697564d536b07397b95dfc28d5bDaniel Dunbar// Initialization Utilities
719ccb6cb6fd9e48697564d536b07397b95dfc28d5bDaniel Dunbar
7208e1fbbc492bc1f4833136d9b55e1aaf478565d32Argyrios Kyrtzidisbool CompilerInstance::InitializeSourceManager(const FrontendInputFile &Input){
7214967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  return InitializeSourceManager(
7224967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      Input, getDiagnostics(), getFileManager(), getSourceManager(),
7234967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      hasPreprocessor() ? &getPreprocessor().getHeaderSearchInfo() : nullptr,
7244967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      getDependencyOutputOpts(), getFrontendOpts());
725ccb6cb6fd9e48697564d536b07397b95dfc28d5bDaniel Dunbar}
726ccb6cb6fd9e48697564d536b07397b95dfc28d5bDaniel Dunbar
7274967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// static
7284967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainarbool CompilerInstance::InitializeSourceManager(
7294967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    const FrontendInputFile &Input, DiagnosticsEngine &Diags,
7304967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    FileManager &FileMgr, SourceManager &SourceMgr, HeaderSearch *HS,
7314967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    DependencyOutputOptions &DepOpts, const FrontendOptions &Opts) {
7328e1fbbc492bc1f4833136d9b55e1aaf478565d32Argyrios Kyrtzidis  SrcMgr::CharacteristicKind
7338616f9af65b9a3662f2c9dfed38eeabc509f8446Argyrios Kyrtzidis    Kind = Input.isSystem() ? SrcMgr::C_System : SrcMgr::C_User;
7348e1fbbc492bc1f4833136d9b55e1aaf478565d32Argyrios Kyrtzidis
735ecd27bf256c92f56c7c7ede6f40ec5d31a40b35eArgyrios Kyrtzidis  if (Input.isBuffer()) {
736176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    SourceMgr.setMainFileID(SourceMgr.createFileID(
737176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines        std::unique_ptr<llvm::MemoryBuffer>(Input.getBuffer()), Kind));
73887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar    assert(SourceMgr.getMainFileID().isValid() &&
739ecd27bf256c92f56c7c7ede6f40ec5d31a40b35eArgyrios Kyrtzidis           "Couldn't establish MainFileID!");
740ecd27bf256c92f56c7c7ede6f40ec5d31a40b35eArgyrios Kyrtzidis    return true;
741ecd27bf256c92f56c7c7ede6f40ec5d31a40b35eArgyrios Kyrtzidis  }
742ecd27bf256c92f56c7c7ede6f40ec5d31a40b35eArgyrios Kyrtzidis
743ecd27bf256c92f56c7c7ede6f40ec5d31a40b35eArgyrios Kyrtzidis  StringRef InputFile = Input.getFile();
744ecd27bf256c92f56c7c7ede6f40ec5d31a40b35eArgyrios Kyrtzidis
745507097ec40105ed927cb5a744fad98f5875aacacArgyrios Kyrtzidis  // Figure out where to get and map in the main file.
746507097ec40105ed927cb5a744fad98f5875aacacArgyrios Kyrtzidis  if (InputFile != "-") {
7474967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    const FileEntry *File;
7484967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    if (Opts.FindPchSource.empty()) {
7494967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      File = FileMgr.getFile(InputFile, /*OpenFile=*/true);
7504967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    } else {
7514967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      // When building a pch file in clang-cl mode, the .h file is built as if
7524967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      // it was included by a cc file.  Since the driver doesn't know about
7534967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      // all include search directories, the frontend must search the input
7544967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      // file through HeaderSearch here, as if it had been included by the
7554967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      // cc file at Opts.FindPchSource.
7564967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      const FileEntry *FindFile = FileMgr.getFile(Opts.FindPchSource);
7574967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      if (!FindFile) {
7584967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar        Diags.Report(diag::err_fe_error_reading) << Opts.FindPchSource;
7594967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar        return false;
7604967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      }
7614967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      const DirectoryLookup *UnusedCurDir;
7624967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      SmallVector<std::pair<const FileEntry *, const DirectoryEntry *>, 16>
7634967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar          Includers;
7644967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      Includers.push_back(std::make_pair(FindFile, FindFile->getDir()));
7654967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      File = HS->LookupFile(InputFile, SourceLocation(), /*isAngled=*/false,
7664967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                            /*FromDir=*/nullptr,
7674967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                            /*CurDir=*/UnusedCurDir, Includers,
7684967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                            /*SearchPath=*/nullptr,
7694967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                            /*RelativePath=*/nullptr,
7704967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                            /*RequestingModule=*/nullptr,
7714967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                            /*SuggestedModule=*/nullptr, /*SkipCache=*/true);
7724967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      // Also add the header to /showIncludes output.
7734967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      if (File)
7744967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar        DepOpts.ShowIncludesPretendHeader = File->getName();
7754967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    }
776694137c54c79a33c9ac6c07e68327750dcd5adf7Dan Gohman    if (!File) {
777ccb6cb6fd9e48697564d536b07397b95dfc28d5bDaniel Dunbar      Diags.Report(diag::err_fe_error_reading) << InputFile;
778ccb6cb6fd9e48697564d536b07397b95dfc28d5bDaniel Dunbar      return false;
779ccb6cb6fd9e48697564d536b07397b95dfc28d5bDaniel Dunbar    }
780ce36ecd5a509af8fc5924d21694df36e8bc94a95Daniel Dunbar
781ce36ecd5a509af8fc5924d21694df36e8bc94a95Daniel Dunbar    // The natural SourceManager infrastructure can't currently handle named
782ce36ecd5a509af8fc5924d21694df36e8bc94a95Daniel Dunbar    // pipes, but we would at least like to accept them for the main
783a3bf897544692cf71e34f090f39b54f9adf5c8ccBenjamin Kramer    // file. Detect them here, read them with the volatile flag so FileMgr will
784a3bf897544692cf71e34f090f39b54f9adf5c8ccBenjamin Kramer    // pick up the correct size, and simply override their contents as we do for
785a3bf897544692cf71e34f090f39b54f9adf5c8ccBenjamin Kramer    // STDIN.
786ce36ecd5a509af8fc5924d21694df36e8bc94a95Daniel Dunbar    if (File->isNamedPipe()) {
787176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines      auto MB = FileMgr.getBufferForFile(File, /*isVolatile=*/true);
788176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines      if (MB) {
789a3bf897544692cf71e34f090f39b54f9adf5c8ccBenjamin Kramer        // Create a new virtual file that will have the correct size.
790176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines        File = FileMgr.getVirtualFile(InputFile, (*MB)->getBufferSize(), 0);
791176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines        SourceMgr.overrideFileContents(File, std::move(*MB));
792a3bf897544692cf71e34f090f39b54f9adf5c8ccBenjamin Kramer      } else {
793176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines        Diags.Report(diag::err_cannot_open_file) << InputFile
794176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines                                                 << MB.getError().message();
795ce36ecd5a509af8fc5924d21694df36e8bc94a95Daniel Dunbar        return false;
796ce36ecd5a509af8fc5924d21694df36e8bc94a95Daniel Dunbar      }
797ce36ecd5a509af8fc5924d21694df36e8bc94a95Daniel Dunbar    }
798acf36129fa7ff2abef80d38ab6901a50b044c7d1Daniel Dunbar
7996bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    SourceMgr.setMainFileID(
8006bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines        SourceMgr.createFileID(File, SourceLocation(), Kind));
801ccb6cb6fd9e48697564d536b07397b95dfc28d5bDaniel Dunbar  } else {
802c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines    llvm::ErrorOr<std::unique_ptr<llvm::MemoryBuffer>> SBOrErr =
803c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines        llvm::MemoryBuffer::getSTDIN();
804c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines    if (std::error_code EC = SBOrErr.getError()) {
805c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines      Diags.Report(diag::err_fe_error_reading_stdin) << EC.message();
806ccb6cb6fd9e48697564d536b07397b95dfc28d5bDaniel Dunbar      return false;
807ccb6cb6fd9e48697564d536b07397b95dfc28d5bDaniel Dunbar    }
808c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines    std::unique_ptr<llvm::MemoryBuffer> SB = std::move(SBOrErr.get());
809c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines
81090d9081cacb4b0163f2c7527f666d6515257067cDan Gohman    const FileEntry *File = FileMgr.getVirtualFile(SB->getBufferIdentifier(),
81139b49bcaaddb1049234fca9500c0ac02c088e23dChris Lattner                                                   SB->getBufferSize(), 0);
8126bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    SourceMgr.setMainFileID(
8136bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines        SourceMgr.createFileID(File, SourceLocation(), Kind));
814176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    SourceMgr.overrideFileContents(File, std::move(SB));
815ccb6cb6fd9e48697564d536b07397b95dfc28d5bDaniel Dunbar  }
816ccb6cb6fd9e48697564d536b07397b95dfc28d5bDaniel Dunbar
81787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  assert(SourceMgr.getMainFileID().isValid() &&
818694137c54c79a33c9ac6c07e68327750dcd5adf7Dan Gohman         "Couldn't establish MainFileID!");
819ccb6cb6fd9e48697564d536b07397b95dfc28d5bDaniel Dunbar  return true;
820ccb6cb6fd9e48697564d536b07397b95dfc28d5bDaniel Dunbar}
8210397af277e3bba16da1fd125ddba07415686b429Daniel Dunbar
8220397af277e3bba16da1fd125ddba07415686b429Daniel Dunbar// High-Level Operations
8230397af277e3bba16da1fd125ddba07415686b429Daniel Dunbar
8240397af277e3bba16da1fd125ddba07415686b429Daniel Dunbarbool CompilerInstance::ExecuteAction(FrontendAction &Act) {
8250397af277e3bba16da1fd125ddba07415686b429Daniel Dunbar  assert(hasDiagnostics() && "Diagnostics engine is not initialized!");
8260397af277e3bba16da1fd125ddba07415686b429Daniel Dunbar  assert(!getFrontendOpts().ShowHelp && "Client must handle '-help'!");
8270397af277e3bba16da1fd125ddba07415686b429Daniel Dunbar  assert(!getFrontendOpts().ShowVersion && "Client must handle '-version'!");
8280397af277e3bba16da1fd125ddba07415686b429Daniel Dunbar
8290397af277e3bba16da1fd125ddba07415686b429Daniel Dunbar  // FIXME: Take this as an argument, once all the APIs we used have moved to
8300397af277e3bba16da1fd125ddba07415686b429Daniel Dunbar  // taking it as an input instead of hard-coding llvm::errs.
8315f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner  raw_ostream &OS = llvm::errs();
8320397af277e3bba16da1fd125ddba07415686b429Daniel Dunbar
8330397af277e3bba16da1fd125ddba07415686b429Daniel Dunbar  // Create the target instance.
834c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  setTarget(TargetInfo::CreateTargetInfo(getDiagnostics(),
835c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines                                         getInvocation().TargetOpts));
8360397af277e3bba16da1fd125ddba07415686b429Daniel Dunbar  if (!hasTarget())
8370397af277e3bba16da1fd125ddba07415686b429Daniel Dunbar    return false;
8380397af277e3bba16da1fd125ddba07415686b429Daniel Dunbar
83987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  // Create TargetInfo for the other side of CUDA compilation.
84087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  if (getLangOpts().CUDA && !getFrontendOpts().AuxTriple.empty()) {
8414967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    auto TO = std::make_shared<TargetOptions>();
84287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar    TO->Triple = getFrontendOpts().AuxTriple;
8434967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    TO->HostTriple = getTarget().getTriple().str();
84487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar    setAuxTarget(TargetInfo::CreateTargetInfo(getDiagnostics(), TO));
84587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  }
84687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar
8470397af277e3bba16da1fd125ddba07415686b429Daniel Dunbar  // Inform the target of the language options.
8480397af277e3bba16da1fd125ddba07415686b429Daniel Dunbar  //
8490397af277e3bba16da1fd125ddba07415686b429Daniel Dunbar  // FIXME: We shouldn't need to do this, the target should be immutable once
8500397af277e3bba16da1fd125ddba07415686b429Daniel Dunbar  // created. This complexity should be lifted elsewhere.
851c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  getTarget().adjust(getLangOpts());
8520397af277e3bba16da1fd125ddba07415686b429Daniel Dunbar
85393a49944e0e68e32bc22d45d44ee136b34beffb3Fariborz Jahanian  // rewriter project will change target built-in bool type from its default.
85493a49944e0e68e32bc22d45d44ee136b34beffb3Fariborz Jahanian  if (getFrontendOpts().ProgramAction == frontend::RewriteObjC)
85593a49944e0e68e32bc22d45d44ee136b34beffb3Fariborz Jahanian    getTarget().noSignedCharForObjCBool();
85693a49944e0e68e32bc22d45d44ee136b34beffb3Fariborz Jahanian
8570397af277e3bba16da1fd125ddba07415686b429Daniel Dunbar  // Validate/process some options.
8580397af277e3bba16da1fd125ddba07415686b429Daniel Dunbar  if (getHeaderSearchOpts().Verbose)
8590397af277e3bba16da1fd125ddba07415686b429Daniel Dunbar    OS << "clang -cc1 version " CLANG_VERSION_STRING
860c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines       << " based upon " << BACKEND_PACKAGE_STRING
8615d8b9548420e67f1bf45b7bbc1cf9fb86e9e4505Sebastian Pop       << " default target " << llvm::sys::getDefaultTargetTriple() << "\n";
8620397af277e3bba16da1fd125ddba07415686b429Daniel Dunbar
8630397af277e3bba16da1fd125ddba07415686b429Daniel Dunbar  if (getFrontendOpts().ShowTimers)
8640397af277e3bba16da1fd125ddba07415686b429Daniel Dunbar    createFrontendTimer();
8650397af277e3bba16da1fd125ddba07415686b429Daniel Dunbar
86695dd5583e3900443a1d7970d557d8c54aa320601Douglas Gregor  if (getFrontendOpts().ShowStats)
86795dd5583e3900443a1d7970d557d8c54aa320601Douglas Gregor    llvm::EnableStatistics();
868a789ca9b967abe47b84df83bcf4afb150856a8d9NAKAMURA Takumi
86987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  for (const FrontendInputFile &FIF : getFrontendOpts().Inputs) {
870176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    // Reset the ID tables if we are reusing the SourceManager and parsing
871176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    // regular files.
872176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    if (hasSourceManager() && !Act.isModelParsingAction())
8732056048f0f619adadc9a5416a2c4cdf95c58eef7Daniel Dunbar      getSourceManager().clearIDTables();
8740397af277e3bba16da1fd125ddba07415686b429Daniel Dunbar
87587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar    if (Act.BeginSourceFile(*this, FIF)) {
8760397af277e3bba16da1fd125ddba07415686b429Daniel Dunbar      Act.Execute();
8770397af277e3bba16da1fd125ddba07415686b429Daniel Dunbar      Act.EndSourceFile();
8780397af277e3bba16da1fd125ddba07415686b429Daniel Dunbar    }
8790397af277e3bba16da1fd125ddba07415686b429Daniel Dunbar  }
8800397af277e3bba16da1fd125ddba07415686b429Daniel Dunbar
88129f2787b6da552018a7716f18f5bd8f67bd6edb5Argyrios Kyrtzidis  // Notify the diagnostic client that all files were processed.
88229f2787b6da552018a7716f18f5bd8f67bd6edb5Argyrios Kyrtzidis  getDiagnostics().getClient()->finish();
88329f2787b6da552018a7716f18f5bd8f67bd6edb5Argyrios Kyrtzidis
88453eee7ba970d21ff15bbd4334164037a3b4cc4b8Chris Lattner  if (getDiagnosticOpts().ShowCarets) {
885f2224d89a6ae65a3839529e26d0f6d025d83d6bbArgyrios Kyrtzidis    // We can have multiple diagnostics sharing one diagnostic client.
886f2224d89a6ae65a3839529e26d0f6d025d83d6bbArgyrios Kyrtzidis    // Get the total number of warnings/errors from the client.
887f2224d89a6ae65a3839529e26d0f6d025d83d6bbArgyrios Kyrtzidis    unsigned NumWarnings = getDiagnostics().getClient()->getNumWarnings();
888f2224d89a6ae65a3839529e26d0f6d025d83d6bbArgyrios Kyrtzidis    unsigned NumErrors = getDiagnostics().getClient()->getNumErrors();
889a789ca9b967abe47b84df83bcf4afb150856a8d9NAKAMURA Takumi
89053eee7ba970d21ff15bbd4334164037a3b4cc4b8Chris Lattner    if (NumWarnings)
89153eee7ba970d21ff15bbd4334164037a3b4cc4b8Chris Lattner      OS << NumWarnings << " warning" << (NumWarnings == 1 ? "" : "s");
89253eee7ba970d21ff15bbd4334164037a3b4cc4b8Chris Lattner    if (NumWarnings && NumErrors)
89353eee7ba970d21ff15bbd4334164037a3b4cc4b8Chris Lattner      OS << " and ";
89453eee7ba970d21ff15bbd4334164037a3b4cc4b8Chris Lattner    if (NumErrors)
89553eee7ba970d21ff15bbd4334164037a3b4cc4b8Chris Lattner      OS << NumErrors << " error" << (NumErrors == 1 ? "" : "s");
89653eee7ba970d21ff15bbd4334164037a3b4cc4b8Chris Lattner    if (NumWarnings || NumErrors)
89753eee7ba970d21ff15bbd4334164037a3b4cc4b8Chris Lattner      OS << " generated.\n";
89853eee7ba970d21ff15bbd4334164037a3b4cc4b8Chris Lattner  }
8990397af277e3bba16da1fd125ddba07415686b429Daniel Dunbar
9002056048f0f619adadc9a5416a2c4cdf95c58eef7Daniel Dunbar  if (getFrontendOpts().ShowStats && hasFileManager()) {
9010397af277e3bba16da1fd125ddba07415686b429Daniel Dunbar    getFileManager().PrintStats();
9020397af277e3bba16da1fd125ddba07415686b429Daniel Dunbar    OS << "\n";
9030397af277e3bba16da1fd125ddba07415686b429Daniel Dunbar  }
9040397af277e3bba16da1fd125ddba07415686b429Daniel Dunbar
905ab41b97c3cddf1bcdd8bf82ab09ed3ceafcd05b1Argyrios Kyrtzidis  return !getDiagnostics().getClient()->getNumErrors();
9060397af277e3bba16da1fd125ddba07415686b429Daniel Dunbar}
9070397af277e3bba16da1fd125ddba07415686b429Daniel Dunbar
90821cae2059a06f7d89eee169409c9266def1b1acaDouglas Gregor/// \brief Determine the appropriate source input kind based on language
90921cae2059a06f7d89eee169409c9266def1b1acaDouglas Gregor/// options.
91021cae2059a06f7d89eee169409c9266def1b1acaDouglas Gregorstatic InputKind getSourceInputKindFromOptions(const LangOptions &LangOpts) {
91121cae2059a06f7d89eee169409c9266def1b1acaDouglas Gregor  if (LangOpts.OpenCL)
91221cae2059a06f7d89eee169409c9266def1b1acaDouglas Gregor    return IK_OpenCL;
91321cae2059a06f7d89eee169409c9266def1b1acaDouglas Gregor  if (LangOpts.CUDA)
91421cae2059a06f7d89eee169409c9266def1b1acaDouglas Gregor    return IK_CUDA;
91521cae2059a06f7d89eee169409c9266def1b1acaDouglas Gregor  if (LangOpts.ObjC1)
91621cae2059a06f7d89eee169409c9266def1b1acaDouglas Gregor    return LangOpts.CPlusPlus? IK_ObjCXX : IK_ObjC;
91721cae2059a06f7d89eee169409c9266def1b1acaDouglas Gregor  return LangOpts.CPlusPlus? IK_CXX : IK_C;
91821cae2059a06f7d89eee169409c9266def1b1acaDouglas Gregor}
91921cae2059a06f7d89eee169409c9266def1b1acaDouglas Gregor
920f9e357d8a66c606a86a6e1aef678898b8843bd30Douglas Gregor/// \brief Compile a module file for the given module, using the options
921176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines/// provided by the importing compiler instance. Returns true if the module
922176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines/// was built without errors.
923176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hinesstatic bool compileModuleImpl(CompilerInstance &ImportingInstance,
924176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines                              SourceLocation ImportLoc,
925176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines                              Module *Module,
926176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines                              StringRef ModuleFileName) {
927f9e357d8a66c606a86a6e1aef678898b8843bd30Douglas Gregor  ModuleMap &ModMap
928f9e357d8a66c606a86a6e1aef678898b8843bd30Douglas Gregor    = ImportingInstance.getPreprocessor().getHeaderSearchInfo().getModuleMap();
929f9e357d8a66c606a86a6e1aef678898b8843bd30Douglas Gregor
93021cae2059a06f7d89eee169409c9266def1b1acaDouglas Gregor  // Construct a compiler invocation for creating this module.
931c93dc7889644293e318e19d82830ea2acc45b678Dylan Noblesmith  IntrusiveRefCntPtr<CompilerInvocation> Invocation
93221cae2059a06f7d89eee169409c9266def1b1acaDouglas Gregor    (new CompilerInvocation(ImportingInstance.getInvocation()));
933a789ca9b967abe47b84df83bcf4afb150856a8d9NAKAMURA Takumi
93418ee547b6926cacefa15eed8ca60ff73d22e279bDouglas Gregor  PreprocessorOptions &PPOpts = Invocation->getPreprocessorOpts();
93518ee547b6926cacefa15eed8ca60ff73d22e279bDouglas Gregor
936b2d39c217b2cfe87cbe69f25df83869940d8adcdDouglas Gregor  // For any options that aren't intended to affect how a module is built,
937b2d39c217b2cfe87cbe69f25df83869940d8adcdDouglas Gregor  // reset them to their default values.
938d3b74d9ca4f239a7a90ad193378c494306c57352Ted Kremenek  Invocation->getLangOpts()->resetNonModularOptions();
93918ee547b6926cacefa15eed8ca60ff73d22e279bDouglas Gregor  PPOpts.resetNonModularOptions();
940a789ca9b967abe47b84df83bcf4afb150856a8d9NAKAMURA Takumi
9412a06085281d1b6aee628f85e8676eec04542cbc9Douglas Gregor  // Remove any macro definitions that are explicitly ignored by the module.
9422a06085281d1b6aee628f85e8676eec04542cbc9Douglas Gregor  // They aren't supposed to affect how the module is built anyway.
9432a06085281d1b6aee628f85e8676eec04542cbc9Douglas Gregor  const HeaderSearchOptions &HSOpts = Invocation->getHeaderSearchOpts();
944651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  PPOpts.Macros.erase(
945651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      std::remove_if(PPOpts.Macros.begin(), PPOpts.Macros.end(),
946651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines                     [&HSOpts](const std::pair<std::string, bool> &def) {
947651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines        StringRef MacroDef = def.first;
948651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines        return HSOpts.ModulesIgnoreMacros.count(MacroDef.split('=').first) > 0;
949651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      }),
950651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      PPOpts.Macros.end());
9512a06085281d1b6aee628f85e8676eec04542cbc9Douglas Gregor
952b86b8dc7ef89405205f94635c1073cdb1a7093ebDouglas Gregor  // Note the name of the module we're building.
953933e7a61da12400d8971890719cb03d68c1b02ebDouglas Gregor  Invocation->getLangOpts()->CurrentModule = Module->getTopLevelModuleName();
954b86b8dc7ef89405205f94635c1073cdb1a7093ebDouglas Gregor
955463d90986ec54c62bf8fe31193ef5db701db48a5Douglas Gregor  // Make sure that the failed-module structure has been allocated in
956463d90986ec54c62bf8fe31193ef5db701db48a5Douglas Gregor  // the importing instance, and propagate the pointer to the newly-created
957463d90986ec54c62bf8fe31193ef5db701db48a5Douglas Gregor  // instance.
958463d90986ec54c62bf8fe31193ef5db701db48a5Douglas Gregor  PreprocessorOptions &ImportingPPOpts
959463d90986ec54c62bf8fe31193ef5db701db48a5Douglas Gregor    = ImportingInstance.getInvocation().getPreprocessorOpts();
960463d90986ec54c62bf8fe31193ef5db701db48a5Douglas Gregor  if (!ImportingPPOpts.FailedModules)
961463d90986ec54c62bf8fe31193ef5db701db48a5Douglas Gregor    ImportingPPOpts.FailedModules = new PreprocessorOptions::FailedModulesSet;
962463d90986ec54c62bf8fe31193ef5db701db48a5Douglas Gregor  PPOpts.FailedModules = ImportingPPOpts.FailedModules;
963463d90986ec54c62bf8fe31193ef5db701db48a5Douglas Gregor
96418ee547b6926cacefa15eed8ca60ff73d22e279bDouglas Gregor  // If there is a module map file, build the module using the module map.
965b2d39c217b2cfe87cbe69f25df83869940d8adcdDouglas Gregor  // Set up the inputs/outputs so that we build the module from its umbrella
966b2d39c217b2cfe87cbe69f25df83869940d8adcdDouglas Gregor  // header.
96721cae2059a06f7d89eee169409c9266def1b1acaDouglas Gregor  FrontendOptions &FrontendOpts = Invocation->getFrontendOpts();
9686e975c4517958bcc11c834336d340797356058dbDouglas Gregor  FrontendOpts.OutputFile = ModuleFileName.str();
96921cae2059a06f7d89eee169409c9266def1b1acaDouglas Gregor  FrontendOpts.DisableFree = false;
970f575d6e7c3b887ea4c5394d2c7e322c7a929a57eDouglas Gregor  FrontendOpts.GenerateGlobalModuleIndex = false;
97187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  FrontendOpts.BuildingImplicitModule = true;
97221cae2059a06f7d89eee169409c9266def1b1acaDouglas Gregor  FrontendOpts.Inputs.clear();
97318ee547b6926cacefa15eed8ca60ff73d22e279bDouglas Gregor  InputKind IK = getSourceInputKindFromOptions(*Invocation->getLangOpts());
974a789ca9b967abe47b84df83bcf4afb150856a8d9NAKAMURA Takumi
97518ee547b6926cacefa15eed8ca60ff73d22e279bDouglas Gregor  // Don't free the remapped file buffers; they are owned by our caller.
97618ee547b6926cacefa15eed8ca60ff73d22e279bDouglas Gregor  PPOpts.RetainRemappedFileBuffers = true;
97718ee547b6926cacefa15eed8ca60ff73d22e279bDouglas Gregor
97818ee547b6926cacefa15eed8ca60ff73d22e279bDouglas Gregor  Invocation->getDiagnosticOpts().VerifyDiagnostics = 0;
97976d991ec6c5cd247ee18fe65c35d43c2d47cf094Douglas Gregor  assert(ImportingInstance.getInvocation().getModuleHash() ==
98018ee547b6926cacefa15eed8ca60ff73d22e279bDouglas Gregor         Invocation->getModuleHash() && "Module hash mismatch!");
98118ee547b6926cacefa15eed8ca60ff73d22e279bDouglas Gregor
98221cae2059a06f7d89eee169409c9266def1b1acaDouglas Gregor  // Construct a compiler instance that will be used to actually create the
98321cae2059a06f7d89eee169409c9266def1b1acaDouglas Gregor  // module.
98487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  CompilerInstance Instance(ImportingInstance.getPCHContainerOperations(),
98587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar                            /*BuildingModule=*/true);
98621cae2059a06f7d89eee169409c9266def1b1acaDouglas Gregor  Instance.setInvocation(&*Invocation);
987a4a90cabfa15c900016a7cfaea51a6d4e8ebf4dbDouglas Gregor
988a4a90cabfa15c900016a7cfaea51a6d4e8ebf4dbDouglas Gregor  Instance.createDiagnostics(new ForwardingDiagnosticConsumer(
989a4a90cabfa15c900016a7cfaea51a6d4e8ebf4dbDouglas Gregor                                   ImportingInstance.getDiagnosticClient()),
990cc2b653c319599f502425d2c3de29865d47bb9e4Douglas Gregor                             /*ShouldOwnClient=*/true);
991830ea5b7c75413526c19531f0180fa6e45b98919Douglas Gregor
992651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  Instance.setVirtualFileSystem(&ImportingInstance.getVirtualFileSystem());
993651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
9944565e487531c7bf6d348dbe9f5529784966fc7aeDouglas Gregor  // Note that this module is part of the module build stack, so that we
995830ea5b7c75413526c19531f0180fa6e45b98919Douglas Gregor  // can detect cycles in the module graph.
996651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  Instance.setFileManager(&ImportingInstance.getFileManager());
997830ea5b7c75413526c19531f0180fa6e45b98919Douglas Gregor  Instance.createSourceManager(Instance.getFileManager());
998830ea5b7c75413526c19531f0180fa6e45b98919Douglas Gregor  SourceManager &SourceMgr = Instance.getSourceManager();
9994565e487531c7bf6d348dbe9f5529784966fc7aeDouglas Gregor  SourceMgr.setModuleBuildStack(
10004565e487531c7bf6d348dbe9f5529784966fc7aeDouglas Gregor    ImportingInstance.getSourceManager().getModuleBuildStack());
10014565e487531c7bf6d348dbe9f5529784966fc7aeDouglas Gregor  SourceMgr.pushModuleBuildStack(Module->getTopLevelModuleName(),
1002830ea5b7c75413526c19531f0180fa6e45b98919Douglas Gregor    FullSourceLoc(ImportLoc, ImportingInstance.getSourceManager()));
1003830ea5b7c75413526c19531f0180fa6e45b98919Douglas Gregor
1004c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  // If we're collecting module dependencies, we need to share a collector
100587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  // between all of the module CompilerInstances. Other than that, we don't
100687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  // want to produce any dependency output from the module build.
1007c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  Instance.setModuleDepCollector(ImportingInstance.getModuleDepCollector());
100887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  Invocation->getDependencyOutputOpts() = DependencyOutputOptions();
1009c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines
1010ee0cd37fe4a9f4e2ee73ae34cf93c410cb299a82Manuel Klimek  // Get or create the module map that we'll use to build this module.
1011ee0cd37fe4a9f4e2ee73ae34cf93c410cb299a82Manuel Klimek  std::string InferredModuleMapContent;
1012ee0cd37fe4a9f4e2ee73ae34cf93c410cb299a82Manuel Klimek  if (const FileEntry *ModuleMapFile =
1013ee0cd37fe4a9f4e2ee73ae34cf93c410cb299a82Manuel Klimek          ModMap.getContainingModuleMapFile(Module)) {
1014ee0cd37fe4a9f4e2ee73ae34cf93c410cb299a82Manuel Klimek    // Use the module map where this module resides.
1015b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar    FrontendOpts.Inputs.emplace_back(ModuleMapFile->getName(), IK);
1016ee0cd37fe4a9f4e2ee73ae34cf93c410cb299a82Manuel Klimek  } else {
1017b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar    SmallString<128> FakeModuleMapFile(Module->Directory->getName());
1018b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar    llvm::sys::path::append(FakeModuleMapFile, "__inferred_module.map");
1019b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar    FrontendOpts.Inputs.emplace_back(FakeModuleMapFile, IK);
1020b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar
1021ee0cd37fe4a9f4e2ee73ae34cf93c410cb299a82Manuel Klimek    llvm::raw_string_ostream OS(InferredModuleMapContent);
1022ee0cd37fe4a9f4e2ee73ae34cf93c410cb299a82Manuel Klimek    Module->print(OS);
1023ee0cd37fe4a9f4e2ee73ae34cf93c410cb299a82Manuel Klimek    OS.flush();
1024ee0cd37fe4a9f4e2ee73ae34cf93c410cb299a82Manuel Klimek
1025176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    std::unique_ptr<llvm::MemoryBuffer> ModuleMapBuffer =
1026ee0cd37fe4a9f4e2ee73ae34cf93c410cb299a82Manuel Klimek        llvm::MemoryBuffer::getMemBuffer(InferredModuleMapContent);
1027ee0cd37fe4a9f4e2ee73ae34cf93c410cb299a82Manuel Klimek    ModuleMapFile = Instance.getFileManager().getVirtualFile(
1028b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar        FakeModuleMapFile, InferredModuleMapContent.size(), 0);
1029176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    SourceMgr.overrideFileContents(ModuleMapFile, std::move(ModuleMapBuffer));
1030ee0cd37fe4a9f4e2ee73ae34cf93c410cb299a82Manuel Klimek  }
1031830ea5b7c75413526c19531f0180fa6e45b98919Douglas Gregor
1032176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  // Construct a module-generating action. Passing through the module map is
10336bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  // safe because the FileManager is shared between the compiler instances.
1034176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  GenerateModuleAction CreateModuleAction(
1035176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines      ModMap.getModuleMapFileForUniquing(Module), Module->IsSystem);
1036176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines
1037176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  ImportingInstance.getDiagnostics().Report(ImportLoc,
1038176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines                                            diag::remark_module_build)
1039176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    << Module->Name << ModuleFileName;
1040176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines
10410ced799878d1beb8f0fa1cc31fa6d2e4229c217cDouglas Gregor  // Execute the action to actually build the module in-place. Use a separate
10420ced799878d1beb8f0fa1cc31fa6d2e4229c217cDouglas Gregor  // thread so that we get a stack large enough.
10430ced799878d1beb8f0fa1cc31fa6d2e4229c217cDouglas Gregor  const unsigned ThreadStackSize = 8 << 20;
10440ced799878d1beb8f0fa1cc31fa6d2e4229c217cDouglas Gregor  llvm::CrashRecoveryContext CRC;
1045651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  CRC.RunSafelyOnThread([&]() { Instance.ExecuteAction(CreateModuleAction); },
1046651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines                        ThreadStackSize);
1047a4a90cabfa15c900016a7cfaea51a6d4e8ebf4dbDouglas Gregor
1048176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  ImportingInstance.getDiagnostics().Report(ImportLoc,
1049176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines                                            diag::remark_module_build_done)
1050176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    << Module->Name;
1051176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines
105218ee547b6926cacefa15eed8ca60ff73d22e279bDouglas Gregor  // Delete the temporary module map file.
105318ee547b6926cacefa15eed8ca60ff73d22e279bDouglas Gregor  // FIXME: Even though we're executing under crash protection, it would still
105418ee547b6926cacefa15eed8ca60ff73d22e279bDouglas Gregor  // be nice to do this with RemoveFileOnSignal when we can. However, that
105518ee547b6926cacefa15eed8ca60ff73d22e279bDouglas Gregor  // doesn't make sense for all clients, so clean this up manually.
1056a2e94892e273423e2f772f989921cda6442a66c4Benjamin Kramer  Instance.clearOutputFiles(/*EraseFiles=*/true);
1057a6b00fc97669aa25d89ae9f202b05dfadfd0e324Douglas Gregor
1058a6b00fc97669aa25d89ae9f202b05dfadfd0e324Douglas Gregor  // We've rebuilt a module. If we're allowed to generate or update the global
1059a6b00fc97669aa25d89ae9f202b05dfadfd0e324Douglas Gregor  // module index, record that fact in the importing compiler instance.
1060f575d6e7c3b887ea4c5394d2c7e322c7a929a57eDouglas Gregor  if (ImportingInstance.getFrontendOpts().GenerateGlobalModuleIndex) {
1061a6b00fc97669aa25d89ae9f202b05dfadfd0e324Douglas Gregor    ImportingInstance.setBuildGlobalModuleIndex(true);
1062a6b00fc97669aa25d89ae9f202b05dfadfd0e324Douglas Gregor  }
1063176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines
1064176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  return !Instance.getDiagnostics().hasErrorOccurred();
1065a789ca9b967abe47b84df83bcf4afb150856a8d9NAKAMURA Takumi}
106621cae2059a06f7d89eee169409c9266def1b1acaDouglas Gregor
1067c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hinesstatic bool compileAndLoadModule(CompilerInstance &ImportingInstance,
1068c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines                                 SourceLocation ImportLoc,
1069176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines                                 SourceLocation ModuleNameLoc, Module *Module,
1070c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines                                 StringRef ModuleFileName) {
1071176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  DiagnosticsEngine &Diags = ImportingInstance.getDiagnostics();
1072176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines
1073176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  auto diagnoseBuildFailure = [&] {
1074176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    Diags.Report(ModuleNameLoc, diag::err_module_not_built)
1075176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines        << Module->Name << SourceRange(ImportLoc, ModuleNameLoc);
1076176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  };
1077176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines
10786bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  // FIXME: have LockFileManager return an error_code so that we can
10796bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  // avoid the mkdir when the directory already exists.
10806bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  StringRef Dir = llvm::sys::path::parent_path(ModuleFileName);
10816bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  llvm::sys::fs::create_directories(Dir);
10826bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines
10836bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  while (1) {
1084c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines    unsigned ModuleLoadCapabilities = ASTReader::ARR_Missing;
10856bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    llvm::LockFileManager Locked(ModuleFileName);
10866bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    switch (Locked) {
10876bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    case llvm::LockFileManager::LFS_Error:
1088176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines      Diags.Report(ModuleNameLoc, diag::err_module_lock_failure)
10894967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar          << Module->Name << Locked.getErrorMessage();
1090c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines      return false;
10916bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines
10926bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    case llvm::LockFileManager::LFS_Owned:
1093c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines      // We're responsible for building the module ourselves.
1094176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines      if (!compileModuleImpl(ImportingInstance, ModuleNameLoc, Module,
1095176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines                             ModuleFileName)) {
1096176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines        diagnoseBuildFailure();
1097176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines        return false;
1098176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines      }
10996bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines      break;
11006bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines
11016bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    case llvm::LockFileManager::LFS_Shared:
11026bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines      // Someone else is responsible for building the module. Wait for them to
11036bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines      // finish.
11040e2c34f92f00628d48968dfea096d36381f494cbStephen Hines      switch (Locked.waitForUnlock()) {
11050e2c34f92f00628d48968dfea096d36381f494cbStephen Hines      case llvm::LockFileManager::Res_Success:
11060e2c34f92f00628d48968dfea096d36381f494cbStephen Hines        ModuleLoadCapabilities |= ASTReader::ARR_OutOfDate;
11070e2c34f92f00628d48968dfea096d36381f494cbStephen Hines        break;
11080e2c34f92f00628d48968dfea096d36381f494cbStephen Hines      case llvm::LockFileManager::Res_OwnerDied:
11096bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines        continue; // try again to get the lock.
11100e2c34f92f00628d48968dfea096d36381f494cbStephen Hines      case llvm::LockFileManager::Res_Timeout:
11110e2c34f92f00628d48968dfea096d36381f494cbStephen Hines        Diags.Report(ModuleNameLoc, diag::err_module_lock_timeout)
11120e2c34f92f00628d48968dfea096d36381f494cbStephen Hines            << Module->Name;
11130e2c34f92f00628d48968dfea096d36381f494cbStephen Hines        // Clear the lock file so that future invokations can make progress.
11140e2c34f92f00628d48968dfea096d36381f494cbStephen Hines        Locked.unsafeRemoveLockFile();
11150e2c34f92f00628d48968dfea096d36381f494cbStephen Hines        return false;
11160e2c34f92f00628d48968dfea096d36381f494cbStephen Hines      }
1117c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines      break;
11186bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    }
11196bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines
1120c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines    // Try to read the module file, now that we've compiled it.
1121c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines    ASTReader::ASTReadResult ReadResult =
1122c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines        ImportingInstance.getModuleManager()->ReadAST(
1123176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines            ModuleFileName, serialization::MK_ImplicitModule, ImportLoc,
1124c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines            ModuleLoadCapabilities);
1125c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines
1126c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines    if (ReadResult == ASTReader::OutOfDate &&
1127c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines        Locked == llvm::LockFileManager::LFS_Shared) {
1128c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines      // The module may be out of date in the presence of file system races,
1129c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines      // or if one of its imports depends on header search paths that are not
1130c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines      // consistent with this ImportingInstance.  Try again...
1131c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines      continue;
1132c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines    } else if (ReadResult == ASTReader::Missing) {
1133176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines      diagnoseBuildFailure();
1134176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    } else if (ReadResult != ASTReader::Success &&
1135176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines               !Diags.hasErrorOccurred()) {
1136176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines      // The ASTReader didn't diagnose the error, so conservatively report it.
1137176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines      diagnoseBuildFailure();
1138c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines    }
1139c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines    return ReadResult == ASTReader::Success;
11406bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  }
11416bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines}
11426bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines
114363a726870b486e0470c3a4b11cf62bab8be00b73Douglas Gregor/// \brief Diagnose differences between the current definition of the given
114463a726870b486e0470c3a4b11cf62bab8be00b73Douglas Gregor/// configuration macro and the definition provided on the command line.
114563a726870b486e0470c3a4b11cf62bab8be00b73Douglas Gregorstatic void checkConfigMacro(Preprocessor &PP, StringRef ConfigMacro,
114663a726870b486e0470c3a4b11cf62bab8be00b73Douglas Gregor                             Module *Mod, SourceLocation ImportLoc) {
114763a726870b486e0470c3a4b11cf62bab8be00b73Douglas Gregor  IdentifierInfo *Id = PP.getIdentifierInfo(ConfigMacro);
114863a726870b486e0470c3a4b11cf62bab8be00b73Douglas Gregor  SourceManager &SourceMgr = PP.getSourceManager();
114963a726870b486e0470c3a4b11cf62bab8be00b73Douglas Gregor
115063a726870b486e0470c3a4b11cf62bab8be00b73Douglas Gregor  // If this identifier has never had a macro definition, then it could
115163a726870b486e0470c3a4b11cf62bab8be00b73Douglas Gregor  // not have changed.
115263a726870b486e0470c3a4b11cf62bab8be00b73Douglas Gregor  if (!Id->hadMacroDefinition())
115363a726870b486e0470c3a4b11cf62bab8be00b73Douglas Gregor    return;
1154b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar  auto *LatestLocalMD = PP.getLocalMacroDirectiveHistory(Id);
115563a726870b486e0470c3a4b11cf62bab8be00b73Douglas Gregor
1156b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar  // Find the macro definition from the command line.
1157b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar  MacroInfo *CmdLineDefinition = nullptr;
1158b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar  for (auto *MD = LatestLocalMD; MD; MD = MD->getPrevious()) {
115963a726870b486e0470c3a4b11cf62bab8be00b73Douglas Gregor    // We only care about the predefines buffer.
1160b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar    FileID FID = SourceMgr.getFileID(MD->getLocation());
1161b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar    if (FID.isInvalid() || FID != PP.getPredefinesFileID())
116263a726870b486e0470c3a4b11cf62bab8be00b73Douglas Gregor      continue;
1163b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar    if (auto *DMD = dyn_cast<DefMacroDirective>(MD))
1164b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar      CmdLineDefinition = DMD->getMacroInfo();
116563a726870b486e0470c3a4b11cf62bab8be00b73Douglas Gregor    break;
116663a726870b486e0470c3a4b11cf62bab8be00b73Douglas Gregor  }
116763a726870b486e0470c3a4b11cf62bab8be00b73Douglas Gregor
1168b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar  auto *CurrentDefinition = PP.getMacroInfo(Id);
1169b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar  if (CurrentDefinition == CmdLineDefinition) {
1170b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar    // Macro matches. Nothing to do.
1171b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar  } else if (!CurrentDefinition) {
1172b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar    // This macro was defined on the command line, then #undef'd later.
1173b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar    // Complain.
1174b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar    PP.Diag(ImportLoc, diag::warn_module_config_macro_undef)
1175b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar      << true << ConfigMacro << Mod->getFullModuleName();
1176b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar    auto LatestDef = LatestLocalMD->getDefinition();
1177b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar    assert(LatestDef.isUndefined() &&
1178b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar           "predefined macro went away with no #undef?");
1179b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar    PP.Diag(LatestDef.getUndefLocation(), diag::note_module_def_undef_here)
1180b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar      << true;
1181b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar    return;
1182b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar  } else if (!CmdLineDefinition) {
1183b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar    // There was no definition for this macro in the predefines buffer,
1184b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar    // but there was a local definition. Complain.
118563a726870b486e0470c3a4b11cf62bab8be00b73Douglas Gregor    PP.Diag(ImportLoc, diag::warn_module_config_macro_undef)
118663a726870b486e0470c3a4b11cf62bab8be00b73Douglas Gregor      << false << ConfigMacro << Mod->getFullModuleName();
1187b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar    PP.Diag(CurrentDefinition->getDefinitionLoc(),
1188b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar            diag::note_module_def_undef_here)
1189b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar      << false;
1190b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar  } else if (!CurrentDefinition->isIdenticalTo(*CmdLineDefinition, PP,
1191b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar                                               /*Syntactically=*/true)) {
1192b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar    // The macro definitions differ.
1193b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar    PP.Diag(ImportLoc, diag::warn_module_config_macro_undef)
1194b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar      << false << ConfigMacro << Mod->getFullModuleName();
1195b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar    PP.Diag(CurrentDefinition->getDefinitionLoc(),
1196b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar            diag::note_module_def_undef_here)
119763a726870b486e0470c3a4b11cf62bab8be00b73Douglas Gregor      << false;
119863a726870b486e0470c3a4b11cf62bab8be00b73Douglas Gregor  }
119963a726870b486e0470c3a4b11cf62bab8be00b73Douglas Gregor}
120063a726870b486e0470c3a4b11cf62bab8be00b73Douglas Gregor
1201d44d2872b2ebe58237de4dbc350b82cab944ccc5Douglas Gregor/// \brief Write a new timestamp file with the given path.
1202d44d2872b2ebe58237de4dbc350b82cab944ccc5Douglas Gregorstatic void writeTimestampFile(StringRef TimestampFile) {
1203176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  std::error_code EC;
1204176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  llvm::raw_fd_ostream Out(TimestampFile.str(), EC, llvm::sys::fs::F_None);
1205d44d2872b2ebe58237de4dbc350b82cab944ccc5Douglas Gregor}
1206d44d2872b2ebe58237de4dbc350b82cab944ccc5Douglas Gregor
1207d44d2872b2ebe58237de4dbc350b82cab944ccc5Douglas Gregor/// \brief Prune the module cache of modules that haven't been accessed in
1208d44d2872b2ebe58237de4dbc350b82cab944ccc5Douglas Gregor/// a long time.
1209d44d2872b2ebe58237de4dbc350b82cab944ccc5Douglas Gregorstatic void pruneModuleCache(const HeaderSearchOptions &HSOpts) {
1210d44d2872b2ebe58237de4dbc350b82cab944ccc5Douglas Gregor  struct stat StatBuf;
1211d44d2872b2ebe58237de4dbc350b82cab944ccc5Douglas Gregor  llvm::SmallString<128> TimestampFile;
1212d44d2872b2ebe58237de4dbc350b82cab944ccc5Douglas Gregor  TimestampFile = HSOpts.ModuleCachePath;
121387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  assert(!TimestampFile.empty());
1214d44d2872b2ebe58237de4dbc350b82cab944ccc5Douglas Gregor  llvm::sys::path::append(TimestampFile, "modules.timestamp");
1215d44d2872b2ebe58237de4dbc350b82cab944ccc5Douglas Gregor
1216d44d2872b2ebe58237de4dbc350b82cab944ccc5Douglas Gregor  // Try to stat() the timestamp file.
1217d44d2872b2ebe58237de4dbc350b82cab944ccc5Douglas Gregor  if (::stat(TimestampFile.c_str(), &StatBuf)) {
1218d44d2872b2ebe58237de4dbc350b82cab944ccc5Douglas Gregor    // If the timestamp file wasn't there, create one now.
1219d44d2872b2ebe58237de4dbc350b82cab944ccc5Douglas Gregor    if (errno == ENOENT) {
1220d44d2872b2ebe58237de4dbc350b82cab944ccc5Douglas Gregor      writeTimestampFile(TimestampFile);
1221d44d2872b2ebe58237de4dbc350b82cab944ccc5Douglas Gregor    }
1222d44d2872b2ebe58237de4dbc350b82cab944ccc5Douglas Gregor    return;
1223d44d2872b2ebe58237de4dbc350b82cab944ccc5Douglas Gregor  }
1224d44d2872b2ebe58237de4dbc350b82cab944ccc5Douglas Gregor
1225d44d2872b2ebe58237de4dbc350b82cab944ccc5Douglas Gregor  // Check whether the time stamp is older than our pruning interval.
1226d44d2872b2ebe58237de4dbc350b82cab944ccc5Douglas Gregor  // If not, do nothing.
1227d44d2872b2ebe58237de4dbc350b82cab944ccc5Douglas Gregor  time_t TimeStampModTime = StatBuf.st_mtime;
12286bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  time_t CurrentTime = time(nullptr);
122993ce7d59f0ce9d85301cbad96a71694e4f345fcdBenjamin Kramer  if (CurrentTime - TimeStampModTime <= time_t(HSOpts.ModuleCachePruneInterval))
1230d44d2872b2ebe58237de4dbc350b82cab944ccc5Douglas Gregor    return;
1231d44d2872b2ebe58237de4dbc350b82cab944ccc5Douglas Gregor
1232d44d2872b2ebe58237de4dbc350b82cab944ccc5Douglas Gregor  // Write a new timestamp file so that nobody else attempts to prune.
1233d44d2872b2ebe58237de4dbc350b82cab944ccc5Douglas Gregor  // There is a benign race condition here, if two Clang instances happen to
1234d44d2872b2ebe58237de4dbc350b82cab944ccc5Douglas Gregor  // notice at the same time that the timestamp is out-of-date.
1235d44d2872b2ebe58237de4dbc350b82cab944ccc5Douglas Gregor  writeTimestampFile(TimestampFile);
1236d44d2872b2ebe58237de4dbc350b82cab944ccc5Douglas Gregor
1237d44d2872b2ebe58237de4dbc350b82cab944ccc5Douglas Gregor  // Walk the entire module cache, looking for unused module files and module
1238d44d2872b2ebe58237de4dbc350b82cab944ccc5Douglas Gregor  // indices.
1239c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  std::error_code EC;
1240d44d2872b2ebe58237de4dbc350b82cab944ccc5Douglas Gregor  SmallString<128> ModuleCachePathNative;
1241d44d2872b2ebe58237de4dbc350b82cab944ccc5Douglas Gregor  llvm::sys::path::native(HSOpts.ModuleCachePath, ModuleCachePathNative);
12423ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar  for (llvm::sys::fs::directory_iterator Dir(ModuleCachePathNative, EC), DirEnd;
1243d44d2872b2ebe58237de4dbc350b82cab944ccc5Douglas Gregor       Dir != DirEnd && !EC; Dir.increment(EC)) {
1244d44d2872b2ebe58237de4dbc350b82cab944ccc5Douglas Gregor    // If we don't have a directory, there's nothing to look into.
1245b470d1a54877e7b3622e4cbdeae423c6d51be696Rafael Espindola    if (!llvm::sys::fs::is_directory(Dir->path()))
1246d44d2872b2ebe58237de4dbc350b82cab944ccc5Douglas Gregor      continue;
1247d44d2872b2ebe58237de4dbc350b82cab944ccc5Douglas Gregor
1248d44d2872b2ebe58237de4dbc350b82cab944ccc5Douglas Gregor    // Walk all of the files within this directory.
1249d44d2872b2ebe58237de4dbc350b82cab944ccc5Douglas Gregor    for (llvm::sys::fs::directory_iterator File(Dir->path(), EC), FileEnd;
1250d44d2872b2ebe58237de4dbc350b82cab944ccc5Douglas Gregor         File != FileEnd && !EC; File.increment(EC)) {
1251d44d2872b2ebe58237de4dbc350b82cab944ccc5Douglas Gregor      // We only care about module and global module index files.
1252651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      StringRef Extension = llvm::sys::path::extension(File->path());
1253651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      if (Extension != ".pcm" && Extension != ".timestamp" &&
1254651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines          llvm::sys::path::filename(File->path()) != "modules.idx")
1255d44d2872b2ebe58237de4dbc350b82cab944ccc5Douglas Gregor        continue;
1256d44d2872b2ebe58237de4dbc350b82cab944ccc5Douglas Gregor
1257d44d2872b2ebe58237de4dbc350b82cab944ccc5Douglas Gregor      // Look at this file. If we can't stat it, there's nothing interesting
1258d44d2872b2ebe58237de4dbc350b82cab944ccc5Douglas Gregor      // there.
1259651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      if (::stat(File->path().c_str(), &StatBuf))
1260d44d2872b2ebe58237de4dbc350b82cab944ccc5Douglas Gregor        continue;
1261d44d2872b2ebe58237de4dbc350b82cab944ccc5Douglas Gregor
1262d44d2872b2ebe58237de4dbc350b82cab944ccc5Douglas Gregor      // If the file has been used recently enough, leave it there.
1263d44d2872b2ebe58237de4dbc350b82cab944ccc5Douglas Gregor      time_t FileAccessTime = StatBuf.st_atime;
126493ce7d59f0ce9d85301cbad96a71694e4f345fcdBenjamin Kramer      if (CurrentTime - FileAccessTime <=
126593ce7d59f0ce9d85301cbad96a71694e4f345fcdBenjamin Kramer              time_t(HSOpts.ModuleCachePruneAfter)) {
1266d44d2872b2ebe58237de4dbc350b82cab944ccc5Douglas Gregor        continue;
1267d44d2872b2ebe58237de4dbc350b82cab944ccc5Douglas Gregor      }
1268d44d2872b2ebe58237de4dbc350b82cab944ccc5Douglas Gregor
1269d44d2872b2ebe58237de4dbc350b82cab944ccc5Douglas Gregor      // Remove the file.
1270651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      llvm::sys::fs::remove(File->path());
1271651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
1272651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      // Remove the timestamp file.
1273651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      std::string TimpestampFilename = File->path() + ".timestamp";
1274651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      llvm::sys::fs::remove(TimpestampFilename);
1275d44d2872b2ebe58237de4dbc350b82cab944ccc5Douglas Gregor    }
1276d44d2872b2ebe58237de4dbc350b82cab944ccc5Douglas Gregor
1277d44d2872b2ebe58237de4dbc350b82cab944ccc5Douglas Gregor    // If we removed all of the files in the directory, remove the directory
1278d44d2872b2ebe58237de4dbc350b82cab944ccc5Douglas Gregor    // itself.
1279651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    if (llvm::sys::fs::directory_iterator(Dir->path(), EC) ==
1280651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines            llvm::sys::fs::directory_iterator() && !EC)
1281651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      llvm::sys::fs::remove(Dir->path());
1282d44d2872b2ebe58237de4dbc350b82cab944ccc5Douglas Gregor  }
1283d44d2872b2ebe58237de4dbc350b82cab944ccc5Douglas Gregor}
1284d44d2872b2ebe58237de4dbc350b82cab944ccc5Douglas Gregor
12856bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hinesvoid CompilerInstance::createModuleManager() {
12866bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  if (!ModuleManager) {
12876bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    if (!hasASTContext())
12886bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines      createASTContext();
12896bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines
12903ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar    // If we're implicitly building modules but not currently recursively
12913ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar    // building a module, check whether we need to prune the module cache.
129287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar    if (getSourceManager().getModuleBuildStack().empty() &&
129387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar        !getPreprocessor().getHeaderSearchInfo().getModuleCachePath().empty() &&
12946bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines        getHeaderSearchOpts().ModuleCachePruneInterval > 0 &&
12956bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines        getHeaderSearchOpts().ModuleCachePruneAfter > 0) {
12966bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines      pruneModuleCache(getHeaderSearchOpts());
12976bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    }
12986bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines
12996bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    HeaderSearchOptions &HSOpts = getHeaderSearchOpts();
13006bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    std::string Sysroot = HSOpts.Sysroot;
13016bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    const PreprocessorOptions &PPOpts = getPreprocessorOpts();
130287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar    std::unique_ptr<llvm::Timer> ReadTimer;
130387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar    if (FrontendTimerGroup)
130487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar      ReadTimer = llvm::make_unique<llvm::Timer>("Reading modules",
130587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar                                                 *FrontendTimerGroup);
130687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar    ModuleManager = new ASTReader(
130787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar        getPreprocessor(), getASTContext(), getPCHContainerReader(),
130887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar        getFrontendOpts().ModuleFileExtensions,
130987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar        Sysroot.empty() ? "" : Sysroot.c_str(), PPOpts.DisablePCHValidation,
131087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar        /*AllowASTWithCompilerErrors=*/false,
131187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar        /*AllowConfigurationMismatch=*/false,
131287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar        HSOpts.ModulesValidateSystemHeaders,
131387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar        getFrontendOpts().UseGlobalModuleIndex,
131487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar        std::move(ReadTimer));
13156bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    if (hasASTConsumer()) {
13166bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines      ModuleManager->setDeserializationListener(
13176bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines        getASTConsumer().GetASTDeserializationListener());
13186bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines      getASTContext().setASTMutationListener(
13196bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines        getASTConsumer().GetASTMutationListener());
13206bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    }
13216bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    getASTContext().setExternalSource(ModuleManager);
13226bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    if (hasSema())
13236bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines      ModuleManager->InitializeSema(getSema());
13246bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    if (hasASTConsumer())
13256bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines      ModuleManager->StartTranslationUnit(&getASTConsumer());
132687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar
132787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar    if (TheDependencyFileGenerator)
132887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar      TheDependencyFileGenerator->AttachToASTReader(*ModuleManager);
132987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar    for (auto &Listener : DependencyCollectors)
133087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar      Listener->attachToASTReader(*ModuleManager);
13316bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  }
13326bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines}
13336bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines
1334176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hinesbool CompilerInstance::loadModuleFile(StringRef FileName) {
133587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  llvm::Timer Timer;
133687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  if (FrontendTimerGroup)
133787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar    Timer.init("Preloading " + FileName.str(), *FrontendTimerGroup);
133887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  llvm::TimeRegion TimeLoading(FrontendTimerGroup ? &Timer : nullptr);
133987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar
1340176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  // Helper to recursively read the module names for all modules we're adding.
1341176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  // We mark these as known and redirect any attempt to load that module to
1342176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  // the files we were handed.
1343176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  struct ReadModuleNames : ASTReaderListener {
1344176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    CompilerInstance &CI;
134587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar    llvm::SmallVector<IdentifierInfo*, 8> LoadedModules;
1346176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines
134787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar    ReadModuleNames(CompilerInstance &CI) : CI(CI) {}
1348176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines
134987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar    void ReadModuleName(StringRef ModuleName) override {
135087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar      LoadedModules.push_back(
135187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar          CI.getPreprocessor().getIdentifierInfo(ModuleName));
135287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar    }
13530e2c34f92f00628d48968dfea096d36381f494cbStephen Hines
135487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar    void registerAll() {
135587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar      for (auto *II : LoadedModules) {
135687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar        CI.KnownModules[II] = CI.getPreprocessor()
135787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar                                  .getHeaderSearchInfo()
135887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar                                  .getModuleMap()
135987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar                                  .findModule(II->getName());
1360176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines      }
136187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar      LoadedModules.clear();
1362176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    }
1363176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines
136487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar    void markAllUnavailable() {
136587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar      for (auto *II : LoadedModules) {
136687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar        if (Module *M = CI.getPreprocessor()
136787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar                            .getHeaderSearchInfo()
136887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar                            .getModuleMap()
136987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar                            .findModule(II->getName()))
137087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar          M->HasIncompatibleModuleFile = true;
137187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar      }
137287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar      LoadedModules.clear();
1373176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    }
137487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  };
1375176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines
13763ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar  // If we don't already have an ASTReader, create one now.
13773ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar  if (!ModuleManager)
13783ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar    createModuleManager();
13793ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar
138087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  auto Listener = llvm::make_unique<ReadModuleNames>(*this);
138187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  auto &ListenerRef = *Listener;
138287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  ASTReader::ListenerScope ReadModuleNamesListener(*ModuleManager,
138387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar                                                   std::move(Listener));
13843ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar
138587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  // Try to load the module file.
138687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  switch (ModuleManager->ReadAST(FileName, serialization::MK_ExplicitModule,
138787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar                                 SourceLocation(),
138887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar                                 ASTReader::ARR_ConfigurationMismatch)) {
138987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  case ASTReader::Success:
139087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar    // We successfully loaded the module file; remember the set of provided
139187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar    // modules so that we don't try to load implicit modules for them.
139287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar    ListenerRef.registerAll();
139387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar    return true;
1394176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines
139587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  case ASTReader::ConfigurationMismatch:
139687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar    // Ignore unusable module files.
139787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar    getDiagnostics().Report(SourceLocation(), diag::warn_module_config_mismatch)
139887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar        << FileName;
139987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar    // All modules provided by any files we tried and failed to load are now
140087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar    // unavailable; includes of those modules should now be handled textually.
140187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar    ListenerRef.markAllUnavailable();
140287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar    return true;
1403176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines
140487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  default:
1405176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    return false;
1406176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  }
1407176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines}
1408176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines
1409463d90986ec54c62bf8fe31193ef5db701db48a5Douglas GregorModuleLoadResult
1410463d90986ec54c62bf8fe31193ef5db701db48a5Douglas GregorCompilerInstance::loadModule(SourceLocation ImportLoc,
1411463d90986ec54c62bf8fe31193ef5db701db48a5Douglas Gregor                             ModuleIdPath Path,
1412463d90986ec54c62bf8fe31193ef5db701db48a5Douglas Gregor                             Module::NameVisibilityKind Visibility,
1413463d90986ec54c62bf8fe31193ef5db701db48a5Douglas Gregor                             bool IsInclusionDirective) {
1414b934d248d001d1536e074e3e8da8f47db63d719fRichard Smith  // Determine what file we're searching from.
1415b934d248d001d1536e074e3e8da8f47db63d719fRichard Smith  StringRef ModuleName = Path[0].first->getName();
1416b934d248d001d1536e074e3e8da8f47db63d719fRichard Smith  SourceLocation ModuleNameLoc = Path[0].second;
1417b934d248d001d1536e074e3e8da8f47db63d719fRichard Smith
1418b514c792821a8f053027d88444e13bfaa8efef76Douglas Gregor  // If we've already handled this import, just return the cached result.
1419b514c792821a8f053027d88444e13bfaa8efef76Douglas Gregor  // This one-element cache is important to eliminate redundant diagnostics
1420b514c792821a8f053027d88444e13bfaa8efef76Douglas Gregor  // when both the preprocessor and parser see the same import declaration.
142187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  if (ImportLoc.isValid() && LastModuleImportLoc == ImportLoc) {
14225e35693721364673f8196e4f5a370f56b92e6053Douglas Gregor    // Make the named module visible.
14234967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    if (LastModuleImportResult && ModuleName != getLangOpts().CurrentModule)
14245ebcb20b0331a6e64c213f0bb5f4bed9a9e8eb34Argyrios Kyrtzidis      ModuleManager->makeModuleVisible(LastModuleImportResult, Visibility,
1425b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar                                       ImportLoc);
1426392ed2b717d86ebdd202cb9bb58d18d8b3b4cd87Douglas Gregor    return LastModuleImportResult;
14275e35693721364673f8196e4f5a370f56b92e6053Douglas Gregor  }
1428a789ca9b967abe47b84df83bcf4afb150856a8d9NAKAMURA Takumi
14296bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  clang::Module *Module = nullptr;
1430b934d248d001d1536e074e3e8da8f47db63d719fRichard Smith
143149009ec701feb3009450e57e40c656e2ad7c1f41Douglas Gregor  // If we don't already have information on this module, load the module now.
14321a4761edca58c6b559de825b9abfb66f7f1ba94aDouglas Gregor  llvm::DenseMap<const IdentifierInfo *, clang::Module *>::iterator Known
1433392ed2b717d86ebdd202cb9bb58d18d8b3b4cd87Douglas Gregor    = KnownModules.find(Path[0].first);
14345e3f9223db88227d6d21679c613b139d8160186dDouglas Gregor  if (Known != KnownModules.end()) {
14355e3f9223db88227d6d21679c613b139d8160186dDouglas Gregor    // Retrieve the cached top-level module.
14365e3f9223db88227d6d21679c613b139d8160186dDouglas Gregor    Module = Known->second;
14374967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  } else if (ModuleName == getLangOpts().CurrentModule) {
14385e3f9223db88227d6d21679c613b139d8160186dDouglas Gregor    // This is the module we're building.
14396bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    Module = PP->getHeaderSearchInfo().lookupModule(ModuleName);
14405e3f9223db88227d6d21679c613b139d8160186dDouglas Gregor    Known = KnownModules.insert(std::make_pair(Path[0].first, Module)).first;
14415e3f9223db88227d6d21679c613b139d8160186dDouglas Gregor  } else {
144249009ec701feb3009450e57e40c656e2ad7c1f41Douglas Gregor    // Search for a module with the given name.
1443e434ec71fccfe078906403affd641f709702d598Douglas Gregor    Module = PP->getHeaderSearchInfo().lookupModule(ModuleName);
1444651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    if (!Module) {
1445651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      getDiagnostics().Report(ModuleNameLoc, diag::err_module_not_found)
1446651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      << ModuleName
1447651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      << SourceRange(ImportLoc, ModuleNameLoc);
1448651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      ModuleBuildFailed = true;
1449651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      return ModuleLoadResult();
1450651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    }
1451651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
145287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar    std::string ModuleFileName =
145387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar        PP->getHeaderSearchInfo().getModuleFileName(Module);
145487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar    if (ModuleFileName.empty()) {
145587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar      if (Module->HasIncompatibleModuleFile) {
145687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar        // We tried and failed to load a module file for this module. Fall
145787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar        // back to textual inclusion for its headers.
145887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar        return ModuleLoadResult(nullptr, /*missingExpected*/true);
145987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar      }
146087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar
14610e2c34f92f00628d48968dfea096d36381f494cbStephen Hines      getDiagnostics().Report(ModuleNameLoc, diag::err_module_build_disabled)
14620e2c34f92f00628d48968dfea096d36381f494cbStephen Hines          << ModuleName;
14630e2c34f92f00628d48968dfea096d36381f494cbStephen Hines      ModuleBuildFailed = true;
14640e2c34f92f00628d48968dfea096d36381f494cbStephen Hines      return ModuleLoadResult();
14650e2c34f92f00628d48968dfea096d36381f494cbStephen Hines    }
1466176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines
146749009ec701feb3009450e57e40c656e2ad7c1f41Douglas Gregor    // If we don't already have an ASTReader, create one now.
14686bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    if (!ModuleManager)
14696bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines      createModuleManager();
1470a789ca9b967abe47b84df83bcf4afb150856a8d9NAKAMURA Takumi
147187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar    llvm::Timer Timer;
147287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar    if (FrontendTimerGroup)
147387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar      Timer.init("Loading " + ModuleFileName, *FrontendTimerGroup);
147487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar    llvm::TimeRegion TimeLoading(FrontendTimerGroup ? &Timer : nullptr);
1475c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines
1476677e15ffee2ecc9c1c8f46fd77cab4b5afb59640Douglas Gregor    // Try to load the module file.
147787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar    unsigned ARRFlags = ASTReader::ARR_OutOfDate | ASTReader::ARR_Missing;
1478176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    switch (ModuleManager->ReadAST(ModuleFileName,
147987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar                                   serialization::MK_ImplicitModule,
1480677e15ffee2ecc9c1c8f46fd77cab4b5afb59640Douglas Gregor                                   ImportLoc, ARRFlags)) {
148149009ec701feb3009450e57e40c656e2ad7c1f41Douglas Gregor    case ASTReader::Success:
148249009ec701feb3009450e57e40c656e2ad7c1f41Douglas Gregor      break;
14836aa52ec6b969faabf3764baf79d89810b8249a7eDouglas Gregor
14840295c238f7b4329f86498055337f91f25465f836Eli Friedman    case ASTReader::OutOfDate:
1485677e15ffee2ecc9c1c8f46fd77cab4b5afb59640Douglas Gregor    case ASTReader::Missing: {
14860295c238f7b4329f86498055337f91f25465f836Eli Friedman      // The module file is missing or out-of-date. Build it.
1487651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      assert(Module && "missing module file");
1488677e15ffee2ecc9c1c8f46fd77cab4b5afb59640Douglas Gregor      // Check whether there is a cycle in the module graph.
1489677e15ffee2ecc9c1c8f46fd77cab4b5afb59640Douglas Gregor      ModuleBuildStack ModPath = getSourceManager().getModuleBuildStack();
1490677e15ffee2ecc9c1c8f46fd77cab4b5afb59640Douglas Gregor      ModuleBuildStack::iterator Pos = ModPath.begin(), PosEnd = ModPath.end();
1491677e15ffee2ecc9c1c8f46fd77cab4b5afb59640Douglas Gregor      for (; Pos != PosEnd; ++Pos) {
1492677e15ffee2ecc9c1c8f46fd77cab4b5afb59640Douglas Gregor        if (Pos->first == ModuleName)
1493677e15ffee2ecc9c1c8f46fd77cab4b5afb59640Douglas Gregor          break;
1494677e15ffee2ecc9c1c8f46fd77cab4b5afb59640Douglas Gregor      }
1495677e15ffee2ecc9c1c8f46fd77cab4b5afb59640Douglas Gregor
1496677e15ffee2ecc9c1c8f46fd77cab4b5afb59640Douglas Gregor      if (Pos != PosEnd) {
1497677e15ffee2ecc9c1c8f46fd77cab4b5afb59640Douglas Gregor        SmallString<256> CyclePath;
1498677e15ffee2ecc9c1c8f46fd77cab4b5afb59640Douglas Gregor        for (; Pos != PosEnd; ++Pos) {
1499677e15ffee2ecc9c1c8f46fd77cab4b5afb59640Douglas Gregor          CyclePath += Pos->first;
1500677e15ffee2ecc9c1c8f46fd77cab4b5afb59640Douglas Gregor          CyclePath += " -> ";
1501677e15ffee2ecc9c1c8f46fd77cab4b5afb59640Douglas Gregor        }
1502677e15ffee2ecc9c1c8f46fd77cab4b5afb59640Douglas Gregor        CyclePath += ModuleName;
1503677e15ffee2ecc9c1c8f46fd77cab4b5afb59640Douglas Gregor
1504677e15ffee2ecc9c1c8f46fd77cab4b5afb59640Douglas Gregor        getDiagnostics().Report(ModuleNameLoc, diag::err_module_cycle)
1505677e15ffee2ecc9c1c8f46fd77cab4b5afb59640Douglas Gregor          << ModuleName << CyclePath;
1506677e15ffee2ecc9c1c8f46fd77cab4b5afb59640Douglas Gregor        return ModuleLoadResult();
1507677e15ffee2ecc9c1c8f46fd77cab4b5afb59640Douglas Gregor      }
1508463d90986ec54c62bf8fe31193ef5db701db48a5Douglas Gregor
1509463d90986ec54c62bf8fe31193ef5db701db48a5Douglas Gregor      // Check whether we have already attempted to build this module (but
1510463d90986ec54c62bf8fe31193ef5db701db48a5Douglas Gregor      // failed).
1511463d90986ec54c62bf8fe31193ef5db701db48a5Douglas Gregor      if (getPreprocessorOpts().FailedModules &&
1512463d90986ec54c62bf8fe31193ef5db701db48a5Douglas Gregor          getPreprocessorOpts().FailedModules->hasAlreadyFailed(ModuleName)) {
1513463d90986ec54c62bf8fe31193ef5db701db48a5Douglas Gregor        getDiagnostics().Report(ModuleNameLoc, diag::err_module_not_built)
1514463d90986ec54c62bf8fe31193ef5db701db48a5Douglas Gregor          << ModuleName
1515463d90986ec54c62bf8fe31193ef5db701db48a5Douglas Gregor          << SourceRange(ImportLoc, ModuleNameLoc);
1516f575d6e7c3b887ea4c5394d2c7e322c7a929a57eDouglas Gregor        ModuleBuildFailed = true;
1517463d90986ec54c62bf8fe31193ef5db701db48a5Douglas Gregor        return ModuleLoadResult();
1518463d90986ec54c62bf8fe31193ef5db701db48a5Douglas Gregor      }
1519463d90986ec54c62bf8fe31193ef5db701db48a5Douglas Gregor
1520c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines      // Try to compile and then load the module.
1521c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines      if (!compileAndLoadModule(*this, ImportLoc, ModuleNameLoc, Module,
1522c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines                                ModuleFileName)) {
1523176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines        assert(getDiagnostics().hasErrorOccurred() &&
1524176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines               "undiagnosed error in compileAndLoadModule");
1525b8a8be10038edd1454156d4c25cc86d4e93b6623Douglas Gregor        if (getPreprocessorOpts().FailedModules)
1526b8a8be10038edd1454156d4c25cc86d4e93b6623Douglas Gregor          getPreprocessorOpts().FailedModules->addFailed(ModuleName);
15276bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines        KnownModules[Path[0].first] = nullptr;
1528f575d6e7c3b887ea4c5394d2c7e322c7a929a57eDouglas Gregor        ModuleBuildFailed = true;
1529463d90986ec54c62bf8fe31193ef5db701db48a5Douglas Gregor        return ModuleLoadResult();
15307cdd28162dc7ade4b14bf237e87b4bbc17b2f023Douglas Gregor      }
15317cdd28162dc7ade4b14bf237e87b4bbc17b2f023Douglas Gregor
15327cdd28162dc7ade4b14bf237e87b4bbc17b2f023Douglas Gregor      // Okay, we've rebuilt and now loaded the module.
15337cdd28162dc7ade4b14bf237e87b4bbc17b2f023Douglas Gregor      break;
15347cdd28162dc7ade4b14bf237e87b4bbc17b2f023Douglas Gregor    }
15357cdd28162dc7ade4b14bf237e87b4bbc17b2f023Douglas Gregor
15364825fd7fbb3fe87cdf8da9bccc1361fac45bdf2dDouglas Gregor    case ASTReader::VersionMismatch:
15374825fd7fbb3fe87cdf8da9bccc1361fac45bdf2dDouglas Gregor    case ASTReader::ConfigurationMismatch:
15384825fd7fbb3fe87cdf8da9bccc1361fac45bdf2dDouglas Gregor    case ASTReader::HadErrors:
15393b7deda7137e62810a810ce25b062927a9fc7c71Argyrios Kyrtzidis      ModuleLoader::HadFatalFailure = true;
154087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar      // FIXME: The ASTReader will already have complained, but can we shoehorn
154149009ec701feb3009450e57e40c656e2ad7c1f41Douglas Gregor      // that diagnostic information into a more useful form?
15426bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines      KnownModules[Path[0].first] = nullptr;
1543463d90986ec54c62bf8fe31193ef5db701db48a5Douglas Gregor      return ModuleLoadResult();
1544a789ca9b967abe47b84df83bcf4afb150856a8d9NAKAMURA Takumi
154549009ec701feb3009450e57e40c656e2ad7c1f41Douglas Gregor    case ASTReader::Failure:
15463b7deda7137e62810a810ce25b062927a9fc7c71Argyrios Kyrtzidis      ModuleLoader::HadFatalFailure = true;
1547392ed2b717d86ebdd202cb9bb58d18d8b3b4cd87Douglas Gregor      // Already complained, but note now that we failed.
15486bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines      KnownModules[Path[0].first] = nullptr;
1549f575d6e7c3b887ea4c5394d2c7e322c7a929a57eDouglas Gregor      ModuleBuildFailed = true;
1550463d90986ec54c62bf8fe31193ef5db701db48a5Douglas Gregor      return ModuleLoadResult();
155149009ec701feb3009450e57e40c656e2ad7c1f41Douglas Gregor    }
1552e2ac16b09ea66ad955752381b82fb8719d003e5eArgyrios Kyrtzidis
1553392ed2b717d86ebdd202cb9bb58d18d8b3b4cd87Douglas Gregor    // Cache the result of this top-level module lookup for later.
1554392ed2b717d86ebdd202cb9bb58d18d8b3b4cd87Douglas Gregor    Known = KnownModules.insert(std::make_pair(Path[0].first, Module)).first;
15556aa52ec6b969faabf3764baf79d89810b8249a7eDouglas Gregor  }
155649009ec701feb3009450e57e40c656e2ad7c1f41Douglas Gregor
1557392ed2b717d86ebdd202cb9bb58d18d8b3b4cd87Douglas Gregor  // If we never found the module, fail.
1558392ed2b717d86ebdd202cb9bb58d18d8b3b4cd87Douglas Gregor  if (!Module)
1559463d90986ec54c62bf8fe31193ef5db701db48a5Douglas Gregor    return ModuleLoadResult();
1560392ed2b717d86ebdd202cb9bb58d18d8b3b4cd87Douglas Gregor
156149009ec701feb3009450e57e40c656e2ad7c1f41Douglas Gregor  // Verify that the rest of the module path actually corresponds to
156249009ec701feb3009450e57e40c656e2ad7c1f41Douglas Gregor  // a submodule.
1563392ed2b717d86ebdd202cb9bb58d18d8b3b4cd87Douglas Gregor  if (Path.size() > 1) {
156449009ec701feb3009450e57e40c656e2ad7c1f41Douglas Gregor    for (unsigned I = 1, N = Path.size(); I != N; ++I) {
156549009ec701feb3009450e57e40c656e2ad7c1f41Douglas Gregor      StringRef Name = Path[I].first->getName();
1566b7a7819473709c01ea024a2dc15e99d38f0f8760Douglas Gregor      clang::Module *Sub = Module->findSubmodule(Name);
156749009ec701feb3009450e57e40c656e2ad7c1f41Douglas Gregor
1568b7a7819473709c01ea024a2dc15e99d38f0f8760Douglas Gregor      if (!Sub) {
156949009ec701feb3009450e57e40c656e2ad7c1f41Douglas Gregor        // Attempt to perform typo correction to find a module name that works.
1570cfa88f893915ceb8ae4ce2f17c46c24a4d67502fDmitri Gribenko        SmallVector<StringRef, 2> Best;
157149009ec701feb3009450e57e40c656e2ad7c1f41Douglas Gregor        unsigned BestEditDistance = (std::numeric_limits<unsigned>::max)();
157249009ec701feb3009450e57e40c656e2ad7c1f41Douglas Gregor
1573b7a7819473709c01ea024a2dc15e99d38f0f8760Douglas Gregor        for (clang::Module::submodule_iterator J = Module->submodule_begin(),
1574b7a7819473709c01ea024a2dc15e99d38f0f8760Douglas Gregor                                            JEnd = Module->submodule_end();
1575e25633f777cfcaa564b4ed36cec37d6e6e1ecb04Matt Beaumont-Gay             J != JEnd; ++J) {
1576b7a7819473709c01ea024a2dc15e99d38f0f8760Douglas Gregor          unsigned ED = Name.edit_distance((*J)->Name,
157749009ec701feb3009450e57e40c656e2ad7c1f41Douglas Gregor                                           /*AllowReplacements=*/true,
157849009ec701feb3009450e57e40c656e2ad7c1f41Douglas Gregor                                           BestEditDistance);
157949009ec701feb3009450e57e40c656e2ad7c1f41Douglas Gregor          if (ED <= BestEditDistance) {
1580b7a7819473709c01ea024a2dc15e99d38f0f8760Douglas Gregor            if (ED < BestEditDistance) {
158149009ec701feb3009450e57e40c656e2ad7c1f41Douglas Gregor              Best.clear();
1582b7a7819473709c01ea024a2dc15e99d38f0f8760Douglas Gregor              BestEditDistance = ED;
1583b7a7819473709c01ea024a2dc15e99d38f0f8760Douglas Gregor            }
1584b7a7819473709c01ea024a2dc15e99d38f0f8760Douglas Gregor
1585b7a7819473709c01ea024a2dc15e99d38f0f8760Douglas Gregor            Best.push_back((*J)->Name);
158649009ec701feb3009450e57e40c656e2ad7c1f41Douglas Gregor          }
158749009ec701feb3009450e57e40c656e2ad7c1f41Douglas Gregor        }
158849009ec701feb3009450e57e40c656e2ad7c1f41Douglas Gregor
158949009ec701feb3009450e57e40c656e2ad7c1f41Douglas Gregor        // If there was a clear winner, user it.
159049009ec701feb3009450e57e40c656e2ad7c1f41Douglas Gregor        if (Best.size() == 1) {
159149009ec701feb3009450e57e40c656e2ad7c1f41Douglas Gregor          getDiagnostics().Report(Path[I].second,
159249009ec701feb3009450e57e40c656e2ad7c1f41Douglas Gregor                                  diag::err_no_submodule_suggest)
1593392ed2b717d86ebdd202cb9bb58d18d8b3b4cd87Douglas Gregor            << Path[I].first << Module->getFullModuleName() << Best[0]
159449009ec701feb3009450e57e40c656e2ad7c1f41Douglas Gregor            << SourceRange(Path[0].second, Path[I-1].second)
159549009ec701feb3009450e57e40c656e2ad7c1f41Douglas Gregor            << FixItHint::CreateReplacement(SourceRange(Path[I].second),
159649009ec701feb3009450e57e40c656e2ad7c1f41Douglas Gregor                                            Best[0]);
1597b7a7819473709c01ea024a2dc15e99d38f0f8760Douglas Gregor
1598b7a7819473709c01ea024a2dc15e99d38f0f8760Douglas Gregor          Sub = Module->findSubmodule(Best[0]);
159949009ec701feb3009450e57e40c656e2ad7c1f41Douglas Gregor        }
160049009ec701feb3009450e57e40c656e2ad7c1f41Douglas Gregor      }
160149009ec701feb3009450e57e40c656e2ad7c1f41Douglas Gregor
1602b7a7819473709c01ea024a2dc15e99d38f0f8760Douglas Gregor      if (!Sub) {
160349009ec701feb3009450e57e40c656e2ad7c1f41Douglas Gregor        // No submodule by this name. Complain, and don't look for further
160449009ec701feb3009450e57e40c656e2ad7c1f41Douglas Gregor        // submodules.
160549009ec701feb3009450e57e40c656e2ad7c1f41Douglas Gregor        getDiagnostics().Report(Path[I].second, diag::err_no_submodule)
1606392ed2b717d86ebdd202cb9bb58d18d8b3b4cd87Douglas Gregor          << Path[I].first << Module->getFullModuleName()
160749009ec701feb3009450e57e40c656e2ad7c1f41Douglas Gregor          << SourceRange(Path[0].second, Path[I-1].second);
160849009ec701feb3009450e57e40c656e2ad7c1f41Douglas Gregor        break;
160949009ec701feb3009450e57e40c656e2ad7c1f41Douglas Gregor      }
161049009ec701feb3009450e57e40c656e2ad7c1f41Douglas Gregor
1611b7a7819473709c01ea024a2dc15e99d38f0f8760Douglas Gregor      Module = Sub;
161249009ec701feb3009450e57e40c656e2ad7c1f41Douglas Gregor    }
161349009ec701feb3009450e57e40c656e2ad7c1f41Douglas Gregor  }
1614176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines
16155e3f9223db88227d6d21679c613b139d8160186dDouglas Gregor  // Make the named module visible, if it's not already part of the module
16165e3f9223db88227d6d21679c613b139d8160186dDouglas Gregor  // we are parsing.
1617305dc3ebaa0bea5f3b789e4b54afc79c25907615Douglas Gregor  if (ModuleName != getLangOpts().CurrentModule) {
1618305dc3ebaa0bea5f3b789e4b54afc79c25907615Douglas Gregor    if (!Module->IsFromModuleFile) {
1619305dc3ebaa0bea5f3b789e4b54afc79c25907615Douglas Gregor      // We have an umbrella header or directory that doesn't actually include
1620305dc3ebaa0bea5f3b789e4b54afc79c25907615Douglas Gregor      // all of the headers within the directory it covers. Complain about
1621305dc3ebaa0bea5f3b789e4b54afc79c25907615Douglas Gregor      // this missing submodule and recover by forgetting that we ever saw
1622305dc3ebaa0bea5f3b789e4b54afc79c25907615Douglas Gregor      // this submodule.
1623305dc3ebaa0bea5f3b789e4b54afc79c25907615Douglas Gregor      // FIXME: Should we detect this at module load time? It seems fairly
1624305dc3ebaa0bea5f3b789e4b54afc79c25907615Douglas Gregor      // expensive (and rare).
1625305dc3ebaa0bea5f3b789e4b54afc79c25907615Douglas Gregor      getDiagnostics().Report(ImportLoc, diag::warn_missing_submodule)
1626305dc3ebaa0bea5f3b789e4b54afc79c25907615Douglas Gregor        << Module->getFullModuleName()
1627305dc3ebaa0bea5f3b789e4b54afc79c25907615Douglas Gregor        << SourceRange(Path.front().second, Path.back().second);
16286bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines
16296bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines      return ModuleLoadResult(nullptr, true);
1630305dc3ebaa0bea5f3b789e4b54afc79c25907615Douglas Gregor    }
163151f564f80d9f71e175635b452ffeeeff899e9bf1Douglas Gregor
163251f564f80d9f71e175635b452ffeeeff899e9bf1Douglas Gregor    // Check whether this module is available.
16335794b53ad5b38b53c9eaf3a172354e63081ceb2fRichard Smith    clang::Module::Requirement Requirement;
16340e2c34f92f00628d48968dfea096d36381f494cbStephen Hines    clang::Module::UnresolvedHeaderDirective MissingHeader;
1635651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    if (!Module->isAvailable(getLangOpts(), getTarget(), Requirement,
1636651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines                             MissingHeader)) {
1637651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      if (MissingHeader.FileNameLoc.isValid()) {
1638651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines        getDiagnostics().Report(MissingHeader.FileNameLoc,
1639651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines                                diag::err_module_header_missing)
1640651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines          << MissingHeader.IsUmbrella << MissingHeader.FileName;
1641651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      } else {
1642651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines        getDiagnostics().Report(ImportLoc, diag::err_module_unavailable)
1643651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines          << Module->getFullModuleName()
1644651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines          << Requirement.second << Requirement.first
1645651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines          << SourceRange(Path.front().second, Path.back().second);
1646651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      }
164751f564f80d9f71e175635b452ffeeeff899e9bf1Douglas Gregor      LastModuleImportLoc = ImportLoc;
1648463d90986ec54c62bf8fe31193ef5db701db48a5Douglas Gregor      LastModuleImportResult = ModuleLoadResult();
1649463d90986ec54c62bf8fe31193ef5db701db48a5Douglas Gregor      return ModuleLoadResult();
165051f564f80d9f71e175635b452ffeeeff899e9bf1Douglas Gregor    }
165151f564f80d9f71e175635b452ffeeeff899e9bf1Douglas Gregor
1652b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar    ModuleManager->makeModuleVisible(Module, Visibility, ImportLoc);
1653305dc3ebaa0bea5f3b789e4b54afc79c25907615Douglas Gregor  }
165463a726870b486e0470c3a4b11cf62bab8be00b73Douglas Gregor
165563a726870b486e0470c3a4b11cf62bab8be00b73Douglas Gregor  // Check for any configuration macros that have changed.
165663a726870b486e0470c3a4b11cf62bab8be00b73Douglas Gregor  clang::Module *TopModule = Module->getTopLevelModule();
165763a726870b486e0470c3a4b11cf62bab8be00b73Douglas Gregor  for (unsigned I = 0, N = TopModule->ConfigMacros.size(); I != N; ++I) {
165863a726870b486e0470c3a4b11cf62bab8be00b73Douglas Gregor    checkConfigMacro(getPreprocessor(), TopModule->ConfigMacros[I],
165963a726870b486e0470c3a4b11cf62bab8be00b73Douglas Gregor                     Module, ImportLoc);
166063a726870b486e0470c3a4b11cf62bab8be00b73Douglas Gregor  }
166163a726870b486e0470c3a4b11cf62bab8be00b73Douglas Gregor
1662b514c792821a8f053027d88444e13bfaa8efef76Douglas Gregor  LastModuleImportLoc = ImportLoc;
1663463d90986ec54c62bf8fe31193ef5db701db48a5Douglas Gregor  LastModuleImportResult = ModuleLoadResult(Module, false);
1664463d90986ec54c62bf8fe31193ef5db701db48a5Douglas Gregor  return LastModuleImportResult;
16656aa52ec6b969faabf3764baf79d89810b8249a7eDouglas Gregor}
1666ca2ab45341c448284cf93770018c717810575f86Douglas Gregor
1667ca2ab45341c448284cf93770018c717810575f86Douglas Gregorvoid CompilerInstance::makeModuleVisible(Module *Mod,
16685ebcb20b0331a6e64c213f0bb5f4bed9a9e8eb34Argyrios Kyrtzidis                                         Module::NameVisibilityKind Visibility,
1669b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar                                         SourceLocation ImportLoc) {
1670b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar  if (!ModuleManager)
1671b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar    createModuleManager();
1672b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar  if (!ModuleManager)
1673b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar    return;
1674b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar
1675b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar  ModuleManager->makeModuleVisible(Mod, Visibility, ImportLoc);
1676ca2ab45341c448284cf93770018c717810575f86Douglas Gregor}
1677ca2ab45341c448284cf93770018c717810575f86Douglas Gregor
16786bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen HinesGlobalModuleIndex *CompilerInstance::loadGlobalModuleIndex(
16796bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    SourceLocation TriggerLoc) {
168087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  if (getPreprocessor().getHeaderSearchInfo().getModuleCachePath().empty())
168187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar    return nullptr;
16826bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  if (!ModuleManager)
16836bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    createModuleManager();
16846bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  // Can't do anything if we don't have the module manager.
16856bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  if (!ModuleManager)
16866bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    return nullptr;
16876bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  // Get an existing global index.  This loads it if not already
16886bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  // loaded.
16896bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  ModuleManager->loadGlobalIndex();
16906bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  GlobalModuleIndex *GlobalIndex = ModuleManager->getGlobalIndex();
16916bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  // If the global index doesn't exist, create it.
16926bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  if (!GlobalIndex && shouldBuildGlobalModuleIndex() && hasFileManager() &&
16936bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines      hasPreprocessor()) {
16946bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    llvm::sys::fs::create_directories(
16956bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines      getPreprocessor().getHeaderSearchInfo().getModuleCachePath());
16966bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    GlobalModuleIndex::writeIndex(
169787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar        getFileManager(), getPCHContainerReader(),
169887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar        getPreprocessor().getHeaderSearchInfo().getModuleCachePath());
16996bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    ModuleManager->resetForReload();
17006bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    ModuleManager->loadGlobalIndex();
17016bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    GlobalIndex = ModuleManager->getGlobalIndex();
17026bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  }
17036bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  // For finding modules needing to be imported for fixit messages,
17046bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  // we need to make the global index cover all modules, so we do that here.
17056bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  if (!HaveFullGlobalModuleIndex && GlobalIndex && !buildingModule()) {
17066bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    ModuleMap &MMap = getPreprocessor().getHeaderSearchInfo().getModuleMap();
17076bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    bool RecreateIndex = false;
17086bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    for (ModuleMap::module_iterator I = MMap.module_begin(),
17096bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines        E = MMap.module_end(); I != E; ++I) {
17106bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines      Module *TheModule = I->second;
17116bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines      const FileEntry *Entry = TheModule->getASTFile();
17126bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines      if (!Entry) {
17136bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines        SmallVector<std::pair<IdentifierInfo *, SourceLocation>, 2> Path;
17146bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines        Path.push_back(std::make_pair(
171587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar            getPreprocessor().getIdentifierInfo(TheModule->Name), TriggerLoc));
17166bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines        std::reverse(Path.begin(), Path.end());
171787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar        // Load a module as hidden.  This also adds it to the global index.
171887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar        loadModule(TheModule->DefinitionLoc, Path, Module::Hidden, false);
17196bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines        RecreateIndex = true;
17206bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines      }
17216bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    }
17226bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    if (RecreateIndex) {
17236bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines      GlobalModuleIndex::writeIndex(
172487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar          getFileManager(), getPCHContainerReader(),
172587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar          getPreprocessor().getHeaderSearchInfo().getModuleCachePath());
17266bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines      ModuleManager->resetForReload();
17276bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines      ModuleManager->loadGlobalIndex();
17286bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines      GlobalIndex = ModuleManager->getGlobalIndex();
17296bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    }
17306bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    HaveFullGlobalModuleIndex = true;
17316bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  }
17326bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  return GlobalIndex;
17336bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines}
17346bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines
17356bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines// Check global module index for missing imports.
17366bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hinesbool
17376bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen HinesCompilerInstance::lookupMissingImports(StringRef Name,
17386bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines                                       SourceLocation TriggerLoc) {
17396bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  // Look for the symbol in non-imported modules, but only if an error
17406bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  // actually occurred.
17416bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  if (!buildingModule()) {
17426bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    // Load global module index, or retrieve a previously loaded one.
17436bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    GlobalModuleIndex *GlobalIndex = loadGlobalModuleIndex(
17446bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines      TriggerLoc);
17456bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines
17466bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    // Only if we have a global index.
17476bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    if (GlobalIndex) {
17486bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines      GlobalModuleIndex::HitSet FoundModules;
17496bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines
17506bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines      // Find the modules that reference the identifier.
17516bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines      // Note that this only finds top-level modules.
17526bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines      // We'll let diagnoseTypo find the actual declaration module.
17536bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines      if (GlobalIndex->lookupIdentifier(Name, FoundModules))
17546bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines        return true;
17556bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    }
17566bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  }
17576bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines
17586bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  return false;
17596bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines}
1760176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hinesvoid CompilerInstance::resetAndLeakSema() { BuryPointer(takeSema()); }
1761