1 //===--- CompilerInstance.cpp ---------------------------------------------===//
2 //
3 //                     The LLVM Compiler Infrastructure
4 //
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
7 //
8 //===----------------------------------------------------------------------===//
9 
10 #include "clang/Frontend/CompilerInstance.h"
11 #include "clang/AST/ASTConsumer.h"
12 #include "clang/AST/ASTContext.h"
13 #include "clang/AST/Decl.h"
14 #include "clang/Basic/Diagnostic.h"
15 #include "clang/Basic/FileManager.h"
16 #include "clang/Basic/SourceManager.h"
17 #include "clang/Basic/TargetInfo.h"
18 #include "clang/Basic/Version.h"
19 #include "clang/Config/config.h"
20 #include "clang/Frontend/ChainedDiagnosticConsumer.h"
21 #include "clang/Frontend/FrontendAction.h"
22 #include "clang/Frontend/FrontendActions.h"
23 #include "clang/Frontend/FrontendDiagnostic.h"
24 #include "clang/Frontend/LogDiagnosticPrinter.h"
25 #include "clang/Frontend/SerializedDiagnosticPrinter.h"
26 #include "clang/Frontend/TextDiagnosticPrinter.h"
27 #include "clang/Frontend/Utils.h"
28 #include "clang/Frontend/VerifyDiagnosticConsumer.h"
29 #include "clang/Lex/HeaderSearch.h"
30 #include "clang/Lex/PTHManager.h"
31 #include "clang/Lex/Preprocessor.h"
32 #include "clang/Sema/CodeCompleteConsumer.h"
33 #include "clang/Sema/Sema.h"
34 #include "clang/Serialization/ASTReader.h"
35 #include "clang/Serialization/GlobalModuleIndex.h"
36 #include "llvm/ADT/Statistic.h"
37 #include "llvm/Support/CrashRecoveryContext.h"
38 #include "llvm/Support/Errc.h"
39 #include "llvm/Support/FileSystem.h"
40 #include "llvm/Support/Host.h"
41 #include "llvm/Support/LockFileManager.h"
42 #include "llvm/Support/MemoryBuffer.h"
43 #include "llvm/Support/Path.h"
44 #include "llvm/Support/Program.h"
45 #include "llvm/Support/Signals.h"
46 #include "llvm/Support/Timer.h"
47 #include "llvm/Support/raw_ostream.h"
48 #include <sys/stat.h>
49 #include <system_error>
50 #include <time.h>
51 
52 using namespace clang;
53 
CompilerInstance(std::shared_ptr<PCHContainerOperations> PCHContainerOps,bool BuildingModule)54 CompilerInstance::CompilerInstance(
55     std::shared_ptr<PCHContainerOperations> PCHContainerOps,
56     bool BuildingModule)
57     : ModuleLoader(BuildingModule), Invocation(new CompilerInvocation()),
58       ModuleManager(nullptr), ThePCHContainerOperations(PCHContainerOps),
59       BuildGlobalModuleIndex(false), HaveFullGlobalModuleIndex(false),
60       ModuleBuildFailed(false) {}
61 
~CompilerInstance()62 CompilerInstance::~CompilerInstance() {
63   assert(OutputFiles.empty() && "Still output files in flight?");
64 }
65 
setInvocation(CompilerInvocation * Value)66 void CompilerInstance::setInvocation(CompilerInvocation *Value) {
67   Invocation = Value;
68 }
69 
shouldBuildGlobalModuleIndex() const70 bool CompilerInstance::shouldBuildGlobalModuleIndex() const {
71   return (BuildGlobalModuleIndex ||
72           (ModuleManager && ModuleManager->isGlobalIndexUnavailable() &&
73            getFrontendOpts().GenerateGlobalModuleIndex)) &&
74          !ModuleBuildFailed;
75 }
76 
setDiagnostics(DiagnosticsEngine * Value)77 void CompilerInstance::setDiagnostics(DiagnosticsEngine *Value) {
78   Diagnostics = Value;
79 }
80 
setTarget(TargetInfo * Value)81 void CompilerInstance::setTarget(TargetInfo *Value) { Target = Value; }
setAuxTarget(TargetInfo * Value)82 void CompilerInstance::setAuxTarget(TargetInfo *Value) { AuxTarget = Value; }
83 
setFileManager(FileManager * Value)84 void CompilerInstance::setFileManager(FileManager *Value) {
85   FileMgr = Value;
86   if (Value)
87     VirtualFileSystem = Value->getVirtualFileSystem();
88   else
89     VirtualFileSystem.reset();
90 }
91 
setSourceManager(SourceManager * Value)92 void CompilerInstance::setSourceManager(SourceManager *Value) {
93   SourceMgr = Value;
94 }
95 
setPreprocessor(Preprocessor * Value)96 void CompilerInstance::setPreprocessor(Preprocessor *Value) { PP = Value; }
97 
setASTContext(ASTContext * Value)98 void CompilerInstance::setASTContext(ASTContext *Value) {
99   Context = Value;
100 
101   if (Context && Consumer)
102     getASTConsumer().Initialize(getASTContext());
103 }
104 
setSema(Sema * S)105 void CompilerInstance::setSema(Sema *S) {
106   TheSema.reset(S);
107 }
108 
setASTConsumer(std::unique_ptr<ASTConsumer> Value)109 void CompilerInstance::setASTConsumer(std::unique_ptr<ASTConsumer> Value) {
110   Consumer = std::move(Value);
111 
112   if (Context && Consumer)
113     getASTConsumer().Initialize(getASTContext());
114 }
115 
setCodeCompletionConsumer(CodeCompleteConsumer * Value)116 void CompilerInstance::setCodeCompletionConsumer(CodeCompleteConsumer *Value) {
117   CompletionConsumer.reset(Value);
118 }
119 
takeSema()120 std::unique_ptr<Sema> CompilerInstance::takeSema() {
121   return std::move(TheSema);
122 }
123 
getModuleManager() const124 IntrusiveRefCntPtr<ASTReader> CompilerInstance::getModuleManager() const {
125   return ModuleManager;
126 }
setModuleManager(IntrusiveRefCntPtr<ASTReader> Reader)127 void CompilerInstance::setModuleManager(IntrusiveRefCntPtr<ASTReader> Reader) {
128   ModuleManager = Reader;
129 }
130 
131 std::shared_ptr<ModuleDependencyCollector>
getModuleDepCollector() const132 CompilerInstance::getModuleDepCollector() const {
133   return ModuleDepCollector;
134 }
135 
setModuleDepCollector(std::shared_ptr<ModuleDependencyCollector> Collector)136 void CompilerInstance::setModuleDepCollector(
137     std::shared_ptr<ModuleDependencyCollector> Collector) {
138   ModuleDepCollector = Collector;
139 }
140 
141 // Diagnostics
SetUpDiagnosticLog(DiagnosticOptions * DiagOpts,const CodeGenOptions * CodeGenOpts,DiagnosticsEngine & Diags)142 static void SetUpDiagnosticLog(DiagnosticOptions *DiagOpts,
143                                const CodeGenOptions *CodeGenOpts,
144                                DiagnosticsEngine &Diags) {
145   std::error_code EC;
146   std::unique_ptr<raw_ostream> StreamOwner;
147   raw_ostream *OS = &llvm::errs();
148   if (DiagOpts->DiagnosticLogFile != "-") {
149     // Create the output stream.
150     auto FileOS = llvm::make_unique<llvm::raw_fd_ostream>(
151         DiagOpts->DiagnosticLogFile, EC,
152         llvm::sys::fs::F_Append | llvm::sys::fs::F_Text);
153     if (EC) {
154       Diags.Report(diag::warn_fe_cc_log_diagnostics_failure)
155           << DiagOpts->DiagnosticLogFile << EC.message();
156     } else {
157       FileOS->SetUnbuffered();
158       OS = FileOS.get();
159       StreamOwner = std::move(FileOS);
160     }
161   }
162 
163   // Chain in the diagnostic client which will log the diagnostics.
164   auto Logger = llvm::make_unique<LogDiagnosticPrinter>(*OS, DiagOpts,
165                                                         std::move(StreamOwner));
166   if (CodeGenOpts)
167     Logger->setDwarfDebugFlags(CodeGenOpts->DwarfDebugFlags);
168   assert(Diags.ownsClient());
169   Diags.setClient(
170       new ChainedDiagnosticConsumer(Diags.takeClient(), std::move(Logger)));
171 }
172 
SetupSerializedDiagnostics(DiagnosticOptions * DiagOpts,DiagnosticsEngine & Diags,StringRef OutputFile)173 static void SetupSerializedDiagnostics(DiagnosticOptions *DiagOpts,
174                                        DiagnosticsEngine &Diags,
175                                        StringRef OutputFile) {
176   auto SerializedConsumer =
177       clang::serialized_diags::create(OutputFile, DiagOpts);
178 
179   if (Diags.ownsClient()) {
180     Diags.setClient(new ChainedDiagnosticConsumer(
181         Diags.takeClient(), std::move(SerializedConsumer)));
182   } else {
183     Diags.setClient(new ChainedDiagnosticConsumer(
184         Diags.getClient(), std::move(SerializedConsumer)));
185   }
186 }
187 
createDiagnostics(DiagnosticConsumer * Client,bool ShouldOwnClient)188 void CompilerInstance::createDiagnostics(DiagnosticConsumer *Client,
189                                          bool ShouldOwnClient) {
190   Diagnostics = createDiagnostics(&getDiagnosticOpts(), Client,
191                                   ShouldOwnClient, &getCodeGenOpts());
192 }
193 
194 IntrusiveRefCntPtr<DiagnosticsEngine>
createDiagnostics(DiagnosticOptions * Opts,DiagnosticConsumer * Client,bool ShouldOwnClient,const CodeGenOptions * CodeGenOpts)195 CompilerInstance::createDiagnostics(DiagnosticOptions *Opts,
196                                     DiagnosticConsumer *Client,
197                                     bool ShouldOwnClient,
198                                     const CodeGenOptions *CodeGenOpts) {
199   IntrusiveRefCntPtr<DiagnosticIDs> DiagID(new DiagnosticIDs());
200   IntrusiveRefCntPtr<DiagnosticsEngine>
201       Diags(new DiagnosticsEngine(DiagID, Opts));
202 
203   // Create the diagnostic client for reporting errors or for
204   // implementing -verify.
205   if (Client) {
206     Diags->setClient(Client, ShouldOwnClient);
207   } else
208     Diags->setClient(new TextDiagnosticPrinter(llvm::errs(), Opts));
209 
210   // Chain in -verify checker, if requested.
211   if (Opts->VerifyDiagnostics)
212     Diags->setClient(new VerifyDiagnosticConsumer(*Diags));
213 
214   // Chain in -diagnostic-log-file dumper, if requested.
215   if (!Opts->DiagnosticLogFile.empty())
216     SetUpDiagnosticLog(Opts, CodeGenOpts, *Diags);
217 
218   if (!Opts->DiagnosticSerializationFile.empty())
219     SetupSerializedDiagnostics(Opts, *Diags,
220                                Opts->DiagnosticSerializationFile);
221 
222   // Configure our handling of diagnostics.
223   ProcessWarningOptions(*Diags, *Opts);
224 
225   return Diags;
226 }
227 
228 // File Manager
229 
createFileManager()230 void CompilerInstance::createFileManager() {
231   if (!hasVirtualFileSystem()) {
232     // TODO: choose the virtual file system based on the CompilerInvocation.
233     setVirtualFileSystem(vfs::getRealFileSystem());
234   }
235   FileMgr = new FileManager(getFileSystemOpts(), VirtualFileSystem);
236 }
237 
238 // Source Manager
239 
createSourceManager(FileManager & FileMgr)240 void CompilerInstance::createSourceManager(FileManager &FileMgr) {
241   SourceMgr = new SourceManager(getDiagnostics(), FileMgr);
242 }
243 
244 // Initialize the remapping of files to alternative contents, e.g.,
245 // those specified through other files.
InitializeFileRemapping(DiagnosticsEngine & Diags,SourceManager & SourceMgr,FileManager & FileMgr,const PreprocessorOptions & InitOpts)246 static void InitializeFileRemapping(DiagnosticsEngine &Diags,
247                                     SourceManager &SourceMgr,
248                                     FileManager &FileMgr,
249                                     const PreprocessorOptions &InitOpts) {
250   // Remap files in the source manager (with buffers).
251   for (const auto &RB : InitOpts.RemappedFileBuffers) {
252     // Create the file entry for the file that we're mapping from.
253     const FileEntry *FromFile =
254         FileMgr.getVirtualFile(RB.first, RB.second->getBufferSize(), 0);
255     if (!FromFile) {
256       Diags.Report(diag::err_fe_remap_missing_from_file) << RB.first;
257       if (!InitOpts.RetainRemappedFileBuffers)
258         delete RB.second;
259       continue;
260     }
261 
262     // Override the contents of the "from" file with the contents of
263     // the "to" file.
264     SourceMgr.overrideFileContents(FromFile, RB.second,
265                                    InitOpts.RetainRemappedFileBuffers);
266   }
267 
268   // Remap files in the source manager (with other files).
269   for (const auto &RF : InitOpts.RemappedFiles) {
270     // Find the file that we're mapping to.
271     const FileEntry *ToFile = FileMgr.getFile(RF.second);
272     if (!ToFile) {
273       Diags.Report(diag::err_fe_remap_missing_to_file) << RF.first << RF.second;
274       continue;
275     }
276 
277     // Create the file entry for the file that we're mapping from.
278     const FileEntry *FromFile =
279         FileMgr.getVirtualFile(RF.first, ToFile->getSize(), 0);
280     if (!FromFile) {
281       Diags.Report(diag::err_fe_remap_missing_from_file) << RF.first;
282       continue;
283     }
284 
285     // Override the contents of the "from" file with the contents of
286     // the "to" file.
287     SourceMgr.overrideFileContents(FromFile, ToFile);
288   }
289 
290   SourceMgr.setOverridenFilesKeepOriginalName(
291       InitOpts.RemappedFilesKeepOriginalName);
292 }
293 
294 // Preprocessor
295 
createPreprocessor(TranslationUnitKind TUKind)296 void CompilerInstance::createPreprocessor(TranslationUnitKind TUKind) {
297   const PreprocessorOptions &PPOpts = getPreprocessorOpts();
298 
299   // Create a PTH manager if we are using some form of a token cache.
300   PTHManager *PTHMgr = nullptr;
301   if (!PPOpts.TokenCache.empty())
302     PTHMgr = PTHManager::Create(PPOpts.TokenCache, getDiagnostics());
303 
304   // Create the Preprocessor.
305   HeaderSearch *HeaderInfo = new HeaderSearch(&getHeaderSearchOpts(),
306                                               getSourceManager(),
307                                               getDiagnostics(),
308                                               getLangOpts(),
309                                               &getTarget());
310   PP = new Preprocessor(&getPreprocessorOpts(), getDiagnostics(), getLangOpts(),
311                         getSourceManager(), *HeaderInfo, *this, PTHMgr,
312                         /*OwnsHeaderSearch=*/true, TUKind);
313   PP->Initialize(getTarget(), getAuxTarget());
314 
315   // Note that this is different then passing PTHMgr to Preprocessor's ctor.
316   // That argument is used as the IdentifierInfoLookup argument to
317   // IdentifierTable's ctor.
318   if (PTHMgr) {
319     PTHMgr->setPreprocessor(&*PP);
320     PP->setPTHManager(PTHMgr);
321   }
322 
323   if (PPOpts.DetailedRecord)
324     PP->createPreprocessingRecord();
325 
326   // Apply remappings to the source manager.
327   InitializeFileRemapping(PP->getDiagnostics(), PP->getSourceManager(),
328                           PP->getFileManager(), PPOpts);
329 
330   // Predefine macros and configure the preprocessor.
331   InitializePreprocessor(*PP, PPOpts, getPCHContainerReader(),
332                          getFrontendOpts());
333 
334   // Initialize the header search object.
335   ApplyHeaderSearchOptions(PP->getHeaderSearchInfo(), getHeaderSearchOpts(),
336                            PP->getLangOpts(), PP->getTargetInfo().getTriple());
337 
338   PP->setPreprocessedOutput(getPreprocessorOutputOpts().ShowCPP);
339 
340   if (PP->getLangOpts().Modules && PP->getLangOpts().ImplicitModules)
341     PP->getHeaderSearchInfo().setModuleCachePath(getSpecificModuleCachePath());
342 
343   // Handle generating dependencies, if requested.
344   const DependencyOutputOptions &DepOpts = getDependencyOutputOpts();
345   if (!DepOpts.OutputFile.empty())
346     TheDependencyFileGenerator.reset(
347         DependencyFileGenerator::CreateAndAttachToPreprocessor(*PP, DepOpts));
348   if (!DepOpts.DOTOutputFile.empty())
349     AttachDependencyGraphGen(*PP, DepOpts.DOTOutputFile,
350                              getHeaderSearchOpts().Sysroot);
351 
352   for (auto &Listener : DependencyCollectors)
353     Listener->attachToPreprocessor(*PP);
354 
355   // If we don't have a collector, but we are collecting module dependencies,
356   // then we're the top level compiler instance and need to create one.
357   if (!ModuleDepCollector && !DepOpts.ModuleDependencyOutputDir.empty())
358     ModuleDepCollector = std::make_shared<ModuleDependencyCollector>(
359         DepOpts.ModuleDependencyOutputDir);
360 
361   // Handle generating header include information, if requested.
362   if (DepOpts.ShowHeaderIncludes)
363     AttachHeaderIncludeGen(*PP, DepOpts.ExtraDeps);
364   if (!DepOpts.HeaderIncludeOutputFile.empty()) {
365     StringRef OutputPath = DepOpts.HeaderIncludeOutputFile;
366     if (OutputPath == "-")
367       OutputPath = "";
368     AttachHeaderIncludeGen(*PP, DepOpts.ExtraDeps,
369                            /*ShowAllHeaders=*/true, OutputPath,
370                            /*ShowDepth=*/false);
371   }
372 
373   if (DepOpts.PrintShowIncludes) {
374     AttachHeaderIncludeGen(*PP, DepOpts.ExtraDeps,
375                            /*ShowAllHeaders=*/false, /*OutputPath=*/"",
376                            /*ShowDepth=*/true, /*MSStyle=*/true);
377   }
378 }
379 
getSpecificModuleCachePath()380 std::string CompilerInstance::getSpecificModuleCachePath() {
381   // Set up the module path, including the hash for the
382   // module-creation options.
383   SmallString<256> SpecificModuleCache(getHeaderSearchOpts().ModuleCachePath);
384   if (!SpecificModuleCache.empty() && !getHeaderSearchOpts().DisableModuleHash)
385     llvm::sys::path::append(SpecificModuleCache,
386                             getInvocation().getModuleHash());
387   return SpecificModuleCache.str();
388 }
389 
390 // ASTContext
391 
createASTContext()392 void CompilerInstance::createASTContext() {
393   Preprocessor &PP = getPreprocessor();
394   auto *Context = new ASTContext(getLangOpts(), PP.getSourceManager(),
395                                  PP.getIdentifierTable(), PP.getSelectorTable(),
396                                  PP.getBuiltinInfo());
397   Context->InitBuiltinTypes(getTarget(), getAuxTarget());
398   setASTContext(Context);
399 }
400 
401 // ExternalASTSource
402 
createPCHExternalASTSource(StringRef Path,bool DisablePCHValidation,bool AllowPCHWithCompilerErrors,void * DeserializationListener,bool OwnDeserializationListener)403 void CompilerInstance::createPCHExternalASTSource(
404     StringRef Path, bool DisablePCHValidation, bool AllowPCHWithCompilerErrors,
405     void *DeserializationListener, bool OwnDeserializationListener) {
406   bool Preamble = getPreprocessorOpts().PrecompiledPreambleBytes.first != 0;
407   ModuleManager = createPCHExternalASTSource(
408       Path, getHeaderSearchOpts().Sysroot, DisablePCHValidation,
409       AllowPCHWithCompilerErrors, getPreprocessor(), getASTContext(),
410       getPCHContainerReader(),
411       getFrontendOpts().ModuleFileExtensions,
412       DeserializationListener,
413       OwnDeserializationListener, Preamble,
414       getFrontendOpts().UseGlobalModuleIndex);
415 }
416 
createPCHExternalASTSource(StringRef Path,StringRef Sysroot,bool DisablePCHValidation,bool AllowPCHWithCompilerErrors,Preprocessor & PP,ASTContext & Context,const PCHContainerReader & PCHContainerRdr,ArrayRef<IntrusiveRefCntPtr<ModuleFileExtension>> Extensions,void * DeserializationListener,bool OwnDeserializationListener,bool Preamble,bool UseGlobalModuleIndex)417 IntrusiveRefCntPtr<ASTReader> CompilerInstance::createPCHExternalASTSource(
418     StringRef Path, StringRef Sysroot, bool DisablePCHValidation,
419     bool AllowPCHWithCompilerErrors, Preprocessor &PP, ASTContext &Context,
420     const PCHContainerReader &PCHContainerRdr,
421     ArrayRef<IntrusiveRefCntPtr<ModuleFileExtension>> Extensions,
422     void *DeserializationListener, bool OwnDeserializationListener,
423     bool Preamble, bool UseGlobalModuleIndex) {
424   HeaderSearchOptions &HSOpts = PP.getHeaderSearchInfo().getHeaderSearchOpts();
425 
426   IntrusiveRefCntPtr<ASTReader> Reader(new ASTReader(
427       PP, Context, PCHContainerRdr, Extensions,
428       Sysroot.empty() ? "" : Sysroot.data(), DisablePCHValidation,
429       AllowPCHWithCompilerErrors, /*AllowConfigurationMismatch*/ false,
430       HSOpts.ModulesValidateSystemHeaders, UseGlobalModuleIndex));
431 
432   // We need the external source to be set up before we read the AST, because
433   // eagerly-deserialized declarations may use it.
434   Context.setExternalSource(Reader.get());
435 
436   Reader->setDeserializationListener(
437       static_cast<ASTDeserializationListener *>(DeserializationListener),
438       /*TakeOwnership=*/OwnDeserializationListener);
439   switch (Reader->ReadAST(Path,
440                           Preamble ? serialization::MK_Preamble
441                                    : serialization::MK_PCH,
442                           SourceLocation(),
443                           ASTReader::ARR_None)) {
444   case ASTReader::Success:
445     // Set the predefines buffer as suggested by the PCH reader. Typically, the
446     // predefines buffer will be empty.
447     PP.setPredefines(Reader->getSuggestedPredefines());
448     return Reader;
449 
450   case ASTReader::Failure:
451     // Unrecoverable failure: don't even try to process the input file.
452     break;
453 
454   case ASTReader::Missing:
455   case ASTReader::OutOfDate:
456   case ASTReader::VersionMismatch:
457   case ASTReader::ConfigurationMismatch:
458   case ASTReader::HadErrors:
459     // No suitable PCH file could be found. Return an error.
460     break;
461   }
462 
463   Context.setExternalSource(nullptr);
464   return nullptr;
465 }
466 
467 // Code Completion
468 
EnableCodeCompletion(Preprocessor & PP,const std::string & Filename,unsigned Line,unsigned Column)469 static bool EnableCodeCompletion(Preprocessor &PP,
470                                  const std::string &Filename,
471                                  unsigned Line,
472                                  unsigned Column) {
473   // Tell the source manager to chop off the given file at a specific
474   // line and column.
475   const FileEntry *Entry = PP.getFileManager().getFile(Filename);
476   if (!Entry) {
477     PP.getDiagnostics().Report(diag::err_fe_invalid_code_complete_file)
478       << Filename;
479     return true;
480   }
481 
482   // Truncate the named file at the given line/column.
483   PP.SetCodeCompletionPoint(Entry, Line, Column);
484   return false;
485 }
486 
createCodeCompletionConsumer()487 void CompilerInstance::createCodeCompletionConsumer() {
488   const ParsedSourceLocation &Loc = getFrontendOpts().CodeCompletionAt;
489   if (!CompletionConsumer) {
490     setCodeCompletionConsumer(
491       createCodeCompletionConsumer(getPreprocessor(),
492                                    Loc.FileName, Loc.Line, Loc.Column,
493                                    getFrontendOpts().CodeCompleteOpts,
494                                    llvm::outs()));
495     if (!CompletionConsumer)
496       return;
497   } else if (EnableCodeCompletion(getPreprocessor(), Loc.FileName,
498                                   Loc.Line, Loc.Column)) {
499     setCodeCompletionConsumer(nullptr);
500     return;
501   }
502 
503   if (CompletionConsumer->isOutputBinary() &&
504       llvm::sys::ChangeStdoutToBinary()) {
505     getPreprocessor().getDiagnostics().Report(diag::err_fe_stdout_binary);
506     setCodeCompletionConsumer(nullptr);
507   }
508 }
509 
createFrontendTimer()510 void CompilerInstance::createFrontendTimer() {
511   FrontendTimerGroup.reset(new llvm::TimerGroup("Clang front-end time report"));
512   FrontendTimer.reset(
513       new llvm::Timer("Clang front-end timer", *FrontendTimerGroup));
514 }
515 
516 CodeCompleteConsumer *
createCodeCompletionConsumer(Preprocessor & PP,StringRef Filename,unsigned Line,unsigned Column,const CodeCompleteOptions & Opts,raw_ostream & OS)517 CompilerInstance::createCodeCompletionConsumer(Preprocessor &PP,
518                                                StringRef Filename,
519                                                unsigned Line,
520                                                unsigned Column,
521                                                const CodeCompleteOptions &Opts,
522                                                raw_ostream &OS) {
523   if (EnableCodeCompletion(PP, Filename, Line, Column))
524     return nullptr;
525 
526   // Set up the creation routine for code-completion.
527   return new PrintingCodeCompleteConsumer(Opts, OS);
528 }
529 
createSema(TranslationUnitKind TUKind,CodeCompleteConsumer * CompletionConsumer)530 void CompilerInstance::createSema(TranslationUnitKind TUKind,
531                                   CodeCompleteConsumer *CompletionConsumer) {
532   TheSema.reset(new Sema(getPreprocessor(), getASTContext(), getASTConsumer(),
533                          TUKind, CompletionConsumer));
534 }
535 
536 // Output Files
537 
addOutputFile(OutputFile && OutFile)538 void CompilerInstance::addOutputFile(OutputFile &&OutFile) {
539   assert(OutFile.OS && "Attempt to add empty stream to output list!");
540   OutputFiles.push_back(std::move(OutFile));
541 }
542 
clearOutputFiles(bool EraseFiles)543 void CompilerInstance::clearOutputFiles(bool EraseFiles) {
544   for (OutputFile &OF : OutputFiles) {
545     // Manually close the stream before we rename it.
546     OF.OS.reset();
547 
548     if (!OF.TempFilename.empty()) {
549       if (EraseFiles) {
550         llvm::sys::fs::remove(OF.TempFilename);
551       } else {
552         SmallString<128> NewOutFile(OF.Filename);
553 
554         // If '-working-directory' was passed, the output filename should be
555         // relative to that.
556         FileMgr->FixupRelativePath(NewOutFile);
557         if (std::error_code ec =
558                 llvm::sys::fs::rename(OF.TempFilename, NewOutFile)) {
559           getDiagnostics().Report(diag::err_unable_to_rename_temp)
560             << OF.TempFilename << OF.Filename << ec.message();
561 
562           llvm::sys::fs::remove(OF.TempFilename);
563         }
564       }
565     } else if (!OF.Filename.empty() && EraseFiles)
566       llvm::sys::fs::remove(OF.Filename);
567 
568   }
569   OutputFiles.clear();
570   NonSeekStream.reset();
571 }
572 
573 raw_pwrite_stream *
createDefaultOutputFile(bool Binary,StringRef InFile,StringRef Extension)574 CompilerInstance::createDefaultOutputFile(bool Binary, StringRef InFile,
575                                           StringRef Extension) {
576   return createOutputFile(getFrontendOpts().OutputFile, Binary,
577                           /*RemoveFileOnSignal=*/true, InFile, Extension,
578                           /*UseTemporary=*/true);
579 }
580 
createNullOutputFile()581 llvm::raw_null_ostream *CompilerInstance::createNullOutputFile() {
582   auto OS = llvm::make_unique<llvm::raw_null_ostream>();
583   llvm::raw_null_ostream *Ret = OS.get();
584   addOutputFile(OutputFile("", "", std::move(OS)));
585   return Ret;
586 }
587 
588 raw_pwrite_stream *
createOutputFile(StringRef OutputPath,bool Binary,bool RemoveFileOnSignal,StringRef InFile,StringRef Extension,bool UseTemporary,bool CreateMissingDirectories)589 CompilerInstance::createOutputFile(StringRef OutputPath, bool Binary,
590                                    bool RemoveFileOnSignal, StringRef InFile,
591                                    StringRef Extension, bool UseTemporary,
592                                    bool CreateMissingDirectories) {
593   std::string OutputPathName, TempPathName;
594   std::error_code EC;
595   std::unique_ptr<raw_pwrite_stream> OS = createOutputFile(
596       OutputPath, EC, Binary, RemoveFileOnSignal, InFile, Extension,
597       UseTemporary, CreateMissingDirectories, &OutputPathName, &TempPathName);
598   if (!OS) {
599     getDiagnostics().Report(diag::err_fe_unable_to_open_output) << OutputPath
600                                                                 << EC.message();
601     return nullptr;
602   }
603 
604   raw_pwrite_stream *Ret = OS.get();
605   // Add the output file -- but don't try to remove "-", since this means we are
606   // using stdin.
607   addOutputFile(OutputFile((OutputPathName != "-") ? OutputPathName : "",
608                            TempPathName, std::move(OS)));
609 
610   return Ret;
611 }
612 
createOutputFile(StringRef OutputPath,std::error_code & Error,bool Binary,bool RemoveFileOnSignal,StringRef InFile,StringRef Extension,bool UseTemporary,bool CreateMissingDirectories,std::string * ResultPathName,std::string * TempPathName)613 std::unique_ptr<llvm::raw_pwrite_stream> CompilerInstance::createOutputFile(
614     StringRef OutputPath, std::error_code &Error, bool Binary,
615     bool RemoveFileOnSignal, StringRef InFile, StringRef Extension,
616     bool UseTemporary, bool CreateMissingDirectories,
617     std::string *ResultPathName, std::string *TempPathName) {
618   assert((!CreateMissingDirectories || UseTemporary) &&
619          "CreateMissingDirectories is only allowed when using temporary files");
620 
621   std::string OutFile, TempFile;
622   if (!OutputPath.empty()) {
623     OutFile = OutputPath;
624   } else if (InFile == "-") {
625     OutFile = "-";
626   } else if (!Extension.empty()) {
627     SmallString<128> Path(InFile);
628     llvm::sys::path::replace_extension(Path, Extension);
629     OutFile = Path.str();
630   } else {
631     OutFile = "-";
632   }
633 
634   std::unique_ptr<llvm::raw_fd_ostream> OS;
635   std::string OSFile;
636 
637   if (UseTemporary) {
638     if (OutFile == "-")
639       UseTemporary = false;
640     else {
641       llvm::sys::fs::file_status Status;
642       llvm::sys::fs::status(OutputPath, Status);
643       if (llvm::sys::fs::exists(Status)) {
644         // Fail early if we can't write to the final destination.
645         if (!llvm::sys::fs::can_write(OutputPath)) {
646           Error = make_error_code(llvm::errc::operation_not_permitted);
647           return nullptr;
648         }
649 
650         // Don't use a temporary if the output is a special file. This handles
651         // things like '-o /dev/null'
652         if (!llvm::sys::fs::is_regular_file(Status))
653           UseTemporary = false;
654       }
655     }
656   }
657 
658   if (UseTemporary) {
659     // Create a temporary file.
660     SmallString<128> TempPath;
661     TempPath = OutFile;
662     TempPath += "-%%%%%%%%";
663     int fd;
664     std::error_code EC =
665         llvm::sys::fs::createUniqueFile(TempPath, fd, TempPath);
666 
667     if (CreateMissingDirectories &&
668         EC == llvm::errc::no_such_file_or_directory) {
669       StringRef Parent = llvm::sys::path::parent_path(OutputPath);
670       EC = llvm::sys::fs::create_directories(Parent);
671       if (!EC) {
672         EC = llvm::sys::fs::createUniqueFile(TempPath, fd, TempPath);
673       }
674     }
675 
676     if (!EC) {
677       OS.reset(new llvm::raw_fd_ostream(fd, /*shouldClose=*/true));
678       OSFile = TempFile = TempPath.str();
679     }
680     // If we failed to create the temporary, fallback to writing to the file
681     // directly. This handles the corner case where we cannot write to the
682     // directory, but can write to the file.
683   }
684 
685   if (!OS) {
686     OSFile = OutFile;
687     OS.reset(new llvm::raw_fd_ostream(
688         OSFile, Error,
689         (Binary ? llvm::sys::fs::F_None : llvm::sys::fs::F_Text)));
690     if (Error)
691       return nullptr;
692   }
693 
694   // Make sure the out stream file gets removed if we crash.
695   if (RemoveFileOnSignal)
696     llvm::sys::RemoveFileOnSignal(OSFile);
697 
698   if (ResultPathName)
699     *ResultPathName = OutFile;
700   if (TempPathName)
701     *TempPathName = TempFile;
702 
703   if (!Binary || OS->supportsSeeking())
704     return std::move(OS);
705 
706   auto B = llvm::make_unique<llvm::buffer_ostream>(*OS);
707   assert(!NonSeekStream);
708   NonSeekStream = std::move(OS);
709   return std::move(B);
710 }
711 
712 // Initialization Utilities
713 
InitializeSourceManager(const FrontendInputFile & Input)714 bool CompilerInstance::InitializeSourceManager(const FrontendInputFile &Input){
715   return InitializeSourceManager(Input, getDiagnostics(),
716                                  getFileManager(), getSourceManager(),
717                                  getFrontendOpts());
718 }
719 
InitializeSourceManager(const FrontendInputFile & Input,DiagnosticsEngine & Diags,FileManager & FileMgr,SourceManager & SourceMgr,const FrontendOptions & Opts)720 bool CompilerInstance::InitializeSourceManager(const FrontendInputFile &Input,
721                                                DiagnosticsEngine &Diags,
722                                                FileManager &FileMgr,
723                                                SourceManager &SourceMgr,
724                                                const FrontendOptions &Opts) {
725   SrcMgr::CharacteristicKind
726     Kind = Input.isSystem() ? SrcMgr::C_System : SrcMgr::C_User;
727 
728   if (Input.isBuffer()) {
729     SourceMgr.setMainFileID(SourceMgr.createFileID(
730         std::unique_ptr<llvm::MemoryBuffer>(Input.getBuffer()), Kind));
731     assert(SourceMgr.getMainFileID().isValid() &&
732            "Couldn't establish MainFileID!");
733     return true;
734   }
735 
736   StringRef InputFile = Input.getFile();
737 
738   // Figure out where to get and map in the main file.
739   if (InputFile != "-") {
740     const FileEntry *File = FileMgr.getFile(InputFile, /*OpenFile=*/true);
741     if (!File) {
742       Diags.Report(diag::err_fe_error_reading) << InputFile;
743       return false;
744     }
745 
746     // The natural SourceManager infrastructure can't currently handle named
747     // pipes, but we would at least like to accept them for the main
748     // file. Detect them here, read them with the volatile flag so FileMgr will
749     // pick up the correct size, and simply override their contents as we do for
750     // STDIN.
751     if (File->isNamedPipe()) {
752       auto MB = FileMgr.getBufferForFile(File, /*isVolatile=*/true);
753       if (MB) {
754         // Create a new virtual file that will have the correct size.
755         File = FileMgr.getVirtualFile(InputFile, (*MB)->getBufferSize(), 0);
756         SourceMgr.overrideFileContents(File, std::move(*MB));
757       } else {
758         Diags.Report(diag::err_cannot_open_file) << InputFile
759                                                  << MB.getError().message();
760         return false;
761       }
762     }
763 
764     SourceMgr.setMainFileID(
765         SourceMgr.createFileID(File, SourceLocation(), Kind));
766   } else {
767     llvm::ErrorOr<std::unique_ptr<llvm::MemoryBuffer>> SBOrErr =
768         llvm::MemoryBuffer::getSTDIN();
769     if (std::error_code EC = SBOrErr.getError()) {
770       Diags.Report(diag::err_fe_error_reading_stdin) << EC.message();
771       return false;
772     }
773     std::unique_ptr<llvm::MemoryBuffer> SB = std::move(SBOrErr.get());
774 
775     const FileEntry *File = FileMgr.getVirtualFile(SB->getBufferIdentifier(),
776                                                    SB->getBufferSize(), 0);
777     SourceMgr.setMainFileID(
778         SourceMgr.createFileID(File, SourceLocation(), Kind));
779     SourceMgr.overrideFileContents(File, std::move(SB));
780   }
781 
782   assert(SourceMgr.getMainFileID().isValid() &&
783          "Couldn't establish MainFileID!");
784   return true;
785 }
786 
787 // High-Level Operations
788 
ExecuteAction(FrontendAction & Act)789 bool CompilerInstance::ExecuteAction(FrontendAction &Act) {
790   assert(hasDiagnostics() && "Diagnostics engine is not initialized!");
791   assert(!getFrontendOpts().ShowHelp && "Client must handle '-help'!");
792   assert(!getFrontendOpts().ShowVersion && "Client must handle '-version'!");
793 
794   // FIXME: Take this as an argument, once all the APIs we used have moved to
795   // taking it as an input instead of hard-coding llvm::errs.
796   raw_ostream &OS = llvm::errs();
797 
798   // Create the target instance.
799   setTarget(TargetInfo::CreateTargetInfo(getDiagnostics(),
800                                          getInvocation().TargetOpts));
801   if (!hasTarget())
802     return false;
803 
804   // Create TargetInfo for the other side of CUDA compilation.
805   if (getLangOpts().CUDA && !getFrontendOpts().AuxTriple.empty()) {
806     std::shared_ptr<TargetOptions> TO(new TargetOptions);
807     TO->Triple = getFrontendOpts().AuxTriple;
808     setAuxTarget(TargetInfo::CreateTargetInfo(getDiagnostics(), TO));
809   }
810 
811   // Inform the target of the language options.
812   //
813   // FIXME: We shouldn't need to do this, the target should be immutable once
814   // created. This complexity should be lifted elsewhere.
815   getTarget().adjust(getLangOpts());
816 
817   // rewriter project will change target built-in bool type from its default.
818   if (getFrontendOpts().ProgramAction == frontend::RewriteObjC)
819     getTarget().noSignedCharForObjCBool();
820 
821   // Validate/process some options.
822   if (getHeaderSearchOpts().Verbose)
823     OS << "clang -cc1 version " CLANG_VERSION_STRING
824        << " based upon " << BACKEND_PACKAGE_STRING
825        << " default target " << llvm::sys::getDefaultTargetTriple() << "\n";
826 
827   if (getFrontendOpts().ShowTimers)
828     createFrontendTimer();
829 
830   if (getFrontendOpts().ShowStats)
831     llvm::EnableStatistics();
832 
833   for (const FrontendInputFile &FIF : getFrontendOpts().Inputs) {
834     // Reset the ID tables if we are reusing the SourceManager and parsing
835     // regular files.
836     if (hasSourceManager() && !Act.isModelParsingAction())
837       getSourceManager().clearIDTables();
838 
839     if (Act.BeginSourceFile(*this, FIF)) {
840       Act.Execute();
841       Act.EndSourceFile();
842     }
843   }
844 
845   // Notify the diagnostic client that all files were processed.
846   getDiagnostics().getClient()->finish();
847 
848   if (getDiagnosticOpts().ShowCarets) {
849     // We can have multiple diagnostics sharing one diagnostic client.
850     // Get the total number of warnings/errors from the client.
851     unsigned NumWarnings = getDiagnostics().getClient()->getNumWarnings();
852     unsigned NumErrors = getDiagnostics().getClient()->getNumErrors();
853 
854     if (NumWarnings)
855       OS << NumWarnings << " warning" << (NumWarnings == 1 ? "" : "s");
856     if (NumWarnings && NumErrors)
857       OS << " and ";
858     if (NumErrors)
859       OS << NumErrors << " error" << (NumErrors == 1 ? "" : "s");
860     if (NumWarnings || NumErrors)
861       OS << " generated.\n";
862   }
863 
864   if (getFrontendOpts().ShowStats && hasFileManager()) {
865     getFileManager().PrintStats();
866     OS << "\n";
867   }
868 
869   return !getDiagnostics().getClient()->getNumErrors();
870 }
871 
872 /// \brief Determine the appropriate source input kind based on language
873 /// options.
getSourceInputKindFromOptions(const LangOptions & LangOpts)874 static InputKind getSourceInputKindFromOptions(const LangOptions &LangOpts) {
875   if (LangOpts.OpenCL)
876     return IK_OpenCL;
877   if (LangOpts.CUDA)
878     return IK_CUDA;
879   if (LangOpts.ObjC1)
880     return LangOpts.CPlusPlus? IK_ObjCXX : IK_ObjC;
881   return LangOpts.CPlusPlus? IK_CXX : IK_C;
882 }
883 
884 /// \brief Compile a module file for the given module, using the options
885 /// provided by the importing compiler instance. Returns true if the module
886 /// was built without errors.
compileModuleImpl(CompilerInstance & ImportingInstance,SourceLocation ImportLoc,Module * Module,StringRef ModuleFileName)887 static bool compileModuleImpl(CompilerInstance &ImportingInstance,
888                               SourceLocation ImportLoc,
889                               Module *Module,
890                               StringRef ModuleFileName) {
891   ModuleMap &ModMap
892     = ImportingInstance.getPreprocessor().getHeaderSearchInfo().getModuleMap();
893 
894   // Construct a compiler invocation for creating this module.
895   IntrusiveRefCntPtr<CompilerInvocation> Invocation
896     (new CompilerInvocation(ImportingInstance.getInvocation()));
897 
898   PreprocessorOptions &PPOpts = Invocation->getPreprocessorOpts();
899 
900   // For any options that aren't intended to affect how a module is built,
901   // reset them to their default values.
902   Invocation->getLangOpts()->resetNonModularOptions();
903   PPOpts.resetNonModularOptions();
904 
905   // Remove any macro definitions that are explicitly ignored by the module.
906   // They aren't supposed to affect how the module is built anyway.
907   const HeaderSearchOptions &HSOpts = Invocation->getHeaderSearchOpts();
908   PPOpts.Macros.erase(
909       std::remove_if(PPOpts.Macros.begin(), PPOpts.Macros.end(),
910                      [&HSOpts](const std::pair<std::string, bool> &def) {
911         StringRef MacroDef = def.first;
912         return HSOpts.ModulesIgnoreMacros.count(MacroDef.split('=').first) > 0;
913       }),
914       PPOpts.Macros.end());
915 
916   // Note the name of the module we're building.
917   Invocation->getLangOpts()->CurrentModule = Module->getTopLevelModuleName();
918 
919   // Make sure that the failed-module structure has been allocated in
920   // the importing instance, and propagate the pointer to the newly-created
921   // instance.
922   PreprocessorOptions &ImportingPPOpts
923     = ImportingInstance.getInvocation().getPreprocessorOpts();
924   if (!ImportingPPOpts.FailedModules)
925     ImportingPPOpts.FailedModules = new PreprocessorOptions::FailedModulesSet;
926   PPOpts.FailedModules = ImportingPPOpts.FailedModules;
927 
928   // If there is a module map file, build the module using the module map.
929   // Set up the inputs/outputs so that we build the module from its umbrella
930   // header.
931   FrontendOptions &FrontendOpts = Invocation->getFrontendOpts();
932   FrontendOpts.OutputFile = ModuleFileName.str();
933   FrontendOpts.DisableFree = false;
934   FrontendOpts.GenerateGlobalModuleIndex = false;
935   FrontendOpts.BuildingImplicitModule = true;
936   FrontendOpts.Inputs.clear();
937   InputKind IK = getSourceInputKindFromOptions(*Invocation->getLangOpts());
938 
939   // Don't free the remapped file buffers; they are owned by our caller.
940   PPOpts.RetainRemappedFileBuffers = true;
941 
942   Invocation->getDiagnosticOpts().VerifyDiagnostics = 0;
943   assert(ImportingInstance.getInvocation().getModuleHash() ==
944          Invocation->getModuleHash() && "Module hash mismatch!");
945 
946   // Construct a compiler instance that will be used to actually create the
947   // module.
948   CompilerInstance Instance(ImportingInstance.getPCHContainerOperations(),
949                             /*BuildingModule=*/true);
950   Instance.setInvocation(&*Invocation);
951 
952   Instance.createDiagnostics(new ForwardingDiagnosticConsumer(
953                                    ImportingInstance.getDiagnosticClient()),
954                              /*ShouldOwnClient=*/true);
955 
956   Instance.setVirtualFileSystem(&ImportingInstance.getVirtualFileSystem());
957 
958   // Note that this module is part of the module build stack, so that we
959   // can detect cycles in the module graph.
960   Instance.setFileManager(&ImportingInstance.getFileManager());
961   Instance.createSourceManager(Instance.getFileManager());
962   SourceManager &SourceMgr = Instance.getSourceManager();
963   SourceMgr.setModuleBuildStack(
964     ImportingInstance.getSourceManager().getModuleBuildStack());
965   SourceMgr.pushModuleBuildStack(Module->getTopLevelModuleName(),
966     FullSourceLoc(ImportLoc, ImportingInstance.getSourceManager()));
967 
968   // If we're collecting module dependencies, we need to share a collector
969   // between all of the module CompilerInstances. Other than that, we don't
970   // want to produce any dependency output from the module build.
971   Instance.setModuleDepCollector(ImportingInstance.getModuleDepCollector());
972   Invocation->getDependencyOutputOpts() = DependencyOutputOptions();
973 
974   // Get or create the module map that we'll use to build this module.
975   std::string InferredModuleMapContent;
976   if (const FileEntry *ModuleMapFile =
977           ModMap.getContainingModuleMapFile(Module)) {
978     // Use the module map where this module resides.
979     FrontendOpts.Inputs.emplace_back(ModuleMapFile->getName(), IK);
980   } else {
981     SmallString<128> FakeModuleMapFile(Module->Directory->getName());
982     llvm::sys::path::append(FakeModuleMapFile, "__inferred_module.map");
983     FrontendOpts.Inputs.emplace_back(FakeModuleMapFile, IK);
984 
985     llvm::raw_string_ostream OS(InferredModuleMapContent);
986     Module->print(OS);
987     OS.flush();
988 
989     std::unique_ptr<llvm::MemoryBuffer> ModuleMapBuffer =
990         llvm::MemoryBuffer::getMemBuffer(InferredModuleMapContent);
991     ModuleMapFile = Instance.getFileManager().getVirtualFile(
992         FakeModuleMapFile, InferredModuleMapContent.size(), 0);
993     SourceMgr.overrideFileContents(ModuleMapFile, std::move(ModuleMapBuffer));
994   }
995 
996   // Construct a module-generating action. Passing through the module map is
997   // safe because the FileManager is shared between the compiler instances.
998   GenerateModuleAction CreateModuleAction(
999       ModMap.getModuleMapFileForUniquing(Module), Module->IsSystem);
1000 
1001   ImportingInstance.getDiagnostics().Report(ImportLoc,
1002                                             diag::remark_module_build)
1003     << Module->Name << ModuleFileName;
1004 
1005   // Execute the action to actually build the module in-place. Use a separate
1006   // thread so that we get a stack large enough.
1007   const unsigned ThreadStackSize = 8 << 20;
1008   llvm::CrashRecoveryContext CRC;
1009   CRC.RunSafelyOnThread([&]() { Instance.ExecuteAction(CreateModuleAction); },
1010                         ThreadStackSize);
1011 
1012   ImportingInstance.getDiagnostics().Report(ImportLoc,
1013                                             diag::remark_module_build_done)
1014     << Module->Name;
1015 
1016   // Delete the temporary module map file.
1017   // FIXME: Even though we're executing under crash protection, it would still
1018   // be nice to do this with RemoveFileOnSignal when we can. However, that
1019   // doesn't make sense for all clients, so clean this up manually.
1020   Instance.clearOutputFiles(/*EraseFiles=*/true);
1021 
1022   // We've rebuilt a module. If we're allowed to generate or update the global
1023   // module index, record that fact in the importing compiler instance.
1024   if (ImportingInstance.getFrontendOpts().GenerateGlobalModuleIndex) {
1025     ImportingInstance.setBuildGlobalModuleIndex(true);
1026   }
1027 
1028   return !Instance.getDiagnostics().hasErrorOccurred();
1029 }
1030 
compileAndLoadModule(CompilerInstance & ImportingInstance,SourceLocation ImportLoc,SourceLocation ModuleNameLoc,Module * Module,StringRef ModuleFileName)1031 static bool compileAndLoadModule(CompilerInstance &ImportingInstance,
1032                                  SourceLocation ImportLoc,
1033                                  SourceLocation ModuleNameLoc, Module *Module,
1034                                  StringRef ModuleFileName) {
1035   DiagnosticsEngine &Diags = ImportingInstance.getDiagnostics();
1036 
1037   auto diagnoseBuildFailure = [&] {
1038     Diags.Report(ModuleNameLoc, diag::err_module_not_built)
1039         << Module->Name << SourceRange(ImportLoc, ModuleNameLoc);
1040   };
1041 
1042   // FIXME: have LockFileManager return an error_code so that we can
1043   // avoid the mkdir when the directory already exists.
1044   StringRef Dir = llvm::sys::path::parent_path(ModuleFileName);
1045   llvm::sys::fs::create_directories(Dir);
1046 
1047   while (1) {
1048     unsigned ModuleLoadCapabilities = ASTReader::ARR_Missing;
1049     llvm::LockFileManager Locked(ModuleFileName);
1050     switch (Locked) {
1051     case llvm::LockFileManager::LFS_Error:
1052       Diags.Report(ModuleNameLoc, diag::err_module_lock_failure)
1053           << Module->Name;
1054       return false;
1055 
1056     case llvm::LockFileManager::LFS_Owned:
1057       // We're responsible for building the module ourselves.
1058       if (!compileModuleImpl(ImportingInstance, ModuleNameLoc, Module,
1059                              ModuleFileName)) {
1060         diagnoseBuildFailure();
1061         return false;
1062       }
1063       break;
1064 
1065     case llvm::LockFileManager::LFS_Shared:
1066       // Someone else is responsible for building the module. Wait for them to
1067       // finish.
1068       switch (Locked.waitForUnlock()) {
1069       case llvm::LockFileManager::Res_Success:
1070         ModuleLoadCapabilities |= ASTReader::ARR_OutOfDate;
1071         break;
1072       case llvm::LockFileManager::Res_OwnerDied:
1073         continue; // try again to get the lock.
1074       case llvm::LockFileManager::Res_Timeout:
1075         Diags.Report(ModuleNameLoc, diag::err_module_lock_timeout)
1076             << Module->Name;
1077         // Clear the lock file so that future invokations can make progress.
1078         Locked.unsafeRemoveLockFile();
1079         return false;
1080       }
1081       break;
1082     }
1083 
1084     // Try to read the module file, now that we've compiled it.
1085     ASTReader::ASTReadResult ReadResult =
1086         ImportingInstance.getModuleManager()->ReadAST(
1087             ModuleFileName, serialization::MK_ImplicitModule, ImportLoc,
1088             ModuleLoadCapabilities);
1089 
1090     if (ReadResult == ASTReader::OutOfDate &&
1091         Locked == llvm::LockFileManager::LFS_Shared) {
1092       // The module may be out of date in the presence of file system races,
1093       // or if one of its imports depends on header search paths that are not
1094       // consistent with this ImportingInstance.  Try again...
1095       continue;
1096     } else if (ReadResult == ASTReader::Missing) {
1097       diagnoseBuildFailure();
1098     } else if (ReadResult != ASTReader::Success &&
1099                !Diags.hasErrorOccurred()) {
1100       // The ASTReader didn't diagnose the error, so conservatively report it.
1101       diagnoseBuildFailure();
1102     }
1103     return ReadResult == ASTReader::Success;
1104   }
1105 }
1106 
1107 /// \brief Diagnose differences between the current definition of the given
1108 /// configuration macro and the definition provided on the command line.
checkConfigMacro(Preprocessor & PP,StringRef ConfigMacro,Module * Mod,SourceLocation ImportLoc)1109 static void checkConfigMacro(Preprocessor &PP, StringRef ConfigMacro,
1110                              Module *Mod, SourceLocation ImportLoc) {
1111   IdentifierInfo *Id = PP.getIdentifierInfo(ConfigMacro);
1112   SourceManager &SourceMgr = PP.getSourceManager();
1113 
1114   // If this identifier has never had a macro definition, then it could
1115   // not have changed.
1116   if (!Id->hadMacroDefinition())
1117     return;
1118   auto *LatestLocalMD = PP.getLocalMacroDirectiveHistory(Id);
1119 
1120   // Find the macro definition from the command line.
1121   MacroInfo *CmdLineDefinition = nullptr;
1122   for (auto *MD = LatestLocalMD; MD; MD = MD->getPrevious()) {
1123     // We only care about the predefines buffer.
1124     FileID FID = SourceMgr.getFileID(MD->getLocation());
1125     if (FID.isInvalid() || FID != PP.getPredefinesFileID())
1126       continue;
1127     if (auto *DMD = dyn_cast<DefMacroDirective>(MD))
1128       CmdLineDefinition = DMD->getMacroInfo();
1129     break;
1130   }
1131 
1132   auto *CurrentDefinition = PP.getMacroInfo(Id);
1133   if (CurrentDefinition == CmdLineDefinition) {
1134     // Macro matches. Nothing to do.
1135   } else if (!CurrentDefinition) {
1136     // This macro was defined on the command line, then #undef'd later.
1137     // Complain.
1138     PP.Diag(ImportLoc, diag::warn_module_config_macro_undef)
1139       << true << ConfigMacro << Mod->getFullModuleName();
1140     auto LatestDef = LatestLocalMD->getDefinition();
1141     assert(LatestDef.isUndefined() &&
1142            "predefined macro went away with no #undef?");
1143     PP.Diag(LatestDef.getUndefLocation(), diag::note_module_def_undef_here)
1144       << true;
1145     return;
1146   } else if (!CmdLineDefinition) {
1147     // There was no definition for this macro in the predefines buffer,
1148     // but there was a local definition. Complain.
1149     PP.Diag(ImportLoc, diag::warn_module_config_macro_undef)
1150       << false << ConfigMacro << Mod->getFullModuleName();
1151     PP.Diag(CurrentDefinition->getDefinitionLoc(),
1152             diag::note_module_def_undef_here)
1153       << false;
1154   } else if (!CurrentDefinition->isIdenticalTo(*CmdLineDefinition, PP,
1155                                                /*Syntactically=*/true)) {
1156     // The macro definitions differ.
1157     PP.Diag(ImportLoc, diag::warn_module_config_macro_undef)
1158       << false << ConfigMacro << Mod->getFullModuleName();
1159     PP.Diag(CurrentDefinition->getDefinitionLoc(),
1160             diag::note_module_def_undef_here)
1161       << false;
1162   }
1163 }
1164 
1165 /// \brief Write a new timestamp file with the given path.
writeTimestampFile(StringRef TimestampFile)1166 static void writeTimestampFile(StringRef TimestampFile) {
1167   std::error_code EC;
1168   llvm::raw_fd_ostream Out(TimestampFile.str(), EC, llvm::sys::fs::F_None);
1169 }
1170 
1171 /// \brief Prune the module cache of modules that haven't been accessed in
1172 /// a long time.
pruneModuleCache(const HeaderSearchOptions & HSOpts)1173 static void pruneModuleCache(const HeaderSearchOptions &HSOpts) {
1174   struct stat StatBuf;
1175   llvm::SmallString<128> TimestampFile;
1176   TimestampFile = HSOpts.ModuleCachePath;
1177   assert(!TimestampFile.empty());
1178   llvm::sys::path::append(TimestampFile, "modules.timestamp");
1179 
1180   // Try to stat() the timestamp file.
1181   if (::stat(TimestampFile.c_str(), &StatBuf)) {
1182     // If the timestamp file wasn't there, create one now.
1183     if (errno == ENOENT) {
1184       writeTimestampFile(TimestampFile);
1185     }
1186     return;
1187   }
1188 
1189   // Check whether the time stamp is older than our pruning interval.
1190   // If not, do nothing.
1191   time_t TimeStampModTime = StatBuf.st_mtime;
1192   time_t CurrentTime = time(nullptr);
1193   if (CurrentTime - TimeStampModTime <= time_t(HSOpts.ModuleCachePruneInterval))
1194     return;
1195 
1196   // Write a new timestamp file so that nobody else attempts to prune.
1197   // There is a benign race condition here, if two Clang instances happen to
1198   // notice at the same time that the timestamp is out-of-date.
1199   writeTimestampFile(TimestampFile);
1200 
1201   // Walk the entire module cache, looking for unused module files and module
1202   // indices.
1203   std::error_code EC;
1204   SmallString<128> ModuleCachePathNative;
1205   llvm::sys::path::native(HSOpts.ModuleCachePath, ModuleCachePathNative);
1206   for (llvm::sys::fs::directory_iterator Dir(ModuleCachePathNative, EC), DirEnd;
1207        Dir != DirEnd && !EC; Dir.increment(EC)) {
1208     // If we don't have a directory, there's nothing to look into.
1209     if (!llvm::sys::fs::is_directory(Dir->path()))
1210       continue;
1211 
1212     // Walk all of the files within this directory.
1213     for (llvm::sys::fs::directory_iterator File(Dir->path(), EC), FileEnd;
1214          File != FileEnd && !EC; File.increment(EC)) {
1215       // We only care about module and global module index files.
1216       StringRef Extension = llvm::sys::path::extension(File->path());
1217       if (Extension != ".pcm" && Extension != ".timestamp" &&
1218           llvm::sys::path::filename(File->path()) != "modules.idx")
1219         continue;
1220 
1221       // Look at this file. If we can't stat it, there's nothing interesting
1222       // there.
1223       if (::stat(File->path().c_str(), &StatBuf))
1224         continue;
1225 
1226       // If the file has been used recently enough, leave it there.
1227       time_t FileAccessTime = StatBuf.st_atime;
1228       if (CurrentTime - FileAccessTime <=
1229               time_t(HSOpts.ModuleCachePruneAfter)) {
1230         continue;
1231       }
1232 
1233       // Remove the file.
1234       llvm::sys::fs::remove(File->path());
1235 
1236       // Remove the timestamp file.
1237       std::string TimpestampFilename = File->path() + ".timestamp";
1238       llvm::sys::fs::remove(TimpestampFilename);
1239     }
1240 
1241     // If we removed all of the files in the directory, remove the directory
1242     // itself.
1243     if (llvm::sys::fs::directory_iterator(Dir->path(), EC) ==
1244             llvm::sys::fs::directory_iterator() && !EC)
1245       llvm::sys::fs::remove(Dir->path());
1246   }
1247 }
1248 
createModuleManager()1249 void CompilerInstance::createModuleManager() {
1250   if (!ModuleManager) {
1251     if (!hasASTContext())
1252       createASTContext();
1253 
1254     // If we're implicitly building modules but not currently recursively
1255     // building a module, check whether we need to prune the module cache.
1256     if (getSourceManager().getModuleBuildStack().empty() &&
1257         !getPreprocessor().getHeaderSearchInfo().getModuleCachePath().empty() &&
1258         getHeaderSearchOpts().ModuleCachePruneInterval > 0 &&
1259         getHeaderSearchOpts().ModuleCachePruneAfter > 0) {
1260       pruneModuleCache(getHeaderSearchOpts());
1261     }
1262 
1263     HeaderSearchOptions &HSOpts = getHeaderSearchOpts();
1264     std::string Sysroot = HSOpts.Sysroot;
1265     const PreprocessorOptions &PPOpts = getPreprocessorOpts();
1266     std::unique_ptr<llvm::Timer> ReadTimer;
1267     if (FrontendTimerGroup)
1268       ReadTimer = llvm::make_unique<llvm::Timer>("Reading modules",
1269                                                  *FrontendTimerGroup);
1270     ModuleManager = new ASTReader(
1271         getPreprocessor(), getASTContext(), getPCHContainerReader(),
1272         getFrontendOpts().ModuleFileExtensions,
1273         Sysroot.empty() ? "" : Sysroot.c_str(), PPOpts.DisablePCHValidation,
1274         /*AllowASTWithCompilerErrors=*/false,
1275         /*AllowConfigurationMismatch=*/false,
1276         HSOpts.ModulesValidateSystemHeaders,
1277         getFrontendOpts().UseGlobalModuleIndex,
1278         std::move(ReadTimer));
1279     if (hasASTConsumer()) {
1280       ModuleManager->setDeserializationListener(
1281         getASTConsumer().GetASTDeserializationListener());
1282       getASTContext().setASTMutationListener(
1283         getASTConsumer().GetASTMutationListener());
1284     }
1285     getASTContext().setExternalSource(ModuleManager);
1286     if (hasSema())
1287       ModuleManager->InitializeSema(getSema());
1288     if (hasASTConsumer())
1289       ModuleManager->StartTranslationUnit(&getASTConsumer());
1290 
1291     if (TheDependencyFileGenerator)
1292       TheDependencyFileGenerator->AttachToASTReader(*ModuleManager);
1293     if (ModuleDepCollector)
1294       ModuleDepCollector->attachToASTReader(*ModuleManager);
1295     for (auto &Listener : DependencyCollectors)
1296       Listener->attachToASTReader(*ModuleManager);
1297   }
1298 }
1299 
loadModuleFile(StringRef FileName)1300 bool CompilerInstance::loadModuleFile(StringRef FileName) {
1301   llvm::Timer Timer;
1302   if (FrontendTimerGroup)
1303     Timer.init("Preloading " + FileName.str(), *FrontendTimerGroup);
1304   llvm::TimeRegion TimeLoading(FrontendTimerGroup ? &Timer : nullptr);
1305 
1306   // Helper to recursively read the module names for all modules we're adding.
1307   // We mark these as known and redirect any attempt to load that module to
1308   // the files we were handed.
1309   struct ReadModuleNames : ASTReaderListener {
1310     CompilerInstance &CI;
1311     llvm::SmallVector<IdentifierInfo*, 8> LoadedModules;
1312 
1313     ReadModuleNames(CompilerInstance &CI) : CI(CI) {}
1314 
1315     void ReadModuleName(StringRef ModuleName) override {
1316       LoadedModules.push_back(
1317           CI.getPreprocessor().getIdentifierInfo(ModuleName));
1318     }
1319 
1320     void registerAll() {
1321       for (auto *II : LoadedModules) {
1322         CI.KnownModules[II] = CI.getPreprocessor()
1323                                   .getHeaderSearchInfo()
1324                                   .getModuleMap()
1325                                   .findModule(II->getName());
1326       }
1327       LoadedModules.clear();
1328     }
1329 
1330     void markAllUnavailable() {
1331       for (auto *II : LoadedModules) {
1332         if (Module *M = CI.getPreprocessor()
1333                             .getHeaderSearchInfo()
1334                             .getModuleMap()
1335                             .findModule(II->getName()))
1336           M->HasIncompatibleModuleFile = true;
1337       }
1338       LoadedModules.clear();
1339     }
1340   };
1341 
1342   // If we don't already have an ASTReader, create one now.
1343   if (!ModuleManager)
1344     createModuleManager();
1345 
1346   auto Listener = llvm::make_unique<ReadModuleNames>(*this);
1347   auto &ListenerRef = *Listener;
1348   ASTReader::ListenerScope ReadModuleNamesListener(*ModuleManager,
1349                                                    std::move(Listener));
1350 
1351   // Try to load the module file.
1352   switch (ModuleManager->ReadAST(FileName, serialization::MK_ExplicitModule,
1353                                  SourceLocation(),
1354                                  ASTReader::ARR_ConfigurationMismatch)) {
1355   case ASTReader::Success:
1356     // We successfully loaded the module file; remember the set of provided
1357     // modules so that we don't try to load implicit modules for them.
1358     ListenerRef.registerAll();
1359     return true;
1360 
1361   case ASTReader::ConfigurationMismatch:
1362     // Ignore unusable module files.
1363     getDiagnostics().Report(SourceLocation(), diag::warn_module_config_mismatch)
1364         << FileName;
1365     // All modules provided by any files we tried and failed to load are now
1366     // unavailable; includes of those modules should now be handled textually.
1367     ListenerRef.markAllUnavailable();
1368     return true;
1369 
1370   default:
1371     return false;
1372   }
1373 }
1374 
1375 ModuleLoadResult
loadModule(SourceLocation ImportLoc,ModuleIdPath Path,Module::NameVisibilityKind Visibility,bool IsInclusionDirective)1376 CompilerInstance::loadModule(SourceLocation ImportLoc,
1377                              ModuleIdPath Path,
1378                              Module::NameVisibilityKind Visibility,
1379                              bool IsInclusionDirective) {
1380   // Determine what file we're searching from.
1381   StringRef ModuleName = Path[0].first->getName();
1382   SourceLocation ModuleNameLoc = Path[0].second;
1383 
1384   // If we've already handled this import, just return the cached result.
1385   // This one-element cache is important to eliminate redundant diagnostics
1386   // when both the preprocessor and parser see the same import declaration.
1387   if (ImportLoc.isValid() && LastModuleImportLoc == ImportLoc) {
1388     // Make the named module visible.
1389     if (LastModuleImportResult && ModuleName != getLangOpts().CurrentModule &&
1390         ModuleName != getLangOpts().ImplementationOfModule)
1391       ModuleManager->makeModuleVisible(LastModuleImportResult, Visibility,
1392                                        ImportLoc);
1393     return LastModuleImportResult;
1394   }
1395 
1396   clang::Module *Module = nullptr;
1397 
1398   // If we don't already have information on this module, load the module now.
1399   llvm::DenseMap<const IdentifierInfo *, clang::Module *>::iterator Known
1400     = KnownModules.find(Path[0].first);
1401   if (Known != KnownModules.end()) {
1402     // Retrieve the cached top-level module.
1403     Module = Known->second;
1404   } else if (ModuleName == getLangOpts().CurrentModule ||
1405              ModuleName == getLangOpts().ImplementationOfModule) {
1406     // This is the module we're building.
1407     Module = PP->getHeaderSearchInfo().lookupModule(ModuleName);
1408     Known = KnownModules.insert(std::make_pair(Path[0].first, Module)).first;
1409   } else {
1410     // Search for a module with the given name.
1411     Module = PP->getHeaderSearchInfo().lookupModule(ModuleName);
1412     if (!Module) {
1413       getDiagnostics().Report(ModuleNameLoc, diag::err_module_not_found)
1414       << ModuleName
1415       << SourceRange(ImportLoc, ModuleNameLoc);
1416       ModuleBuildFailed = true;
1417       return ModuleLoadResult();
1418     }
1419 
1420     std::string ModuleFileName =
1421         PP->getHeaderSearchInfo().getModuleFileName(Module);
1422     if (ModuleFileName.empty()) {
1423       if (Module->HasIncompatibleModuleFile) {
1424         // We tried and failed to load a module file for this module. Fall
1425         // back to textual inclusion for its headers.
1426         return ModuleLoadResult(nullptr, /*missingExpected*/true);
1427       }
1428 
1429       getDiagnostics().Report(ModuleNameLoc, diag::err_module_build_disabled)
1430           << ModuleName;
1431       ModuleBuildFailed = true;
1432       return ModuleLoadResult();
1433     }
1434 
1435     // If we don't already have an ASTReader, create one now.
1436     if (!ModuleManager)
1437       createModuleManager();
1438 
1439     llvm::Timer Timer;
1440     if (FrontendTimerGroup)
1441       Timer.init("Loading " + ModuleFileName, *FrontendTimerGroup);
1442     llvm::TimeRegion TimeLoading(FrontendTimerGroup ? &Timer : nullptr);
1443 
1444     // Try to load the module file.
1445     unsigned ARRFlags = ASTReader::ARR_OutOfDate | ASTReader::ARR_Missing;
1446     switch (ModuleManager->ReadAST(ModuleFileName,
1447                                    serialization::MK_ImplicitModule,
1448                                    ImportLoc, ARRFlags)) {
1449     case ASTReader::Success:
1450       break;
1451 
1452     case ASTReader::OutOfDate:
1453     case ASTReader::Missing: {
1454       // The module file is missing or out-of-date. Build it.
1455       assert(Module && "missing module file");
1456       // Check whether there is a cycle in the module graph.
1457       ModuleBuildStack ModPath = getSourceManager().getModuleBuildStack();
1458       ModuleBuildStack::iterator Pos = ModPath.begin(), PosEnd = ModPath.end();
1459       for (; Pos != PosEnd; ++Pos) {
1460         if (Pos->first == ModuleName)
1461           break;
1462       }
1463 
1464       if (Pos != PosEnd) {
1465         SmallString<256> CyclePath;
1466         for (; Pos != PosEnd; ++Pos) {
1467           CyclePath += Pos->first;
1468           CyclePath += " -> ";
1469         }
1470         CyclePath += ModuleName;
1471 
1472         getDiagnostics().Report(ModuleNameLoc, diag::err_module_cycle)
1473           << ModuleName << CyclePath;
1474         return ModuleLoadResult();
1475       }
1476 
1477       // Check whether we have already attempted to build this module (but
1478       // failed).
1479       if (getPreprocessorOpts().FailedModules &&
1480           getPreprocessorOpts().FailedModules->hasAlreadyFailed(ModuleName)) {
1481         getDiagnostics().Report(ModuleNameLoc, diag::err_module_not_built)
1482           << ModuleName
1483           << SourceRange(ImportLoc, ModuleNameLoc);
1484         ModuleBuildFailed = true;
1485         return ModuleLoadResult();
1486       }
1487 
1488       // Try to compile and then load the module.
1489       if (!compileAndLoadModule(*this, ImportLoc, ModuleNameLoc, Module,
1490                                 ModuleFileName)) {
1491         assert(getDiagnostics().hasErrorOccurred() &&
1492                "undiagnosed error in compileAndLoadModule");
1493         if (getPreprocessorOpts().FailedModules)
1494           getPreprocessorOpts().FailedModules->addFailed(ModuleName);
1495         KnownModules[Path[0].first] = nullptr;
1496         ModuleBuildFailed = true;
1497         return ModuleLoadResult();
1498       }
1499 
1500       // Okay, we've rebuilt and now loaded the module.
1501       break;
1502     }
1503 
1504     case ASTReader::VersionMismatch:
1505     case ASTReader::ConfigurationMismatch:
1506     case ASTReader::HadErrors:
1507       ModuleLoader::HadFatalFailure = true;
1508       // FIXME: The ASTReader will already have complained, but can we shoehorn
1509       // that diagnostic information into a more useful form?
1510       KnownModules[Path[0].first] = nullptr;
1511       return ModuleLoadResult();
1512 
1513     case ASTReader::Failure:
1514       ModuleLoader::HadFatalFailure = true;
1515       // Already complained, but note now that we failed.
1516       KnownModules[Path[0].first] = nullptr;
1517       ModuleBuildFailed = true;
1518       return ModuleLoadResult();
1519     }
1520 
1521     // Cache the result of this top-level module lookup for later.
1522     Known = KnownModules.insert(std::make_pair(Path[0].first, Module)).first;
1523   }
1524 
1525   // If we never found the module, fail.
1526   if (!Module)
1527     return ModuleLoadResult();
1528 
1529   // Verify that the rest of the module path actually corresponds to
1530   // a submodule.
1531   if (Path.size() > 1) {
1532     for (unsigned I = 1, N = Path.size(); I != N; ++I) {
1533       StringRef Name = Path[I].first->getName();
1534       clang::Module *Sub = Module->findSubmodule(Name);
1535 
1536       if (!Sub) {
1537         // Attempt to perform typo correction to find a module name that works.
1538         SmallVector<StringRef, 2> Best;
1539         unsigned BestEditDistance = (std::numeric_limits<unsigned>::max)();
1540 
1541         for (clang::Module::submodule_iterator J = Module->submodule_begin(),
1542                                             JEnd = Module->submodule_end();
1543              J != JEnd; ++J) {
1544           unsigned ED = Name.edit_distance((*J)->Name,
1545                                            /*AllowReplacements=*/true,
1546                                            BestEditDistance);
1547           if (ED <= BestEditDistance) {
1548             if (ED < BestEditDistance) {
1549               Best.clear();
1550               BestEditDistance = ED;
1551             }
1552 
1553             Best.push_back((*J)->Name);
1554           }
1555         }
1556 
1557         // If there was a clear winner, user it.
1558         if (Best.size() == 1) {
1559           getDiagnostics().Report(Path[I].second,
1560                                   diag::err_no_submodule_suggest)
1561             << Path[I].first << Module->getFullModuleName() << Best[0]
1562             << SourceRange(Path[0].second, Path[I-1].second)
1563             << FixItHint::CreateReplacement(SourceRange(Path[I].second),
1564                                             Best[0]);
1565 
1566           Sub = Module->findSubmodule(Best[0]);
1567         }
1568       }
1569 
1570       if (!Sub) {
1571         // No submodule by this name. Complain, and don't look for further
1572         // submodules.
1573         getDiagnostics().Report(Path[I].second, diag::err_no_submodule)
1574           << Path[I].first << Module->getFullModuleName()
1575           << SourceRange(Path[0].second, Path[I-1].second);
1576         break;
1577       }
1578 
1579       Module = Sub;
1580     }
1581   }
1582 
1583   // Don't make the module visible if we are in the implementation.
1584   if (ModuleName == getLangOpts().ImplementationOfModule)
1585     return ModuleLoadResult(Module, false);
1586 
1587   // Make the named module visible, if it's not already part of the module
1588   // we are parsing.
1589   if (ModuleName != getLangOpts().CurrentModule) {
1590     if (!Module->IsFromModuleFile) {
1591       // We have an umbrella header or directory that doesn't actually include
1592       // all of the headers within the directory it covers. Complain about
1593       // this missing submodule and recover by forgetting that we ever saw
1594       // this submodule.
1595       // FIXME: Should we detect this at module load time? It seems fairly
1596       // expensive (and rare).
1597       getDiagnostics().Report(ImportLoc, diag::warn_missing_submodule)
1598         << Module->getFullModuleName()
1599         << SourceRange(Path.front().second, Path.back().second);
1600 
1601       return ModuleLoadResult(nullptr, true);
1602     }
1603 
1604     // Check whether this module is available.
1605     clang::Module::Requirement Requirement;
1606     clang::Module::UnresolvedHeaderDirective MissingHeader;
1607     if (!Module->isAvailable(getLangOpts(), getTarget(), Requirement,
1608                              MissingHeader)) {
1609       if (MissingHeader.FileNameLoc.isValid()) {
1610         getDiagnostics().Report(MissingHeader.FileNameLoc,
1611                                 diag::err_module_header_missing)
1612           << MissingHeader.IsUmbrella << MissingHeader.FileName;
1613       } else {
1614         getDiagnostics().Report(ImportLoc, diag::err_module_unavailable)
1615           << Module->getFullModuleName()
1616           << Requirement.second << Requirement.first
1617           << SourceRange(Path.front().second, Path.back().second);
1618       }
1619       LastModuleImportLoc = ImportLoc;
1620       LastModuleImportResult = ModuleLoadResult();
1621       return ModuleLoadResult();
1622     }
1623 
1624     ModuleManager->makeModuleVisible(Module, Visibility, ImportLoc);
1625   }
1626 
1627   // Check for any configuration macros that have changed.
1628   clang::Module *TopModule = Module->getTopLevelModule();
1629   for (unsigned I = 0, N = TopModule->ConfigMacros.size(); I != N; ++I) {
1630     checkConfigMacro(getPreprocessor(), TopModule->ConfigMacros[I],
1631                      Module, ImportLoc);
1632   }
1633 
1634   LastModuleImportLoc = ImportLoc;
1635   LastModuleImportResult = ModuleLoadResult(Module, false);
1636   return LastModuleImportResult;
1637 }
1638 
makeModuleVisible(Module * Mod,Module::NameVisibilityKind Visibility,SourceLocation ImportLoc)1639 void CompilerInstance::makeModuleVisible(Module *Mod,
1640                                          Module::NameVisibilityKind Visibility,
1641                                          SourceLocation ImportLoc) {
1642   if (!ModuleManager)
1643     createModuleManager();
1644   if (!ModuleManager)
1645     return;
1646 
1647   ModuleManager->makeModuleVisible(Mod, Visibility, ImportLoc);
1648 }
1649 
loadGlobalModuleIndex(SourceLocation TriggerLoc)1650 GlobalModuleIndex *CompilerInstance::loadGlobalModuleIndex(
1651     SourceLocation TriggerLoc) {
1652   if (getPreprocessor().getHeaderSearchInfo().getModuleCachePath().empty())
1653     return nullptr;
1654   if (!ModuleManager)
1655     createModuleManager();
1656   // Can't do anything if we don't have the module manager.
1657   if (!ModuleManager)
1658     return nullptr;
1659   // Get an existing global index.  This loads it if not already
1660   // loaded.
1661   ModuleManager->loadGlobalIndex();
1662   GlobalModuleIndex *GlobalIndex = ModuleManager->getGlobalIndex();
1663   // If the global index doesn't exist, create it.
1664   if (!GlobalIndex && shouldBuildGlobalModuleIndex() && hasFileManager() &&
1665       hasPreprocessor()) {
1666     llvm::sys::fs::create_directories(
1667       getPreprocessor().getHeaderSearchInfo().getModuleCachePath());
1668     GlobalModuleIndex::writeIndex(
1669         getFileManager(), getPCHContainerReader(),
1670         getPreprocessor().getHeaderSearchInfo().getModuleCachePath());
1671     ModuleManager->resetForReload();
1672     ModuleManager->loadGlobalIndex();
1673     GlobalIndex = ModuleManager->getGlobalIndex();
1674   }
1675   // For finding modules needing to be imported for fixit messages,
1676   // we need to make the global index cover all modules, so we do that here.
1677   if (!HaveFullGlobalModuleIndex && GlobalIndex && !buildingModule()) {
1678     ModuleMap &MMap = getPreprocessor().getHeaderSearchInfo().getModuleMap();
1679     bool RecreateIndex = false;
1680     for (ModuleMap::module_iterator I = MMap.module_begin(),
1681         E = MMap.module_end(); I != E; ++I) {
1682       Module *TheModule = I->second;
1683       const FileEntry *Entry = TheModule->getASTFile();
1684       if (!Entry) {
1685         SmallVector<std::pair<IdentifierInfo *, SourceLocation>, 2> Path;
1686         Path.push_back(std::make_pair(
1687             getPreprocessor().getIdentifierInfo(TheModule->Name), TriggerLoc));
1688         std::reverse(Path.begin(), Path.end());
1689         // Load a module as hidden.  This also adds it to the global index.
1690         loadModule(TheModule->DefinitionLoc, Path, Module::Hidden, false);
1691         RecreateIndex = true;
1692       }
1693     }
1694     if (RecreateIndex) {
1695       GlobalModuleIndex::writeIndex(
1696           getFileManager(), getPCHContainerReader(),
1697           getPreprocessor().getHeaderSearchInfo().getModuleCachePath());
1698       ModuleManager->resetForReload();
1699       ModuleManager->loadGlobalIndex();
1700       GlobalIndex = ModuleManager->getGlobalIndex();
1701     }
1702     HaveFullGlobalModuleIndex = true;
1703   }
1704   return GlobalIndex;
1705 }
1706 
1707 // Check global module index for missing imports.
1708 bool
lookupMissingImports(StringRef Name,SourceLocation TriggerLoc)1709 CompilerInstance::lookupMissingImports(StringRef Name,
1710                                        SourceLocation TriggerLoc) {
1711   // Look for the symbol in non-imported modules, but only if an error
1712   // actually occurred.
1713   if (!buildingModule()) {
1714     // Load global module index, or retrieve a previously loaded one.
1715     GlobalModuleIndex *GlobalIndex = loadGlobalModuleIndex(
1716       TriggerLoc);
1717 
1718     // Only if we have a global index.
1719     if (GlobalIndex) {
1720       GlobalModuleIndex::HitSet FoundModules;
1721 
1722       // Find the modules that reference the identifier.
1723       // Note that this only finds top-level modules.
1724       // We'll let diagnoseTypo find the actual declaration module.
1725       if (GlobalIndex->lookupIdentifier(Name, FoundModules))
1726         return true;
1727     }
1728   }
1729 
1730   return false;
1731 }
resetAndLeakSema()1732 void CompilerInstance::resetAndLeakSema() { BuryPointer(takeSema()); }
1733