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