17#include "llvm/ADT/IntrusiveRefCntPtr.h"
18#include "llvm/ADT/ScopeExit.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(StringRef 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;
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,
209 Listener.visitModuleFile(PrebuiltModuleFilename,
218 while (!Worklist.empty()) {
231static std::string makeObjFileName(StringRef
FileName) {
233 llvm::sys::path::replace_extension(ObjFileName,
"o");
234 return std::string(ObjFileName);
239deduceDepTarget(
const std::string &OutputFile,
241 if (OutputFile !=
"-")
244 if (InputFiles.empty() || !InputFiles.front().isFile())
245 return "clang-scan-deps\\ dependency";
247 return makeObjFileName(InputFiles.front().getFile());
260static std::optional<StringRef> getSimpleMacroName(StringRef
Macro) {
261 StringRef Name =
Macro.split(
"=").first.ltrim(
" \t");
264 auto FinishName = [&]() -> std::optional<StringRef> {
265 StringRef SimpleName = Name.slice(0, I);
266 if (SimpleName.empty())
271 for (; I != Name.size(); ++I) {
280 if (llvm::isAlnum(Name[I]))
290 using MacroOpt = std::pair<StringRef, std::size_t>;
291 std::vector<MacroOpt> SimpleNames;
292 SimpleNames.reserve(PPOpts.
Macros.size());
293 std::size_t Index = 0;
294 for (
const auto &M : PPOpts.
Macros) {
295 auto SName = getSimpleMacroName(M.first);
299 SimpleNames.emplace_back(*SName, Index);
303 llvm::stable_sort(SimpleNames, llvm::less_first());
305 auto NewEnd = std::unique(
306 SimpleNames.rbegin(), SimpleNames.rend(),
307 [](
const MacroOpt &A,
const MacroOpt &B) { return A.first == B.first; });
308 SimpleNames.erase(SimpleNames.begin(), NewEnd.base());
311 decltype(PPOpts.
Macros) NewMacros;
312 NewMacros.reserve(SimpleNames.size());
313 for (std::size_t I = 0, E = SimpleNames.size(); I != E; ++I) {
314 std::size_t OriginalIndex = SimpleNames[I].second;
316 NewMacros.push_back(std::move(PPOpts.
Macros[OriginalIndex]));
318 std::swap(PPOpts.
Macros, NewMacros);
327 FileMgr.getVirtualFileSystem().visit([&](llvm::vfs::FileSystem &FS) {
328 auto *
DFS = llvm::dyn_cast<DependencyScanningWorkerFilesystem>(&FS);
330 assert(!DepFS &&
"Found multiple scanning VFSs");
334 assert(DepFS &&
"Did not find scanning VFS");
337 std::unique_ptr<DependencyDirectivesGetter>
338 cloneFor(FileManager &FileMgr)
override {
339 return std::make_unique<ScanningDependencyDirectivesGetter>(FileMgr);
342 std::optional<ArrayRef<dependency_directives_scan::Directive>>
343 operator()(FileEntryRef
File)
override {
344 return DepFS->getDirectiveTokens(
File.getName());
351 DiagOpts.ShowCarets =
false;
362 return llvm::StringSwitch<bool>(Warning)
363 .Cases({
"pch-vfs-diff",
"error=pch-vfs-diff"},
false)
364 .StartsWith(
"no-error=",
false)
370std::unique_ptr<DiagnosticOptions>
372 std::vector<const char *> CLI;
373 for (
const std::string &Arg : CommandLine)
374 CLI.push_back(Arg.c_str());
376 sanitizeDiagOpts(*DiagOpts);
383 std::vector<const char *> CCommandLine(CommandLine.size(),
nullptr);
384 llvm::transform(CommandLine, CCommandLine.begin(),
385 [](
const std::string &Str) { return Str.c_str(); });
392std::unique_ptr<CompilerInvocation>
395 llvm::opt::ArgStringList Argv;
396 for (
const std::string &Str :
ArrayRef(CommandLine).drop_front())
397 Argv.push_back(Str.c_str());
399 auto Invocation = std::make_unique<CompilerInvocation>();
420 DepFS->resetBypassedPathPrefix();
425 if (!ModulesCachePath.empty())
426 DepFS->setBypassedPathPrefix(ModulesCachePath);
429 std::make_unique<ScanningDependencyDirectivesGetter>(
438 auto ScanInvocation = std::make_shared<CompilerInvocation>(Invocation);
440 sanitizeDiagOpts(ScanInvocation->getDiagnosticOpts());
442 ScanInvocation->getPreprocessorOpts().AllowPCHWithDifferentModulesCachePath =
445 if (ScanInvocation->getHeaderSearchOpts().ModulesValidateOncePerBuildSession)
446 ScanInvocation->getHeaderSearchOpts().BuildSessionTimestamp =
449 ScanInvocation->getFrontendOpts().DisableFree =
false;
450 ScanInvocation->getFrontendOpts().GenerateGlobalModuleIndex =
false;
451 ScanInvocation->getFrontendOpts().UseGlobalModuleIndex =
false;
452 ScanInvocation->getFrontendOpts().GenReducedBMI =
false;
453 ScanInvocation->getFrontendOpts().ModuleOutputPath.clear();
456 ScanInvocation->getFrontendOpts().ModulesShareFileManager =
true;
457 ScanInvocation->getHeaderSearchOpts().ModuleFormat =
"raw";
458 ScanInvocation->getHeaderSearchOpts().ModulesIncludeVFSUsage =
466 ScanInvocation->getHeaderSearchOpts().ModulesStrictContextHash =
true;
467 ScanInvocation->getHeaderSearchOpts().ModulesSerializeOnlyPreprocessor =
true;
468 ScanInvocation->getHeaderSearchOpts().ModulesSkipDiagnosticOptions =
true;
469 ScanInvocation->getHeaderSearchOpts().ModulesSkipHeaderSearchPaths =
true;
470 ScanInvocation->getHeaderSearchOpts().ModulesSkipPragmaDiagnosticMappings =
472 ScanInvocation->getHeaderSearchOpts().ModulesForceValidateUserHeaders =
false;
476 ScanInvocation->getDependencyOutputOpts() = {};
480 return ScanInvocation;
490 if (!Sysroot.empty() && (llvm::sys::path::root_directory(Sysroot) != Sysroot))
495std::optional<PrebuiltModulesAttrsMap>
505 if (visitPrebuiltModule(
508 PrebuiltModulesASTMap, ScanInstance.
getDiagnostics(), StableDirs))
511 return PrebuiltModulesASTMap;
514std::unique_ptr<DependencyOutputOptions>
517 auto Opts = std::make_unique<DependencyOutputOptions>(
521 if (Opts->Targets.empty())
524 Opts->IncludeSystemHeaders =
true;
529std::shared_ptr<ModuleDepCollector>
532 std::unique_ptr<DependencyOutputOptions> DepOutputOpts,
538 std::shared_ptr<ModuleDepCollector> MDC;
542 std::make_shared<DependencyConsumerForwarder>(
543 std::move(DepOutputOpts), WorkingDirectory, Consumer));
547 MDC = std::make_shared<ModuleDepCollector>(
548 Service, std::move(DepOutputOpts), ScanInstance, Consumer, Controller,
549 Inv, std::move(PrebuiltModulesASTMap), StableDirs);
562 std::vector<std::thread> Compiles;
567 void add(llvm::unique_function<
void()> Compile) {
568 std::lock_guard<std::mutex> Lock(Mutex);
570 Compiles.emplace_back(std::move(Compile));
576 std::lock_guard<std::mutex> Lock(Mutex);
581 for (std::thread &Compile : Compiles)
621 if (Timestamp >
CI.getHeaderSearchOpts().BuildSessionTimestamp)
624 if (!
CI.getASTReader())
625 CI.createASTReader();
631 switch (
CI.getASTReader()->ReadASTCore(
633 nullptr, Imported, {}, {}, {},
653 auto Lock = ModCache.
getLock(ModuleFileName);
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
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 void prepareForGetLock(StringRef ModuleFilename)=0
May perform any work that only needs to be performed once for multiple calls getLock() with the same ...
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.
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