clang: lib/Tooling/DependencyScanning/ModuleDepCollector.cpp Source File (original) (raw)
1
2
3
4
5
6
7
8
10
15#include "llvm/ADT/STLExtras.h"
16#include "llvm/Support/BLAKE3.h"
17#include "llvm/Support/StringSaver.h"
18#include
19
20using namespace clang;
21using namespace tooling;
22using namespace dependencies;
23
26 PathBuf.reserve(256);
27 for (StringRef FileDep : FileDeps) {
28 auto ResolvedFileDep =
30 Cb(*ResolvedFileDep);
31 }
32}
33
35 assert(!std::holds_alternativestd::monostate(BuildInfo) &&
36 "Using uninitialized ModuleDeps");
37 if (const auto *CI = std::get_if(&BuildInfo))
38 BuildInfo = CI->getCC1CommandLine();
39 return std::get<std::vectorstd::string>(BuildInfo);
40}
41
42static void
48
49 std::vectorHeaderSearchOptions::Entry Entries;
51
52 llvm::BitVector SearchPathUsage(Entries.size());
53 llvm::DenseSet<const serialization::ModuleFile *> Visited;
61 };
62 VisitMF(&MF);
63
64 if (SearchPathUsage.size() != Entries.size())
65 llvm::report_fatal_error(
66 "Inconsistent search path options between modules detected");
67
68 for (auto Idx : SearchPathUsage.set_bits())
69 Opts.UserEntries.push_back(std::move(Entries[Idx]));
70 }
72 std::vectorstd::string VFSOverlayFiles;
74
75 llvm::BitVector VFSUsage(VFSOverlayFiles.size());
76 llvm::DenseSet<const serialization::ModuleFile *> Visited;
82
83
87 } else {
88
89
90 auto VFSMap = PrebuiltModuleVFSMap.find(MF->FileName);
91 if (VFSMap == PrebuiltModuleVFSMap.end())
92 return;
93 for (std::size_t I = 0, E = VFSOverlayFiles.size(); I != E; ++I) {
94 if (VFSMap->second.contains(VFSOverlayFiles[I]))
95 VFSUsage[I] = true;
96 }
97 }
98 };
99 VisitMF(&MF);
100
101 if (VFSUsage.size() != VFSOverlayFiles.size())
102 llvm::report_fatal_error(
103 "Inconsistent -ivfsoverlay options between modules detected");
104
105 for (auto Idx : VFSUsage.set_bits())
106 Opts.VFSOverlayFiles.push_back(std::move(VFSOverlayFiles[Idx]));
107 }
108}
109
111 bool IsSystemModule) {
112
113
114 if (!IsSystemModule)
115 return;
116 bool Wsystem_headers = false;
117 for (StringRef Opt : Opts.Warnings) {
118 bool isPositive = !Opt.consume_front("no-");
119 if (Opt == "system-headers")
120 Wsystem_headers = isPositive;
121 }
122 if (Wsystem_headers)
123 return;
124
125
126
130}
131
132static std::vectorstd::string splitString(std::string S, char Separator) {
134 StringRef(S).split(Segments, Separator, -1, false);
135 std::vectorstd::string Result;
136 Result.reserve(Segments.size());
137 for (StringRef Segment : Segments)
138 Result.push_back(Segment.str());
140}
141
156 '\0');
159
163 }
164 }
165}
166
170
174 }
184 }
185}
186
191
192
193
194
196
197
198
199
202
204
207
208
209
215
221
222
224 llvm::erase_if(
226 [&CI](const std::pair<std::string, bool> &Def) {
227 StringRef MacroDef = Def.first;
228 return CI.getHeaderSearchOpts().ModulesIgnoreMacros.contains(
229 llvm::CachedHashString(MacroDef.split('=').first));
230 });
231
233 }
234
235 return CI;
236}
237
239ModuleDepCollector::getInvocationAdjustedForModuleBuildWithoutOutputs(
243
246
247
251 ModuleMapInputKind);
252
253 auto CurrentModuleMapEntry =
255 assert(CurrentModuleMapEntry && "module map file entry not found");
256
257
258
260
261 auto DepModuleMapFiles = collectModuleMapFiles(Deps.ClangModuleDeps);
263
264 auto ModuleMapEntry =
266 assert(ModuleMapEntry && "module map file entry not found");
267
268
269
270
271
272
273 if (EagerLoadModules && DepModuleMapFiles.contains(*ModuleMapEntry))
274 continue;
275
276
277
278 if (*ModuleMapEntry == *CurrentModuleMapEntry &&
279 !DepModuleMapFiles.contains(*ModuleMapEntry))
280 continue;
281
283 }
284
285
288
289
291
293
297
299 }
300
301 Optimize(CI);
302
303 return CI;
304}
305
306llvm::DenseSet<const FileEntry *> ModuleDepCollector::collectModuleMapFiles(
308 llvm::DenseSet<const FileEntry *> ModuleMapFiles;
309 for (const ModuleID &MID : ClangModuleDeps) {
310 ModuleDeps *MD = ModuleDepsByID.lookup(MID);
311 assert(MD && "Inconsistent dependency info");
312
315 assert(FE && "Missing module map file that was previously found");
316 ModuleMapFiles.insert(*FE);
317 }
318 return ModuleMapFiles;
319}
320
321void ModuleDepCollector::addModuleMapFiles(
323 if (EagerLoadModules)
324 return;
325
326 for (const ModuleID &MID : ClangModuleDeps) {
327 ModuleDeps *MD = ModuleDepsByID.lookup(MID);
328 assert(MD && "Inconsistent dependency info");
330 }
331}
332
333void ModuleDepCollector::addModuleFiles(
335 for (const ModuleID &MID : ClangModuleDeps) {
336 std::string PCMPath =
338 if (EagerLoadModules)
340 else
342 {MID.ModuleName, std::move(PCMPath)});
343 }
344}
345
346void ModuleDepCollector::addModuleFiles(
348 for (const ModuleID &MID : ClangModuleDeps) {
349 std::string PCMPath =
351 if (EagerLoadModules)
353 else
355 {MID.ModuleName, std::move(PCMPath)});
356 }
357}
358
364 return false;
365 default:
366 return true;
367 }
368}
369
374
383 CurrentModuleMap->getNameAsRequested());
384
386 for (const auto &KV : ModularDeps)
387 if (DirectModularDeps.contains(KV.first))
388 DirectDeps.push_back(KV.second->ID);
389
390
391 addModuleMapFiles(CI, DirectDeps);
392
393 addModuleFiles(CI, DirectDeps);
394
395 for (const auto &KV : DirectPrebuiltModularDeps)
397 }
398}
399
402 bool EagerLoadModules,
403 llvm::vfs::FileSystem &VFS) {
404 llvm::HashBuilder<llvm::TruncatedBLAKE3<16>, llvm::endianness::native>
405 HashBuilder;
407
408
409
412 llvm::ErrorOrstd::string CWD = VFS.getCurrentWorkingDirectory();
413 if (CWD)
414 HashBuilder.add(*CWD);
415
416
418 ArgVec.reserve(4096);
420 Arg.toVector(ArgVec);
421 ArgVec.push_back('\0');
422 });
423 HashBuilder.add(ArgVec);
424
425
426
427
428
429
431 HashBuilder.add(ID.ModuleName);
432 HashBuilder.add(ID.ContextHash);
433 }
434
435 HashBuilder.add(EagerLoadModules);
436
437 llvm::BLAKE3Result<16> Hash = HashBuilder.final();
438 std::array<uint64_t, 2> Words;
439 static_assert(sizeof(Hash) == sizeof(Words), "Hash must match Words");
440 std::memcpy(Words.data(), Hash.data(), sizeof(Hash));
441 return toString(llvm::APInt(sizeof(Words) * 8, Words), 36, false);
442}
443
444void ModuleDepCollector::associateWithContextHash(
448 bool Inserted = ModuleDepsByID.insert({Deps.ID, &Deps}).second;
449 (void)Inserted;
450 assert(Inserted && "duplicate module mapping");
451}
452
459 return;
460
461
462
463 if (MDC.ContextHash.empty()) {
466 }
467
469
470
471
472
473 if (std::optional Filename = SM.getNonBuiltinFilenameForID(FID))
474 MDC.addFileDep(llvm::sys::path::remove_leading_dotslash(*Filename));
475}
476
480 StringRef SearchPath, StringRef RelativePath, const Module *SuggestedModule,
482 if ( && !ModuleImported) {
483
484
486 }
487 handleImport(SuggestedModule);
488}
489
492 const Module *Imported) {
495 RequiredModule.ModuleName = Path[0].first->getName().str();
497 MDC.RequiredStdCXXModules.push_back(RequiredModule);
498 return;
499 }
500
501 handleImport(Imported);
502}
503
504void ModuleDepCollectorPP::handleImport(const Module *Imported) {
505 if (!Imported)
506 return;
507
509
510 if (MDC.isPrebuiltModule(TopLevelModule))
511 MDC.DirectPrebuiltModularDeps.insert(
513 else
514 MDC.DirectModularDeps.insert(TopLevelModule);
515}
516
519 MDC.MainFile = std::string(MDC.ScanInstance.getSourceManager()
522
524 if (PP.isInNamedModule()) {
526 ProvidedModule.ModuleName = PP.getNamedModuleName();
529
530
531
532 if (PP.isInImplementationUnit())
533 MDC.RequiredStdCXXModules.push_back(ProvidedModule);
534 else
535 MDC.ProvidedStdCXXModule = ProvidedModule;
536 }
537
540
541 for (const Module *M :
543 if (!MDC.isPrebuiltModule(M))
544 MDC.DirectModularDeps.insert(M);
545
546 for (const Module *M : MDC.DirectModularDeps)
547 handleTopLevelModule(M);
548
550
551 if (MDC.IsStdModuleP1689Format)
553 MDC.ProvidedStdCXXModule, MDC.RequiredStdCXXModules);
554
555 for (auto &&I : MDC.ModularDeps)
557
558 for (const Module *M : MDC.DirectModularDeps) {
559 auto It = MDC.ModularDeps.find(M);
560
561 if (It != MDC.ModularDeps.end())
563 }
564
565 for (auto &&I : MDC.FileDeps)
567
568 for (auto &&I : MDC.DirectPrebuiltModularDeps)
570}
571
572std::optional
573ModuleDepCollectorPP::handleTopLevelModule(const Module *M) {
574 assert(M == M->getTopLevelModule() && "Expected top level module!");
575
576
577
578
579
581 return {};
582
583
584 if (auto ModI = MDC.ModularDeps.find(M); ModI != MDC.ModularDeps.end())
585 return ModI->second->ID;
586
587 auto OwnedMD = std::make_unique();
589
592
593
596
599
604 }
605
607 MDC.ScanInstance.getASTReader()->getModuleManager().lookup(
610 MDC.ScanInstance.getASTReader()->visitInputFileInfos(
611 *MF, true,
613
614
615
616
617
619 return;
621 });
622
623 llvm::DenseSet<const Module *> SeenDeps;
624 addAllSubmodulePrebuiltDeps(M, MD, SeenDeps);
625 addAllSubmoduleDeps(M, MD, SeenDeps);
626 addAllAffectingClangModules(M, MD, SeenDeps);
627
629 PathBuf.reserve(256);
630 MDC.ScanInstance.getASTReader()->visitInputFileInfos(
631 *MF, true,
634 return;
636 "__inferred_module.map"))
637 return;
642 });
643
645 MDC.getInvocationAdjustedForModuleBuildWithoutOutputs(
651 MDC.PrebuiltModuleVFSMap,
652 MDC.OptimizeArgs);
657 });
658
659 MDC.associateWithContextHash(CI, MD);
660
661
662 MDC.addOutputPaths(CI, MD);
663
664 MD.BuildInfo = std::move(CI);
665
666 MDC.ModularDeps.insert({M, std::move(OwnedMD)});
667
668 return MD.ID;
669}
670
672 llvm::function_ref<void(const Module *)> F) {
673
674
675
677 llvm::stable_sort(Submodules, [](const Module *A, const Module *B) {
679 });
680 for (const Module *SubM : Submodules)
681 F(SubM);
682}
683
684void ModuleDepCollectorPP::addAllSubmodulePrebuiltDeps(
686 llvm::DenseSet<const Module *> &SeenSubmodules) {
687 addModulePrebuiltDeps(M, MD, SeenSubmodules);
688
690 addAllSubmodulePrebuiltDeps(SubM, MD, SeenSubmodules);
691 });
692}
693
694void ModuleDepCollectorPP::addModulePrebuiltDeps(
696 llvm::DenseSet<const Module *> &SeenSubmodules) {
699 if (MDC.isPrebuiltModule(Import->getTopLevelModule()))
700 if (SeenSubmodules.insert(Import->getTopLevelModule()).second)
702}
703
704void ModuleDepCollectorPP::addAllSubmoduleDeps(
706 llvm::DenseSet<const Module *> &AddedModules) {
707 addModuleDep(M, MD, AddedModules);
708
710 addAllSubmoduleDeps(SubM, MD, AddedModules);
711 });
712}
713
714void ModuleDepCollectorPP::addModuleDep(
716 llvm::DenseSet<const Module *> &AddedModules) {
719 !MDC.isPrebuiltModule(Import)) {
720 if (auto ImportID = handleTopLevelModule(Import->getTopLevelModule()))
721 if (AddedModules.insert(Import->getTopLevelModule()).second)
723 }
724 }
725}
726
727void ModuleDepCollectorPP::addAllAffectingClangModules(
729 llvm::DenseSet<const Module *> &AddedModules) {
730 addAffectingClangModule(M, MD, AddedModules);
731
733 addAllAffectingClangModules(SubM, MD, AddedModules);
734}
735
736void ModuleDepCollectorPP::addAffectingClangModule(
738 llvm::DenseSet<const Module *> &AddedModules) {
741 "Not quite import not top-level module");
743 !MDC.isPrebuiltModule(Affecting)) {
744 if (auto ImportID = handleTopLevelModule(Affecting))
745 if (AddedModules.insert(Affecting).second)
747 }
748 }
749}
750
752 std::unique_ptr Opts,
757 bool IsStdModuleP1689Format)
758 : ScanInstance(ScanInstance), Consumer(C), Controller(Controller),
759 PrebuiltModuleVFSMap(std::move(PrebuiltModuleVFSMap)),
760 Opts(std::move(Opts)),
761 CommonInvocation(
763 OptimizeArgs(OptimizeArgs), EagerLoadModules(EagerLoadModules),
764 IsStdModuleP1689Format(IsStdModuleP1689Format) {}
765
767 PP.addPPCallbacks(std::make_unique(*this));
768}
769
771
772bool ModuleDepCollector::isPrebuiltModule(const Module *M) {
774 const auto &PrebuiltModuleFiles =
776 auto PrebuiltModuleFileIt = PrebuiltModuleFiles.find(Name);
777 if (PrebuiltModuleFileIt == PrebuiltModuleFiles.end())
778 return false;
779 assert("Prebuilt module came from the expected AST file" &&
781 return true;
782}
783
786 if (llvm::sys::path::is_absolute(Path) &&
787 !llvm::sys::path::is_style_windows(llvm::sys::path::Style::native))
789 Storage.assign(Path.begin(), Path.end());
791 llvm::sys::path::make_preferred(Storage);
792 return StringRef(Storage.data(), Storage.size());
793}
794
795void ModuleDepCollector::addFileDep(StringRef Path) {
796 if (IsStdModuleP1689Format) {
797
798
799 FileDeps.emplace_back(Path);
800 return;
801 }
802
805 FileDeps.emplace_back(Path);
806}
807
808void ModuleDepCollector::addFileDep(ModuleDeps &MD, StringRef Path) {
809 MD.FileDeps.emplace_back(Path);
810}
llvm::DenseSet< const void * > Visited
llvm::MachO::FileType FileType
llvm::MachO::Target Target
static void optimizeHeaderSearchOpts(HeaderSearchOptions &Opts, ASTReader &Reader, const serialization::ModuleFile &MF, const PrebuiltModuleVFSMapT &PrebuiltModuleVFSMap, ScanningOptimizations OptimizeArgs)
static std::vector< std::string > splitString(std::string S, char Separator)
static std::string getModuleContextHash(const ModuleDeps &MD, const CowCompilerInvocation &CI, bool EagerLoadModules, llvm::vfs::FileSystem &VFS)
static void optimizeDiagnosticOpts(DiagnosticOptions &Opts, bool IsSystemModule)
static StringRef makeAbsoluteAndPreferred(CompilerInstance &CI, StringRef Path, SmallVectorImpl< char > &Storage)
static CowCompilerInvocation makeCommonInvocationForModuleBuild(CompilerInvocation CI)
static void forEachSubmoduleSorted(const Module *M, llvm::function_ref< void(const Module *)> F)
static bool needsModules(FrontendInputFile FIF)
Defines the clang::Preprocessor interface.
static std::string toString(const clang::SanitizerSet &Sanitizers)
Produce a string containing comma-separated names of sanitizers in Sanitizers set.
Reads an AST files chain containing the contents of a translation unit.
static TemporarilyOwnedStringRef ResolveImportedPath(SmallString< 0 > &Buf, StringRef Path, ModuleFile &ModF)
Resolve Path in the context of module file M.
Represents a character-granular source range.
CodeGenOptions - Track various options which control how the code is optimized and passed to the back...
std::string CoverageNotesFile
The filename with path we use for coverage notes files.
std::string ProfileInstrumentUsePath
Name of the profile file to use as input for -fprofile-instr-use.
std::string SampleProfileFile
Name of the profile file to use with -fprofile-sample-use.
std::string CoverageDataFile
The filename with path we use for coverage data files.
std::string DebugCompilationDir
The string to embed in debug information as the current working directory.
std::string MainFileName
The user provided name for the "main file", if non-empty.
std::string CoverageCompilationDir
The string to embed in coverage mapping as the current working directory.
std::string ProfileRemappingFile
Name of the profile remapping file to apply to the profile data supplied by -fprofile-sample-use or -...
std::string DwarfDebugFlags
The string to embed in the debug information for the compile unit, if non-empty.
CompilerInstance - Helper class for managing a single instance of the Clang compiler.
FileManager & getFileManager() const
Return the current file manager to the caller.
IntrusiveRefCntPtr< ASTReader > getASTReader() const
Preprocessor & getPreprocessor() const
Return the current preprocessor.
HeaderSearchOptions & getHeaderSearchOpts()
CompilerInvocation & getInvocation()
PreprocessorOptions & getPreprocessorOpts()
llvm::vfs::FileSystem & getVirtualFileSystem() const
SourceManager & getSourceManager() const
Return the current source manager.
const FrontendOptions & getFrontendOpts() const
void generateCC1CommandLine(llvm::SmallVectorImpl< const char * > &Args, StringAllocator SA) const
Generate cc1-compatible command line arguments from this instance.
const DependencyOutputOptions & getDependencyOutputOpts() const
const DiagnosticOptions & getDiagnosticOpts() const
Helper class for holding the data necessary to invoke the compiler.
PreprocessorOptions & getPreprocessorOpts()
void clearImplicitModuleBuildOptions()
Disable implicit modules and canonicalize options that are only used by implicit modules.
LangOptions & getLangOpts()
Mutable getters.
DependencyOutputOptions & getDependencyOutputOpts()
void resetNonModularOptions()
Reset all of the options that are not considered when building a module.
FrontendOptions & getFrontendOpts()
std::string getModuleHash() const
Retrieve a module hash string that is suitable for uniquely identifying the conditions under which th...
CodeGenOptions & getCodeGenOpts()
HeaderSearchOptions & getHeaderSearchOpts()
DiagnosticOptions & getDiagnosticOpts()
Same as CompilerInvocation, but with copy-on-write optimization.
FrontendOptions & getMutFrontendOpts()
LangOptions & getMutLangOpts()
Mutable getters.
HeaderSearchOptions & getMutHeaderSearchOpts()
DiagnosticOptions & getMutDiagnosticOpts()
DependencyOutputOptions & getMutDependencyOutputOpts()
std::string OutputFile
The file to write dependency output to.
std::vector< std::string > Targets
A list of names to use as the targets in the dependency file; this list must contain at least one ent...
Options for controlling the compiler diagnostics engine.
std::vector< std::string > Remarks
The list of -R... options used to alter the diagnostic mappings, with the prefixes removed.
std::vector< std::string > Warnings
The list of -W... options used to alter the diagnostic mappings, with the prefixes removed.
std::vector< std::string > UndefPrefixes
The list of prefixes from -Wundef-prefix=... used to generate warnings for undefined macros.
std::vector< std::string > SystemHeaderWarningsModules
The list of -Wsystem-headers-in-module=... options used to override whether -Wsystem-headers is enabl...
std::string DiagnosticSerializationFile
The file to serialize diagnostics to (non-appending).
StringRef getName() const
The name of this FileEntry.
An opaque identifier used by SourceManager which refers to a source file (MemoryBuffer) along with it...
OptionalFileEntryRef getOptionalFileRef(StringRef Filename, bool OpenFile=false, bool CacheFailure=true)
Get a FileEntryRef if it exists, without doing anything on error.
bool makeAbsolutePath(SmallVectorImpl< char > &Path) const
Makes Path absolute taking into account FileSystemOptions and the working directory option.
An input file for the front end.
InputKind getKind() const
InputKind DashX
The input kind, either specified via -x argument or deduced from the input file name.
std::vector< std::string > ModuleFiles
The list of additional prebuilt module files to load before processing the input.
enum clang::FrontendOptions::@202 ARCMTAction
unsigned IsSystemModule
When using -emit-module, treat the modulemap as a system module.
std::vector< std::string > LLVMArgs
A list of arguments to forward to LLVM's option processing; this should only be used for debugging an...
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.
std::vector< std::string > ModuleMapFiles
The list of module map files to load before processing the input.
The kind of a file that we've been handed as an input.
Language getLanguage() const
Keeps track of the various options that can be enabled, which controls the dialect of C or C++ that i...
std::string ModuleName
The module currently being compiled as specified by -fmodule-name.
OptionalFileEntryRef getModuleMapFileForUniquing(const Module *M) const
std::error_code canonicalizeModuleMapPath(SmallVectorImpl< char > &Path)
Canonicalize Path in a manner suitable for a module map file.
Describes a module or submodule.
StringRef getTopLevelModuleName() const
Retrieve the name of the top-level module.
llvm::SmallSetVector< Module *, 2 > Imports
The set of modules imported by this module, and on which this module depends.
unsigned IsSystem
Whether this is a "system" module (which assumes that all headers in it are system headers).
std::string Name
The name of this module.
llvm::iterator_range< submodule_iterator > submodules()
llvm::SmallVector< LinkLibrary, 2 > LinkLibraries
The set of libraries or frameworks to link against when an entity from this module is used.
llvm::SmallSetVector< Module *, 2 > AffectingClangModules
The set of top-level modules that affected the compilation of this module, but were not imported.
std::string getFullModuleName(bool AllowStringLiterals=false) const
Retrieve the full name of this module, including the path from its top-level module.
Module * getTopLevelModule()
Retrieve the top-level module for this (sub)module, which may be this module.
OptionalFileEntryRef getASTFile() const
The serialized AST file for this module, if one was created.
bool UseExportAsModuleLinkName
Autolinking uses the framework name for linking purposes when this is false and the export_as name ot...
std::string ImplicitPCHInclude
The implicit PCH included at the start of the translation unit, or empty.
std::vector< std::pair< std::string, bool > > Macros
Engages in a tight little dance with the lexer to efficiently preprocess tokens.
bool isInImportingCXXNamedModules() const
If we're importing a standard C++20 Named Modules.
void addPPCallbacks(std::unique_ptr< PPCallbacks > C)
Module * getCurrentModuleImplementation()
Retrieves the module whose implementation we're current compiling, if any.
HeaderSearch & getHeaderSearchInfo() const
const llvm::SmallSetVector< Module *, 2 > & getAffectingClangModules() const
Get the set of top-level clang modules that affected preprocessing, but were not imported.
Encodes a location in the source.
This class handles loading and caching of source files into memory.
OptionalFileEntryRef getFileEntryRefForID(FileID FID) const
Returns the FileEntryRef for the provided FileID.
FileID getMainFileID() const
Returns the FileID of the main source file.
Token - This structure provides full information about a lexed token.
Information about a module that has been loaded by the ASTReader.
std::string FileName
The file name of the module file.
llvm::SetVector< ModuleFile * > Imports
List of modules which this module directly imported.
llvm::BitVector SearchPathUsage
The bit vector denoting usage of each header search entry (true = used).
llvm::BitVector VFSUsage
The bit vector denoting usage of each VFS entry (true = used).
ModuleKind Kind
The type of this module.
std::string BaseDirectory
The base directory of the module.
CharacteristicKind
Indicates whether a file or directory holds normal user code, system code, or system code which is im...
@ GeneratePCH
Generate pre-compiled header.
@ GenerateModule
Generate pre-compiled module from a module map.
const unsigned VERSION_MINOR
AST file minor version number supported by this version of Clang.
const unsigned VERSION_MAJOR
AST file major version number supported by this version of Clang.
@ MK_ImplicitModule
File is an implicitly-loaded module.
The JSON file list parser is used to communicate input to InstallAPI.
if(T->getSizeExpr()) TRY_TO(TraverseStmt(const_cast< Expr * >(T -> getSizeExpr())))
void quoteMakeTarget(StringRef Target, SmallVectorImpl< char > &Res)
Quote target names for inclusion in GNU Make dependency files.
@ Asm
Assembly: we accept this only so that we can preprocess it.
@ Result
The result type of a method or function.
std::string getClangFullRepositoryVersion()
Retrieves the full repository version that is an amalgamation of the information in getClangRepositor...
int __ovld __cnfn any(char)
Returns 1 if the most significant bit in any component of x is set; otherwise returns 0.
The input file info that has been loaded from an AST file.
StringRef UnresolvedImportedFilename
StringRef UnresolvedImportedFilenameAsRequested