Subversion Repositories QNX 8.QNX8 LLVM/Clang compiler suite

Rev

Blame | Last modification | View Log | Download | RSS feed

  1. //===-- CompilerInstance.h - Clang Compiler Instance ------------*- C++ -*-===//
  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. #ifndef LLVM_CLANG_FRONTEND_COMPILERINSTANCE_H_
  10. #define LLVM_CLANG_FRONTEND_COMPILERINSTANCE_H_
  11.  
  12. #include "clang/AST/ASTConsumer.h"
  13. #include "clang/Basic/Diagnostic.h"
  14. #include "clang/Basic/SourceManager.h"
  15. #include "clang/Frontend/CompilerInvocation.h"
  16. #include "clang/Frontend/PCHContainerOperations.h"
  17. #include "clang/Frontend/Utils.h"
  18. #include "clang/Lex/HeaderSearchOptions.h"
  19. #include "clang/Lex/ModuleLoader.h"
  20. #include "llvm/ADT/ArrayRef.h"
  21. #include "llvm/ADT/DenseMap.h"
  22. #include "llvm/ADT/IntrusiveRefCntPtr.h"
  23. #include "llvm/ADT/StringRef.h"
  24. #include "llvm/Support/BuryPointer.h"
  25. #include "llvm/Support/FileSystem.h"
  26. #include <cassert>
  27. #include <list>
  28. #include <memory>
  29. #include <optional>
  30. #include <string>
  31. #include <utility>
  32.  
  33. namespace llvm {
  34. class raw_fd_ostream;
  35. class Timer;
  36. class TimerGroup;
  37. }
  38.  
  39. namespace clang {
  40. class ASTContext;
  41. class ASTReader;
  42. class CodeCompleteConsumer;
  43. class DiagnosticsEngine;
  44. class DiagnosticConsumer;
  45. class FileManager;
  46. class FrontendAction;
  47. class InMemoryModuleCache;
  48. class Module;
  49. class Preprocessor;
  50. class Sema;
  51. class SourceManager;
  52. class TargetInfo;
  53. enum class DisableValidationForModuleKind;
  54.  
  55. /// CompilerInstance - Helper class for managing a single instance of the Clang
  56. /// compiler.
  57. ///
  58. /// The CompilerInstance serves two purposes:
  59. ///  (1) It manages the various objects which are necessary to run the compiler,
  60. ///      for example the preprocessor, the target information, and the AST
  61. ///      context.
  62. ///  (2) It provides utility routines for constructing and manipulating the
  63. ///      common Clang objects.
  64. ///
  65. /// The compiler instance generally owns the instance of all the objects that it
  66. /// manages. However, clients can still share objects by manually setting the
  67. /// object and retaking ownership prior to destroying the CompilerInstance.
  68. ///
  69. /// The compiler instance is intended to simplify clients, but not to lock them
  70. /// in to the compiler instance for everything. When possible, utility functions
  71. /// come in two forms; a short form that reuses the CompilerInstance objects,
  72. /// and a long form that takes explicit instances of any required objects.
  73. class CompilerInstance : public ModuleLoader {
  74.   /// The options used in this compiler instance.
  75.   std::shared_ptr<CompilerInvocation> Invocation;
  76.  
  77.   /// The diagnostics engine instance.
  78.   IntrusiveRefCntPtr<DiagnosticsEngine> Diagnostics;
  79.  
  80.   /// The target being compiled for.
  81.   IntrusiveRefCntPtr<TargetInfo> Target;
  82.  
  83.   /// Auxiliary Target info.
  84.   IntrusiveRefCntPtr<TargetInfo> AuxTarget;
  85.  
  86.   /// The file manager.
  87.   IntrusiveRefCntPtr<FileManager> FileMgr;
  88.  
  89.   /// The source manager.
  90.   IntrusiveRefCntPtr<SourceManager> SourceMgr;
  91.  
  92.   /// The cache of PCM files.
  93.   IntrusiveRefCntPtr<InMemoryModuleCache> ModuleCache;
  94.  
  95.   /// The preprocessor.
  96.   std::shared_ptr<Preprocessor> PP;
  97.  
  98.   /// The AST context.
  99.   IntrusiveRefCntPtr<ASTContext> Context;
  100.  
  101.   /// An optional sema source that will be attached to sema.
  102.   IntrusiveRefCntPtr<ExternalSemaSource> ExternalSemaSrc;
  103.  
  104.   /// The AST consumer.
  105.   std::unique_ptr<ASTConsumer> Consumer;
  106.  
  107.   /// The code completion consumer.
  108.   std::unique_ptr<CodeCompleteConsumer> CompletionConsumer;
  109.  
  110.   /// The semantic analysis object.
  111.   std::unique_ptr<Sema> TheSema;
  112.  
  113.   /// The frontend timer group.
  114.   std::unique_ptr<llvm::TimerGroup> FrontendTimerGroup;
  115.  
  116.   /// The frontend timer.
  117.   std::unique_ptr<llvm::Timer> FrontendTimer;
  118.  
  119.   /// The ASTReader, if one exists.
  120.   IntrusiveRefCntPtr<ASTReader> TheASTReader;
  121.  
  122.   /// The module dependency collector for crashdumps
  123.   std::shared_ptr<ModuleDependencyCollector> ModuleDepCollector;
  124.  
  125.   /// The module provider.
  126.   std::shared_ptr<PCHContainerOperations> ThePCHContainerOperations;
  127.  
  128.   std::vector<std::shared_ptr<DependencyCollector>> DependencyCollectors;
  129.  
  130.   /// The set of top-level modules that has already been built on the
  131.   /// fly as part of this overall compilation action.
  132.   std::map<std::string, std::string, std::less<>> BuiltModules;
  133.  
  134.   /// Should we delete the BuiltModules when we're done?
  135.   bool DeleteBuiltModules = true;
  136.  
  137.   /// The location of the module-import keyword for the last module
  138.   /// import.
  139.   SourceLocation LastModuleImportLoc;
  140.  
  141.   /// The result of the last module import.
  142.   ///
  143.   ModuleLoadResult LastModuleImportResult;
  144.  
  145.   /// Whether we should (re)build the global module index once we
  146.   /// have finished with this translation unit.
  147.   bool BuildGlobalModuleIndex = false;
  148.  
  149.   /// We have a full global module index, with all modules.
  150.   bool HaveFullGlobalModuleIndex = false;
  151.  
  152.   /// One or more modules failed to build.
  153.   bool DisableGeneratingGlobalModuleIndex = false;
  154.  
  155.   /// The stream for verbose output if owned, otherwise nullptr.
  156.   std::unique_ptr<raw_ostream> OwnedVerboseOutputStream;
  157.  
  158.   /// The stream for verbose output.
  159.   raw_ostream *VerboseOutputStream = &llvm::errs();
  160.  
  161.   /// Holds information about the output file.
  162.   ///
  163.   /// If TempFilename is not empty we must rename it to Filename at the end.
  164.   /// TempFilename may be empty and Filename non-empty if creating the temporary
  165.   /// failed.
  166.   struct OutputFile {
  167.     std::string Filename;
  168.     std::optional<llvm::sys::fs::TempFile> File;
  169.  
  170.     OutputFile(std::string filename,
  171.                std::optional<llvm::sys::fs::TempFile> file)
  172.         : Filename(std::move(filename)), File(std::move(file)) {}
  173.   };
  174.  
  175.   /// The list of active output files.
  176.   std::list<OutputFile> OutputFiles;
  177.  
  178.   /// Force an output buffer.
  179.   std::unique_ptr<llvm::raw_pwrite_stream> OutputStream;
  180.  
  181.   CompilerInstance(const CompilerInstance &) = delete;
  182.   void operator=(const CompilerInstance &) = delete;
  183. public:
  184.   explicit CompilerInstance(
  185.       std::shared_ptr<PCHContainerOperations> PCHContainerOps =
  186.           std::make_shared<PCHContainerOperations>(),
  187.       InMemoryModuleCache *SharedModuleCache = nullptr);
  188.   ~CompilerInstance() override;
  189.  
  190.   /// @name High-Level Operations
  191.   /// {
  192.  
  193.   /// ExecuteAction - Execute the provided action against the compiler's
  194.   /// CompilerInvocation object.
  195.   ///
  196.   /// This function makes the following assumptions:
  197.   ///
  198.   ///  - The invocation options should be initialized. This function does not
  199.   ///    handle the '-help' or '-version' options, clients should handle those
  200.   ///    directly.
  201.   ///
  202.   ///  - The diagnostics engine should have already been created by the client.
  203.   ///
  204.   ///  - No other CompilerInstance state should have been initialized (this is
  205.   ///    an unchecked error).
  206.   ///
  207.   ///  - Clients should have initialized any LLVM target features that may be
  208.   ///    required.
  209.   ///
  210.   ///  - Clients should eventually call llvm_shutdown() upon the completion of
  211.   ///    this routine to ensure that any managed objects are properly destroyed.
  212.   ///
  213.   /// Note that this routine may write output to 'stderr'.
  214.   ///
  215.   /// \param Act - The action to execute.
  216.   /// \return - True on success.
  217.   //
  218.   // FIXME: Eliminate the llvm_shutdown requirement, that should either be part
  219.   // of the context or else not CompilerInstance specific.
  220.   bool ExecuteAction(FrontendAction &Act);
  221.  
  222.   /// Load the list of plugins requested in the \c FrontendOptions.
  223.   void LoadRequestedPlugins();
  224.  
  225.   /// }
  226.   /// @name Compiler Invocation and Options
  227.   /// {
  228.  
  229.   bool hasInvocation() const { return Invocation != nullptr; }
  230.  
  231.   CompilerInvocation &getInvocation() {
  232.     assert(Invocation && "Compiler instance has no invocation!");
  233.     return *Invocation;
  234.   }
  235.  
  236.   /// setInvocation - Replace the current invocation.
  237.   void setInvocation(std::shared_ptr<CompilerInvocation> Value);
  238.  
  239.   /// Indicates whether we should (re)build the global module index.
  240.   bool shouldBuildGlobalModuleIndex() const;
  241.  
  242.   /// Set the flag indicating whether we should (re)build the global
  243.   /// module index.
  244.   void setBuildGlobalModuleIndex(bool Build) {
  245.     BuildGlobalModuleIndex = Build;
  246.   }
  247.  
  248.   /// }
  249.   /// @name Forwarding Methods
  250.   /// {
  251.  
  252.   AnalyzerOptionsRef getAnalyzerOpts() {
  253.     return Invocation->getAnalyzerOpts();
  254.   }
  255.  
  256.   CodeGenOptions &getCodeGenOpts() {
  257.     return Invocation->getCodeGenOpts();
  258.   }
  259.   const CodeGenOptions &getCodeGenOpts() const {
  260.     return Invocation->getCodeGenOpts();
  261.   }
  262.  
  263.   DependencyOutputOptions &getDependencyOutputOpts() {
  264.     return Invocation->getDependencyOutputOpts();
  265.   }
  266.   const DependencyOutputOptions &getDependencyOutputOpts() const {
  267.     return Invocation->getDependencyOutputOpts();
  268.   }
  269.  
  270.   DiagnosticOptions &getDiagnosticOpts() {
  271.     return Invocation->getDiagnosticOpts();
  272.   }
  273.   const DiagnosticOptions &getDiagnosticOpts() const {
  274.     return Invocation->getDiagnosticOpts();
  275.   }
  276.  
  277.   FileSystemOptions &getFileSystemOpts() {
  278.     return Invocation->getFileSystemOpts();
  279.   }
  280.   const FileSystemOptions &getFileSystemOpts() const {
  281.     return Invocation->getFileSystemOpts();
  282.   }
  283.  
  284.   FrontendOptions &getFrontendOpts() {
  285.     return Invocation->getFrontendOpts();
  286.   }
  287.   const FrontendOptions &getFrontendOpts() const {
  288.     return Invocation->getFrontendOpts();
  289.   }
  290.  
  291.   HeaderSearchOptions &getHeaderSearchOpts() {
  292.     return Invocation->getHeaderSearchOpts();
  293.   }
  294.   const HeaderSearchOptions &getHeaderSearchOpts() const {
  295.     return Invocation->getHeaderSearchOpts();
  296.   }
  297.   std::shared_ptr<HeaderSearchOptions> getHeaderSearchOptsPtr() const {
  298.     return Invocation->getHeaderSearchOptsPtr();
  299.   }
  300.  
  301.   LangOptions &getLangOpts() {
  302.     return *Invocation->getLangOpts();
  303.   }
  304.   const LangOptions &getLangOpts() const {
  305.     return *Invocation->getLangOpts();
  306.   }
  307.  
  308.   PreprocessorOptions &getPreprocessorOpts() {
  309.     return Invocation->getPreprocessorOpts();
  310.   }
  311.   const PreprocessorOptions &getPreprocessorOpts() const {
  312.     return Invocation->getPreprocessorOpts();
  313.   }
  314.  
  315.   PreprocessorOutputOptions &getPreprocessorOutputOpts() {
  316.     return Invocation->getPreprocessorOutputOpts();
  317.   }
  318.   const PreprocessorOutputOptions &getPreprocessorOutputOpts() const {
  319.     return Invocation->getPreprocessorOutputOpts();
  320.   }
  321.  
  322.   TargetOptions &getTargetOpts() {
  323.     return Invocation->getTargetOpts();
  324.   }
  325.   const TargetOptions &getTargetOpts() const {
  326.     return Invocation->getTargetOpts();
  327.   }
  328.  
  329.   /// }
  330.   /// @name Diagnostics Engine
  331.   /// {
  332.  
  333.   bool hasDiagnostics() const { return Diagnostics != nullptr; }
  334.  
  335.   /// Get the current diagnostics engine.
  336.   DiagnosticsEngine &getDiagnostics() const {
  337.     assert(Diagnostics && "Compiler instance has no diagnostics!");
  338.     return *Diagnostics;
  339.   }
  340.  
  341.   /// setDiagnostics - Replace the current diagnostics engine.
  342.   void setDiagnostics(DiagnosticsEngine *Value);
  343.  
  344.   DiagnosticConsumer &getDiagnosticClient() const {
  345.     assert(Diagnostics && Diagnostics->getClient() &&
  346.            "Compiler instance has no diagnostic client!");
  347.     return *Diagnostics->getClient();
  348.   }
  349.  
  350.   /// }
  351.   /// @name VerboseOutputStream
  352.   /// }
  353.  
  354.   /// Replace the current stream for verbose output.
  355.   void setVerboseOutputStream(raw_ostream &Value);
  356.  
  357.   /// Replace the current stream for verbose output.
  358.   void setVerboseOutputStream(std::unique_ptr<raw_ostream> Value);
  359.  
  360.   /// Get the current stream for verbose output.
  361.   raw_ostream &getVerboseOutputStream() {
  362.     return *VerboseOutputStream;
  363.   }
  364.  
  365.   /// }
  366.   /// @name Target Info
  367.   /// {
  368.  
  369.   bool hasTarget() const { return Target != nullptr; }
  370.  
  371.   TargetInfo &getTarget() const {
  372.     assert(Target && "Compiler instance has no target!");
  373.     return *Target;
  374.   }
  375.  
  376.   /// Replace the current Target.
  377.   void setTarget(TargetInfo *Value);
  378.  
  379.   /// }
  380.   /// @name AuxTarget Info
  381.   /// {
  382.  
  383.   TargetInfo *getAuxTarget() const { return AuxTarget.get(); }
  384.  
  385.   /// Replace the current AuxTarget.
  386.   void setAuxTarget(TargetInfo *Value);
  387.  
  388.   // Create Target and AuxTarget based on current options
  389.   bool createTarget();
  390.  
  391.   /// }
  392.   /// @name Virtual File System
  393.   /// {
  394.  
  395.   llvm::vfs::FileSystem &getVirtualFileSystem() const;
  396.  
  397.   /// }
  398.   /// @name File Manager
  399.   /// {
  400.  
  401.   bool hasFileManager() const { return FileMgr != nullptr; }
  402.  
  403.   /// Return the current file manager to the caller.
  404.   FileManager &getFileManager() const {
  405.     assert(FileMgr && "Compiler instance has no file manager!");
  406.     return *FileMgr;
  407.   }
  408.  
  409.   void resetAndLeakFileManager() {
  410.     llvm::BuryPointer(FileMgr.get());
  411.     FileMgr.resetWithoutRelease();
  412.   }
  413.  
  414.   /// Replace the current file manager and virtual file system.
  415.   void setFileManager(FileManager *Value);
  416.  
  417.   /// }
  418.   /// @name Source Manager
  419.   /// {
  420.  
  421.   bool hasSourceManager() const { return SourceMgr != nullptr; }
  422.  
  423.   /// Return the current source manager.
  424.   SourceManager &getSourceManager() const {
  425.     assert(SourceMgr && "Compiler instance has no source manager!");
  426.     return *SourceMgr;
  427.   }
  428.  
  429.   void resetAndLeakSourceManager() {
  430.     llvm::BuryPointer(SourceMgr.get());
  431.     SourceMgr.resetWithoutRelease();
  432.   }
  433.  
  434.   /// setSourceManager - Replace the current source manager.
  435.   void setSourceManager(SourceManager *Value);
  436.  
  437.   /// }
  438.   /// @name Preprocessor
  439.   /// {
  440.  
  441.   bool hasPreprocessor() const { return PP != nullptr; }
  442.  
  443.   /// Return the current preprocessor.
  444.   Preprocessor &getPreprocessor() const {
  445.     assert(PP && "Compiler instance has no preprocessor!");
  446.     return *PP;
  447.   }
  448.  
  449.   std::shared_ptr<Preprocessor> getPreprocessorPtr() { return PP; }
  450.  
  451.   void resetAndLeakPreprocessor() {
  452.     llvm::BuryPointer(new std::shared_ptr<Preprocessor>(PP));
  453.   }
  454.  
  455.   /// Replace the current preprocessor.
  456.   void setPreprocessor(std::shared_ptr<Preprocessor> Value);
  457.  
  458.   /// }
  459.   /// @name ASTContext
  460.   /// {
  461.  
  462.   bool hasASTContext() const { return Context != nullptr; }
  463.  
  464.   ASTContext &getASTContext() const {
  465.     assert(Context && "Compiler instance has no AST context!");
  466.     return *Context;
  467.   }
  468.  
  469.   void resetAndLeakASTContext() {
  470.     llvm::BuryPointer(Context.get());
  471.     Context.resetWithoutRelease();
  472.   }
  473.  
  474.   /// setASTContext - Replace the current AST context.
  475.   void setASTContext(ASTContext *Value);
  476.  
  477.   /// Replace the current Sema; the compiler instance takes ownership
  478.   /// of S.
  479.   void setSema(Sema *S);
  480.  
  481.   /// }
  482.   /// @name ASTConsumer
  483.   /// {
  484.  
  485.   bool hasASTConsumer() const { return (bool)Consumer; }
  486.  
  487.   ASTConsumer &getASTConsumer() const {
  488.     assert(Consumer && "Compiler instance has no AST consumer!");
  489.     return *Consumer;
  490.   }
  491.  
  492.   /// takeASTConsumer - Remove the current AST consumer and give ownership to
  493.   /// the caller.
  494.   std::unique_ptr<ASTConsumer> takeASTConsumer() { return std::move(Consumer); }
  495.  
  496.   /// setASTConsumer - Replace the current AST consumer; the compiler instance
  497.   /// takes ownership of \p Value.
  498.   void setASTConsumer(std::unique_ptr<ASTConsumer> Value);
  499.  
  500.   /// }
  501.   /// @name Semantic analysis
  502.   /// {
  503.   bool hasSema() const { return (bool)TheSema; }
  504.  
  505.   Sema &getSema() const {
  506.     assert(TheSema && "Compiler instance has no Sema object!");
  507.     return *TheSema;
  508.   }
  509.  
  510.   std::unique_ptr<Sema> takeSema();
  511.   void resetAndLeakSema();
  512.  
  513.   /// }
  514.   /// @name Module Management
  515.   /// {
  516.  
  517.   IntrusiveRefCntPtr<ASTReader> getASTReader() const;
  518.   void setASTReader(IntrusiveRefCntPtr<ASTReader> Reader);
  519.  
  520.   std::shared_ptr<ModuleDependencyCollector> getModuleDepCollector() const;
  521.   void setModuleDepCollector(
  522.       std::shared_ptr<ModuleDependencyCollector> Collector);
  523.  
  524.   std::shared_ptr<PCHContainerOperations> getPCHContainerOperations() const {
  525.     return ThePCHContainerOperations;
  526.   }
  527.  
  528.   /// Return the appropriate PCHContainerWriter depending on the
  529.   /// current CodeGenOptions.
  530.   const PCHContainerWriter &getPCHContainerWriter() const {
  531.     assert(Invocation && "cannot determine module format without invocation");
  532.     StringRef Format = getHeaderSearchOpts().ModuleFormat;
  533.     auto *Writer = ThePCHContainerOperations->getWriterOrNull(Format);
  534.     if (!Writer) {
  535.       if (Diagnostics)
  536.         Diagnostics->Report(diag::err_module_format_unhandled) << Format;
  537.       llvm::report_fatal_error("unknown module format");
  538.     }
  539.     return *Writer;
  540.   }
  541.  
  542.   /// Return the appropriate PCHContainerReader depending on the
  543.   /// current CodeGenOptions.
  544.   const PCHContainerReader &getPCHContainerReader() const {
  545.     assert(Invocation && "cannot determine module format without invocation");
  546.     StringRef Format = getHeaderSearchOpts().ModuleFormat;
  547.     auto *Reader = ThePCHContainerOperations->getReaderOrNull(Format);
  548.     if (!Reader) {
  549.       if (Diagnostics)
  550.         Diagnostics->Report(diag::err_module_format_unhandled) << Format;
  551.       llvm::report_fatal_error("unknown module format");
  552.     }
  553.     return *Reader;
  554.   }
  555.  
  556.   /// }
  557.   /// @name Code Completion
  558.   /// {
  559.  
  560.   bool hasCodeCompletionConsumer() const { return (bool)CompletionConsumer; }
  561.  
  562.   CodeCompleteConsumer &getCodeCompletionConsumer() const {
  563.     assert(CompletionConsumer &&
  564.            "Compiler instance has no code completion consumer!");
  565.     return *CompletionConsumer;
  566.   }
  567.  
  568.   /// setCodeCompletionConsumer - Replace the current code completion consumer;
  569.   /// the compiler instance takes ownership of \p Value.
  570.   void setCodeCompletionConsumer(CodeCompleteConsumer *Value);
  571.  
  572.   /// }
  573.   /// @name Frontend timer
  574.   /// {
  575.  
  576.   bool hasFrontendTimer() const { return (bool)FrontendTimer; }
  577.  
  578.   llvm::Timer &getFrontendTimer() const {
  579.     assert(FrontendTimer && "Compiler instance has no frontend timer!");
  580.     return *FrontendTimer;
  581.   }
  582.  
  583.   /// }
  584.   /// @name Output Files
  585.   /// {
  586.  
  587.   /// clearOutputFiles - Clear the output file list. The underlying output
  588.   /// streams must have been closed beforehand.
  589.   ///
  590.   /// \param EraseFiles - If true, attempt to erase the files from disk.
  591.   void clearOutputFiles(bool EraseFiles);
  592.  
  593.   /// }
  594.   /// @name Construction Utility Methods
  595.   /// {
  596.  
  597.   /// Create the diagnostics engine using the invocation's diagnostic options
  598.   /// and replace any existing one with it.
  599.   ///
  600.   /// Note that this routine also replaces the diagnostic client,
  601.   /// allocating one if one is not provided.
  602.   ///
  603.   /// \param Client If non-NULL, a diagnostic client that will be
  604.   /// attached to (and, then, owned by) the DiagnosticsEngine inside this AST
  605.   /// unit.
  606.   ///
  607.   /// \param ShouldOwnClient If Client is non-NULL, specifies whether
  608.   /// the diagnostic object should take ownership of the client.
  609.   void createDiagnostics(DiagnosticConsumer *Client = nullptr,
  610.                          bool ShouldOwnClient = true);
  611.  
  612.   /// Create a DiagnosticsEngine object with a the TextDiagnosticPrinter.
  613.   ///
  614.   /// If no diagnostic client is provided, this creates a
  615.   /// DiagnosticConsumer that is owned by the returned diagnostic
  616.   /// object, if using directly the caller is responsible for
  617.   /// releasing the returned DiagnosticsEngine's client eventually.
  618.   ///
  619.   /// \param Opts - The diagnostic options; note that the created text
  620.   /// diagnostic object contains a reference to these options.
  621.   ///
  622.   /// \param Client If non-NULL, a diagnostic client that will be
  623.   /// attached to (and, then, owned by) the returned DiagnosticsEngine
  624.   /// object.
  625.   ///
  626.   /// \param CodeGenOpts If non-NULL, the code gen options in use, which may be
  627.   /// used by some diagnostics printers (for logging purposes only).
  628.   ///
  629.   /// \return The new object on success, or null on failure.
  630.   static IntrusiveRefCntPtr<DiagnosticsEngine>
  631.   createDiagnostics(DiagnosticOptions *Opts,
  632.                     DiagnosticConsumer *Client = nullptr,
  633.                     bool ShouldOwnClient = true,
  634.                     const CodeGenOptions *CodeGenOpts = nullptr);
  635.  
  636.   /// Create the file manager and replace any existing one with it.
  637.   ///
  638.   /// \return The new file manager on success, or null on failure.
  639.   FileManager *
  640.   createFileManager(IntrusiveRefCntPtr<llvm::vfs::FileSystem> VFS = nullptr);
  641.  
  642.   /// Create the source manager and replace any existing one with it.
  643.   void createSourceManager(FileManager &FileMgr);
  644.  
  645.   /// Create the preprocessor, using the invocation, file, and source managers,
  646.   /// and replace any existing one with it.
  647.   void createPreprocessor(TranslationUnitKind TUKind);
  648.  
  649.   std::string getSpecificModuleCachePath(StringRef ModuleHash);
  650.   std::string getSpecificModuleCachePath() {
  651.     return getSpecificModuleCachePath(getInvocation().getModuleHash());
  652.   }
  653.  
  654.   /// Create the AST context.
  655.   void createASTContext();
  656.  
  657.   /// Create an external AST source to read a PCH file and attach it to the AST
  658.   /// context.
  659.   void createPCHExternalASTSource(
  660.       StringRef Path, DisableValidationForModuleKind DisableValidation,
  661.       bool AllowPCHWithCompilerErrors, void *DeserializationListener,
  662.       bool OwnDeserializationListener);
  663.  
  664.   /// Create an external AST source to read a PCH file.
  665.   ///
  666.   /// \return - The new object on success, or null on failure.
  667.   static IntrusiveRefCntPtr<ASTReader> createPCHExternalASTSource(
  668.       StringRef Path, StringRef Sysroot,
  669.       DisableValidationForModuleKind DisableValidation,
  670.       bool AllowPCHWithCompilerErrors, Preprocessor &PP,
  671.       InMemoryModuleCache &ModuleCache, ASTContext &Context,
  672.       const PCHContainerReader &PCHContainerRdr,
  673.       ArrayRef<std::shared_ptr<ModuleFileExtension>> Extensions,
  674.       ArrayRef<std::shared_ptr<DependencyCollector>> DependencyCollectors,
  675.       void *DeserializationListener, bool OwnDeserializationListener,
  676.       bool Preamble, bool UseGlobalModuleIndex);
  677.  
  678.   /// Create a code completion consumer using the invocation; note that this
  679.   /// will cause the source manager to truncate the input source file at the
  680.   /// completion point.
  681.   void createCodeCompletionConsumer();
  682.  
  683.   /// Create a code completion consumer to print code completion results, at
  684.   /// \p Filename, \p Line, and \p Column, to the given output stream \p OS.
  685.   static CodeCompleteConsumer *createCodeCompletionConsumer(
  686.       Preprocessor &PP, StringRef Filename, unsigned Line, unsigned Column,
  687.       const CodeCompleteOptions &Opts, raw_ostream &OS);
  688.  
  689.   /// Create the Sema object to be used for parsing.
  690.   void createSema(TranslationUnitKind TUKind,
  691.                   CodeCompleteConsumer *CompletionConsumer);
  692.  
  693.   /// Create the frontend timer and replace any existing one with it.
  694.   void createFrontendTimer();
  695.  
  696.   /// Create the default output file (from the invocation's options) and add it
  697.   /// to the list of tracked output files.
  698.   ///
  699.   /// The files created by this are usually removed on signal, and, depending
  700.   /// on FrontendOptions, may also use a temporary file (that is, the data is
  701.   /// written to a temporary file which will atomically replace the target
  702.   /// output on success).
  703.   ///
  704.   /// \return - Null on error.
  705.   std::unique_ptr<raw_pwrite_stream> createDefaultOutputFile(
  706.       bool Binary = true, StringRef BaseInput = "", StringRef Extension = "",
  707.       bool RemoveFileOnSignal = true, bool CreateMissingDirectories = false,
  708.       bool ForceUseTemporary = false);
  709.  
  710.   /// Create a new output file, optionally deriving the output path name, and
  711.   /// add it to the list of tracked output files.
  712.   ///
  713.   /// \return - Null on error.
  714.   std::unique_ptr<raw_pwrite_stream>
  715.   createOutputFile(StringRef OutputPath, bool Binary, bool RemoveFileOnSignal,
  716.                    bool UseTemporary, bool CreateMissingDirectories = false);
  717.  
  718. private:
  719.   /// Create a new output file and add it to the list of tracked output files.
  720.   ///
  721.   /// If \p OutputPath is empty, then createOutputFile will derive an output
  722.   /// path location as \p BaseInput, with any suffix removed, and \p Extension
  723.   /// appended. If \p OutputPath is not stdout and \p UseTemporary
  724.   /// is true, createOutputFile will create a new temporary file that must be
  725.   /// renamed to \p OutputPath in the end.
  726.   ///
  727.   /// \param OutputPath - If given, the path to the output file.
  728.   /// \param Binary - The mode to open the file in.
  729.   /// \param RemoveFileOnSignal - Whether the file should be registered with
  730.   /// llvm::sys::RemoveFileOnSignal. Note that this is not safe for
  731.   /// multithreaded use, as the underlying signal mechanism is not reentrant
  732.   /// \param UseTemporary - Create a new temporary file that must be renamed to
  733.   /// OutputPath in the end.
  734.   /// \param CreateMissingDirectories - When \p UseTemporary is true, create
  735.   /// missing directories in the output path.
  736.   Expected<std::unique_ptr<raw_pwrite_stream>>
  737.   createOutputFileImpl(StringRef OutputPath, bool Binary,
  738.                        bool RemoveFileOnSignal, bool UseTemporary,
  739.                        bool CreateMissingDirectories);
  740.  
  741. public:
  742.   std::unique_ptr<raw_pwrite_stream> createNullOutputFile();
  743.  
  744.   /// }
  745.   /// @name Initialization Utility Methods
  746.   /// {
  747.  
  748.   /// InitializeSourceManager - Initialize the source manager to set InputFile
  749.   /// as the main file.
  750.   ///
  751.   /// \return True on success.
  752.   bool InitializeSourceManager(const FrontendInputFile &Input);
  753.  
  754.   /// InitializeSourceManager - Initialize the source manager to set InputFile
  755.   /// as the main file.
  756.   ///
  757.   /// \return True on success.
  758.   static bool InitializeSourceManager(const FrontendInputFile &Input,
  759.                                       DiagnosticsEngine &Diags,
  760.                                       FileManager &FileMgr,
  761.                                       SourceManager &SourceMgr);
  762.  
  763.   /// }
  764.  
  765.   void setOutputStream(std::unique_ptr<llvm::raw_pwrite_stream> OutStream) {
  766.     OutputStream = std::move(OutStream);
  767.   }
  768.  
  769.   std::unique_ptr<llvm::raw_pwrite_stream> takeOutputStream() {
  770.     return std::move(OutputStream);
  771.   }
  772.  
  773.   void createASTReader();
  774.  
  775.   bool loadModuleFile(StringRef FileName);
  776.  
  777. private:
  778.   /// Find a module, potentially compiling it, before reading its AST.  This is
  779.   /// the guts of loadModule.
  780.   ///
  781.   /// For prebuilt modules, the Module is not expected to exist in
  782.   /// HeaderSearch's ModuleMap.  If a ModuleFile by that name is in the
  783.   /// ModuleManager, then it will be loaded and looked up.
  784.   ///
  785.   /// For implicit modules, the Module is expected to already be in the
  786.   /// ModuleMap.  First attempt to load it from the given path on disk.  If that
  787.   /// fails, defer to compileModuleAndReadAST, which will first build and then
  788.   /// load it.
  789.   ModuleLoadResult findOrCompileModuleAndReadAST(StringRef ModuleName,
  790.                                                  SourceLocation ImportLoc,
  791.                                                  SourceLocation ModuleNameLoc,
  792.                                                  bool IsInclusionDirective);
  793.  
  794. public:
  795.   ModuleLoadResult loadModule(SourceLocation ImportLoc, ModuleIdPath Path,
  796.                               Module::NameVisibilityKind Visibility,
  797.                               bool IsInclusionDirective) override;
  798.  
  799.   void createModuleFromSource(SourceLocation ImportLoc, StringRef ModuleName,
  800.                               StringRef Source) override;
  801.  
  802.   void makeModuleVisible(Module *Mod, Module::NameVisibilityKind Visibility,
  803.                          SourceLocation ImportLoc) override;
  804.  
  805.   bool hadModuleLoaderFatalFailure() const {
  806.     return ModuleLoader::HadFatalFailure;
  807.   }
  808.  
  809.   GlobalModuleIndex *loadGlobalModuleIndex(SourceLocation TriggerLoc) override;
  810.  
  811.   bool lookupMissingImports(StringRef Name, SourceLocation TriggerLoc) override;
  812.  
  813.   void addDependencyCollector(std::shared_ptr<DependencyCollector> Listener) {
  814.     DependencyCollectors.push_back(std::move(Listener));
  815.   }
  816.  
  817.   void setExternalSemaSource(IntrusiveRefCntPtr<ExternalSemaSource> ESS);
  818.  
  819.   InMemoryModuleCache &getModuleCache() const { return *ModuleCache; }
  820. };
  821.  
  822. } // end namespace clang
  823.  
  824. #endif
  825.