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