1 //===--- FrontendAction.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/FrontendAction.h"
11 #include "clang/AST/ASTConsumer.h"
12 #include "clang/AST/ASTContext.h"
13 #include "clang/AST/DeclGroup.h"
14 #include "clang/Frontend/ASTUnit.h"
15 #include "clang/Frontend/CompilerInstance.h"
16 #include "clang/Frontend/FrontendDiagnostic.h"
17 #include "clang/Frontend/FrontendPluginRegistry.h"
18 #include "clang/Frontend/LayoutOverrideSource.h"
19 #include "clang/Frontend/MultiplexConsumer.h"
20 #include "clang/Frontend/Utils.h"
21 #include "clang/Lex/HeaderSearch.h"
22 #include "clang/Lex/LiteralSupport.h"
23 #include "clang/Lex/Preprocessor.h"
24 #include "clang/Lex/PreprocessorOptions.h"
25 #include "clang/Parse/ParseAST.h"
26 #include "clang/Serialization/ASTDeserializationListener.h"
27 #include "clang/Serialization/ASTReader.h"
28 #include "clang/Serialization/GlobalModuleIndex.h"
29 #include "llvm/Support/ErrorHandling.h"
30 #include "llvm/Support/FileSystem.h"
31 #include "llvm/Support/Path.h"
32 #include "llvm/Support/Timer.h"
33 #include "llvm/Support/raw_ostream.h"
34 #include <system_error>
35 using namespace clang;
36 
37 LLVM_INSTANTIATE_REGISTRY(FrontendPluginRegistry)
38 
39 namespace {
40 
41 class DelegatingDeserializationListener : public ASTDeserializationListener {
42   ASTDeserializationListener *Previous;
43   bool DeletePrevious;
44 
45 public:
46   explicit DelegatingDeserializationListener(
47       ASTDeserializationListener *Previous, bool DeletePrevious)
48       : Previous(Previous), DeletePrevious(DeletePrevious) {}
49   ~DelegatingDeserializationListener() override {
50     if (DeletePrevious)
51       delete Previous;
52   }
53 
54   void ReaderInitialized(ASTReader *Reader) override {
55     if (Previous)
56       Previous->ReaderInitialized(Reader);
57   }
58   void IdentifierRead(serialization::IdentID ID,
59                       IdentifierInfo *II) override {
60     if (Previous)
61       Previous->IdentifierRead(ID, II);
62   }
63   void TypeRead(serialization::TypeIdx Idx, QualType T) override {
64     if (Previous)
65       Previous->TypeRead(Idx, T);
66   }
67   void DeclRead(serialization::DeclID ID, const Decl *D) override {
68     if (Previous)
69       Previous->DeclRead(ID, D);
70   }
71   void SelectorRead(serialization::SelectorID ID, Selector Sel) override {
72     if (Previous)
73       Previous->SelectorRead(ID, Sel);
74   }
75   void MacroDefinitionRead(serialization::PreprocessedEntityID PPID,
76                            MacroDefinitionRecord *MD) override {
77     if (Previous)
78       Previous->MacroDefinitionRead(PPID, MD);
79   }
80 };
81 
82 /// \brief Dumps deserialized declarations.
83 class DeserializedDeclsDumper : public DelegatingDeserializationListener {
84 public:
85   explicit DeserializedDeclsDumper(ASTDeserializationListener *Previous,
86                                    bool DeletePrevious)
87       : DelegatingDeserializationListener(Previous, DeletePrevious) {}
88 
89   void DeclRead(serialization::DeclID ID, const Decl *D) override {
90     llvm::outs() << "PCH DECL: " << D->getDeclKindName();
91     if (const NamedDecl *ND = dyn_cast<NamedDecl>(D))
92       llvm::outs() << " - " << *ND;
93     llvm::outs() << "\n";
94 
95     DelegatingDeserializationListener::DeclRead(ID, D);
96   }
97 };
98 
99 /// \brief Checks deserialized declarations and emits error if a name
100 /// matches one given in command-line using -error-on-deserialized-decl.
101 class DeserializedDeclsChecker : public DelegatingDeserializationListener {
102   ASTContext &Ctx;
103   std::set<std::string> NamesToCheck;
104 
105 public:
106   DeserializedDeclsChecker(ASTContext &Ctx,
107                            const std::set<std::string> &NamesToCheck,
108                            ASTDeserializationListener *Previous,
109                            bool DeletePrevious)
110       : DelegatingDeserializationListener(Previous, DeletePrevious), Ctx(Ctx),
111         NamesToCheck(NamesToCheck) {}
112 
113   void DeclRead(serialization::DeclID ID, const Decl *D) override {
114     if (const NamedDecl *ND = dyn_cast<NamedDecl>(D))
115       if (NamesToCheck.find(ND->getNameAsString()) != NamesToCheck.end()) {
116         unsigned DiagID
117           = Ctx.getDiagnostics().getCustomDiagID(DiagnosticsEngine::Error,
118                                                  "%0 was deserialized");
119         Ctx.getDiagnostics().Report(Ctx.getFullLoc(D->getLocation()), DiagID)
120             << ND->getNameAsString();
121       }
122 
123     DelegatingDeserializationListener::DeclRead(ID, D);
124   }
125 };
126 
127 } // end anonymous namespace
128 
129 FrontendAction::FrontendAction() : Instance(nullptr) {}
130 
131 FrontendAction::~FrontendAction() {}
132 
133 void FrontendAction::setCurrentInput(const FrontendInputFile &CurrentInput,
134                                      std::unique_ptr<ASTUnit> AST) {
135   this->CurrentInput = CurrentInput;
136   CurrentASTUnit = std::move(AST);
137 }
138 
139 Module *FrontendAction::getCurrentModule() const {
140   CompilerInstance &CI = getCompilerInstance();
141   return CI.getPreprocessor().getHeaderSearchInfo().lookupModule(
142       CI.getLangOpts().CurrentModule, /*AllowSearch*/false);
143 }
144 
145 std::unique_ptr<ASTConsumer>
146 FrontendAction::CreateWrappedASTConsumer(CompilerInstance &CI,
147                                          StringRef InFile) {
148   std::unique_ptr<ASTConsumer> Consumer = CreateASTConsumer(CI, InFile);
149   if (!Consumer)
150     return nullptr;
151 
152   // If there are no registered plugins we don't need to wrap the consumer
153   if (FrontendPluginRegistry::begin() == FrontendPluginRegistry::end())
154     return Consumer;
155 
156   // Collect the list of plugins that go before the main action (in Consumers)
157   // or after it (in AfterConsumers)
158   std::vector<std::unique_ptr<ASTConsumer>> Consumers;
159   std::vector<std::unique_ptr<ASTConsumer>> AfterConsumers;
160   for (FrontendPluginRegistry::iterator it = FrontendPluginRegistry::begin(),
161                                         ie = FrontendPluginRegistry::end();
162        it != ie; ++it) {
163     std::unique_ptr<PluginASTAction> P = it->instantiate();
164     PluginASTAction::ActionType ActionType = P->getActionType();
165     if (ActionType == PluginASTAction::Cmdline) {
166       // This is O(|plugins| * |add_plugins|), but since both numbers are
167       // way below 50 in practice, that's ok.
168       for (size_t i = 0, e = CI.getFrontendOpts().AddPluginActions.size();
169            i != e; ++i) {
170         if (it->getName() == CI.getFrontendOpts().AddPluginActions[i]) {
171           ActionType = PluginASTAction::AddAfterMainAction;
172           break;
173         }
174       }
175     }
176     if ((ActionType == PluginASTAction::AddBeforeMainAction ||
177          ActionType == PluginASTAction::AddAfterMainAction) &&
178         P->ParseArgs(CI, CI.getFrontendOpts().PluginArgs[it->getName()])) {
179       std::unique_ptr<ASTConsumer> PluginConsumer = P->CreateASTConsumer(CI, InFile);
180       if (ActionType == PluginASTAction::AddBeforeMainAction) {
181         Consumers.push_back(std::move(PluginConsumer));
182       } else {
183         AfterConsumers.push_back(std::move(PluginConsumer));
184       }
185     }
186   }
187 
188   // Add to Consumers the main consumer, then all the plugins that go after it
189   Consumers.push_back(std::move(Consumer));
190   for (auto &C : AfterConsumers) {
191     Consumers.push_back(std::move(C));
192   }
193 
194   return llvm::make_unique<MultiplexConsumer>(std::move(Consumers));
195 }
196 
197 /// For preprocessed files, if the first line is the linemarker and specifies
198 /// the original source file name, use that name as the input file name.
199 /// Returns the location of the first token after the line marker directive.
200 ///
201 /// \param CI The compiler instance.
202 /// \param InputFile Populated with the filename from the line marker.
203 /// \param AddLineNote If \c true, add a line note corresponding to this line
204 ///        directive. Only use this if the directive will not actually be
205 ///        visited by the preprocessor.
206 static SourceLocation ReadOriginalFileName(CompilerInstance &CI,
207                                            std::string &InputFile,
208                                            bool AddLineNote = false) {
209   auto &SourceMgr = CI.getSourceManager();
210   auto MainFileID = SourceMgr.getMainFileID();
211 
212   bool Invalid = false;
213   const auto *MainFileBuf = SourceMgr.getBuffer(MainFileID, &Invalid);
214   if (Invalid)
215     return SourceLocation();
216 
217   std::unique_ptr<Lexer> RawLexer(
218       new Lexer(MainFileID, MainFileBuf, SourceMgr, CI.getLangOpts()));
219 
220   // If the first line has the syntax of
221   //
222   // # NUM "FILENAME"
223   //
224   // we use FILENAME as the input file name.
225   Token T;
226   if (RawLexer->LexFromRawLexer(T) || T.getKind() != tok::hash)
227     return SourceLocation();
228   if (RawLexer->LexFromRawLexer(T) || T.isAtStartOfLine() ||
229       T.getKind() != tok::numeric_constant)
230     return SourceLocation();
231 
232   unsigned LineNo;
233   SourceLocation LineNoLoc = T.getLocation();
234   if (AddLineNote) {
235     llvm::SmallString<16> Buffer;
236     if (Lexer::getSpelling(LineNoLoc, Buffer, SourceMgr, CI.getLangOpts())
237             .getAsInteger(10, LineNo))
238       return SourceLocation();
239   }
240 
241   RawLexer->LexFromRawLexer(T);
242   if (T.isAtStartOfLine() || T.getKind() != tok::string_literal)
243     return SourceLocation();
244 
245   StringLiteralParser Literal(T, CI.getPreprocessor());
246   if (Literal.hadError)
247     return SourceLocation();
248   RawLexer->LexFromRawLexer(T);
249   if (T.isNot(tok::eof) && !T.isAtStartOfLine())
250     return SourceLocation();
251   InputFile = Literal.GetString().str();
252 
253   if (AddLineNote)
254     CI.getSourceManager().AddLineNote(
255         LineNoLoc, LineNo, SourceMgr.getLineTableFilenameID(InputFile), false,
256         false, SrcMgr::C_User);
257 
258   return T.getLocation();
259 }
260 
261 static SmallVectorImpl<char> &
262 operator+=(SmallVectorImpl<char> &Includes, StringRef RHS) {
263   Includes.append(RHS.begin(), RHS.end());
264   return Includes;
265 }
266 
267 static void addHeaderInclude(StringRef HeaderName,
268                              SmallVectorImpl<char> &Includes,
269                              const LangOptions &LangOpts,
270                              bool IsExternC) {
271   if (IsExternC && LangOpts.CPlusPlus)
272     Includes += "extern \"C\" {\n";
273   if (LangOpts.ObjC1)
274     Includes += "#import \"";
275   else
276     Includes += "#include \"";
277 
278   Includes += HeaderName;
279 
280   Includes += "\"\n";
281   if (IsExternC && LangOpts.CPlusPlus)
282     Includes += "}\n";
283 }
284 
285 /// \brief Collect the set of header includes needed to construct the given
286 /// module and update the TopHeaders file set of the module.
287 ///
288 /// \param Module The module we're collecting includes from.
289 ///
290 /// \param Includes Will be augmented with the set of \#includes or \#imports
291 /// needed to load all of the named headers.
292 static std::error_code collectModuleHeaderIncludes(
293     const LangOptions &LangOpts, FileManager &FileMgr, DiagnosticsEngine &Diag,
294     ModuleMap &ModMap, clang::Module *Module, SmallVectorImpl<char> &Includes) {
295   // Don't collect any headers for unavailable modules.
296   if (!Module->isAvailable())
297     return std::error_code();
298 
299   // Resolve all lazy header directives to header files.
300   ModMap.resolveHeaderDirectives(Module);
301 
302   // If any headers are missing, we can't build this module. In most cases,
303   // diagnostics for this should have already been produced; we only get here
304   // if explicit stat information was provided.
305   // FIXME: If the name resolves to a file with different stat information,
306   // produce a better diagnostic.
307   if (!Module->MissingHeaders.empty()) {
308     auto &MissingHeader = Module->MissingHeaders.front();
309     Diag.Report(MissingHeader.FileNameLoc, diag::err_module_header_missing)
310       << MissingHeader.IsUmbrella << MissingHeader.FileName;
311     return std::error_code();
312   }
313 
314   // Add includes for each of these headers.
315   for (auto HK : {Module::HK_Normal, Module::HK_Private}) {
316     for (Module::Header &H : Module->Headers[HK]) {
317       Module->addTopHeader(H.Entry);
318       // Use the path as specified in the module map file. We'll look for this
319       // file relative to the module build directory (the directory containing
320       // the module map file) so this will find the same file that we found
321       // while parsing the module map.
322       addHeaderInclude(H.NameAsWritten, Includes, LangOpts, Module->IsExternC);
323     }
324   }
325   // Note that Module->PrivateHeaders will not be a TopHeader.
326 
327   if (Module::Header UmbrellaHeader = Module->getUmbrellaHeader()) {
328     Module->addTopHeader(UmbrellaHeader.Entry);
329     if (Module->Parent)
330       // Include the umbrella header for submodules.
331       addHeaderInclude(UmbrellaHeader.NameAsWritten, Includes, LangOpts,
332                        Module->IsExternC);
333   } else if (Module::DirectoryName UmbrellaDir = Module->getUmbrellaDir()) {
334     // Add all of the headers we find in this subdirectory.
335     std::error_code EC;
336     SmallString<128> DirNative;
337     llvm::sys::path::native(UmbrellaDir.Entry->getName(), DirNative);
338 
339     vfs::FileSystem &FS = *FileMgr.getVirtualFileSystem();
340     for (vfs::recursive_directory_iterator Dir(FS, DirNative, EC), End;
341          Dir != End && !EC; Dir.increment(EC)) {
342       // Check whether this entry has an extension typically associated with
343       // headers.
344       if (!llvm::StringSwitch<bool>(llvm::sys::path::extension(Dir->getName()))
345           .Cases(".h", ".H", ".hh", ".hpp", true)
346           .Default(false))
347         continue;
348 
349       const FileEntry *Header = FileMgr.getFile(Dir->getName());
350       // FIXME: This shouldn't happen unless there is a file system race. Is
351       // that worth diagnosing?
352       if (!Header)
353         continue;
354 
355       // If this header is marked 'unavailable' in this module, don't include
356       // it.
357       if (ModMap.isHeaderUnavailableInModule(Header, Module))
358         continue;
359 
360       // Compute the relative path from the directory to this file.
361       SmallVector<StringRef, 16> Components;
362       auto PathIt = llvm::sys::path::rbegin(Dir->getName());
363       for (int I = 0; I != Dir.level() + 1; ++I, ++PathIt)
364         Components.push_back(*PathIt);
365       SmallString<128> RelativeHeader(UmbrellaDir.NameAsWritten);
366       for (auto It = Components.rbegin(), End = Components.rend(); It != End;
367            ++It)
368         llvm::sys::path::append(RelativeHeader, *It);
369 
370       // Include this header as part of the umbrella directory.
371       Module->addTopHeader(Header);
372       addHeaderInclude(RelativeHeader, Includes, LangOpts, Module->IsExternC);
373     }
374 
375     if (EC)
376       return EC;
377   }
378 
379   // Recurse into submodules.
380   for (clang::Module::submodule_iterator Sub = Module->submodule_begin(),
381                                       SubEnd = Module->submodule_end();
382        Sub != SubEnd; ++Sub)
383     if (std::error_code Err = collectModuleHeaderIncludes(
384             LangOpts, FileMgr, Diag, ModMap, *Sub, Includes))
385       return Err;
386 
387   return std::error_code();
388 }
389 
390 static bool loadModuleMapForModuleBuild(CompilerInstance &CI, bool IsSystem,
391                                         bool IsPreprocessed,
392                                         std::string &PresumedModuleMapFile,
393                                         unsigned &Offset) {
394   auto &SrcMgr = CI.getSourceManager();
395   HeaderSearch &HS = CI.getPreprocessor().getHeaderSearchInfo();
396 
397   // Map the current input to a file.
398   FileID ModuleMapID = SrcMgr.getMainFileID();
399   const FileEntry *ModuleMap = SrcMgr.getFileEntryForID(ModuleMapID);
400 
401   // If the module map is preprocessed, handle the initial line marker;
402   // line directives are not part of the module map syntax in general.
403   Offset = 0;
404   if (IsPreprocessed) {
405     SourceLocation EndOfLineMarker =
406         ReadOriginalFileName(CI, PresumedModuleMapFile, /*AddLineNote*/true);
407     if (EndOfLineMarker.isValid())
408       Offset = CI.getSourceManager().getDecomposedLoc(EndOfLineMarker).second;
409   }
410 
411   // Load the module map file.
412   if (HS.loadModuleMapFile(ModuleMap, IsSystem, ModuleMapID, &Offset,
413                            PresumedModuleMapFile))
414     return true;
415 
416   if (SrcMgr.getBuffer(ModuleMapID)->getBufferSize() == Offset)
417     Offset = 0;
418 
419   return false;
420 }
421 
422 static Module *prepareToBuildModule(CompilerInstance &CI,
423                                     StringRef ModuleMapFilename) {
424   if (CI.getLangOpts().CurrentModule.empty()) {
425     CI.getDiagnostics().Report(diag::err_missing_module_name);
426 
427     // FIXME: Eventually, we could consider asking whether there was just
428     // a single module described in the module map, and use that as a
429     // default. Then it would be fairly trivial to just "compile" a module
430     // map with a single module (the common case).
431     return nullptr;
432   }
433 
434   // Dig out the module definition.
435   HeaderSearch &HS = CI.getPreprocessor().getHeaderSearchInfo();
436   Module *M = HS.lookupModule(CI.getLangOpts().CurrentModule,
437                               /*AllowSearch=*/false);
438   if (!M) {
439     CI.getDiagnostics().Report(diag::err_missing_module)
440       << CI.getLangOpts().CurrentModule << ModuleMapFilename;
441 
442     return nullptr;
443   }
444 
445   // Check whether we can build this module at all.
446   if (Preprocessor::checkModuleIsAvailable(CI.getLangOpts(), CI.getTarget(),
447                                            CI.getDiagnostics(), M))
448     return nullptr;
449 
450   // Inform the preprocessor that includes from within the input buffer should
451   // be resolved relative to the build directory of the module map file.
452   CI.getPreprocessor().setMainFileDir(M->Directory);
453 
454   // If the module was inferred from a different module map (via an expanded
455   // umbrella module definition), track that fact.
456   // FIXME: It would be preferable to fill this in as part of processing
457   // the module map, rather than adding it after the fact.
458   StringRef OriginalModuleMapName = CI.getFrontendOpts().OriginalModuleMap;
459   if (!OriginalModuleMapName.empty()) {
460     auto *OriginalModuleMap =
461         CI.getFileManager().getFile(OriginalModuleMapName,
462                                     /*openFile*/ true);
463     if (!OriginalModuleMap) {
464       CI.getDiagnostics().Report(diag::err_module_map_not_found)
465         << OriginalModuleMapName;
466       return nullptr;
467     }
468     if (OriginalModuleMap != CI.getSourceManager().getFileEntryForID(
469                                  CI.getSourceManager().getMainFileID())) {
470       M->IsInferred = true;
471       CI.getPreprocessor().getHeaderSearchInfo().getModuleMap()
472         .setInferredModuleAllowedBy(M, OriginalModuleMap);
473     }
474   }
475 
476   // If we're being run from the command-line, the module build stack will not
477   // have been filled in yet, so complete it now in order to allow us to detect
478   // module cycles.
479   SourceManager &SourceMgr = CI.getSourceManager();
480   if (SourceMgr.getModuleBuildStack().empty())
481     SourceMgr.pushModuleBuildStack(CI.getLangOpts().CurrentModule,
482                                    FullSourceLoc(SourceLocation(), SourceMgr));
483   return M;
484 }
485 
486 /// Compute the input buffer that should be used to build the specified module.
487 static std::unique_ptr<llvm::MemoryBuffer>
488 getInputBufferForModule(CompilerInstance &CI, Module *M) {
489   FileManager &FileMgr = CI.getFileManager();
490 
491   // Collect the set of #includes we need to build the module.
492   SmallString<256> HeaderContents;
493   std::error_code Err = std::error_code();
494   if (Module::Header UmbrellaHeader = M->getUmbrellaHeader())
495     addHeaderInclude(UmbrellaHeader.NameAsWritten, HeaderContents,
496                      CI.getLangOpts(), M->IsExternC);
497   Err = collectModuleHeaderIncludes(
498       CI.getLangOpts(), FileMgr, CI.getDiagnostics(),
499       CI.getPreprocessor().getHeaderSearchInfo().getModuleMap(), M,
500       HeaderContents);
501 
502   if (Err) {
503     CI.getDiagnostics().Report(diag::err_module_cannot_create_includes)
504       << M->getFullModuleName() << Err.message();
505     return nullptr;
506   }
507 
508   return llvm::MemoryBuffer::getMemBufferCopy(
509       HeaderContents, Module::getModuleInputBufferName());
510 }
511 
512 bool FrontendAction::BeginSourceFile(CompilerInstance &CI,
513                                      const FrontendInputFile &RealInput) {
514   FrontendInputFile Input(RealInput);
515   assert(!Instance && "Already processing a source file!");
516   assert(!Input.isEmpty() && "Unexpected empty filename!");
517   setCurrentInput(Input);
518   setCompilerInstance(&CI);
519 
520   StringRef InputFile = Input.getFile();
521   bool HasBegunSourceFile = false;
522   bool ReplayASTFile = Input.getKind().getFormat() == InputKind::Precompiled &&
523                        usesPreprocessorOnly();
524   if (!BeginInvocation(CI))
525     goto failure;
526 
527   // If we're replaying the build of an AST file, import it and set up
528   // the initial state from its build.
529   if (ReplayASTFile) {
530     IntrusiveRefCntPtr<DiagnosticsEngine> Diags(&CI.getDiagnostics());
531 
532     // The AST unit populates its own diagnostics engine rather than ours.
533     IntrusiveRefCntPtr<DiagnosticsEngine> ASTDiags(
534         new DiagnosticsEngine(Diags->getDiagnosticIDs(),
535                               &Diags->getDiagnosticOptions()));
536     ASTDiags->setClient(Diags->getClient(), /*OwnsClient*/false);
537 
538     std::unique_ptr<ASTUnit> AST = ASTUnit::LoadFromASTFile(
539         InputFile, CI.getPCHContainerReader(), ASTDiags, CI.getFileSystemOpts(),
540         CI.getCodeGenOpts().DebugTypeExtRefs);
541     if (!AST)
542       goto failure;
543 
544     // Options relating to how we treat the input (but not what we do with it)
545     // are inherited from the AST unit.
546     CI.getHeaderSearchOpts() = AST->getHeaderSearchOpts();
547     CI.getPreprocessorOpts() = AST->getPreprocessorOpts();
548     CI.getLangOpts() = AST->getLangOpts();
549 
550     // Preload all the module files loaded transitively by the AST unit.
551     if (auto ASTReader = AST->getASTReader()) {
552       auto &MM = ASTReader->getModuleManager();
553       for (ModuleFile &MF : MM)
554         if (&MF != &MM.getPrimaryModule())
555           CI.getFrontendOpts().ModuleFiles.push_back(MF.FileName);
556     }
557     // FIXME: Preload module maps loaded by the AST unit.
558 
559     // Set the shared objects, these are reset when we finish processing the
560     // file, otherwise the CompilerInstance will happily destroy them.
561     CI.setFileManager(&AST->getFileManager());
562     CI.createSourceManager(CI.getFileManager());
563     CI.getSourceManager().initializeForReplay(AST->getSourceManager());
564     CI.createPreprocessor(getTranslationUnitKind());
565 
566     // Set up the input file for replay purposes.
567     auto Kind = AST->getInputKind();
568     if (Kind.getFormat() == InputKind::ModuleMap) {
569       Module *ASTModule =
570           AST->getPreprocessor().getHeaderSearchInfo().lookupModule(
571               AST->getLangOpts().CurrentModule, /*AllowSearch*/ false);
572       Input = FrontendInputFile(ASTModule->PresumedModuleMapFile, Kind);
573     } else {
574       auto &SM = CI.getSourceManager();
575       FileID ID = SM.getMainFileID();
576       if (auto *File = SM.getFileEntryForID(ID))
577         Input = FrontendInputFile(File->getName(), Kind);
578       else
579         Input = FrontendInputFile(SM.getBuffer(ID), Kind);
580     }
581     setCurrentInput(Input, std::move(AST));
582   }
583 
584   // AST files follow a very different path, since they share objects via the
585   // AST unit.
586   if (Input.getKind().getFormat() == InputKind::Precompiled) {
587     assert(!usesPreprocessorOnly() && "this case was handled above");
588     assert(hasASTFileSupport() &&
589            "This action does not have AST file support!");
590 
591     IntrusiveRefCntPtr<DiagnosticsEngine> Diags(&CI.getDiagnostics());
592 
593     std::unique_ptr<ASTUnit> AST = ASTUnit::LoadFromASTFile(
594         InputFile, CI.getPCHContainerReader(), Diags, CI.getFileSystemOpts(),
595         CI.getCodeGenOpts().DebugTypeExtRefs);
596 
597     if (!AST)
598       goto failure;
599 
600     // Inform the diagnostic client we are processing a source file.
601     CI.getDiagnosticClient().BeginSourceFile(CI.getLangOpts(), nullptr);
602     HasBegunSourceFile = true;
603 
604     // Set the shared objects, these are reset when we finish processing the
605     // file, otherwise the CompilerInstance will happily destroy them.
606     CI.setFileManager(&AST->getFileManager());
607     CI.setSourceManager(&AST->getSourceManager());
608     CI.setPreprocessor(AST->getPreprocessorPtr());
609     Preprocessor &PP = CI.getPreprocessor();
610     PP.getBuiltinInfo().initializeBuiltins(PP.getIdentifierTable(),
611                                            PP.getLangOpts());
612     CI.setASTContext(&AST->getASTContext());
613 
614     setCurrentInput(Input, std::move(AST));
615 
616     // Initialize the action.
617     if (!BeginSourceFileAction(CI))
618       goto failure;
619 
620     // Create the AST consumer.
621     CI.setASTConsumer(CreateWrappedASTConsumer(CI, InputFile));
622     if (!CI.hasASTConsumer())
623       goto failure;
624 
625     return true;
626   }
627 
628   if (!CI.hasVirtualFileSystem()) {
629     if (IntrusiveRefCntPtr<vfs::FileSystem> VFS =
630           createVFSFromCompilerInvocation(CI.getInvocation(),
631                                           CI.getDiagnostics()))
632       CI.setVirtualFileSystem(VFS);
633     else
634       goto failure;
635   }
636 
637   // Set up the file and source managers, if needed.
638   if (!CI.hasFileManager())
639     CI.createFileManager();
640   if (!CI.hasSourceManager())
641     CI.createSourceManager(CI.getFileManager());
642 
643   // Set up embedding for any specified files. Do this before we load any
644   // source files, including the primary module map for the compilation.
645   for (const auto &F : CI.getFrontendOpts().ModulesEmbedFiles) {
646     if (const auto *FE = CI.getFileManager().getFile(F, /*openFile*/true))
647       CI.getSourceManager().setFileIsTransient(FE);
648     else
649       CI.getDiagnostics().Report(diag::err_modules_embed_file_not_found) << F;
650   }
651   if (CI.getFrontendOpts().ModulesEmbedAllFiles)
652     CI.getSourceManager().setAllFilesAreTransient(true);
653 
654   // IR files bypass the rest of initialization.
655   if (Input.getKind().getLanguage() == InputKind::LLVM_IR) {
656     assert(hasIRSupport() &&
657            "This action does not have IR file support!");
658 
659     // Inform the diagnostic client we are processing a source file.
660     CI.getDiagnosticClient().BeginSourceFile(CI.getLangOpts(), nullptr);
661     HasBegunSourceFile = true;
662 
663     // Initialize the action.
664     if (!BeginSourceFileAction(CI))
665       goto failure;
666 
667     // Initialize the main file entry.
668     if (!CI.InitializeSourceManager(CurrentInput))
669       goto failure;
670 
671     return true;
672   }
673 
674   // If the implicit PCH include is actually a directory, rather than
675   // a single file, search for a suitable PCH file in that directory.
676   if (!CI.getPreprocessorOpts().ImplicitPCHInclude.empty()) {
677     FileManager &FileMgr = CI.getFileManager();
678     PreprocessorOptions &PPOpts = CI.getPreprocessorOpts();
679     StringRef PCHInclude = PPOpts.ImplicitPCHInclude;
680     std::string SpecificModuleCachePath = CI.getSpecificModuleCachePath();
681     if (const DirectoryEntry *PCHDir = FileMgr.getDirectory(PCHInclude)) {
682       std::error_code EC;
683       SmallString<128> DirNative;
684       llvm::sys::path::native(PCHDir->getName(), DirNative);
685       bool Found = false;
686       vfs::FileSystem &FS = *FileMgr.getVirtualFileSystem();
687       for (vfs::directory_iterator Dir = FS.dir_begin(DirNative, EC), DirEnd;
688            Dir != DirEnd && !EC; Dir.increment(EC)) {
689         // Check whether this is an acceptable AST file.
690         if (ASTReader::isAcceptableASTFile(
691                 Dir->getName(), FileMgr, CI.getPCHContainerReader(),
692                 CI.getLangOpts(), CI.getTargetOpts(), CI.getPreprocessorOpts(),
693                 SpecificModuleCachePath)) {
694           PPOpts.ImplicitPCHInclude = Dir->getName();
695           Found = true;
696           break;
697         }
698       }
699 
700       if (!Found) {
701         CI.getDiagnostics().Report(diag::err_fe_no_pch_in_dir) << PCHInclude;
702         goto failure;
703       }
704     }
705   }
706 
707   // Set up the preprocessor if needed. When parsing model files the
708   // preprocessor of the original source is reused.
709   if (!isModelParsingAction())
710     CI.createPreprocessor(getTranslationUnitKind());
711 
712   // Inform the diagnostic client we are processing a source file.
713   CI.getDiagnosticClient().BeginSourceFile(CI.getLangOpts(),
714                                            &CI.getPreprocessor());
715   HasBegunSourceFile = true;
716 
717   // Initialize the main file entry.
718   if (!CI.InitializeSourceManager(Input))
719     goto failure;
720 
721   // For module map files, we first parse the module map and synthesize a
722   // "<module-includes>" buffer before more conventional processing.
723   if (Input.getKind().getFormat() == InputKind::ModuleMap) {
724     CI.getLangOpts().setCompilingModule(LangOptions::CMK_ModuleMap);
725 
726     std::string PresumedModuleMapFile;
727     unsigned OffsetToContents;
728     if (loadModuleMapForModuleBuild(CI, Input.isSystem(),
729                                     Input.isPreprocessed(),
730                                     PresumedModuleMapFile, OffsetToContents))
731       goto failure;
732 
733     auto *CurrentModule = prepareToBuildModule(CI, Input.getFile());
734     if (!CurrentModule)
735       goto failure;
736 
737     CurrentModule->PresumedModuleMapFile = PresumedModuleMapFile;
738 
739     if (OffsetToContents)
740       // If the module contents are in the same file, skip to them.
741       CI.getPreprocessor().setSkipMainFilePreamble(OffsetToContents, true);
742     else {
743       // Otherwise, convert the module description to a suitable input buffer.
744       auto Buffer = getInputBufferForModule(CI, CurrentModule);
745       if (!Buffer)
746         goto failure;
747 
748       // Reinitialize the main file entry to refer to the new input.
749       if (!CI.InitializeSourceManager(FrontendInputFile(
750               Buffer.release(), Input.getKind().withFormat(InputKind::Source),
751               CurrentModule->IsSystem)))
752         goto failure;
753     }
754   }
755 
756   // Initialize the action.
757   if (!BeginSourceFileAction(CI))
758     goto failure;
759 
760   // Create the AST context and consumer unless this is a preprocessor only
761   // action.
762   if (!usesPreprocessorOnly()) {
763     // Parsing a model file should reuse the existing ASTContext.
764     if (!isModelParsingAction())
765       CI.createASTContext();
766 
767     // For preprocessed files, check if the first line specifies the original
768     // source file name with a linemarker.
769     std::string PresumedInputFile = InputFile;
770     if (Input.isPreprocessed())
771       ReadOriginalFileName(CI, PresumedInputFile);
772 
773     std::unique_ptr<ASTConsumer> Consumer =
774         CreateWrappedASTConsumer(CI, PresumedInputFile);
775     if (!Consumer)
776       goto failure;
777 
778     // FIXME: should not overwrite ASTMutationListener when parsing model files?
779     if (!isModelParsingAction())
780       CI.getASTContext().setASTMutationListener(Consumer->GetASTMutationListener());
781 
782     if (!CI.getPreprocessorOpts().ChainedIncludes.empty()) {
783       // Convert headers to PCH and chain them.
784       IntrusiveRefCntPtr<ExternalSemaSource> source, FinalReader;
785       source = createChainedIncludesSource(CI, FinalReader);
786       if (!source)
787         goto failure;
788       CI.setModuleManager(static_cast<ASTReader *>(FinalReader.get()));
789       CI.getASTContext().setExternalSource(source);
790     } else if (CI.getLangOpts().Modules ||
791                !CI.getPreprocessorOpts().ImplicitPCHInclude.empty()) {
792       // Use PCM or PCH.
793       assert(hasPCHSupport() && "This action does not have PCH support!");
794       ASTDeserializationListener *DeserialListener =
795           Consumer->GetASTDeserializationListener();
796       bool DeleteDeserialListener = false;
797       if (CI.getPreprocessorOpts().DumpDeserializedPCHDecls) {
798         DeserialListener = new DeserializedDeclsDumper(DeserialListener,
799                                                        DeleteDeserialListener);
800         DeleteDeserialListener = true;
801       }
802       if (!CI.getPreprocessorOpts().DeserializedPCHDeclsToErrorOn.empty()) {
803         DeserialListener = new DeserializedDeclsChecker(
804             CI.getASTContext(),
805             CI.getPreprocessorOpts().DeserializedPCHDeclsToErrorOn,
806             DeserialListener, DeleteDeserialListener);
807         DeleteDeserialListener = true;
808       }
809       if (!CI.getPreprocessorOpts().ImplicitPCHInclude.empty()) {
810         CI.createPCHExternalASTSource(
811             CI.getPreprocessorOpts().ImplicitPCHInclude,
812             CI.getPreprocessorOpts().DisablePCHValidation,
813           CI.getPreprocessorOpts().AllowPCHWithCompilerErrors, DeserialListener,
814             DeleteDeserialListener);
815         if (!CI.getASTContext().getExternalSource())
816           goto failure;
817       }
818       // If modules are enabled, create the module manager before creating
819       // any builtins, so that all declarations know that they might be
820       // extended by an external source.
821       if (CI.getLangOpts().Modules || !CI.hasASTContext() ||
822           !CI.getASTContext().getExternalSource()) {
823         CI.createModuleManager();
824         CI.getModuleManager()->setDeserializationListener(DeserialListener,
825                                                         DeleteDeserialListener);
826       }
827     }
828 
829     CI.setASTConsumer(std::move(Consumer));
830     if (!CI.hasASTConsumer())
831       goto failure;
832   }
833 
834   // Initialize built-in info as long as we aren't using an external AST
835   // source.
836   if (CI.getLangOpts().Modules || !CI.hasASTContext() ||
837       !CI.getASTContext().getExternalSource()) {
838     Preprocessor &PP = CI.getPreprocessor();
839     PP.getBuiltinInfo().initializeBuiltins(PP.getIdentifierTable(),
840                                            PP.getLangOpts());
841   } else {
842     // FIXME: If this is a problem, recover from it by creating a multiplex
843     // source.
844     assert((!CI.getLangOpts().Modules || CI.getModuleManager()) &&
845            "modules enabled but created an external source that "
846            "doesn't support modules");
847   }
848 
849   // If we were asked to load any module map files, do so now.
850   for (const auto &Filename : CI.getFrontendOpts().ModuleMapFiles) {
851     if (auto *File = CI.getFileManager().getFile(Filename))
852       CI.getPreprocessor().getHeaderSearchInfo().loadModuleMapFile(
853           File, /*IsSystem*/false);
854     else
855       CI.getDiagnostics().Report(diag::err_module_map_not_found) << Filename;
856   }
857 
858   // If we were asked to load any module files, do so now.
859   for (const auto &ModuleFile : CI.getFrontendOpts().ModuleFiles)
860     if (!CI.loadModuleFile(ModuleFile))
861       goto failure;
862 
863   // If there is a layout overrides file, attach an external AST source that
864   // provides the layouts from that file.
865   if (!CI.getFrontendOpts().OverrideRecordLayoutsFile.empty() &&
866       CI.hasASTContext() && !CI.getASTContext().getExternalSource()) {
867     IntrusiveRefCntPtr<ExternalASTSource>
868       Override(new LayoutOverrideSource(
869                      CI.getFrontendOpts().OverrideRecordLayoutsFile));
870     CI.getASTContext().setExternalSource(Override);
871   }
872 
873   return true;
874 
875   // If we failed, reset state since the client will not end up calling the
876   // matching EndSourceFile().
877 failure:
878   if (HasBegunSourceFile)
879     CI.getDiagnosticClient().EndSourceFile();
880   CI.clearOutputFiles(/*EraseFiles=*/true);
881   CI.getLangOpts().setCompilingModule(LangOptions::CMK_None);
882   setCurrentInput(FrontendInputFile());
883   setCompilerInstance(nullptr);
884   return false;
885 }
886 
887 bool FrontendAction::Execute() {
888   CompilerInstance &CI = getCompilerInstance();
889 
890   if (CI.hasFrontendTimer()) {
891     llvm::TimeRegion Timer(CI.getFrontendTimer());
892     ExecuteAction();
893   }
894   else ExecuteAction();
895 
896   // If we are supposed to rebuild the global module index, do so now unless
897   // there were any module-build failures.
898   if (CI.shouldBuildGlobalModuleIndex() && CI.hasFileManager() &&
899       CI.hasPreprocessor()) {
900     StringRef Cache =
901         CI.getPreprocessor().getHeaderSearchInfo().getModuleCachePath();
902     if (!Cache.empty())
903       GlobalModuleIndex::writeIndex(CI.getFileManager(),
904                                     CI.getPCHContainerReader(), Cache);
905   }
906 
907   return true;
908 }
909 
910 void FrontendAction::EndSourceFile() {
911   CompilerInstance &CI = getCompilerInstance();
912 
913   // Inform the diagnostic client we are done with this source file.
914   CI.getDiagnosticClient().EndSourceFile();
915 
916   // Inform the preprocessor we are done.
917   if (CI.hasPreprocessor())
918     CI.getPreprocessor().EndSourceFile();
919 
920   // Finalize the action.
921   EndSourceFileAction();
922 
923   // Sema references the ast consumer, so reset sema first.
924   //
925   // FIXME: There is more per-file stuff we could just drop here?
926   bool DisableFree = CI.getFrontendOpts().DisableFree;
927   if (DisableFree) {
928     CI.resetAndLeakSema();
929     CI.resetAndLeakASTContext();
930     BuryPointer(CI.takeASTConsumer().get());
931   } else {
932     CI.setSema(nullptr);
933     CI.setASTContext(nullptr);
934     CI.setASTConsumer(nullptr);
935   }
936 
937   if (CI.getFrontendOpts().ShowStats) {
938     llvm::errs() << "\nSTATISTICS FOR '" << getCurrentFile() << "':\n";
939     CI.getPreprocessor().PrintStats();
940     CI.getPreprocessor().getIdentifierTable().PrintStats();
941     CI.getPreprocessor().getHeaderSearchInfo().PrintStats();
942     CI.getSourceManager().PrintStats();
943     llvm::errs() << "\n";
944   }
945 
946   // Cleanup the output streams, and erase the output files if instructed by the
947   // FrontendAction.
948   CI.clearOutputFiles(/*EraseFiles=*/shouldEraseOutputFiles());
949 
950   if (isCurrentFileAST()) {
951     if (DisableFree) {
952       CI.resetAndLeakPreprocessor();
953       CI.resetAndLeakSourceManager();
954       CI.resetAndLeakFileManager();
955       BuryPointer(CurrentASTUnit.release());
956     } else {
957       CI.setPreprocessor(nullptr);
958       CI.setSourceManager(nullptr);
959       CI.setFileManager(nullptr);
960     }
961   }
962 
963   setCompilerInstance(nullptr);
964   setCurrentInput(FrontendInputFile());
965   CI.getLangOpts().setCompilingModule(LangOptions::CMK_None);
966 }
967 
968 bool FrontendAction::shouldEraseOutputFiles() {
969   return getCompilerInstance().getDiagnostics().hasErrorOccurred();
970 }
971 
972 //===----------------------------------------------------------------------===//
973 // Utility Actions
974 //===----------------------------------------------------------------------===//
975 
976 void ASTFrontendAction::ExecuteAction() {
977   CompilerInstance &CI = getCompilerInstance();
978   if (!CI.hasPreprocessor())
979     return;
980 
981   // FIXME: Move the truncation aspect of this into Sema, we delayed this till
982   // here so the source manager would be initialized.
983   if (hasCodeCompletionSupport() &&
984       !CI.getFrontendOpts().CodeCompletionAt.FileName.empty())
985     CI.createCodeCompletionConsumer();
986 
987   // Use a code completion consumer?
988   CodeCompleteConsumer *CompletionConsumer = nullptr;
989   if (CI.hasCodeCompletionConsumer())
990     CompletionConsumer = &CI.getCodeCompletionConsumer();
991 
992   if (!CI.hasSema())
993     CI.createSema(getTranslationUnitKind(), CompletionConsumer);
994 
995   ParseAST(CI.getSema(), CI.getFrontendOpts().ShowStats,
996            CI.getFrontendOpts().SkipFunctionBodies);
997 }
998 
999 void PluginASTAction::anchor() { }
1000 
1001 std::unique_ptr<ASTConsumer>
1002 PreprocessorFrontendAction::CreateASTConsumer(CompilerInstance &CI,
1003                                               StringRef InFile) {
1004   llvm_unreachable("Invalid CreateASTConsumer on preprocessor action!");
1005 }
1006 
1007 std::unique_ptr<ASTConsumer>
1008 WrapperFrontendAction::CreateASTConsumer(CompilerInstance &CI,
1009                                          StringRef InFile) {
1010   return WrappedAction->CreateASTConsumer(CI, InFile);
1011 }
1012 bool WrapperFrontendAction::BeginInvocation(CompilerInstance &CI) {
1013   return WrappedAction->BeginInvocation(CI);
1014 }
1015 bool WrapperFrontendAction::BeginSourceFileAction(CompilerInstance &CI) {
1016   WrappedAction->setCurrentInput(getCurrentInput());
1017   WrappedAction->setCompilerInstance(&CI);
1018   auto Ret = WrappedAction->BeginSourceFileAction(CI);
1019   // BeginSourceFileAction may change CurrentInput, e.g. during module builds.
1020   setCurrentInput(WrappedAction->getCurrentInput());
1021   return Ret;
1022 }
1023 void WrapperFrontendAction::ExecuteAction() {
1024   WrappedAction->ExecuteAction();
1025 }
1026 void WrapperFrontendAction::EndSourceFileAction() {
1027   WrappedAction->EndSourceFileAction();
1028 }
1029 
1030 bool WrapperFrontendAction::usesPreprocessorOnly() const {
1031   return WrappedAction->usesPreprocessorOnly();
1032 }
1033 TranslationUnitKind WrapperFrontendAction::getTranslationUnitKind() {
1034   return WrappedAction->getTranslationUnitKind();
1035 }
1036 bool WrapperFrontendAction::hasPCHSupport() const {
1037   return WrappedAction->hasPCHSupport();
1038 }
1039 bool WrapperFrontendAction::hasASTFileSupport() const {
1040   return WrappedAction->hasASTFileSupport();
1041 }
1042 bool WrapperFrontendAction::hasIRSupport() const {
1043   return WrappedAction->hasIRSupport();
1044 }
1045 bool WrapperFrontendAction::hasCodeCompletionSupport() const {
1046   return WrappedAction->hasCodeCompletionSupport();
1047 }
1048 
1049 WrapperFrontendAction::WrapperFrontendAction(
1050     std::unique_ptr<FrontendAction> WrappedAction)
1051   : WrappedAction(std::move(WrappedAction)) {}
1052 
1053