clang 23.0.0git
Module.cpp
Go to the documentation of this file.
1//===- Module.cpp - Describe a module -------------------------------------===//
2//
3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4// See https://llvm.org/LICENSE.txt for license information.
5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6//
7//===----------------------------------------------------------------------===//
8//
9// This file defines the Module class, which describes a module in the source
10// code.
11//
12//===----------------------------------------------------------------------===//
13
14#include "clang/Basic/Module.h"
20#include "llvm/ADT/ArrayRef.h"
21#include "llvm/ADT/SmallVector.h"
22#include "llvm/ADT/StringMap.h"
23#include "llvm/ADT/StringRef.h"
24#include "llvm/ADT/StringSwitch.h"
25#include "llvm/Support/Compiler.h"
26#include "llvm/Support/ErrorHandling.h"
27#include "llvm/Support/raw_ostream.h"
28#include <cassert>
29#include <functional>
30#include <string>
31#include <utility>
32#include <vector>
33
34using namespace clang;
35
59
60Module::~Module() = default;
61
62static bool isPlatformEnvironment(const TargetInfo &Target, StringRef Feature) {
63 StringRef Platform = Target.getPlatformName();
64 StringRef Env = Target.getTriple().getEnvironmentName();
65
66 // Attempt to match platform and environment.
67 if (Platform == Feature || Target.getTriple().getOSName() == Feature ||
68 Env == Feature)
69 return true;
70
71 auto CmpPlatformEnv = [](StringRef LHS, StringRef RHS) {
72 auto Pos = LHS.find('-');
73 if (Pos == StringRef::npos)
74 return false;
75 SmallString<128> NewLHS = LHS.slice(0, Pos);
76 NewLHS += LHS.slice(Pos+1, LHS.size());
77 return NewLHS == RHS;
78 };
79
80 SmallString<128> PlatformEnv = Target.getTriple().getOSAndEnvironmentName();
81 // Darwin has different but equivalent variants for simulators, example:
82 // 1. x86_64-apple-ios-simulator
83 // 2. x86_64-apple-iossimulator
84 // where both are valid examples of the same platform+environment but in the
85 // variant (2) the simulator is hardcoded as part of the platform name. Both
86 // forms above should match for "iossimulator" requirement.
87 if (Target.getTriple().isOSDarwin() && PlatformEnv.ends_with("simulator"))
88 return PlatformEnv == Feature || CmpPlatformEnv(PlatformEnv, Feature);
89
90 return PlatformEnv == Feature;
91}
92
93/// Determine whether a translation unit built using the current
94/// language options has the given feature.
95static bool hasFeature(StringRef Feature, const LangOptions &LangOpts,
96 const TargetInfo &Target) {
97 bool HasFeature = llvm::StringSwitch<bool>(Feature)
98 .Case("altivec", LangOpts.AltiVec)
99 .Case("blocks", LangOpts.Blocks)
100 .Case("coroutines", LangOpts.Coroutines)
101 .Case("cplusplus", LangOpts.CPlusPlus)
102 .Case("cplusplus11", LangOpts.CPlusPlus11)
103 .Case("cplusplus14", LangOpts.CPlusPlus14)
104 .Case("cplusplus17", LangOpts.CPlusPlus17)
105 .Case("cplusplus20", LangOpts.CPlusPlus20)
106 .Case("cplusplus23", LangOpts.CPlusPlus23)
107 .Case("cplusplus26", LangOpts.CPlusPlus26)
108 .Case("c99", LangOpts.C99)
109 .Case("c11", LangOpts.C11)
110 .Case("c17", LangOpts.C17)
111 .Case("c23", LangOpts.C23)
112 .Case("freestanding", LangOpts.Freestanding)
113 .Case("gnuinlineasm", LangOpts.GNUAsm)
114 .Case("objc", LangOpts.ObjC)
115 .Case("objc_arc", LangOpts.ObjCAutoRefCount)
116 .Case("opencl", LangOpts.OpenCL)
117 .Case("tls", Target.isTLSSupported())
118 .Case("zvector", LangOpts.ZVector)
119 .Default(Target.hasFeature(Feature) ||
121 if (!HasFeature)
122 HasFeature = llvm::is_contained(LangOpts.ModuleFeatures, Feature);
123 return HasFeature;
124}
125
127 const TargetInfo &Target, Requirement &Req,
128 Module *&ShadowingModule) const {
129 if (!IsUnimportable)
130 return false;
131
132 for (const Module *Current = this; Current; Current = Current->Parent) {
133 if (Current->ShadowingModule) {
134 ShadowingModule = Current->ShadowingModule;
135 return true;
136 }
137 for (unsigned I = 0, N = Current->Requirements.size(); I != N; ++I) {
138 if (hasFeature(Current->Requirements[I].FeatureName, LangOpts, Target) !=
139 Current->Requirements[I].RequiredState) {
140 Req = Current->Requirements[I];
141 return true;
142 }
143 }
144 }
145
146 llvm_unreachable("could not find a reason why module is unimportable");
147}
148
149// The -fmodule-name option tells the compiler to textually include headers in
150// the specified module, meaning Clang won't build the specified module. This
151// is useful in a number of situations, for instance, when building a library
152// that vends a module map, one might want to avoid hitting intermediate build
153// products containing the module map or avoid finding the system installed
154// modulemap for that library.
155bool Module::isForBuilding(const LangOptions &LangOpts) const {
156 StringRef TopLevelName = getTopLevelModuleName();
157 StringRef CurrentModule = LangOpts.CurrentModule;
158
159 // When building the implementation of framework Foo, we want to make sure
160 // that Foo *and* Foo_Private are textually included and no modules are built
161 // for either.
162 if (!LangOpts.isCompilingModule() && getTopLevelModule()->IsFramework &&
163 CurrentModule == LangOpts.ModuleName &&
164 !CurrentModule.ends_with("_Private") &&
165 TopLevelName.ends_with("_Private"))
166 TopLevelName = TopLevelName.drop_back(8);
167
168 return TopLevelName == CurrentModule;
169}
170
172 Requirement &Req,
173 UnresolvedHeaderDirective &MissingHeader,
174 Module *&ShadowingModule) const {
175 if (IsAvailable)
176 return true;
177
178 if (isUnimportable(LangOpts, Target, Req, ShadowingModule))
179 return false;
180
181 // FIXME: All missing headers are listed on the top-level module. Should we
182 // just look there?
183 for (const Module *Current = this; Current; Current = Current->Parent) {
184 if (!Current->MissingHeaders.empty()) {
185 MissingHeader = Current->MissingHeaders.front();
186 return false;
187 }
188 }
189
190 llvm_unreachable("could not find a reason why module is unavailable");
191}
192
194 for (auto *Parent = this; Parent; Parent = Parent->Parent) {
195 if (Parent == Other)
196 return true;
197 }
198 return false;
199}
200
202 const Module *Result = this;
203 while (Result->Parent)
204 Result = Result->Parent;
205
206 return Result;
207}
208
210 const std::pair<std::string, SourceLocation> &IdComponent) {
211 return IdComponent.first;
212}
213
214static StringRef getModuleNameFromComponent(StringRef R) { return R; }
215
216template<typename InputIter>
217static void printModuleId(raw_ostream &OS, InputIter Begin, InputIter End,
218 bool AllowStringLiterals = true) {
219 for (InputIter It = Begin; It != End; ++It) {
220 if (It != Begin)
221 OS << ".";
222
223 StringRef Name = getModuleNameFromComponent(*It);
224 if (!AllowStringLiterals || isValidAsciiIdentifier(Name))
225 OS << Name;
226 else {
227 OS << '"';
228 OS.write_escaped(Name);
229 OS << '"';
230 }
231 }
232}
233
234template<typename Container>
235static void printModuleId(raw_ostream &OS, const Container &C) {
236 return printModuleId(OS, C.begin(), C.end());
237}
238
239std::string Module::getFullModuleName(bool AllowStringLiterals) const {
241
242 // Build up the set of module names (from innermost to outermost).
243 for (const Module *M = this; M; M = M->Parent)
244 Names.push_back(M->Name);
245
246 std::string Result;
247
248 llvm::raw_string_ostream Out(Result);
249 printModuleId(Out, Names.rbegin(), Names.rend(), AllowStringLiterals);
250
251 return Result;
252}
253
255 for (const Module *M = this; M; M = M->Parent) {
256 if (nameParts.empty() || M->Name != nameParts.back())
257 return false;
258 nameParts = nameParts.drop_back();
259 }
260 return nameParts.empty();
261}
262
264 if (const auto *Hdr = std::get_if<FileEntryRef>(&Umbrella))
265 return Hdr->getDir();
266 if (const auto *Dir = std::get_if<DirectoryEntryRef>(&Umbrella))
267 return *Dir;
268 return std::nullopt;
269}
270
272 assert(File);
273 TopHeaders.insert(File);
274}
275
277 if (!TopHeaderNames.empty()) {
278 for (StringRef TopHeaderName : TopHeaderNames)
279 if (auto FE = FileMgr.getOptionalFileRef(TopHeaderName))
280 TopHeaders.insert(*FE);
281 TopHeaderNames.clear();
282 }
283
284 return llvm::ArrayRef(TopHeaders.begin(), TopHeaders.end());
285}
286
287bool Module::directlyUses(const Module *Requested) {
288 auto *Top = getTopLevelModule();
289
290 // A top-level module implicitly uses itself.
291 if (Requested->isSubModuleOf(Top))
292 return true;
293
294 for (auto *Use : Top->DirectUses)
295 if (Requested->isSubModuleOf(Use))
296 return true;
297
298 // Anyone is allowed to use our builtin stddef.h and its accompanying modules.
299 if (Requested->fullModuleNameIs({"_Builtin_stddef", "max_align_t"}) ||
300 Requested->fullModuleNameIs({"_Builtin_stddef_wint_t"}))
301 return true;
302 // Darwin is allowed is to use our builtin 'ptrauth.h' and its accompanying
303 // module.
304 if (!Requested->Parent && Requested->Name == "ptrauth")
305 return true;
306
308 UndeclaredUses.insert(Requested);
309
310 return false;
311}
312
313void Module::addRequirement(StringRef Feature, bool RequiredState,
314 const LangOptions &LangOpts,
315 const TargetInfo &Target) {
316 Requirements.push_back(Requirement{std::string(Feature), RequiredState});
317
318 // If this feature is currently available, we're done.
319 if (hasFeature(Feature, LangOpts, Target) == RequiredState)
320 return;
321
322 markUnavailable(/*Unimportable*/true);
323}
324
325void Module::markUnavailable(bool Unimportable) {
326 auto needUpdate = [Unimportable](Module *M) {
327 return M->IsAvailable || (!M->IsUnimportable && Unimportable);
328 };
329
330 if (!needUpdate(this))
331 return;
332
334 Stack.push_back(this);
335 while (!Stack.empty()) {
336 Module *Current = Stack.pop_back_val();
337
338 if (!needUpdate(Current))
339 continue;
340
341 Current->IsAvailable = false;
342 Current->IsUnimportable |= Unimportable;
343 for (Module *Submodule : Current->submodules()) {
344 if (needUpdate(Submodule))
345 Stack.push_back(Submodule);
346 }
347 }
348}
349
351 if (auto It = SubModuleIndex.find(Name); It != SubModuleIndex.end())
352 return SubModules[It->second];
353
354 return nullptr;
355}
356
358 assert(isNamedModuleUnit() && "We should only query the global module "
359 "fragment from the C++20 Named modules");
360
361 for (Module *SubModule : submodules())
362 if (SubModule->isExplicitGlobalModule())
363 return SubModule;
364
365 return nullptr;
366}
367
369 assert(isNamedModuleUnit() && "We should only query the private module "
370 "fragment from the C++20 Named modules");
371
372 for (Module *SubModule : submodules())
373 if (SubModule->isPrivateModule())
374 return SubModule;
375
376 return nullptr;
377}
378
380 // All non-explicit submodules are exported.
381 for (Module *Mod : submodules())
382 if (!Mod->IsExplicit)
383 Exported.push_back(Mod);
384
385 // Find re-exported modules by filtering the list of imported modules.
386 bool AnyWildcard = false;
387 bool UnrestrictedWildcard = false;
388 SmallVector<Module *, 4> WildcardRestrictions;
389 for (unsigned I = 0, N = Exports.size(); I != N; ++I) {
390 Module *Mod = Exports[I].first;
391 if (!Exports[I].second) {
392 // Export a named module directly; no wildcards involved.
393 Exported.push_back(Mod);
394
395 continue;
396 }
397
398 // Wildcard export: export all of the imported modules that match
399 // the given pattern.
400 AnyWildcard = true;
401 if (UnrestrictedWildcard)
402 continue;
403
404 if (Module *Restriction = Exports[I].first)
405 WildcardRestrictions.push_back(Restriction);
406 else {
407 WildcardRestrictions.clear();
408 UnrestrictedWildcard = true;
409 }
410 }
411
412 // If there were any wildcards, push any imported modules that were
413 // re-exported by the wildcard restriction.
414 if (!AnyWildcard)
415 return;
416
417 for (unsigned I = 0, N = Imports.size(); I != N; ++I) {
418 Module *Mod = Imports[I];
419 bool Acceptable = UnrestrictedWildcard;
420 if (!Acceptable) {
421 // Check whether this module meets one of the restrictions.
422 for (unsigned R = 0, NR = WildcardRestrictions.size(); R != NR; ++R) {
423 Module *Restriction = WildcardRestrictions[R];
424 if (Mod == Restriction || Mod->isSubModuleOf(Restriction)) {
425 Acceptable = true;
426 break;
427 }
428 }
429 }
430
431 if (!Acceptable)
432 continue;
433
434 Exported.push_back(Mod);
435 }
436}
437
438void Module::buildVisibleModulesCache() const {
439 assert(VisibleModulesCache.empty() && "cache does not need building");
440
441 // This module is visible to itself.
442 VisibleModulesCache.insert(this);
443
444 // Every imported module is visible.
445 SmallVector<Module *, 16> Stack(Imports.begin(), Imports.end());
446 while (!Stack.empty()) {
447 Module *CurrModule = Stack.pop_back_val();
448
449 // Every module transitively exported by an imported module is visible.
450 if (VisibleModulesCache.insert(CurrModule).second)
451 CurrModule->getExportedModules(Stack);
452 }
453}
454
455void Module::print(raw_ostream &OS, unsigned Indent, bool Dump) const {
456 OS.indent(Indent);
457 if (IsFramework)
458 OS << "framework ";
459 if (IsExplicit)
460 OS << "explicit ";
461 OS << "module ";
462 printModuleId(OS, &Name, &Name + 1);
463
464 if (IsSystem || IsExternC) {
465 OS.indent(Indent + 2);
466 if (IsSystem)
467 OS << " [system]";
468 if (IsExternC)
469 OS << " [extern_c]";
470 }
471
472 OS << " {\n";
473
474 if (!Requirements.empty()) {
475 OS.indent(Indent + 2);
476 OS << "requires ";
477 for (unsigned I = 0, N = Requirements.size(); I != N; ++I) {
478 if (I)
479 OS << ", ";
480 if (!Requirements[I].RequiredState)
481 OS << "!";
482 OS << Requirements[I].FeatureName;
483 }
484 OS << "\n";
485 }
486
487 if (std::optional<Header> H = getUmbrellaHeaderAsWritten()) {
488 OS.indent(Indent + 2);
489 OS << "umbrella header \"";
490 OS.write_escaped(H->NameAsWritten);
491 OS << "\"\n";
492 } else if (std::optional<DirectoryName> D = getUmbrellaDirAsWritten()) {
493 OS.indent(Indent + 2);
494 OS << "umbrella \"";
495 OS.write_escaped(D->NameAsWritten);
496 OS << "\"\n";
497 }
498
499 if (!ConfigMacros.empty() || ConfigMacrosExhaustive) {
500 OS.indent(Indent + 2);
501 OS << "config_macros ";
503 OS << "[exhaustive]";
504 for (unsigned I = 0, N = ConfigMacros.size(); I != N; ++I) {
505 if (I)
506 OS << ", ";
507 OS << ConfigMacros[I];
508 }
509 OS << "\n";
510 }
511
512 struct {
513 StringRef Prefix;
515 } Kinds[] = {{"", HK_Normal},
516 {"textual ", HK_Textual},
517 {"private ", HK_Private},
518 {"private textual ", HK_PrivateTextual},
519 {"exclude ", HK_Excluded}};
520
521 for (auto &K : Kinds) {
522 assert(&K == &Kinds[K.Kind] && "kinds in wrong order");
523 for (auto &H : getHeaders(K.Kind)) {
524 OS.indent(Indent + 2);
525 OS << K.Prefix << "header \"";
526 OS.write_escaped(H.NameAsWritten);
527 OS << "\" { size " << H.Entry.getSize()
528 << " mtime " << H.Entry.getModificationTime() << " }\n";
529 }
530 }
531 for (auto *Unresolved : {&UnresolvedHeaders, &MissingHeaders}) {
532 for (auto &U : *Unresolved) {
533 OS.indent(Indent + 2);
534 OS << Kinds[U.Kind].Prefix << "header \"";
535 OS.write_escaped(U.FileName);
536 OS << "\"";
537 if (U.Size || U.ModTime) {
538 OS << " {";
539 if (U.Size)
540 OS << " size " << *U.Size;
541 if (U.ModTime)
542 OS << " mtime " << *U.ModTime;
543 OS << " }";
544 }
545 OS << "\n";
546 }
547 }
548
549 if (!ExportAsModule.empty()) {
550 OS.indent(Indent + 2);
551 OS << "export_as" << ExportAsModule << "\n";
552 }
553
554 for (Module *Submodule : submodules())
555 // Print inferred subframework modules so that we don't need to re-infer
556 // them (requires expensive directory iteration + stat calls) when we build
557 // the module. Regular inferred submodules are OK, as we need to look at all
558 // those header files anyway.
559 if (!Submodule->IsInferred || Submodule->IsFramework)
560 Submodule->print(OS, Indent + 2, Dump);
561
562 for (unsigned I = 0, N = Exports.size(); I != N; ++I) {
563 OS.indent(Indent + 2);
564 OS << "export ";
565 if (Module *Restriction = Exports[I].first) {
566 OS << Restriction->getFullModuleName(true);
567 if (Exports[I].second)
568 OS << ".*";
569 } else {
570 OS << "*";
571 }
572 OS << "\n";
573 }
574
575 for (unsigned I = 0, N = UnresolvedExports.size(); I != N; ++I) {
576 OS.indent(Indent + 2);
577 OS << "export ";
579 if (UnresolvedExports[I].Wildcard)
580 OS << (UnresolvedExports[I].Id.empty() ? "*" : ".*");
581 OS << "\n";
582 }
583
584 if (Dump) {
585 for (Module *M : Imports) {
586 OS.indent(Indent + 2);
587 llvm::errs() << "import " << M->getFullModuleName() << "\n";
588 }
589 }
590
591 for (unsigned I = 0, N = DirectUses.size(); I != N; ++I) {
592 OS.indent(Indent + 2);
593 OS << "use ";
594 OS << DirectUses[I]->getFullModuleName(true);
595 OS << "\n";
596 }
597
598 for (unsigned I = 0, N = UnresolvedDirectUses.size(); I != N; ++I) {
599 OS.indent(Indent + 2);
600 OS << "use ";
602 OS << "\n";
603 }
604
605 for (unsigned I = 0, N = LinkLibraries.size(); I != N; ++I) {
606 OS.indent(Indent + 2);
607 OS << "link ";
609 OS << "framework ";
610 OS << "\"";
611 OS.write_escaped(LinkLibraries[I].Library);
612 OS << "\"";
613 }
614
615 for (unsigned I = 0, N = UnresolvedConflicts.size(); I != N; ++I) {
616 OS.indent(Indent + 2);
617 OS << "conflict ";
619 OS << ", \"";
620 OS.write_escaped(UnresolvedConflicts[I].Message);
621 OS << "\"\n";
622 }
623
624 for (unsigned I = 0, N = Conflicts.size(); I != N; ++I) {
625 OS.indent(Indent + 2);
626 OS << "conflict ";
627 OS << Conflicts[I].Other->getFullModuleName(true);
628 OS << ", \"";
629 OS.write_escaped(Conflicts[I].Message);
630 OS << "\"\n";
631 }
632
633 if (InferSubmodules) {
634 OS.indent(Indent + 2);
636 OS << "explicit ";
637 OS << "module * {\n";
639 OS.indent(Indent + 4);
640 OS << "export *\n";
641 }
642 OS.indent(Indent + 2);
643 OS << "}\n";
644 }
645
646 OS.indent(Indent);
647 OS << "}\n";
648}
649
650LLVM_DUMP_METHOD void Module::dump() const {
651 print(llvm::errs(), 0, true);
652}
653
655 bool IncludeExports, VisibleCallback Vis,
656 ConflictCallback Cb) {
657 // We can't import a global module fragment so the location can be invalid.
658 assert((M->isGlobalModule() || Loc.isValid()) &&
659 "setVisible expects a valid import location");
660 if (isVisible(M))
661 return;
662
663 ++Generation;
664
665 struct Visiting {
666 Module *M;
667 Visiting *ExportedBy;
668 };
669
670 std::function<void(Visiting)> VisitModule = [&](Visiting V) {
671 // Nothing to do for a module that's already visible.
672 unsigned ID = V.M->getVisibilityID();
673 if (ImportLocs.size() <= ID)
674 ImportLocs.resize(ID + 1);
675 else if (ImportLocs[ID].isValid())
676 return;
677
678 ImportLocs[ID] = Loc;
679 Vis(V.M);
680
681 // Make any exported modules visible.
682 if (IncludeExports) {
684 V.M->getExportedModules(Exports);
685 for (Module *E : Exports) {
686 // Don't import non-importable modules.
687 if (!E->isUnimportable())
688 VisitModule({E, &V});
689 }
690 }
691
692 for (auto &C : V.M->Conflicts) {
693 if (isVisible(C.Other)) {
695 for (Visiting *I = &V; I; I = I->ExportedBy)
696 Path.push_back(I->M);
697 Cb(Path, C.Other, C.Message);
698 }
699 }
700 };
701 VisitModule({M, nullptr});
702}
#define V(N, I)
Defines the clang::FileManager interface and associated types.
Defines the clang::LangOptions interface.
llvm::MachO::Target Target
Definition MachO.h:51
static bool isPlatformEnvironment(const TargetInfo &Target, StringRef Feature)
Definition Module.cpp:62
static bool hasFeature(StringRef Feature, const LangOptions &LangOpts, const TargetInfo &Target)
Determine whether a translation unit built using the current language options has the given feature.
Definition Module.cpp:95
static void printModuleId(raw_ostream &OS, InputIter Begin, InputIter End, bool AllowStringLiterals=true)
Definition Module.cpp:217
static StringRef getModuleNameFromComponent(const std::pair< std::string, SourceLocation > &IdComponent)
Definition Module.cpp:209
Defines the clang::Module class, which describes a module in the source code.
static bool HasFeature(const Preprocessor &PP, StringRef Feature)
HasFeature - Return true if we recognize and implement the feature specified by the identifier as a s...
Defines the clang::SourceLocation class and associated facilities.
A reference to a FileEntry that includes the name of the file as it was accessed by the FileManager's...
Definition FileEntry.h:57
Implements support for file system lookup, file system caching, and directory search management.
Definition FileManager.h:53
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.
bool isCompilingModule() const
Are we compiling a module?
std::string CurrentModule
The name of the current module, of which the main source file is a part.
std::vector< std::string > ModuleFeatures
The names of any features to enable in module 'requires' decls in addition to the hard-coded list in ...
Required to construct a Module.
Definition Module.h:332
Reference to a module that consists of either an existing/materialized Module object,...
Definition Module.h:275
Describes a module or submodule.
Definition Module.h:340
StringRef getTopLevelModuleName() const
Retrieve the name of the top-level module.
Definition Module.h:950
void addRequirement(StringRef Feature, bool RequiredState, const LangOptions &LangOpts, const TargetInfo &Target)
Add the given feature requirement to the list of features required by this module.
Definition Module.cpp:313
unsigned IsExplicit
Whether this is an explicit submodule.
Definition Module.h:584
SmallVector< ExportDecl, 2 > Exports
The set of export declarations.
Definition Module.h:671
bool isForBuilding(const LangOptions &LangOpts) const
Determine whether this module can be built in this compilation.
Definition Module.cpp:155
std::variant< std::monostate, FileEntryRef, DirectoryEntryRef > Umbrella
The umbrella header or directory.
Definition Module.h:401
unsigned InferSubmodules
Whether we should infer submodules for this module based on the headers.
Definition Module.h:606
bool directlyUses(const Module *Requested)
Determine whether this module has declared its intention to directly use another module.
Definition Module.cpp:287
std::vector< std::string > ConfigMacros
The set of "configuration macros", which are macros that (intentionally) change how this module is bu...
Definition Module.h:728
unsigned IsUnimportable
Whether this module has declared itself unimportable, either because it's missing a requirement from ...
Definition Module.h:561
NameVisibilityKind NameVisibility
The visibility of names within this particular module.
Definition Module.h:651
@ Hidden
All of the names in this module are hidden.
Definition Module.h:645
void print(raw_ostream &OS, unsigned Indent=0, bool Dump=false) const
Print the module map for this module to the given stream.
Definition Module.cpp:455
bool isNamedModuleUnit() const
Is this a C++20 named module unit.
Definition Module.h:894
SourceLocation DefinitionLoc
The location of the module definition.
Definition Module.h:346
SmallVector< UnresolvedHeaderDirective, 1 > MissingHeaders
Headers that are mentioned in the module map file but could not be found on the file system.
Definition Module.h:541
Module(ModuleConstructorTag, StringRef Name, SourceLocation DefinitionLoc, Module *Parent, bool IsFramework, bool IsExplicit, unsigned VisibilityID)
Construct a new module or submodule.
Definition Module.cpp:36
Module * Parent
The parent of this module.
Definition Module.h:389
void markUnavailable(bool Unimportable)
Mark this module and all of its submodules as unavailable.
Definition Module.cpp:325
SmallVector< UnresolvedHeaderDirective, 1 > UnresolvedHeaders
Headers that are mentioned in the module map file but that we have not yet attempted to resolve to a ...
Definition Module.h:537
ModuleKind Kind
The kind of this module.
Definition Module.h:385
@ HK_PrivateTextual
Definition Module.h:482
bool isUnimportable() const
Determine whether this module has been declared unimportable.
Definition Module.h:763
bool fullModuleNameIs(ArrayRef< StringRef > nameParts) const
Whether the full name of this module is equal to joining nameParts with "."s.
Definition Module.cpp:254
Module * getPrivateModuleFragment() const
Get the Private Module Fragment (sub-module) for this module, it there is one.
Definition Module.cpp:368
unsigned IsInferred
Whether this is an inferred submodule (module * { ... }).
Definition Module.h:599
unsigned IsSystem
Whether this is a "system" module (which assumes that all headers in it are system headers).
Definition Module.h:589
std::string Name
The name of this module.
Definition Module.h:343
Module * getGlobalModuleFragment() const
Get the Global Module Fragment (sub-module) for this module, it there is one.
Definition Module.cpp:357
llvm::iterator_range< submodule_iterator > submodules()
Definition Module.h:1067
unsigned IsExternC
Whether this is an 'extern "C"' module (which implicitly puts all headers in it within an 'extern "C"...
Definition Module.h:595
unsigned ModuleMapIsPrivate
Whether this module came from a "private" module map, found next to a regular (public) module map.
Definition Module.h:634
llvm::SmallVector< LinkLibrary, 2 > LinkLibraries
The set of libraries or frameworks to link against when an entity from this module is used.
Definition Module.h:720
SmallVector< UnresolvedExportDecl, 2 > UnresolvedExports
The set of export declarations that have yet to be resolved.
Definition Module.h:689
std::optional< Header > getUmbrellaHeaderAsWritten() const
Retrieve the umbrella header as written.
Definition Module.h:985
SmallVector< Requirement, 2 > Requirements
The set of language features required to use this module.
Definition Module.h:552
llvm::SmallSetVector< const Module *, 2 > UndeclaredUses
When NoUndeclaredIncludes is true, the set of modules this module tried to import but didn't because ...
Definition Module.h:699
SmallVector< ModuleId, 2 > UnresolvedDirectUses
The set of use declarations that have yet to be resolved.
Definition Module.h:695
unsigned NamedModuleHasInit
Whether this C++20 named modules doesn't need an initializer.
Definition Module.h:639
unsigned NoUndeclaredIncludes
Whether files in this module can only include non-modular headers and headers from used modules.
Definition Module.h:629
ModuleRef findSubmodule(StringRef Name) const
Find the submodule with the given name.
Definition Module.cpp:350
SmallVector< Module *, 2 > DirectUses
The directly used modules.
Definition Module.h:692
unsigned ConfigMacrosExhaustive
Whether the set of configuration macros is exhaustive.
Definition Module.h:624
ArrayRef< Header > getHeaders(HeaderKind HK) const
Definition Module.h:502
bool isGlobalModule() const
Does this Module scope describe a fragment of the global module within some C++ module.
Definition Module.h:438
unsigned InferExportWildcard
Whether, when inferring submodules, the inferr submodules should export all modules they import (e....
Definition Module.h:616
void getExportedModules(SmallVectorImpl< Module * > &Exported) const
Appends this module's list of exported modules to Exported.
Definition Module.cpp:379
std::vector< UnresolvedConflict > UnresolvedConflicts
The list of conflicts for which the module-id has not yet been resolved.
Definition Module.h:741
unsigned IsFromModuleFile
Whether this module was loaded from a module file.
Definition Module.h:576
bool isSubModuleOf(const Module *Other) const
Check if this module is a (possibly transitive) submodule of Other.
Definition Module.cpp:193
ArrayRef< FileEntryRef > getTopHeaders(FileManager &FileMgr)
The top-level headers associated with this module.
Definition Module.cpp:276
bool isAvailable() const
Determine whether this module is available for use within the current translation unit.
Definition Module.h:786
std::optional< DirectoryName > getUmbrellaDirAsWritten() const
Retrieve the umbrella directory as written.
Definition Module.h:977
unsigned HasIncompatibleModuleFile
Whether we tried and failed to load a module file for this module.
Definition Module.h:565
void dump() const
Dump the contents of this module to the given output stream.
Module * ShadowingModule
A module with the same name that shadows this module.
Definition Module.h:555
unsigned IsFramework
Whether this is a framework module.
Definition Module.h:580
std::string ExportAsModule
The module through which entities defined in this module will eventually be exposed,...
Definition Module.h:417
std::string getFullModuleName(bool AllowStringLiterals=false) const
Retrieve the full name of this module, including the path from its top-level module.
Definition Module.cpp:239
void addTopHeader(FileEntryRef File)
Add a top-level header associated with this module.
Definition Module.cpp:271
unsigned IsAvailable
Whether this module is available in the current translation unit.
Definition Module.h:572
unsigned InferExplicitSubmodules
Whether, when inferring submodules, the inferred submodules should be explicit.
Definition Module.h:611
Module * getTopLevelModule()
Retrieve the top-level module for this (sub)module, which may be this module.
Definition Module.h:940
llvm::SmallVector< ModuleRef, 2 > Imports
The set of modules imported by this module, and on which this module depends.
Definition Module.h:658
OptionalDirectoryEntryRef getEffectiveUmbrellaDir() const
Get the effective umbrella directory for this module: either the one explicitly written in the module...
Definition Module.cpp:263
std::vector< Conflict > Conflicts
The list of conflicts.
Definition Module.h:753
Encodes a location in the source.
bool isValid() const
Return true if this is a valid SourceLocation object.
Exposes information about the current target.
Definition TargetInfo.h:227
void setVisible(Module *M, SourceLocation Loc, bool IncludeExports=true, VisibleCallback Vis=[](Module *) {}, ConflictCallback Cb=[](ArrayRef< Module * >, Module *, StringRef) {})
Make a specific module visible.
Definition Module.cpp:654
llvm::function_ref< void(Module *M)> VisibleCallback
A callback to call when a module is made visible (directly or indirectly) by a call to setVisible.
Definition Module.h:1132
llvm::function_ref< void(ArrayRef< Module * > Path, Module *Conflict, StringRef Message)> ConflictCallback
A callback to call when a module conflict is found.
Definition Module.h:1137
bool isVisible(const Module *M) const
Determine whether a module is visible.
Definition Module.h:1119
Defines the clang::TargetInfo interface.
The JSON file list parser is used to communicate input to InstallAPI.
LLVM_READONLY bool isValidAsciiIdentifier(StringRef S, bool AllowDollar=false)
Return true if this is a valid ASCII identifier.
Definition CharInfo.h:244
raw_ostream & Indent(raw_ostream &Out, const unsigned int Space, bool IsDot)
Definition JsonSupport.h:21
@ Result
The result type of a method or function.
Definition TypeBase.h:905
CustomizableOptional< DirectoryEntryRef > OptionalDirectoryEntryRef
@ Other
Other implicit parameter.
Definition Decl.h:1763
int const char * function
Definition c++config.h:31
#define false
Definition stdbool.h:26
#define true
Definition stdbool.h:25
Stored information about a header directive that was found in the module map file but has not been re...
Definition Module.h:525