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