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();
138 void visitModuleFile(ModuleFileName Filename,
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,
218 while (!Worklist.empty()) {
237static std::string makeObjFileName(StringRef
FileName) {
239 llvm::sys::path::replace_extension(ObjFileName,
"o");
240 return std::string(ObjFileName);
245deduceDepTarget(
const std::string &OutputFile,
247 if (OutputFile !=
"-")
250 if (InputFiles.empty() || !InputFiles.front().isFile())
251 return "clang-scan-deps\\ dependency";
253 return makeObjFileName(InputFiles.front().getFile());
266static std::optional<StringRef> getSimpleMacroName(StringRef
Macro) {
267 StringRef Name =
Macro.split(
"=").first.ltrim(
" \t");
270 auto FinishName = [&]() -> std::optional<StringRef> {
271 StringRef SimpleName = Name.slice(0, I);
272 if (SimpleName.empty())
277 for (; I != Name.size(); ++I) {
286 if (llvm::isAlnum(Name[I]))
296 using MacroOpt = std::pair<StringRef, std::size_t>;
297 std::vector<MacroOpt> SimpleNames;
298 SimpleNames.reserve(PPOpts.
Macros.size());
299 std::size_t Index = 0;
300 for (
const auto &M : PPOpts.
Macros) {
301 auto SName = getSimpleMacroName(M.first);
305 SimpleNames.emplace_back(*SName, Index);
309 llvm::stable_sort(SimpleNames, llvm::less_first());
311 auto NewEnd = std::unique(
312 SimpleNames.rbegin(), SimpleNames.rend(),
313 [](
const MacroOpt &A,
const MacroOpt &B) { return A.first == B.first; });
314 SimpleNames.erase(SimpleNames.begin(), NewEnd.base());
317 decltype(PPOpts.
Macros) NewMacros;
318 NewMacros.reserve(SimpleNames.size());
319 for (std::size_t I = 0, E = SimpleNames.size(); I != E; ++I) {
320 std::size_t OriginalIndex = SimpleNames[I].second;
322 NewMacros.push_back(std::move(PPOpts.
Macros[OriginalIndex]));
324 std::swap(PPOpts.
Macros, NewMacros);
333 FileMgr.getVirtualFileSystem().visit([&](llvm::vfs::FileSystem &FS) {
334 auto *
DFS = llvm::dyn_cast<DependencyScanningWorkerFilesystem>(&FS);
336 assert(!DepFS &&
"Found multiple scanning VFSs");
340 assert(DepFS &&
"Did not find scanning VFS");
343 std::unique_ptr<DependencyDirectivesGetter>
344 cloneFor(FileManager &FileMgr)
override {
345 return std::make_unique<ScanningDependencyDirectivesGetter>(FileMgr);
348 std::optional<ArrayRef<dependency_directives_scan::Directive>>
349 operator()(FileEntryRef
File)
override {
350 return DepFS->getDirectiveTokens(
File.getName());
357 DiagOpts.ShowCarets =
false;
368 return llvm::StringSwitch<bool>(Warning)
369 .Cases({
"pch-vfs-diff",
"error=pch-vfs-diff"},
false)
370 .StartsWith(
"no-error=",
false)
376std::unique_ptr<DiagnosticOptions>
378 std::vector<const char *> CLI;
379 for (
const std::string &Arg : CommandLine)
380 CLI.push_back(Arg.c_str());
382 sanitizeDiagOpts(*DiagOpts);
389 std::vector<const char *> CCommandLine(CommandLine.size(),
nullptr);
390 llvm::transform(CommandLine, CCommandLine.begin(),
391 [](
const std::string &Str) { return Str.c_str(); });
398std::unique_ptr<CompilerInvocation>
401 llvm::opt::ArgStringList Argv;
402 for (
const std::string &Str :
ArrayRef(CommandLine).drop_front())
403 Argv.push_back(Str.c_str());
405 auto Invocation = std::make_unique<CompilerInvocation>();
428 DepFS->resetBypassedPathPrefix();
433 if (!ModulesCachePath.empty())
434 DepFS->setBypassedPathPrefix(ModulesCachePath);
437 std::make_unique<ScanningDependencyDirectivesGetter>(
446 auto ScanInvocation = std::make_shared<CompilerInvocation>(Invocation);
448 sanitizeDiagOpts(ScanInvocation->getDiagnosticOpts());
450 ScanInvocation->getPreprocessorOpts().AllowPCHWithDifferentModulesCachePath =
453 if (ScanInvocation->getHeaderSearchOpts().ModulesValidateOncePerBuildSession)
454 ScanInvocation->getHeaderSearchOpts().BuildSessionTimestamp =
457 ScanInvocation->getFrontendOpts().DisableFree =
false;
458 ScanInvocation->getFrontendOpts().GenerateGlobalModuleIndex =
false;
459 ScanInvocation->getFrontendOpts().UseGlobalModuleIndex =
false;
460 ScanInvocation->getFrontendOpts().GenReducedBMI =
false;
461 ScanInvocation->getFrontendOpts().ModuleOutputPath.clear();
464 ScanInvocation->getFrontendOpts().ModulesShareFileManager =
true;
465 ScanInvocation->getHeaderSearchOpts().ModuleFormat =
"raw";
466 ScanInvocation->getHeaderSearchOpts().ModulesIncludeVFSUsage =
474 ScanInvocation->getHeaderSearchOpts().ModulesStrictContextHash =
true;
475 ScanInvocation->getHeaderSearchOpts().ModulesSerializeOnlyPreprocessor =
true;
476 ScanInvocation->getHeaderSearchOpts().ModulesSkipDiagnosticOptions =
true;
477 ScanInvocation->getHeaderSearchOpts().ModulesSkipHeaderSearchPaths =
true;
478 ScanInvocation->getHeaderSearchOpts().ModulesSkipPragmaDiagnosticMappings =
480 ScanInvocation->getHeaderSearchOpts().ModulesForceValidateUserHeaders =
false;
484 ScanInvocation->getDependencyOutputOpts() = {};
488 return ScanInvocation;
498 if (!Sysroot.empty() && (llvm::sys::path::root_directory(Sysroot) != Sysroot))
503std::optional<PrebuiltModulesAttrsMap>
513 if (visitPrebuiltModule(
516 PrebuiltModulesASTMap, ScanInstance.
getDiagnostics(), StableDirs))
519 return PrebuiltModulesASTMap;
522std::unique_ptr<DependencyOutputOptions>
525 auto Opts = std::make_unique<DependencyOutputOptions>(
529 if (Opts->Targets.empty())
532 Opts->IncludeSystemHeaders =
true;
537std::shared_ptr<ModuleDepCollector>
540 std::unique_ptr<DependencyOutputOptions> DepOutputOpts,
546 std::shared_ptr<ModuleDepCollector> MDC;
550 std::make_shared<DependencyConsumerForwarder>(
551 std::move(DepOutputOpts), WorkingDirectory, Consumer));
555 MDC = std::make_shared<ModuleDepCollector>(
556 Service, std::move(DepOutputOpts), ScanInstance, Consumer, Controller,
557 Inv, std::move(PrebuiltModulesASTMap), StableDirs);
570 std::vector<std::thread> Compiles;
575 void add(llvm::unique_function<
void()> Compile) {
576 std::lock_guard<std::mutex> Lock(Mutex);
578 Compiles.emplace_back(std::move(Compile));
584 std::lock_guard<std::mutex> Lock(Mutex);
589 for (std::thread &Compile : Compiles)
629 if (Timestamp >
CI.getHeaderSearchOpts().BuildSessionTimestamp)
632 if (!
CI.getASTReader())
633 CI.createASTReader();
639 switch (
CI.getASTReader()->ReadASTCore(
641 nullptr, Imported, {}, {}, {},
662 llvm::Error LockErr = Lock->tryLock().moveInto(Owned);
664 if (!LockErr && !Owned)
668 llvm::makeIntrusiveRefCnt<DependencyScanningWorkerFilesystem>(
671 CI.getDiagnostics(), std::move(
VFS));
672 auto DC = std::make_unique<DiagnosticConsumer>();
686 Compiles.add([Lock = std::move(Lock), ModCI1 = std::move(ModCI1),
687 ModCI2 = std::move(ModCI2), DC = std::move(DC),
690 llvm::CrashRecoveryContext CRC;
691 (void)CRC.RunSafely([&] {
693 SingleModuleWithAsyncModuleCompiles Action1(*Service, *ModController,
695 (void)ModCI1->ExecuteAction(Action1);
697 ModCI2->getPreprocessorOpts().SingleModuleParseMode = false;
698 GenerateModuleFromModuleMapAction Action2;
699 (void)ModCI2->ExecuteAction(Action2);
734 std::string Executable,
735 std::unique_ptr<CompilerInvocation> OriginalInvocation,
737 std::shared_ptr<PCHContainerOperations> PCHContainerOps,
752 MDC->applyDiscoveredDependencies(*OriginalInvocation);
754 if (!Controller.finalize(ScanInstance, *OriginalInvocation))
757 Consumer.handleBuildCommand(
758 {Executable, OriginalInvocation->getCC1CommandLine()});
765 auto ScanInvocation =
769 std::optional<AsyncModuleCompiles> AsyncCompiles;
770 if (Service.getOpts().AsyncScanModules) {
772 auto ScanInstanceStorage = std::make_unique<CompilerInstance>(
773 std::make_shared<CompilerInvocation>(*ScanInvocation), PCHContainerOps,
774 std::move(ModCache));
783 auto MaybePrebuiltModulesASTMap =
785 if (!MaybePrebuiltModulesASTMap)
792 AsyncCompiles.emplace();
798 ScanInstanceStorage.emplace(std::move(ScanInvocation),
799 std::move(PCHContainerOps), std::move(ModCache));
806 auto MaybePrebuiltModulesASTMap =
808 if (!MaybePrebuiltModulesASTMap)
814 ScanInstance, std::move(DepOutputOpts), WorkingDirectory, Consumer,
815 Service, *OriginalInvocation, Controller, *MaybePrebuiltModulesASTMap,
821 if (!Controller.initialize(ScanInstance, *OriginalInvocation))
829 MDC->applyDiscoveredDependencies(*OriginalInvocation);
831 if (!Controller.finalize(ScanInstance, *OriginalInvocation))
834 Consumer.handleBuildCommand(
835 {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)
void normalizeModuleCachePath(FileManager &FileMgr, StringRef Path, SmallVectorImpl< char > &NormalizedPath)
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