16#include "llvm/ADT/IntrusiveRefCntPtr.h"
17#include "llvm/ADT/ScopeExit.h"
18#include "llvm/Option/Option.h"
19#include "llvm/Support/AdvisoryLock.h"
20#include "llvm/Support/CrashRecoveryContext.h"
21#include "llvm/Support/VirtualFileSystem.h"
22#include "llvm/TargetParser/Host.h"
34 DependencyConsumerForwarder(std::unique_ptr<DependencyOutputOptions> Opts,
35 StringRef WorkingDirectory, DependencyConsumer &C)
36 : DependencyFileGenerator(*Opts), WorkingDirectory(WorkingDirectory),
37 Opts(std::move(Opts)), C(C) {}
39 void finishedMainFile(DiagnosticsEngine &Diags)
override {
40 C.handleDependencyOutputOpts(*Opts);
41 llvm::SmallString<256> CanonPath;
42 for (
const auto &
File : getDependencies()) {
44 llvm::sys::path::remove_dots(CanonPath,
true);
45 llvm::sys::path::make_absolute(WorkingDirectory, CanonPath);
46 C.handleFileDependency(CanonPath);
51 StringRef WorkingDirectory;
52 std::unique_ptr<DependencyOutputOptions> Opts;
53 DependencyConsumer &C;
60 if (LangOpts.Modules) {
63 Diags->
Report(diag::warn_pch_vfsoverlay_mismatch);
65 if (VFSOverlays.empty()) {
66 Diags->
Report(diag::note_pch_vfsoverlay_empty) <<
Type;
68 std::string Files = llvm::join(VFSOverlays,
"\n");
69 Diags->
Report(diag::note_pch_vfsoverlay_files) <<
Type << Files;
87 PrebuiltModuleListener(PrebuiltModuleFilesT &PrebuiltModuleFiles,
88 llvm::SmallVector<std::string> &NewModuleFiles,
90 const HeaderSearchOptions &HSOpts,
91 const LangOptions &LangOpts, DiagnosticsEngine &Diags,
92 const ArrayRef<StringRef> StableDirs)
93 : PrebuiltModuleFiles(PrebuiltModuleFiles),
94 NewModuleFiles(NewModuleFiles),
95 PrebuiltModulesASTMap(PrebuiltModulesASTMap), ExistingHSOpts(HSOpts),
96 ExistingLangOpts(LangOpts), Diags(Diags), StableDirs(StableDirs) {}
98 bool needsImportVisitation()
const override {
return true; }
99 bool needsInputFileVisitation()
override {
return true; }
100 bool needsSystemInputFileVisitation()
override {
return true; }
104 void visitImport(StringRef ModuleName, StringRef Filename)
override {
105 if (PrebuiltModuleFiles.insert({ModuleName.str(), Filename.str()}).second)
106 NewModuleFiles.push_back(Filename.str());
108 auto PrebuiltMapEntry = PrebuiltModulesASTMap.try_emplace(Filename);
109 PrebuiltModuleASTAttrs &PrebuiltModule = PrebuiltMapEntry.first->second;
110 if (PrebuiltMapEntry.second)
113 if (
auto It = PrebuiltModulesASTMap.find(CurrentFile);
114 It != PrebuiltModulesASTMap.end() && CurrentFile != Filename)
121 bool visitInputFileAsRequested(StringRef FilenameAsRequested,
122 StringRef Filename,
bool isSystem,
123 bool isOverridden, time_t StoredTime,
124 bool isExplicitModule)
override {
125 if (StableDirs.empty())
127 auto PrebuiltEntryIt = PrebuiltModulesASTMap.find(CurrentFile);
128 if ((PrebuiltEntryIt == PrebuiltModulesASTMap.end()) ||
129 (!PrebuiltEntryIt->second.isInStableDir()))
132 PrebuiltEntryIt->second.setInStableDir(
134 return PrebuiltEntryIt->second.isInStableDir();
139 bool DirectlyImported)
override {
142 auto PrebuiltEntryIt = PrebuiltModulesASTMap.find(CurrentFile);
143 if ((PrebuiltEntryIt != PrebuiltModulesASTMap.end()) &&
144 !PrebuiltEntryIt->second.isInStableDir())
145 PrebuiltEntryIt->second.updateDependentsNotInStableDirs(
146 PrebuiltModulesASTMap);
147 CurrentFile = Filename.
str();
152 bool ReadHeaderSearchOptions(
const HeaderSearchOptions &HSOpts,
153 StringRef ModuleFilename, StringRef ContextHash,
154 bool Complain)
override {
156 auto PrebuiltMapEntry = PrebuiltModulesASTMap.try_emplace(CurrentFile);
157 PrebuiltModuleASTAttrs &PrebuiltModule = PrebuiltMapEntry.first->second;
158 if (PrebuiltMapEntry.second)
168 bool ReadHeaderSearchPaths(
const HeaderSearchOptions &HSOpts,
169 bool Complain)
override {
171 auto PrebuiltMapEntry = PrebuiltModulesASTMap.try_emplace(CurrentFile);
172 PrebuiltModuleASTAttrs &PrebuiltModule = PrebuiltMapEntry.first->second;
173 if (PrebuiltMapEntry.second)
179 return checkHeaderSearchPaths(
180 HSOpts, ExistingHSOpts, Complain ? &Diags :
nullptr, ExistingLangOpts);
184 PrebuiltModuleFilesT &PrebuiltModuleFiles;
185 llvm::SmallVector<std::string> &NewModuleFiles;
187 const HeaderSearchOptions &ExistingHSOpts;
188 const LangOptions &ExistingLangOpts;
189 DiagnosticsEngine &Diags;
190 std::string CurrentFile;
191 const ArrayRef<StringRef> StableDirs;
196static bool visitPrebuiltModule(StringRef PrebuiltModuleFilename,
198 PrebuiltModuleFilesT &ModuleFiles,
205 PrebuiltModuleListener Listener(ModuleFiles, Worklist, PrebuiltModulesASTMap,
219 while (!Worklist.empty()) {
239static std::string makeObjFileName(StringRef
FileName) {
241 llvm::sys::path::replace_extension(ObjFileName,
"o");
242 return std::string(ObjFileName);
247deduceDepTarget(
const std::string &OutputFile,
249 if (OutputFile !=
"-")
252 if (InputFiles.empty() || !InputFiles.front().isFile())
253 return "clang-scan-deps\\ dependency";
255 return makeObjFileName(InputFiles.front().getFile());
268static std::optional<StringRef> getSimpleMacroName(StringRef
Macro) {
269 StringRef Name =
Macro.split(
"=").first.ltrim(
" \t");
272 auto FinishName = [&]() -> std::optional<StringRef> {
273 StringRef SimpleName = Name.slice(0, I);
274 if (SimpleName.empty())
279 for (; I != Name.size(); ++I) {
288 if (llvm::isAlnum(Name[I]))
298 using MacroOpt = std::pair<StringRef, std::size_t>;
299 std::vector<MacroOpt> SimpleNames;
300 SimpleNames.reserve(PPOpts.
Macros.size());
301 std::size_t Index = 0;
302 for (
const auto &M : PPOpts.
Macros) {
303 auto SName = getSimpleMacroName(M.first);
307 SimpleNames.emplace_back(*SName, Index);
311 llvm::stable_sort(SimpleNames, llvm::less_first());
313 auto NewEnd = std::unique(
314 SimpleNames.rbegin(), SimpleNames.rend(),
315 [](
const MacroOpt &A,
const MacroOpt &B) { return A.first == B.first; });
316 SimpleNames.erase(SimpleNames.begin(), NewEnd.base());
319 decltype(PPOpts.
Macros) NewMacros;
320 NewMacros.reserve(SimpleNames.size());
321 for (std::size_t I = 0, E = SimpleNames.size(); I != E; ++I) {
322 std::size_t OriginalIndex = SimpleNames[I].second;
324 NewMacros.push_back(std::move(PPOpts.
Macros[OriginalIndex]));
326 std::swap(PPOpts.
Macros, NewMacros);
335 FileMgr.getVirtualFileSystem().visit([&](llvm::vfs::FileSystem &FS) {
336 auto *
DFS = llvm::dyn_cast<DependencyScanningWorkerFilesystem>(&FS);
338 assert(!DepFS &&
"Found multiple scanning VFSs");
342 assert(DepFS &&
"Did not find scanning VFS");
345 std::unique_ptr<DependencyDirectivesGetter>
346 cloneFor(FileManager &FileMgr)
override {
347 return std::make_unique<ScanningDependencyDirectivesGetter>(FileMgr);
350 std::optional<ArrayRef<dependency_directives_scan::Directive>>
351 operator()(FileEntryRef
File)
override {
352 return DepFS->getDirectiveTokens(
File.getName());
359 DiagOpts.ShowCarets =
false;
370 return llvm::StringSwitch<bool>(Warning)
371 .Cases({
"pch-vfs-diff",
"error=pch-vfs-diff"},
false)
372 .StartsWith(
"no-error=",
false)
378std::unique_ptr<DiagnosticOptions>
380 std::vector<const char *> CLI;
381 for (
const std::string &Arg : CommandLine)
382 CLI.push_back(Arg.c_str());
384 sanitizeDiagOpts(*DiagOpts);
391 std::vector<const char *> CCommandLine(CommandLine.size(),
nullptr);
392 llvm::transform(CommandLine, CCommandLine.begin(),
393 [](
const std::string &Str) { return Str.c_str(); });
400std::unique_ptr<CompilerInvocation>
403 llvm::opt::ArgStringList Argv;
404 for (
const std::string &Str :
ArrayRef(CommandLine).drop_front())
405 Argv.push_back(Str.c_str());
407 auto Invocation = std::make_unique<CompilerInvocation>();
431 std::make_unique<ScanningDependencyDirectivesGetter>(
439 auto ScanInvocation = std::make_shared<CompilerInvocation>(Invocation);
441 sanitizeDiagOpts(ScanInvocation->getDiagnosticOpts());
443 ScanInvocation->getPreprocessorOpts().AllowPCHWithDifferentModulesCachePath =
446 if (ScanInvocation->getHeaderSearchOpts().ModulesValidateOncePerBuildSession)
447 ScanInvocation->getHeaderSearchOpts().BuildSessionTimestamp =
450 ScanInvocation->getFrontendOpts().DisableFree =
false;
451 ScanInvocation->getFrontendOpts().GenerateGlobalModuleIndex =
false;
452 ScanInvocation->getFrontendOpts().UseGlobalModuleIndex =
false;
453 ScanInvocation->getFrontendOpts().GenReducedBMI =
false;
454 ScanInvocation->getFrontendOpts().ModuleOutputPath.clear();
457 ScanInvocation->getFrontendOpts().ModulesShareFileManager =
true;
458 ScanInvocation->getHeaderSearchOpts().ModuleFormat =
"raw";
459 ScanInvocation->getHeaderSearchOpts().ModulesIncludeVFSUsage =
467 ScanInvocation->getHeaderSearchOpts().ModulesStrictContextHash =
true;
468 ScanInvocation->getHeaderSearchOpts().ModulesSerializeOnlyPreprocessor =
true;
469 ScanInvocation->getHeaderSearchOpts().ModulesSkipDiagnosticOptions =
true;
470 ScanInvocation->getHeaderSearchOpts().ModulesSkipHeaderSearchPaths =
true;
471 ScanInvocation->getHeaderSearchOpts().ModulesSkipPragmaDiagnosticMappings =
473 ScanInvocation->getHeaderSearchOpts().ModulesForceValidateUserHeaders =
false;
477 ScanInvocation->getDependencyOutputOpts() = {};
481 return ScanInvocation;
491 if (!Sysroot.empty() && (llvm::sys::path::root_directory(Sysroot) != Sysroot))
496std::optional<PrebuiltModulesAttrsMap>
506 if (visitPrebuiltModule(
509 PrebuiltModulesASTMap, ScanInstance.
getDiagnostics(), StableDirs))
512 return PrebuiltModulesASTMap;
515std::unique_ptr<DependencyOutputOptions>
518 auto Opts = std::make_unique<DependencyOutputOptions>(
522 if (Opts->Targets.empty())
525 Opts->IncludeSystemHeaders =
true;
530std::shared_ptr<ModuleDepCollector>
533 std::unique_ptr<DependencyOutputOptions> DepOutputOpts,
539 std::shared_ptr<ModuleDepCollector> MDC;
543 std::make_shared<DependencyConsumerForwarder>(
544 std::move(DepOutputOpts), WorkingDirectory, Consumer));
548 MDC = std::make_shared<ModuleDepCollector>(
549 Service, std::move(DepOutputOpts), ScanInstance, Consumer, Controller,
550 Inv, std::move(PrebuiltModulesASTMap), StableDirs);
563 std::vector<std::thread> Compiles;
568 void add(llvm::unique_function<
void()> Compile) {
569 std::lock_guard<std::mutex> Lock(Mutex);
571 Compiles.emplace_back(std::move(Compile));
577 std::lock_guard<std::mutex> Lock(Mutex);
582 for (std::thread &Compile : Compiles)
622 if (Timestamp >
CI.getHeaderSearchOpts().BuildSessionTimestamp)
625 if (!
CI.getASTReader())
626 CI.createASTReader();
632 switch (
CI.getASTReader()->ReadASTCore(
634 nullptr, Imported, {}, {}, {},
655 llvm::Error LockErr = Lock->tryLock().moveInto(Owned);
657 if (!LockErr && !Owned)
661 llvm::makeIntrusiveRefCnt<DependencyScanningWorkerFilesystem>(
664 CI.getDiagnostics(), std::move(
VFS));
665 auto DC = std::make_unique<DiagnosticConsumer>();
679 Compiles.add([Lock = std::move(Lock), ModCI1 = std::move(ModCI1),
680 ModCI2 = std::move(ModCI2), DC = std::move(DC),
683 llvm::CrashRecoveryContext CRC;
684 (void)CRC.RunSafely([&] {
686 SingleModuleWithAsyncModuleCompiles Action1(*Service, *ModController,
688 (void)ModCI1->ExecuteAction(Action1);
690 ModCI2->getPreprocessorOpts().SingleModuleParseMode = false;
691 GenerateModuleFromModuleMapAction Action2;
692 (void)ModCI2->ExecuteAction(Action2);
727 std::string Executable,
728 std::unique_ptr<CompilerInvocation> OriginalInvocation,
730 std::shared_ptr<PCHContainerOperations> PCHContainerOps,
745 MDC->applyDiscoveredDependencies(*OriginalInvocation);
747 if (!Controller.finalize(ScanInstance, *OriginalInvocation))
750 Consumer.handleBuildCommand(
751 {Executable, OriginalInvocation->getCC1CommandLine()});
758 auto ScanInvocation =
762 std::optional<AsyncModuleCompiles> AsyncCompiles;
763 if (Service.getOpts().AsyncScanModules) {
765 auto ScanInstanceStorage = std::make_unique<CompilerInstance>(
766 std::make_shared<CompilerInvocation>(*ScanInvocation), PCHContainerOps,
767 std::move(ModCache));
776 auto MaybePrebuiltModulesASTMap =
778 if (!MaybePrebuiltModulesASTMap)
785 AsyncCompiles.emplace();
791 ScanInstanceStorage.emplace(std::move(ScanInvocation),
792 std::move(PCHContainerOps), std::move(ModCache));
799 auto MaybePrebuiltModulesASTMap =
801 if (!MaybePrebuiltModulesASTMap)
807 ScanInstance, std::move(DepOutputOpts), WorkingDirectory, Consumer,
808 Service, *OriginalInvocation, Controller, *MaybePrebuiltModulesASTMap,
814 if (!Controller.initialize(ScanInstance, *OriginalInvocation))
822 MDC->applyDiscoveredDependencies(*OriginalInvocation);
824 if (!Controller.finalize(ScanInstance, *OriginalInvocation))
827 Consumer.handleBuildCommand(
828 {Executable, OriginalInvocation->getCC1CommandLine()});
Manages (and terminates) the asynchronous compilation of modules.
void add(llvm::unique_function< void()> Compile)
Registers the module compilation, unless this instance is about to be destroyed.
Abstract interface for callback invocations by the ASTReader.
@ ARR_Missing
The client can handle an AST file that cannot load because it is missing.
@ ARR_OutOfDate
The client can handle an AST file that cannot load because it is out-of-date relative to its input fi...
@ ARR_TreatModuleWithErrorsAsOutOfDate
If a module file is marked with errors treat it as out-of-date so the caller can rebuild it.
static bool readASTFileControlBlock(StringRef Filename, FileManager &FileMgr, const ModuleCache &ModCache, const PCHContainerReader &PCHContainerRdr, bool FindModuleFileExtensions, ASTReaderListener &Listener, bool ValidateDiagnosticOptions, unsigned ClientLoadCapabilities=ARR_ConfigurationMismatch|ARR_OutOfDate)
Read the control block for the named AST file.
@ Success
The control block was read successfully.
@ OutOfDate
The AST file is out-of-date relative to its input files, and needs to be regenerated.
@ Missing
The AST file was missing.
Configuration object for making the result of cloneForModuleCompile() thread-safe.
CompilerInstance - Helper class for managing a single instance of the Clang compiler.
void createDiagnostics(DiagnosticConsumer *Client=nullptr, bool ShouldOwnClient=true)
Create the diagnostics engine using the invocation's diagnostic options and replace any existing one ...
const PCHContainerReader & getPCHContainerReader() const
Return the appropriate PCHContainerReader depending on the current CodeGenOptions.
DiagnosticsEngine & getDiagnostics() const
Get the current diagnostics engine.
void createFileManager()
Create the file manager and replace any existing one with it.
FileManager & getFileManager() const
Return the current file manager to the caller.
ModuleCache & getModuleCache() const
void addDependencyCollector(std::shared_ptr< DependencyCollector > Listener)
Preprocessor & getPreprocessor() const
Return the current preprocessor.
void createVirtualFileSystem(IntrusiveRefCntPtr< llvm::vfs::FileSystem > BaseFS=llvm::vfs::getRealFileSystem(), DiagnosticConsumer *DC=nullptr)
Create a virtual file system instance based on the invocation.
FrontendOptions & getFrontendOpts()
HeaderSearchOptions & getHeaderSearchOpts()
void createSourceManager()
Create the source manager and replace any existing one with it.
CompilerInvocation & getInvocation()
PreprocessorOptions & getPreprocessorOpts()
bool ExecuteAction(FrontendAction &Act)
ExecuteAction - Execute the provided action against the compiler's CompilerInvocation object.
LangOptions & getLangOpts()
void setDependencyDirectivesGetter(std::unique_ptr< DependencyDirectivesGetter > Getter)
Helper class for holding the data necessary to invoke the compiler.
PreprocessorOptions & getPreprocessorOpts()
static bool CreateFromArgs(CompilerInvocation &Res, ArrayRef< const char * > CommandLineArgs, DiagnosticsEngine &Diags, const char *Argv0=nullptr)
Create a compiler invocation from a list of input options.
DependencyOutputOptions & getDependencyOutputOpts()
FrontendOptions & getFrontendOpts()
Functor that returns the dependency directives for a given file.
Builds a dependency file when attached to a Preprocessor (for includes) and ASTReader (for module imp...
Abstract interface, implemented by clients of the front-end, which formats and prints fully processed...
Options for controlling the compiler diagnostics engine.
std::vector< std::string > Warnings
The list of -W... options used to alter the diagnostic mappings, with the prefixes removed.
std::string DiagnosticSerializationFile
The file to serialize diagnostics to (non-appending).
Concrete class used by the front-end to report problems and issues.
DiagnosticBuilder Report(SourceLocation Loc, unsigned DiagID)
Issue the message to the client.
bool hasErrorOccurred() const
void setIgnoreAllWarnings(bool Val)
When set to true, any unmapped warnings are ignored.
Implements support for file system lookup, file system caching, and directory search management.
std::string OutputFile
The output file, if any.
SmallVector< FrontendInputFile, 0 > Inputs
The input files and their types.
frontend::ActionKind ProgramAction
The frontend action to perform.
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.
virtual std::time_t getModuleTimestamp(StringRef ModuleFilename)=0
Returns the timestamp denoting the last time inputs of the module file were validated.
virtual std::unique_ptr< llvm::AdvisoryLock > getLock(StringRef ModuleFilename)=0
Returns lock for the given module file. The lock is initially unlocked.
Identifies a module file to be loaded.
static ModuleFileName makeExplicit(std::string Name)
Creates a file name for an explicit module.
StringRef str() const
Returns the plain module file name.
void setBuildingModule(bool BuildingModuleFlag)
Flag indicating whether this instance is building a module.
Describes a module or submodule.
Module * getTopLevelModule()
Retrieve the top-level module for this (sub)module, which may be this module.
This interface provides a way to observe the actions of the preprocessor as it does its thing.
PreprocessorOptions - This class is used for passing the various options used in preprocessor initial...
std::string ImplicitPCHInclude
The implicit PCH included at the start of the translation unit, or empty.
bool SingleModuleParseMode
When enabled, preprocessor is in a mode for parsing a single module only.
std::vector< std::pair< std::string, bool > > Macros
void addPPCallbacks(std::unique_ptr< PPCallbacks > C)
Preprocessor-based frontend action that also loads PCH files.
Encodes a location in the source.
The base class of the type hierarchy.
Dependency scanner callbacks that are used during scanning to influence the behaviour of the scan - f...
virtual void initializeScanInvocation(CompilerInvocation &ScanInvocation)
Initializes the scan invocation.
bool runInvocation(std::string Executable, std::unique_ptr< CompilerInvocation > Invocation, IntrusiveRefCntPtr< llvm::vfs::FileSystem > FS, std::shared_ptr< PCHContainerOperations > PCHContainerOps, DiagnosticConsumer *DiagConsumer)
The dependency scanning service contains shared configuration and state that is used by the individua...
const DependencyScanningServiceOptions & getOpts() const
A virtual file system optimized for the dependency discovery.
void setVFS(llvm::StringSet<> &&VFS)
Update the VFSMap to the one discovered from serializing the AST file.
bool isInStableDir() const
Read-only access to whether the module is made up of dependencies in stable directories.
void addDependent(StringRef ModuleFile)
Add a direct dependent module file, so it can be updated if the current module is from stable directo...
void setInStableDir(bool V=false)
Update whether the prebuilt module resolves entirely in a stable directories.
SmallVector< StringRef > getInitialStableDirs(const CompilerInstance &ScanInstance)
bool areOptionsInStableDir(const ArrayRef< StringRef > Directories, const HeaderSearchOptions &HSOpts)
Determine if options collected from a module's compilation can safely be considered as stable.
@ VFS
Remove unused -ivfsoverlay arguments.
@ Macros
Canonicalize -D and -U options.
std::shared_ptr< CompilerInvocation > createScanCompilerInvocation(const CompilerInvocation &Invocation, const DependencyScanningService &Service, DependencyActionController &Controller)
Creates a CompilerInvocation suitable for the dependency scanner.
void initializeScanCompilerInstance(CompilerInstance &ScanInstance, IntrusiveRefCntPtr< llvm::vfs::FileSystem > FS, DiagnosticConsumer *DiagConsumer, DependencyScanningService &Service, IntrusiveRefCntPtr< DependencyScanningWorkerFilesystem > DepFS)
llvm::StringMap< PrebuiltModuleASTAttrs > PrebuiltModulesAttrsMap
Attributes loaded from AST files of prebuilt modules collected prior to ModuleDepCollector creation.
std::unique_ptr< CompilerInvocation > createCompilerInvocation(ArrayRef< std::string > CommandLine, DiagnosticsEngine &Diags)
void canonicalizeDefines(PreprocessorOptions &PPOpts)
Canonicalizes command-line macro defines (e.g. removing "-DX -UX").
std::unique_ptr< DependencyOutputOptions > createDependencyOutputOptions(const CompilerInvocation &Invocation)
Creates dependency output options to be reported to the dependency consumer, deducing missing informa...
std::optional< PrebuiltModulesAttrsMap > computePrebuiltModulesASTMap(CompilerInstance &ScanInstance, SmallVector< StringRef > &StableDirs)
std::shared_ptr< ModuleCache > makeInProcessModuleCache(ModuleCacheEntries &Entries)
std::shared_ptr< ModuleDepCollector > initializeScanInstanceDependencyCollector(CompilerInstance &ScanInstance, std::unique_ptr< DependencyOutputOptions > DepOutputOpts, StringRef WorkingDirectory, DependencyConsumer &Consumer, DependencyScanningService &Service, CompilerInvocation &Inv, DependencyActionController &Controller, PrebuiltModulesAttrsMap PrebuiltModulesASTMap, llvm::SmallVector< StringRef > &StableDirs)
Create the dependency collector that will collect the produced dependencies.
std::unique_ptr< DiagnosticOptions > createDiagOptions(ArrayRef< std::string > CommandLine)
bool isPathInStableDir(const ArrayRef< StringRef > Directories, const StringRef Input)
Determine if Input can be resolved within a stable directory.
@ Make
This is the Makefile compatible dep format.
@ Full
This outputs the full clang module dependency graph suitable for use for explicitly building modules.
@ P1689
This outputs the dependency graph for standard c++ modules in P1689R5 format.
@ DependencyDirectivesScan
This mode is used to compute the dependencies by running the preprocessor with special kind of lexing...
@ GeneratePCH
Generate pre-compiled header.
ModuleKind
Specifies the kind of module that has been loaded.
@ MK_ExplicitModule
File is an explicitly-loaded module.
@ MK_ImplicitModule
File is an implicitly-loaded module.
The JSON file list parser is used to communicate input to InstallAPI.
std::unique_ptr< DiagnosticOptions > CreateAndPopulateDiagOpts(ArrayRef< const char * > Argv)
nullptr
This class represents a compute construct, representing a 'Kind' of ‘parallel’, 'serial',...
@ Result
The result type of a method or function.
IntrusiveRefCntPtr< llvm::vfs::FileSystem > createVFSFromCompilerInvocation(const CompilerInvocation &CI, DiagnosticsEngine &Diags)
int __ovld __cnfn any(char)
Returns 1 if the most significant bit in any component of x is set; otherwise returns 0.
DependencyActionController & Controller
AsyncModuleCompile(CompilerInstance &CI, DependencyScanningService &Service, DependencyActionController &Controller, AsyncModuleCompiles &Compiles)
void moduleLoadSkipped(Module *M) override
Callback invoked whenever a module load was skipped due to enabled single-module-parse-mode.
AsyncModuleCompiles & Compiles
DependencyScanningService & Service
AsyncModuleCompiles & Compiles
DependencyActionController & Controller
bool BeginSourceFileAction(CompilerInstance &CI) override
Callback at the start of processing a single input.
SingleModuleWithAsyncModuleCompiles(DependencyScanningService &Service, DependencyActionController &Controller, AsyncModuleCompiles &Compiles)
DependencyScanningService & Service
Runs the preprocessor on a TU with single-module-parse-mode and compiles modules asynchronously witho...
bool BeginSourceFileAction(CompilerInstance &CI) override
Callback at the start of processing a single input.
SingleTUWithAsyncModuleCompiles(DependencyScanningService &Service, DependencyActionController &Controller, AsyncModuleCompiles &Compiles)
AsyncModuleCompiles & Compiles
DependencyScanningService & Service
DependencyActionController & Controller
ScanningMode Mode
Whether to use optimized dependency directive scan or full preprocessing.
std::time_t BuildSessionTimestamp
The build session timestamp for validate-once-per-build-session logic.
ScanningOptimizations OptimizeArgs
How to optimize resulting explicit module command lines.
ScanningOutputFormat Format
What output format are we expected to produce.
IntrusiveRefCntPtr< DiagnosticsEngine > DiagEngine
DiagnosticsEngineWithDiagOpts(ArrayRef< std::string > CommandLine, IntrusiveRefCntPtr< llvm::vfs::FileSystem > FS, DiagnosticConsumer &DC)
std::unique_ptr< DiagnosticOptions > DiagOpts