9#ifndef LLVM_CLANG_FRONTEND_COMPILERINSTANCE_H_
10#define LLVM_CLANG_FRONTEND_COMPILERINSTANCE_H_
22#include "llvm/ADT/ArrayRef.h"
23#include "llvm/ADT/DenseMap.h"
24#include "llvm/ADT/IntrusiveRefCntPtr.h"
25#include "llvm/ADT/StringRef.h"
26#include "llvm/Support/BuryPointer.h"
27#include "llvm/Support/FileSystem.h"
28#include "llvm/Support/VirtualFileSystem.h"
46namespace serialization {
50class CodeCompleteConsumer;
51class DiagnosticsEngine;
52class DiagnosticConsumer;
83 std::shared_ptr<CompilerInvocation> Invocation;
92 std::unique_ptr<TargetOptions> AuxTargetOpts;
107 std::unique_ptr<DependencyDirectivesGetter> GetDependencyDirectives;
110 std::shared_ptr<Preprocessor> PP;
119 std::unique_ptr<ASTConsumer> Consumer;
122 std::unique_ptr<CodeCompleteConsumer> CompletionConsumer;
125 std::unique_ptr<Sema> TheSema;
128 std::unique_ptr<llvm::TimerGroup> timerGroup;
131 std::unique_ptr<llvm::Timer> FrontendTimer;
137 std::shared_ptr<ModuleDependencyCollector> ModuleDepCollector;
140 std::shared_ptr<PCHContainerOperations> ThePCHContainerOperations;
142 std::vector<std::shared_ptr<DependencyCollector>> DependencyCollectors;
150 llvm::StringSet<> FailedModules;
154 std::map<std::string, std::string, std::less<>> BuiltModules;
157 bool DeleteBuiltModules =
true;
169 bool BuildGlobalModuleIndex =
false;
172 bool HaveFullGlobalModuleIndex =
false;
175 bool DisableGeneratingGlobalModuleIndex =
false;
178 std::unique_ptr<raw_ostream> OwnedVerboseOutputStream;
181 raw_ostream *VerboseOutputStream = &llvm::errs();
190 std::optional<llvm::sys::fs::TempFile>
File;
192 OutputFile(std::string filename,
193 std::optional<llvm::sys::fs::TempFile> file)
194 :
Filename(std::move(filename)),
File(std::move(file)) {}
198 std::list<OutputFile> OutputFiles;
201 std::unique_ptr<llvm::raw_pwrite_stream> OutputStream;
207 std::shared_ptr<CompilerInvocation> Invocation =
208 std::make_shared<CompilerInvocation>(),
209 std::shared_ptr<PCHContainerOperations> PCHContainerOps =
210 std::make_shared<PCHContainerOperations>(),
266 BuildGlobalModuleIndex = Build;
276 return Invocation->getCodeGenOpts();
279 return Invocation->getCodeGenOpts();
283 return Invocation->getDependencyOutputOpts();
286 return Invocation->getDependencyOutputOpts();
290 return Invocation->getDiagnosticOpts();
293 return Invocation->getDiagnosticOpts();
297 return Invocation->getFileSystemOpts();
300 return Invocation->getFileSystemOpts();
304 return Invocation->getFrontendOpts();
307 return Invocation->getFrontendOpts();
311 return Invocation->getHeaderSearchOpts();
314 return Invocation->getHeaderSearchOpts();
319 return Invocation->getAPINotesOpts();
326 return Invocation->getPreprocessorOpts();
329 return Invocation->getPreprocessorOpts();
333 return Invocation->getPreprocessorOutputOpts();
336 return Invocation->getPreprocessorOutputOpts();
340 return Invocation->getTargetOpts();
343 return Invocation->getTargetOpts();
354 assert(Diagnostics &&
"Compiler instance has no diagnostics!");
359 assert(Diagnostics &&
"Compiler instance has no diagnostics!");
367 assert(Diagnostics && Diagnostics->getClient() &&
368 "Compiler instance has no diagnostic client!");
369 return *Diagnostics->getClient();
384 return *VerboseOutputStream;
394 assert(
Target &&
"Compiler instance has no target!");
399 assert(
Target &&
"Compiler instance has no target!");
434 assert(FileMgr &&
"Compiler instance has no file manager!");
439 assert(FileMgr &&
"Compiler instance has no file manager!");
444 llvm::BuryPointer(FileMgr.get());
445 FileMgr.resetWithoutRelease();
459 assert(SourceMgr &&
"Compiler instance has no source manager!");
464 assert(SourceMgr &&
"Compiler instance has no source manager!");
469 llvm::BuryPointer(SourceMgr.get());
470 SourceMgr.resetWithoutRelease();
484 assert(PP &&
"Compiler instance has no preprocessor!");
491 llvm::BuryPointer(
new std::shared_ptr<Preprocessor>(PP));
504 assert(Context &&
"Compiler instance has no AST context!");
509 assert(Context &&
"Compiler instance has no AST context!");
514 llvm::BuryPointer(Context.get());
515 Context.resetWithoutRelease();
532 assert(Consumer &&
"Compiler instance has no AST consumer!");
547 bool hasSema()
const {
return (
bool)TheSema; }
550 assert(TheSema &&
"Compiler instance has no Sema object!");
566 std::shared_ptr<ModuleDependencyCollector> Collector);
569 return ThePCHContainerOperations;
575 assert(Invocation &&
"cannot determine module format without invocation");
577 auto *Writer = ThePCHContainerOperations->getWriterOrNull(Format);
580 Diagnostics->Report(diag::err_module_format_unhandled) << Format;
581 llvm::report_fatal_error(
"unknown module format");
589 assert(Invocation &&
"cannot determine module format without invocation");
591 auto *Reader = ThePCHContainerOperations->getReaderOrNull(Format);
594 Diagnostics->Report(diag::err_module_format_unhandled) << Format;
595 llvm::report_fatal_error(
"unknown module format");
607 assert(CompletionConsumer &&
608 "Compiler instance has no code completion consumer!");
609 return *CompletionConsumer;
623 assert(FrontendTimer &&
"Compiler instance has no frontend timer!");
624 return *FrontendTimer;
658 bool ShouldOwnClient =
true);
681 bool ShouldOwnClient =
true,
698 std::unique_ptr<DependencyDirectivesGetter> Getter) {
699 GetDependencyDirectives = std::move(Getter);
714 bool AllowPCHWithCompilerErrors,
void *DeserializationListener,
715 bool OwnDeserializationListener);
721 StringRef
Path, StringRef Sysroot,
726 ArrayRef<std::shared_ptr<ModuleFileExtension>> Extensions,
727 ArrayRef<std::shared_ptr<DependencyCollector>> DependencyCollectors,
728 void *DeserializationListener,
bool OwnDeserializationListener,
729 bool Preamble,
bool UseGlobalModuleIndex);
759 bool Binary =
true, StringRef BaseInput =
"", StringRef Extension =
"",
760 bool RemoveFileOnSignal =
true,
bool CreateMissingDirectories =
false,
761 bool ForceUseTemporary =
false);
767 std::unique_ptr<raw_pwrite_stream>
769 bool UseTemporary,
bool CreateMissingDirectories =
false);
790 createOutputFileImpl(StringRef OutputPath,
bool Binary,
791 bool RemoveFileOnSignal,
bool UseTemporary,
792 bool CreateMissingDirectories);
819 OutputStream = std::move(OutStream);
823 return std::move(OutputStream);
836 std::shared_ptr<ModuleDependencyCollector> ModuleDepCollector;
842 std::shared_ptr<ModuleDependencyCollector> ModuleDepCollector =
nullptr)
843 : VFS(
std::move(VFS)), DiagConsumer(DiagConsumer),
844 ModuleDepCollector(
std::move(ModuleDepCollector)) {
845 assert(this->VFS &&
"Clone config requires non-null VFS");
851 return ModuleDepCollector;
870 bool IsInclusionDirective);
875 std::unique_ptr<CompilerInstance> cloneForModuleCompileImpl(
877 StringRef OriginalModuleMapFile, StringRef ModuleFileName,
878 std::optional<ThreadSafeCloneConfig> ThreadSafeConfig = std::nullopt);
890 std::optional<ThreadSafeCloneConfig> ThreadSafeConfig = std::nullopt);
902 bool IsInclusionDirective)
override;
905 StringRef Source)
override;
919 DependencyCollectors.push_back(std::move(Listener));
Defines the Diagnostic-related interfaces.
This is the interface for scanning header and source files to get the minimum necessary preprocessor ...
llvm::MachO::Target Target
Defines the SourceManager interface.
Tracks various options which control how API notes are found and handled.
ASTConsumer - This is an abstract interface that should be implemented by clients that read ASTs.
Holds long-lived AST nodes (such as types and decls) that can be referred to throughout the semantic ...
Stores options for the analyzer from the command line.
Abstract interface for a consumer of code-completion information.
Options controlling the behavior of code completion.
CodeGenOptions - Track various options which control how the code is optimized and passed to the back...
Configuration object for making the result of cloneForModuleCompile() thread-safe.
std::shared_ptr< ModuleDependencyCollector > getModuleDepCollector() const
ThreadSafeCloneConfig(IntrusiveRefCntPtr< llvm::vfs::FileSystem > VFS, DiagnosticConsumer &DiagConsumer, std::shared_ptr< ModuleDependencyCollector > ModuleDepCollector=nullptr)
IntrusiveRefCntPtr< llvm::vfs::FileSystem > getVFS() const
DiagnosticConsumer & getDiagConsumer() const
CompilerInstance - Helper class for managing a single instance of the Clang compiler.
void createPCHExternalASTSource(StringRef Path, DisableValidationForModuleKind DisableValidation, bool AllowPCHWithCompilerErrors, void *DeserializationListener, bool OwnDeserializationListener)
Create an external AST source to read a PCH file and attach it to the AST context.
DiagnosticConsumer & getDiagnosticClient() const
~CompilerInstance() override
void createPreprocessor(TranslationUnitKind TUKind)
Create the preprocessor, using the invocation, file, and source managers, and replace any existing on...
AnalyzerOptions & getAnalyzerOpts()
bool lookupMissingImports(StringRef Name, SourceLocation TriggerLoc) override
Check global module index for missing imports.
void createSourceManager(FileManager &FileMgr)
Create the source manager and replace any existing one with it.
FileManager * createFileManager(IntrusiveRefCntPtr< llvm::vfs::FileSystem > VFS=nullptr)
Create the file manager and replace any existing one with it.
const HeaderSearchOptions & getHeaderSearchOpts() const
DependencyOutputOptions & getDependencyOutputOpts()
bool hasFileManager() const
const DependencyOutputOptions & getDependencyOutputOpts() const
std::shared_ptr< Preprocessor > getPreprocessorPtr()
TargetInfo * getAuxTarget() const
const PCHContainerReader & getPCHContainerReader() const
Return the appropriate PCHContainerReader depending on the current CodeGenOptions.
DiagnosticsEngine & getDiagnostics() const
Get the current diagnostics engine.
GlobalModuleIndex * loadGlobalModuleIndex(SourceLocation TriggerLoc) override
Load, create, or return global module.
raw_ostream & getVerboseOutputStream()
Get the current stream for verbose output.
llvm::TimerGroup & getTimerGroup() const
std::unique_ptr< raw_pwrite_stream > createDefaultOutputFile(bool Binary=true, StringRef BaseInput="", StringRef Extension="", bool RemoveFileOnSignal=true, bool CreateMissingDirectories=false, bool ForceUseTemporary=false)
Create the default output file (from the invocation's options) and add it to the list of tracked outp...
void setExternalSemaSource(IntrusiveRefCntPtr< ExternalSemaSource > ESS)
bool compileModule(SourceLocation ImportLoc, StringRef ModuleName, StringRef ModuleFileName, CompilerInstance &Instance)
Compile a module file for the given module, using the options provided by the importing compiler inst...
void createDiagnostics(llvm::vfs::FileSystem &VFS, DiagnosticConsumer *Client=nullptr, bool ShouldOwnClient=true)
Create the diagnostics engine using the invocation's diagnostic options and replace any existing one ...
const DiagnosticOptions & getDiagnosticOpts() const
std::string getSpecificModuleCachePath()
std::unique_ptr< CompilerInstance > cloneForModuleCompile(SourceLocation ImportLoc, Module *Module, StringRef ModuleFileName, std::optional< ThreadSafeCloneConfig > ThreadSafeConfig=std::nullopt)
Creates a new CompilerInstance for compiling a module.
ModuleLoadResult loadModule(SourceLocation ImportLoc, ModuleIdPath Path, Module::NameVisibilityKind Visibility, bool IsInclusionDirective) override
Attempt to load the given module.
const CodeGenOptions & getCodeGenOpts() const
FileSystemOptions & getFileSystemOpts()
llvm::Timer & getFrontendTimer() const
const TargetOptions & getTargetOpts() const
bool InitializeSourceManager(const FrontendInputFile &Input)
InitializeSourceManager - Initialize the source manager to set InputFile as the main file.
void setOutputStream(std::unique_ptr< llvm::raw_pwrite_stream > OutStream)
FileManager & getFileManager() const
Return the current file manager to the caller.
void setBuildGlobalModuleIndex(bool Build)
Set the flag indicating whether we should (re)build the global module index.
IntrusiveRefCntPtr< DiagnosticsEngine > getDiagnosticsPtr() const
std::unique_ptr< Sema > takeSema()
const PreprocessorOptions & getPreprocessorOpts() const
void printDiagnosticStats()
At the end of a compilation, print the number of warnings/errors.
void resetAndLeakSourceManager()
void setASTConsumer(std::unique_ptr< ASTConsumer > Value)
setASTConsumer - Replace the current AST consumer; the compiler instance takes ownership of Value.
PreprocessorOutputOptions & getPreprocessorOutputOpts()
IntrusiveRefCntPtr< FileManager > getFileManagerPtr() const
IntrusiveRefCntPtr< ASTContext > getASTContextPtr() const
ModuleCache & getModuleCache() const
const PreprocessorOutputOptions & getPreprocessorOutputOpts() const
IntrusiveRefCntPtr< ASTReader > getASTReader() const
void setTarget(TargetInfo *Value)
Replace the current Target.
void setModuleDepCollector(std::shared_ptr< ModuleDependencyCollector > Collector)
void addDependencyCollector(std::shared_ptr< DependencyCollector > Listener)
void createASTContext()
Create the AST context.
std::unique_ptr< raw_pwrite_stream > createOutputFile(StringRef OutputPath, bool Binary, bool RemoveFileOnSignal, bool UseTemporary, bool CreateMissingDirectories=false)
Create a new output file, optionally deriving the output path name, and add it to the list of tracked...
bool hasASTContext() const
void createModuleFromSource(SourceLocation ImportLoc, StringRef ModuleName, StringRef Source) override
Attempt to create the given module from the specified source buffer.
void resetAndLeakFileManager()
Preprocessor & getPreprocessor() const
Return the current preprocessor.
ASTContext & getASTContext() const
void LoadRequestedPlugins()
Load the list of plugins requested in the FrontendOptions.
TargetOptions & getTargetOpts()
IntrusiveRefCntPtr< TargetInfo > getTargetPtr() const
void setASTReader(IntrusiveRefCntPtr< ASTReader > Reader)
std::unique_ptr< llvm::raw_pwrite_stream > takeOutputStream()
FrontendOptions & getFrontendOpts()
const FrontendOptions & getFrontendOpts() const
std::shared_ptr< ModuleDependencyCollector > getModuleDepCollector() const
std::shared_ptr< CompilerInvocation > getInvocationPtr()
bool hasDiagnostics() const
bool hadModuleLoaderFatalFailure() const
void setSema(Sema *S)
Replace the current Sema; the compiler instance takes ownership of S.
void setSourceManager(llvm::IntrusiveRefCntPtr< SourceManager > Value)
setSourceManager - Replace the current source manager.
void setASTContext(llvm::IntrusiveRefCntPtr< ASTContext > Value)
setASTContext - Replace the current AST context.
HeaderSearchOptions & getHeaderSearchOpts()
void createFrontendTimer()
Create the frontend timer and replace any existing one with it.
llvm::IntrusiveRefCntPtr< llvm::vfs::FileSystem > getVirtualFileSystemPtr() const
bool hasCodeCompletionConsumer() const
void resetAndLeakASTContext()
const LangOptions & getLangOpts() const
CompilerInvocation & getInvocation()
const PCHContainerWriter & getPCHContainerWriter() const
Return the appropriate PCHContainerWriter depending on the current CodeGenOptions.
void setVerboseOutputStream(raw_ostream &Value)
Replace the current stream for verbose output.
void resetAndLeakPreprocessor()
std::unique_ptr< ASTConsumer > takeASTConsumer()
takeASTConsumer - Remove the current AST consumer and give ownership to the caller.
PreprocessorOptions & getPreprocessorOpts()
ASTConsumer & getASTConsumer() const
void setFileManager(IntrusiveRefCntPtr< FileManager > Value)
Replace the current file manager and virtual file system.
TargetInfo & getTarget() const
llvm::vfs::FileSystem & getVirtualFileSystem() const
const FileSystemOptions & getFileSystemOpts() const
void createCodeCompletionConsumer()
Create a code completion consumer using the invocation; note that this will cause the source manager ...
void setCodeCompletionConsumer(CodeCompleteConsumer *Value)
setCodeCompletionConsumer - Replace the current code completion consumer; the compiler instance takes...
bool ExecuteAction(FrontendAction &Act)
ExecuteAction - Execute the provided action against the compiler's CompilerInvocation object.
std::shared_ptr< PCHContainerOperations > getPCHContainerOperations() const
void clearOutputFiles(bool EraseFiles)
clearOutputFiles - Clear the output file list.
DiagnosticOptions & getDiagnosticOpts()
LangOptions & getLangOpts()
const APINotesOptions & getAPINotesOpts() const
CodeGenOptions & getCodeGenOpts()
SourceManager & getSourceManager() const
Return the current source manager.
IntrusiveRefCntPtr< SourceManager > getSourceManagerPtr() const
CodeCompleteConsumer & getCodeCompletionConsumer() const
void setDiagnostics(llvm::IntrusiveRefCntPtr< DiagnosticsEngine > Value)
setDiagnostics - Replace the current diagnostics engine.
bool shouldBuildGlobalModuleIndex() const
Indicates whether we should (re)build the global module index.
bool hasSourceManager() const
bool hasASTConsumer() const
APINotesOptions & getAPINotesOpts()
std::unique_ptr< raw_pwrite_stream > createNullOutputFile()
void setAuxTarget(TargetInfo *Value)
Replace the current AuxTarget.
void makeModuleVisible(Module *Mod, Module::NameVisibilityKind Visibility, SourceLocation ImportLoc) override
Make the given module visible.
bool loadModuleFile(StringRef FileName, serialization::ModuleFile *&LoadedModuleFile)
void setDependencyDirectivesGetter(std::unique_ptr< DependencyDirectivesGetter > Getter)
bool hasPreprocessor() const
void setPreprocessor(std::shared_ptr< Preprocessor > Value)
Replace the current preprocessor.
void createSema(TranslationUnitKind TUKind, CodeCompleteConsumer *CompletionConsumer)
Create the Sema object to be used for parsing.
Helper class for holding the data necessary to invoke the compiler.
DependencyOutputOptions - Options for controlling the compiler dependency file generation.
Abstract interface, implemented by clients of the front-end, which formats and prints fully processed...
Options for controlling the compiler diagnostics engine.
Concrete class used by the front-end to report problems and issues.
Implements support for file system lookup, file system caching, and directory search management.
Keeps track of options that affect how file operations are performed.
Abstract base class for actions which can be performed by the frontend.
FrontendOptions - Options for controlling the behavior of the frontend.
A global index for a set of module files, providing information about the identifiers within those mo...
Keeps track of the various options that can be enabled, which controls the dialect of C or C++ that i...
The module cache used for compiling modules implicitly.
Describes the result of attempting to load a module.
Abstract interface for a module loader.
Describes a module or submodule.
NameVisibilityKind
Describes the visibility of the various names within a particular module.
This abstract interface provides operations for unwrapping containers for serialized ASTs (precompile...
This abstract interface provides operations for creating containers for serialized ASTs (precompiled ...
PreprocessorOptions - This class is used for passing the various options used in preprocessor initial...
PreprocessorOutputOptions - Options for controlling the C preprocessor output (e.g....
Engages in a tight little dance with the lexer to efficiently preprocess tokens.
Sema - This implements semantic analysis and AST building for C.
Encodes a location in the source.
This class handles loading and caching of source files into memory.
Exposes information about the current target.
Options for controlling the target.
Information about a module that has been loaded by the ASTReader.
Defines the clang::TargetInfo interface.
The JSON file list parser is used to communicate input to InstallAPI.
@ Module
Module linkage, which indicates that the entity can be referred to from other translation units withi...
TranslationUnitKind
Describes the kind of translation unit being processed.
DisableValidationForModuleKind
Whether to disable the normal validation performed on precompiled headers and module files when they ...
Visibility
Describes the different kinds of visibility that a declaration may have.
Diagnostic wrappers for TextAPI types for error reporting.