• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 
OutputFileOutputFile148     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 
hasInvocation()201   bool hasInvocation() const { return Invocation != nullptr; }
202 
getInvocation()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.
setBuildGlobalModuleIndex(bool Build)216   void setBuildGlobalModuleIndex(bool Build) {
217     BuildGlobalModuleIndex = Build;
218   }
219 
220   /// }
221   /// @name Forwarding Methods
222   /// {
223 
getAnalyzerOpts()224   AnalyzerOptionsRef getAnalyzerOpts() {
225     return Invocation->getAnalyzerOpts();
226   }
227 
getCodeGenOpts()228   CodeGenOptions &getCodeGenOpts() {
229     return Invocation->getCodeGenOpts();
230   }
getCodeGenOpts()231   const CodeGenOptions &getCodeGenOpts() const {
232     return Invocation->getCodeGenOpts();
233   }
234 
getDependencyOutputOpts()235   DependencyOutputOptions &getDependencyOutputOpts() {
236     return Invocation->getDependencyOutputOpts();
237   }
getDependencyOutputOpts()238   const DependencyOutputOptions &getDependencyOutputOpts() const {
239     return Invocation->getDependencyOutputOpts();
240   }
241 
getDiagnosticOpts()242   DiagnosticOptions &getDiagnosticOpts() {
243     return Invocation->getDiagnosticOpts();
244   }
getDiagnosticOpts()245   const DiagnosticOptions &getDiagnosticOpts() const {
246     return Invocation->getDiagnosticOpts();
247   }
248 
getFileSystemOpts()249   const FileSystemOptions &getFileSystemOpts() const {
250     return Invocation->getFileSystemOpts();
251   }
252 
getFrontendOpts()253   FrontendOptions &getFrontendOpts() {
254     return Invocation->getFrontendOpts();
255   }
getFrontendOpts()256   const FrontendOptions &getFrontendOpts() const {
257     return Invocation->getFrontendOpts();
258   }
259 
getHeaderSearchOpts()260   HeaderSearchOptions &getHeaderSearchOpts() {
261     return Invocation->getHeaderSearchOpts();
262   }
getHeaderSearchOpts()263   const HeaderSearchOptions &getHeaderSearchOpts() const {
264     return Invocation->getHeaderSearchOpts();
265   }
266 
getLangOpts()267   LangOptions &getLangOpts() {
268     return *Invocation->getLangOpts();
269   }
getLangOpts()270   const LangOptions &getLangOpts() const {
271     return *Invocation->getLangOpts();
272   }
273 
getPreprocessorOpts()274   PreprocessorOptions &getPreprocessorOpts() {
275     return Invocation->getPreprocessorOpts();
276   }
getPreprocessorOpts()277   const PreprocessorOptions &getPreprocessorOpts() const {
278     return Invocation->getPreprocessorOpts();
279   }
280 
getPreprocessorOutputOpts()281   PreprocessorOutputOptions &getPreprocessorOutputOpts() {
282     return Invocation->getPreprocessorOutputOpts();
283   }
getPreprocessorOutputOpts()284   const PreprocessorOutputOptions &getPreprocessorOutputOpts() const {
285     return Invocation->getPreprocessorOutputOpts();
286   }
287 
getTargetOpts()288   TargetOptions &getTargetOpts() {
289     return Invocation->getTargetOpts();
290   }
getTargetOpts()291   const TargetOptions &getTargetOpts() const {
292     return Invocation->getTargetOpts();
293   }
294 
295   /// }
296   /// @name Diagnostics Engine
297   /// {
298 
hasDiagnostics()299   bool hasDiagnostics() const { return Diagnostics != nullptr; }
300 
301   /// Get the current diagnostics engine.
getDiagnostics()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 
getDiagnosticClient()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 
hasTarget()320   bool hasTarget() const { return Target != nullptr; }
321 
getTarget()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 
hasVirtualFileSystem()334   bool hasVirtualFileSystem() const { return VirtualFileSystem != nullptr; }
335 
getVirtualFileSystem()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.
setVirtualFileSystem(IntrusiveRefCntPtr<vfs::FileSystem> FS)346   void setVirtualFileSystem(IntrusiveRefCntPtr<vfs::FileSystem> FS) {
347     VirtualFileSystem = FS;
348   }
349 
350   /// }
351   /// @name File Manager
352   /// {
353 
hasFileManager()354   bool hasFileManager() const { return FileMgr != nullptr; }
355 
356   /// Return the current file manager to the caller.
getFileManager()357   FileManager &getFileManager() const {
358     assert(FileMgr && "Compiler instance has no file manager!");
359     return *FileMgr;
360   }
361 
resetAndLeakFileManager()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 
hasSourceManager()374   bool hasSourceManager() const { return SourceMgr != nullptr; }
375 
376   /// Return the current source manager.
getSourceManager()377   SourceManager &getSourceManager() const {
378     assert(SourceMgr && "Compiler instance has no source manager!");
379     return *SourceMgr;
380   }
381 
resetAndLeakSourceManager()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 
hasPreprocessor()394   bool hasPreprocessor() const { return PP != nullptr; }
395 
396   /// Return the current preprocessor.
getPreprocessor()397   Preprocessor &getPreprocessor() const {
398     assert(PP && "Compiler instance has no preprocessor!");
399     return *PP;
400   }
401 
resetAndLeakPreprocessor()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 
hasASTContext()414   bool hasASTContext() const { return Context != nullptr; }
415 
getASTContext()416   ASTContext &getASTContext() const {
417     assert(Context && "Compiler instance has no AST context!");
418     return *Context;
419   }
420 
resetAndLeakASTContext()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 
hasASTConsumer()437   bool hasASTConsumer() const { return (bool)Consumer; }
438 
getASTConsumer()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.
takeASTConsumer()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   /// {
hasSema()455   bool hasSema() const { return (bool)TheSema; }
456 
getSema()457   Sema &getSema() const {
458     assert(TheSema && "Compiler instance has no Sema object!");
459     return *TheSema;
460   }
461 
takeSema()462   Sema *takeSema() { return TheSema.release(); }
resetAndLeakSema()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 
hasCodeCompletionConsumer()480   bool hasCodeCompletionConsumer() const { return (bool)CompletionConsumer; }
481 
getCodeCompletionConsumer()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.
takeCodeCompletionConsumer()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 
hasFrontendTimer()502   bool hasFrontendTimer() const { return (bool)FrontendTimer; }
503 
getFrontendTimer()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 
hadModuleLoaderFatalFailure()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 
addDependencyCollector(std::shared_ptr<DependencyCollector> Listener)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