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
33namespace llvm {
34class raw_fd_ostream;
35class Timer;
36class TimerGroup;
37}
38
39namespace clang {
40class ASTContext;
41class ASTReader;
42class CodeCompleteConsumer;
43class DiagnosticsEngine;
44class DiagnosticConsumer;
45class FileManager;
46class FrontendAction;
47class InMemoryModuleCache;
48class Module;
49class Preprocessor;
50class Sema;
51class SourceManager;
52class TargetInfo;
53enum 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.
73class 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;
183public:
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
718private:
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
741public:
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
777private:
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
794public:
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