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