clang 23.0.0git
ModuleMap.cpp
Go to the documentation of this file.
1//===- ModuleMap.cpp - Describe the layout of modules ---------------------===//
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 ModuleMap implementation, which describes the layout
10// of a module as it relates to headers.
11//
12//===----------------------------------------------------------------------===//
13
14#include "clang/Lex/ModuleMap.h"
18#include "clang/Basic/LLVM.h"
20#include "clang/Basic/Module.h"
28#include "llvm/ADT/DenseMap.h"
29#include "llvm/ADT/STLExtras.h"
30#include "llvm/ADT/SmallPtrSet.h"
31#include "llvm/ADT/SmallVector.h"
32#include "llvm/ADT/StringMap.h"
33#include "llvm/ADT/StringRef.h"
34#include "llvm/ADT/StringSwitch.h"
35#include "llvm/Support/Compiler.h"
36#include "llvm/Support/ErrorHandling.h"
37#include "llvm/Support/Path.h"
38#include "llvm/Support/VirtualFileSystem.h"
39#include "llvm/Support/raw_ostream.h"
40#include <cassert>
41#include <cstring>
42#include <optional>
43#include <string>
44#include <system_error>
45#include <utility>
46
47using namespace clang;
48
49static constexpr llvm::StringRef kPrivateModuleSuffix = "_Private";
50
51void ModuleMapCallbacks::anchor() {}
52
54 auto PendingLinkAs = PendingLinkAsModule.find(Mod->Name);
55 if (PendingLinkAs != PendingLinkAsModule.end()) {
56 for (auto &Name : PendingLinkAs->second) {
57 auto *M = findModule(Name.getKey());
58 if (M)
59 M->UseExportAsModuleLinkName = true;
60 }
61 }
62}
63
65 if (findModule(Mod->ExportAsModule))
66 Mod->UseExportAsModuleLinkName = true;
67 else
68 PendingLinkAsModule[Mod->ExportAsModule].insert(Mod->Name);
69}
70
72 switch ((int)Role) {
73 case NormalHeader:
74 return Module::HK_Normal;
75 case PrivateHeader:
76 return Module::HK_Private;
77 case TextualHeader:
78 return Module::HK_Textual;
81 case ExcludedHeader:
83 }
84 llvm_unreachable("unknown header role");
85}
86
89 switch ((int)Kind) {
91 return NormalHeader;
93 return PrivateHeader;
95 return TextualHeader;
99 return ExcludedHeader;
100 }
101 llvm_unreachable("unknown header kind");
102}
103
107
109ModuleMap::resolveExport(Module *Mod,
111 bool Complain) const {
112 // We may have just a wildcard.
113 if (Unresolved.Id.empty()) {
114 assert(Unresolved.Wildcard && "Invalid unresolved export");
115 return Module::ExportDecl(nullptr, true);
116 }
117
118 // Resolve the module-id.
119 Module *Context = resolveModuleId(Unresolved.Id, Mod, Complain);
120 if (!Context)
121 return {};
122
123 return Module::ExportDecl(Context, Unresolved.Wildcard);
124}
125
126Module *ModuleMap::resolveModuleId(const ModuleId &Id, Module *Mod,
127 bool Complain) const {
128 // Find the starting module.
129 Module *Context = lookupModuleUnqualified(Id[0].first, Mod);
130 if (!Context) {
131 if (Complain)
132 Diags.Report(Id[0].second, diag::err_mmap_missing_module_unqualified)
133 << Id[0].first << Mod->getFullModuleName();
134
135 return nullptr;
136 }
137
138 // Dig into the module path.
139 for (unsigned I = 1, N = Id.size(); I != N; ++I) {
140 Module *Sub = lookupModuleQualified(Id[I].first, Context);
141 if (!Sub) {
142 if (Complain)
143 Diags.Report(Id[I].second, diag::err_mmap_missing_module_qualified)
144 << Id[I].first << Context->getFullModuleName()
145 << SourceRange(Id[0].second, Id[I-1].second);
146
147 return nullptr;
148 }
149
150 Context = Sub;
151 }
152
153 return Context;
154}
155
156/// Append to \p Paths the set of paths needed to get to the
157/// subframework in which the given module lives.
159 SmallVectorImpl<char> &Path) {
160 // Collect the framework names from the given module to the top-level module.
162 for (; Mod; Mod = Mod->Parent) {
163 if (Mod->IsFramework)
164 Paths.push_back(Mod->Name);
165 }
166
167 if (Paths.empty())
168 return;
169
170 // Add Frameworks/Name.framework for each subframework.
171 for (StringRef Framework : llvm::drop_begin(llvm::reverse(Paths)))
172 llvm::sys::path::append(Path, "Frameworks", Framework + ".framework");
173}
174
175OptionalFileEntryRef ModuleMap::findHeader(
177 SmallVectorImpl<char> &RelativePathName, bool &NeedsFramework) {
178 // Search for the header file within the module's home directory.
179 auto Directory = M->Directory;
180 SmallString<128> FullPathName(Directory->getName());
181
182 auto GetFile = [&](StringRef Filename) -> OptionalFileEntryRef {
183 auto File =
184 expectedToOptional(SourceMgr.getFileManager().getFileRef(Filename));
185 if (!File || (Header.Size && File->getSize() != *Header.Size) ||
186 (Header.ModTime && File->getModificationTime() != *Header.ModTime))
187 return std::nullopt;
188 return *File;
189 };
190
191 auto GetFrameworkFile = [&]() -> OptionalFileEntryRef {
192 unsigned FullPathLength = FullPathName.size();
193 appendSubframeworkPaths(M, RelativePathName);
194 unsigned RelativePathLength = RelativePathName.size();
195
196 // Check whether this file is in the public headers.
197 llvm::sys::path::append(RelativePathName, "Headers", Header.FileName);
198 llvm::sys::path::append(FullPathName, RelativePathName);
199 if (auto File = GetFile(FullPathName))
200 return File;
201
202 // Check whether this file is in the private headers.
203 // Ideally, private modules in the form 'FrameworkName.Private' should
204 // be defined as 'module FrameworkName.Private', and not as
205 // 'framework module FrameworkName.Private', since a 'Private.Framework'
206 // does not usually exist. However, since both are currently widely used
207 // for private modules, make sure we find the right path in both cases.
208 if (M->IsFramework && M->Name == "Private")
209 RelativePathName.clear();
210 else
211 RelativePathName.resize(RelativePathLength);
212 FullPathName.resize(FullPathLength);
213 llvm::sys::path::append(RelativePathName, "PrivateHeaders",
214 Header.FileName);
215 llvm::sys::path::append(FullPathName, RelativePathName);
216 return GetFile(FullPathName);
217 };
218
219 if (llvm::sys::path::is_absolute(Header.FileName)) {
220 RelativePathName.clear();
221 RelativePathName.append(Header.FileName.begin(), Header.FileName.end());
222 return GetFile(Header.FileName);
223 }
224
225 if (M->isPartOfFramework())
226 return GetFrameworkFile();
227
228 // Lookup for normal headers.
229 llvm::sys::path::append(RelativePathName, Header.FileName);
230 llvm::sys::path::append(FullPathName, RelativePathName);
231 auto NormalHdrFile = GetFile(FullPathName);
232
233 if (!NormalHdrFile && Directory->getName().ends_with(".framework")) {
234 // The lack of 'framework' keyword in a module declaration it's a simple
235 // mistake we can diagnose when the header exists within the proper
236 // framework style path.
237 FullPathName.assign(Directory->getName());
238 RelativePathName.clear();
239 if (GetFrameworkFile()) {
240 Diags.Report(Header.FileNameLoc,
241 diag::warn_mmap_incomplete_framework_module_declaration)
242 << Header.FileName << M->getFullModuleName();
243 NeedsFramework = true;
244 }
245 return std::nullopt;
246 }
247
248 return NormalHdrFile;
249}
250
251/// Determine whether the given file name is the name of a builtin
252/// header, supplied by Clang to replace, override, or augment existing system
253/// headers.
254static bool isBuiltinHeaderName(StringRef FileName) {
255 return llvm::StringSwitch<bool>(FileName)
256 .Case("float.h", true)
257 .Case("iso646.h", true)
258 .Case("limits.h", true)
259 .Case("stdalign.h", true)
260 .Case("stdarg.h", true)
261 .Case("stdatomic.h", true)
262 .Case("stdbool.h", true)
263 .Case("stdckdint.h", true)
264 .Case("stdcountof.h", true)
265 .Case("stddef.h", true)
266 .Case("stdint.h", true)
267 .Case("tgmath.h", true)
268 .Case("unwind.h", true)
269 .Default(false);
270}
271
272/// Determine whether the given module name is the name of a builtin
273/// module that is cyclic with a system module on some platforms.
274static bool isBuiltInModuleName(StringRef ModuleName) {
275 return llvm::StringSwitch<bool>(ModuleName)
276 .Case("_Builtin_float", true)
277 .Case("_Builtin_inttypes", true)
278 .Case("_Builtin_iso646", true)
279 .Case("_Builtin_limits", true)
280 .Case("_Builtin_stdalign", true)
281 .Case("_Builtin_stdarg", true)
282 .Case("_Builtin_stdatomic", true)
283 .Case("_Builtin_stdbool", true)
284 .Case("_Builtin_stddef", true)
285 .Case("_Builtin_stdint", true)
286 .Case("_Builtin_stdnoreturn", true)
287 .Case("_Builtin_tgmath", true)
288 .Case("_Builtin_unwind", true)
289 .Default(false);
290}
291
292void ModuleMap::resolveHeader(Module *Mod,
294 bool &NeedsFramework) {
295 SmallString<128> RelativePathName;
297 findHeader(Mod, Header, RelativePathName, NeedsFramework)) {
298 if (Header.IsUmbrella) {
299 const DirectoryEntry *UmbrellaDir = &File->getDir().getDirEntry();
300 if (Module *UmbrellaMod = UmbrellaDirs[UmbrellaDir])
301 Diags.Report(Header.FileNameLoc, diag::err_mmap_umbrella_clash)
302 << UmbrellaMod->getFullModuleName();
303 else
304 // Record this umbrella header.
306 RelativePathName.str(), Header.FileNameLoc);
307 } else {
308 Module::Header H = {Header.FileName, std::string(RelativePathName),
309 *File};
310 addHeader(Mod, H, headerKindToRole(Header.Kind), /*Imported=*/false,
311 Header.FileNameLoc);
312 }
313 } else if (Header.HasBuiltinHeader && !Header.Size && !Header.ModTime) {
314 // There's a builtin header but no corresponding on-disk header. Assume
315 // this was supposed to modularize the builtin header alone.
316 } else if (Header.Kind == Module::HK_Excluded) {
317 // Ignore missing excluded header files. They're optional anyway.
318 } else {
319 // If we find a module that has a missing header, we mark this module as
320 // unavailable and store the header directive for displaying diagnostics.
321 Mod->MissingHeaders.push_back(Header);
322 // A missing header with stat information doesn't make the module
323 // unavailable; this keeps our behavior consistent as headers are lazily
324 // resolved. (Such a module still can't be built though, except from
325 // preprocessed source.)
326 if (!Header.Size && !Header.ModTime)
327 Mod->markUnavailable(/*Unimportable=*/false);
328 }
329}
330
331bool ModuleMap::resolveAsBuiltinHeader(
332 Module *Mod, const Module::UnresolvedHeaderDirective &Header) {
333 if (Header.Kind == Module::HK_Excluded ||
334 llvm::sys::path::is_absolute(Header.FileName) ||
335 Mod->isPartOfFramework() || !Mod->IsSystem || Header.IsUmbrella ||
336 !BuiltinIncludeDir || BuiltinIncludeDir == Mod->Directory ||
337 !LangOpts.BuiltinHeadersInSystemModules || !isBuiltinHeaderName(Header.FileName))
338 return false;
339
340 // This is a system module with a top-level header. This header
341 // may have a counterpart (or replacement) in the set of headers
342 // supplied by Clang. Find that builtin header.
343 SmallString<128> Path;
344 llvm::sys::path::append(Path, BuiltinIncludeDir->getName(), Header.FileName);
345 auto File = SourceMgr.getFileManager().getOptionalFileRef(Path);
346 if (!File)
347 return false;
348
349 Module::Header H = {Header.FileName, Header.FileName, *File};
350 auto Role = headerKindToRole(Header.Kind);
351 addHeader(Mod, H, Role);
352 return true;
353}
354
356 const LangOptions &LangOpts, const TargetInfo *Target,
357 HeaderSearch &HeaderInfo)
358 : SourceMgr(SourceMgr), Diags(Diags), LangOpts(LangOpts), Target(Target),
359 HeaderInfo(HeaderInfo) {
360}
361
362ModuleMap::~ModuleMap() = default;
363
364void ModuleMap::setTarget(const TargetInfo &Target) {
365 assert((!this->Target || this->Target == &Target) &&
366 "Improper target override");
367 this->Target = &Target;
368}
369
370/// "Sanitize" a filename so that it can be used as an identifier.
371static StringRef sanitizeFilenameAsIdentifier(StringRef Name,
372 SmallVectorImpl<char> &Buffer) {
373 if (Name.empty())
374 return Name;
375
376 if (!isValidAsciiIdentifier(Name)) {
377 // If we don't already have something with the form of an identifier,
378 // create a buffer with the sanitized name.
379 Buffer.clear();
380 if (isDigit(Name[0]))
381 Buffer.push_back('_');
382 Buffer.reserve(Buffer.size() + Name.size());
383 for (unsigned I = 0, N = Name.size(); I != N; ++I) {
384 if (isAsciiIdentifierContinue(Name[I]))
385 Buffer.push_back(Name[I]);
386 else
387 Buffer.push_back('_');
388 }
389
390 Name = StringRef(Buffer.data(), Buffer.size());
391 }
392
393 while (llvm::StringSwitch<bool>(Name)
394#define KEYWORD(Keyword,Conditions) .Case(#Keyword, true)
395#define ALIAS(Keyword, AliasOf, Conditions) .Case(Keyword, true)
396#include "clang/Basic/TokenKinds.def"
397 .Default(false)) {
398 if (Name.data() != Buffer.data())
399 Buffer.append(Name.begin(), Name.end());
400 Buffer.push_back('_');
401 Name = StringRef(Buffer.data(), Buffer.size());
402 }
403
404 return Name;
405}
406
408 return File.getDir() == BuiltinIncludeDir && LangOpts.BuiltinHeadersInSystemModules &&
409 isBuiltinHeaderName(llvm::sys::path::filename(File.getName()));
410}
411
413 Module *Module) const {
414 return LangOpts.BuiltinHeadersInSystemModules && BuiltinIncludeDir &&
417}
418
419ModuleMap::HeadersMap::iterator ModuleMap::findKnownHeader(FileEntryRef File) {
421 HeadersMap::iterator Known = Headers.find(File);
422 if (HeaderInfo.getHeaderSearchOpts().ImplicitModuleMaps &&
423 Known == Headers.end() && ModuleMap::isBuiltinHeader(File)) {
424 HeaderInfo.loadTopLevelSystemModules();
425 return Headers.find(File);
426 }
427 return Known;
428}
429
430ModuleMap::KnownHeader ModuleMap::findHeaderInUmbrellaDirs(
432 if (UmbrellaDirs.empty())
433 return {};
434
435 OptionalDirectoryEntryRef Dir = File.getDir();
436
437 // Note: as an egregious but useful hack we use the real path here, because
438 // frameworks moving from top-level frameworks to embedded frameworks tend
439 // to be symlinked from the top-level location to the embedded location,
440 // and we need to resolve lookups as if we had found the embedded location.
441 StringRef DirName = SourceMgr.getFileManager().getCanonicalName(*Dir);
442
443 // Keep walking up the directory hierarchy, looking for a directory with
444 // an umbrella header.
445 do {
446 auto KnownDir = UmbrellaDirs.find(*Dir);
447 if (KnownDir != UmbrellaDirs.end())
448 return KnownHeader(KnownDir->second, NormalHeader);
449
450 IntermediateDirs.push_back(*Dir);
451
452 // Retrieve our parent path.
453 DirName = llvm::sys::path::parent_path(DirName);
454 if (DirName.empty())
455 break;
456
457 // Resolve the parent path to a directory entry.
458 Dir = SourceMgr.getFileManager().getOptionalDirectoryRef(DirName);
459 } while (Dir);
460 return {};
461}
462
463static bool violatesPrivateInclude(Module *RequestingModule,
464 const FileEntry *IncFileEnt,
465 ModuleMap::KnownHeader Header) {
466#ifndef NDEBUG
467 if (Header.getRole() & ModuleMap::PrivateHeader) {
468 // Check for consistency between the module header role
469 // as obtained from the lookup and as obtained from the module.
470 // This check is not cheap, so enable it only for debugging.
471 bool IsPrivate = false;
472 ArrayRef<Module::Header> HeaderList[] = {
475 for (auto Hs : HeaderList)
476 IsPrivate |= llvm::any_of(
477 Hs, [&](const Module::Header &H) { return H.Entry == IncFileEnt; });
478 assert(IsPrivate && "inconsistent headers and roles");
479 }
480#endif
481 return !Header.isAccessibleFrom(RequestingModule);
482}
483
485 return M ? M->getTopLevelModule() : nullptr;
486}
487
489 bool RequestingModuleIsModuleInterface,
490 SourceLocation FilenameLoc,
491 StringRef Filename, FileEntryRef File) {
492 if (RequestingModule) {
493 resolveUses(RequestingModule, /*Complain=*/false);
494 resolveHeaderDirectives(RequestingModule, /*File=*/std::nullopt);
495 }
496
497 HeadersMap::iterator Known = findKnownHeader(File);
498
499 diagnoseDuplicateHeaderOwnership(FilenameLoc, Filename, File, Known);
500
501 // No errors for indirect modules. This may be a bit of a problem for modules
502 // with no source files.
503 Module *TopLevelRequestingModule = getTopLevelOrNull(RequestingModule);
504 Module *TopLevelSourceModule = getTopLevelOrNull(SourceModule);
505 bool IsPublicForMainPrivateModule = false;
506 if (TopLevelRequestingModule != TopLevelSourceModule) {
507 // Suppose we have a pair of files foo.cpp / foo.h.
508 // Our build system may want to verify that foo.cpp only uses things
509 // declared in the implementation_deps of foo, while foo.h only uses things
510 // declared in interface_deps. This requires them to be two seperate
511 // modules, foo_Private and foo. This check is required to ensure that foo.h
512 // is still checked. Otherwise, foo.h would never be checked, since it will
513 // never be the top-level module.
514 if (TopLevelRequestingModule && TopLevelSourceModule &&
515 llvm::StringRef(TopLevelSourceModule->Name)
516 .ends_with(kPrivateModuleSuffix) &&
517 llvm::StringRef(TopLevelSourceModule->Name)
518 .drop_back(kPrivateModuleSuffix.size()) ==
519 TopLevelRequestingModule->Name) {
520 IsPublicForMainPrivateModule = true;
521 } else {
522 return;
523 }
524 }
525
526 bool Excluded = false;
527 bool UsedByPrivateModule = false;
528 Module *Private = nullptr;
529 Module *NotUsed = nullptr;
530
531 if (Known != Headers.end()) {
532 for (const KnownHeader &Header : Known->second) {
533 // Excluded headers don't really belong to a module.
534 if (Header.getRole() == ModuleMap::ExcludedHeader) {
535 Excluded = true;
536 continue;
537 }
538
539 // Remember private headers for later printing of a diagnostic.
540 if (violatesPrivateInclude(RequestingModule, File, Header)) {
541 Private = Header.getModule();
542 continue;
543 }
544
545 // If uses need to be specified explicitly, we are only allowed to return
546 // modules that are explicitly used by the requesting module.
547 if (RequestingModule && LangOpts.ModulesDeclUse &&
548 !RequestingModule->directlyUses(Header.getModule())) {
549 NotUsed = Header.getModule();
550 if (IsPublicForMainPrivateModule) {
551 UsedByPrivateModule = SourceModule->directlyUses(Header.getModule());
552 }
553 continue;
554 }
555
556 // We have found a module that we can happily use.
557 return;
558 }
559
560 Excluded = true;
561 }
562
563 // We have found a header, but it is private.
564 if (Private) {
565 Diags.Report(FilenameLoc, diag::warn_use_of_private_header_outside_module)
566 << Filename;
567 return;
568 }
569
570 // We have found a module, but we don't use it.
571 if (NotUsed) {
572 if (UsedByPrivateModule) {
573 Diags.Report(FilenameLoc, diag::err_undeclared_use_of_module_private)
574 << RequestingModule->getTopLevelModule()->Name << Filename
575 << NotUsed->Name;
576 } else {
577 Diags.Report(FilenameLoc, diag::err_undeclared_use_of_module_indirect)
578 << RequestingModule->getTopLevelModule()->Name << Filename
579 << NotUsed->Name;
580 }
581 return;
582 }
583
584 if (Excluded || isHeaderInUmbrellaDirs(File))
585 return;
586
587 // At this point, only non-modular includes remain.
588
589 if (RequestingModule && LangOpts.ModulesStrictDeclUse) {
590 Diags.Report(FilenameLoc, diag::err_undeclared_use_of_module)
591 << RequestingModule->getTopLevelModule()->Name << Filename;
592 } else if (RequestingModule && RequestingModuleIsModuleInterface &&
593 LangOpts.isCompilingModule()) {
594 // Do not diagnose when we are not compiling a module.
595 diag::kind DiagID = RequestingModule->getTopLevelModule()->IsFramework ?
596 diag::warn_non_modular_include_in_framework_module :
597 diag::warn_non_modular_include_in_module;
598 Diags.Report(FilenameLoc, DiagID) << RequestingModule->getFullModuleName()
599 << File.getName();
600 }
601}
602
603void ModuleMap::diagnoseDuplicateHeaderOwnership(SourceLocation FilenameLoc,
604 StringRef Filename,
606 HeadersMap::iterator Known) {
607 if (Known == Headers.end())
608 return;
609
610 if (Diags.isIgnored(diag::warn_mmap_duplicate_header_ownership, FilenameLoc))
611 return;
612
613 // Only diagnose each header once.
614 if (!DiagnosedDuplicateHeaders.insert(&File.getFileEntry()).second)
615 return;
616
617 struct OwnerInfo {
618 Module *Mod;
619 SourceLocation Loc;
620 bool IsUmbrella;
621 };
622
623 // Collect distinct top-level modules that explicitly own this header with
624 // a modular (non-textual, non-excluded) role.
625 SmallVector<OwnerInfo, 2> OwningModules;
627 for (const KnownHeader &H : Known->second) {
628 if (!isModular(H.getRole()))
629 continue;
630 Module *TopLevel = H.getModule()->getTopLevelModule();
631 if (!SeenTopLevel.insert(TopLevel).second)
632 continue;
633 auto It = HeaderOwnerLocs.find({&File.getFileEntry(), H.getModule()});
634 SourceLocation OwnerLoc =
635 It != HeaderOwnerLocs.end() ? It->second : SourceLocation();
636 OwningModules.push_back({TopLevel, OwnerLoc, /*IsUmbrella=*/false});
637 }
638
639 // Need at least one explicit owner for there to be a conflict, since
640 // umbrella coverage can only add one more.
641 if (OwningModules.empty())
642 return;
643
644 // Also check umbrella directory coverage for additional owners from different
645 // top-level modules — but only if the header isn't excluded from the umbrella
646 // module. Explicit headers take precedence over umbrella dirs in module
647 // resolution, but a header owned by one module that another module's umbrella
648 // covers can still create problems.
649 SmallVector<DirectoryEntryRef, 2> IntermediateDirs;
650 if (KnownHeader UmbrellaOwner =
651 findHeaderInUmbrellaDirs(File, IntermediateDirs)) {
652 Module *TopLevel = UmbrellaOwner.getModule()->getTopLevelModule();
653 // Only add if it's a different top-level module and the header isn't
654 // excluded from the umbrella module.
655 if (SeenTopLevel.insert(TopLevel).second) {
656 // Check that the header isn't excluded in the umbrella module.
657 bool IsExcluded =
658 llvm::any_of(Known->second, [TopLevel](const KnownHeader &H) {
659 return H.getModule()->getTopLevelModule() == TopLevel &&
660 H.getRole() == ExcludedHeader;
661 });
662 if (!IsExcluded) {
663 OwningModules.push_back({TopLevel,
664 UmbrellaOwner.getModule()->UmbrellaDeclLoc,
665 /*IsUmbrella=*/true});
666 }
667 }
668 }
669
670 if (OwningModules.size() < 2)
671 return;
672
673 Diags.Report(FilenameLoc, diag::warn_mmap_duplicate_header_ownership)
674 << Filename;
675 for (const auto &Owner : OwningModules) {
676 unsigned NoteID = Owner.IsUmbrella
677 ? diag::note_mmap_header_covered_by_umbrella
678 : diag::note_mmap_header_owned_by;
679 Diags.Report(Owner.Loc, NoteID) << Owner.Mod->getFullModuleName();
680 }
681}
682
684 const ModuleMap::KnownHeader &Old) {
685 // Prefer available modules.
686 // FIXME: Considering whether the module is available rather than merely
687 // importable is non-hermetic and can result in surprising behavior for
688 // prebuilt modules. Consider only checking for importability here.
689 if (New.getModule()->isAvailable() && !Old.getModule()->isAvailable())
690 return true;
691
692 // Prefer a public header over a private header.
693 if ((New.getRole() & ModuleMap::PrivateHeader) !=
695 return !(New.getRole() & ModuleMap::PrivateHeader);
696
697 // Prefer a non-textual header over a textual header.
698 if ((New.getRole() & ModuleMap::TextualHeader) !=
700 return !(New.getRole() & ModuleMap::TextualHeader);
701
702 // Prefer a non-excluded header over an excluded header.
703 if ((New.getRole() == ModuleMap::ExcludedHeader) !=
705 return New.getRole() != ModuleMap::ExcludedHeader;
706
707 // Don't have a reason to choose between these. Just keep the first one.
708 return false;
709}
710
712 bool AllowTextual,
713 bool AllowExcluded) {
714 auto MakeResult = [&](ModuleMap::KnownHeader R) -> ModuleMap::KnownHeader {
715 if (!AllowTextual && R.getRole() & ModuleMap::TextualHeader)
716 return {};
717 return R;
718 };
719
720 HeadersMap::iterator Known = findKnownHeader(File);
721 if (Known != Headers.end()) {
723 // Iterate over all modules that 'File' is part of to find the best fit.
724 for (KnownHeader &H : Known->second) {
725 // Cannot use a module if the header is excluded in it.
726 if (!AllowExcluded && H.getRole() == ModuleMap::ExcludedHeader)
727 continue;
728 // Prefer a header from the source module over all others.
729 if (H.getModule()->getTopLevelModule() == SourceModule)
730 return MakeResult(H);
732 Result = H;
733 }
734 return MakeResult(Result);
735 }
736
737 return MakeResult(findOrCreateModuleForHeaderInUmbrellaDir(File));
738}
739
741 Module *M, std::string NameAsWritten,
742 SmallVectorImpl<char> &RelativePathName) {
744 Header.FileName = std::move(NameAsWritten);
745 Header.IsUmbrella = true;
746 bool NeedsFramework;
747 return findHeader(M, Header, RelativePathName, NeedsFramework);
748}
749
751ModuleMap::findOrCreateModuleForHeaderInUmbrellaDir(FileEntryRef File) {
752 assert(!Headers.count(File) && "already have a module for this header");
753
755 KnownHeader H = findHeaderInUmbrellaDirs(File, SkippedDirs);
756 if (H) {
757 Module *Result = H.getModule();
758
759 // Search up the module stack until we find a module with an umbrella
760 // directory.
761 Module *UmbrellaModule = Result;
762 while (!UmbrellaModule->getEffectiveUmbrellaDir() && UmbrellaModule->Parent)
763 UmbrellaModule = UmbrellaModule->Parent;
764
765 if (UmbrellaModule->InferSubmodules) {
766 FileID UmbrellaModuleMap = getModuleMapFileIDForUniquing(UmbrellaModule);
767
768 // Infer submodules for each of the directories we found between
769 // the directory of the umbrella header and the directory where
770 // the actual header is located.
771 bool Explicit = UmbrellaModule->InferExplicitSubmodules;
772
773 for (DirectoryEntryRef SkippedDir : llvm::reverse(SkippedDirs)) {
774 // Find or create the module that corresponds to this directory name.
775 SmallString<32> NameBuf;
776 StringRef Name = sanitizeFilenameAsIdentifier(
777 llvm::sys::path::stem(SkippedDir.getName()), NameBuf);
778 Result = findOrCreateModuleFirst(Name, Result, /*IsFramework=*/false,
779 Explicit);
780 setInferredModuleAllowedBy(Result, UmbrellaModuleMap);
781
782 // Associate the module and the directory.
783 UmbrellaDirs[SkippedDir] = Result;
784
785 // If inferred submodules export everything they import, add a
786 // wildcard to the set of exports.
787 if (UmbrellaModule->InferExportWildcard && Result->Exports.empty())
788 Result->Exports.push_back(Module::ExportDecl(nullptr, true));
789 }
790
791 // Infer a submodule with the same name as this header file.
792 SmallString<32> NameBuf;
793 StringRef Name = sanitizeFilenameAsIdentifier(
794 llvm::sys::path::stem(File.getName()), NameBuf);
795 Result = findOrCreateModuleFirst(Name, Result, /*IsFramework=*/false,
796 Explicit);
797 setInferredModuleAllowedBy(Result, UmbrellaModuleMap);
798 Result->addTopHeader(File);
799
800 // If inferred submodules export everything they import, add a
801 // wildcard to the set of exports.
802 if (UmbrellaModule->InferExportWildcard && Result->Exports.empty())
803 Result->Exports.push_back(Module::ExportDecl(nullptr, true));
804 } else {
805 // Record each of the directories we stepped through as being part of
806 // the module we found, since the umbrella header covers them all.
807 for (unsigned I = 0, N = SkippedDirs.size(); I != N; ++I)
808 UmbrellaDirs[SkippedDirs[I]] = Result;
809 }
810
812 Headers[File].push_back(Header);
813 return Header;
814 }
815
816 return {};
817}
818
821 HeadersMap::iterator Known = findKnownHeader(File);
822 if (Known != Headers.end())
823 return Known->second;
824
825 if (findOrCreateModuleForHeaderInUmbrellaDir(File))
826 return Headers.find(File)->second;
827
828 return {};
829}
830
833 // FIXME: Is this necessary?
835 auto It = Headers.find(File);
836 if (It == Headers.end())
837 return {};
838 return It->second;
839}
840
842 return isHeaderUnavailableInModule(Header, nullptr);
843}
844
846 FileEntryRef Header, const Module *RequestingModule) const {
848 HeadersMap::const_iterator Known = Headers.find(Header);
849 if (Known != Headers.end()) {
851 I = Known->second.begin(),
852 E = Known->second.end();
853 I != E; ++I) {
854
855 if (I->getRole() == ModuleMap::ExcludedHeader)
856 continue;
857
858 if (I->isAvailable() &&
859 (!RequestingModule ||
860 I->getModule()->isSubModuleOf(RequestingModule))) {
861 // When no requesting module is available, the caller is looking if a
862 // header is part a module by only looking into the module map. This is
863 // done by warn_uncovered_module_header checks; don't consider textual
864 // headers part of it in this mode, otherwise we get misleading warnings
865 // that a umbrella header is not including a textual header.
866 if (!RequestingModule && I->getRole() == ModuleMap::TextualHeader)
867 continue;
868 return false;
869 }
870 }
871 return true;
872 }
873
874 OptionalDirectoryEntryRef Dir = Header.getDir();
876 StringRef DirName = Dir->getName();
877
878 auto IsUnavailable = [&](const Module *M) {
879 return !M->isAvailable() && (!RequestingModule ||
880 M->isSubModuleOf(RequestingModule));
881 };
882
883 // Keep walking up the directory hierarchy, looking for a directory with
884 // an umbrella header.
885 do {
886 auto KnownDir = UmbrellaDirs.find(*Dir);
887 if (KnownDir != UmbrellaDirs.end()) {
888 Module *Found = KnownDir->second;
889 if (IsUnavailable(Found))
890 return true;
891
892 // Search up the module stack until we find a module with an umbrella
893 // directory.
894 Module *UmbrellaModule = Found;
895 while (!UmbrellaModule->getEffectiveUmbrellaDir() &&
896 UmbrellaModule->Parent)
897 UmbrellaModule = UmbrellaModule->Parent;
898
899 if (UmbrellaModule->InferSubmodules) {
900 for (DirectoryEntryRef SkippedDir : llvm::reverse(SkippedDirs)) {
901 // Find or create the module that corresponds to this directory name.
902 SmallString<32> NameBuf;
903 StringRef Name = sanitizeFilenameAsIdentifier(
904 llvm::sys::path::stem(SkippedDir.getName()), NameBuf);
906 if (!Found)
907 return false;
908 if (IsUnavailable(Found))
909 return true;
910 }
911
912 // Infer a submodule with the same name as this header file.
913 SmallString<32> NameBuf;
914 StringRef Name = sanitizeFilenameAsIdentifier(
915 llvm::sys::path::stem(Header.getName()),
916 NameBuf);
918 if (!Found)
919 return false;
920 }
921
922 return IsUnavailable(Found);
923 }
924
925 SkippedDirs.push_back(*Dir);
926
927 // Retrieve our parent path.
928 DirName = llvm::sys::path::parent_path(DirName);
929 if (DirName.empty())
930 break;
931
932 // Resolve the parent path to a directory entry.
933 Dir = SourceMgr.getFileManager().getOptionalDirectoryRef(DirName);
934 } while (Dir);
935
936 return false;
937}
938
939Module *ModuleMap::findModule(StringRef Name) const {
940 llvm::StringMap<Module *>::const_iterator Known = Modules.find(Name);
941 if (Known != Modules.end())
942 return Known->getValue();
943
944 return nullptr;
945}
946
948 if (Module *SubM = Parent->findSubmodule(Name))
949 return SubM;
950 if (!Parent->InferSubmodules)
951 return nullptr;
952 Module *Result = new (ModulesAlloc.Allocate())
953 Module(ModuleConstructorTag{}, Name, SourceLocation(), Parent, false,
954 Parent->InferExplicitSubmodules, 0);
955 Result->InferExplicitSubmodules = Parent->InferExplicitSubmodules;
956 Result->InferSubmodules = Parent->InferSubmodules;
957 Result->InferExportWildcard = Parent->InferExportWildcard;
958 if (Result->InferExportWildcard)
959 Result->Exports.push_back(Module::ExportDecl(nullptr, true));
960 return Result;
961}
962
964 Module *Context) const {
965 for(; Context; Context = Context->Parent) {
966 if (Module *Sub = lookupModuleQualified(Name, Context))
967 return Sub;
968 }
969
970 return findModule(Name);
971}
972
974 Module *Context) const {
975 if (!Context)
976 return findModule(Name);
977
978 return Context->findSubmodule(Name);
979}
980
981std::pair<Module *, bool> ModuleMap::findOrCreateModule(StringRef Name,
982 Module *Parent,
983 bool IsFramework,
984 bool IsExplicit) {
985 // Try to find an existing module with this name.
986 if (ModuleRef Sub = lookupModuleQualified(Name, Parent); Sub.getExisting())
987 return std::make_pair(Sub.getExisting(), false);
988
989 // Create a new module with this name.
990 Module *M = createModule(Name, Parent, IsFramework, IsExplicit);
991 return std::make_pair(M, true);
992}
993
994Module *ModuleMap::createModule(StringRef Name, Module *Parent,
995 bool IsFramework, bool IsExplicit) {
996 assert(!lookupModuleQualified(Name, Parent).getExisting() &&
997 "Creating duplicate submodule");
998
999 Module *Result = new (ModulesAlloc.Allocate())
1000 Module(ModuleConstructorTag{}, Name, SourceLocation(), Parent,
1001 IsFramework, IsExplicit, NumCreatedModules++);
1002 if (!Parent) {
1003 if (LangOpts.CurrentModule == Name)
1004 SourceModule = Result;
1005 Modules[Name] = Result;
1006 ModuleScopeIDs[Result] = CurrentModuleScopeID;
1007 }
1008 return Result;
1009}
1010
1012 Module *Parent) {
1013 auto *Result = new (ModulesAlloc.Allocate()) Module(
1014 ModuleConstructorTag{}, "<global>", Loc, Parent, /*IsFramework=*/false,
1015 /*IsExplicit=*/true, NumCreatedModules++);
1017 // If the created module isn't owned by a parent, send it to PendingSubmodules
1018 // to wait for its parent.
1019 if (!Result->Parent)
1020 PendingSubmodules.emplace_back(Result);
1021 return Result;
1022}
1023
1024Module *
1026 Module *Parent) {
1027 assert(Parent && "We should only create an implicit global module fragment "
1028 "in a module purview");
1029 // Note: Here the `IsExplicit` parameter refers to the semantics in clang
1030 // modules. All the non-explicit submodules in clang modules will be exported
1031 // too. Here we simplify the implementation by using the concept.
1032 auto *Result = new (ModulesAlloc.Allocate())
1033 Module(ModuleConstructorTag{}, "<implicit global>", Loc, Parent,
1034 /*IsFramework=*/false, /*IsExplicit=*/false, NumCreatedModules++);
1036 return Result;
1037}
1038
1039Module *
1041 SourceLocation Loc) {
1042 auto *Result = new (ModulesAlloc.Allocate()) Module(
1043 ModuleConstructorTag{}, "<private>", Loc, Parent, /*IsFramework=*/false,
1044 /*IsExplicit=*/true, NumCreatedModules++);
1046 return Result;
1047}
1048
1050 Module::ModuleKind Kind) {
1051 auto *Result = new (ModulesAlloc.Allocate())
1052 Module(ModuleConstructorTag{}, Name, Loc, nullptr, /*IsFramework=*/false,
1053 /*IsExplicit=*/false, NumCreatedModules++);
1054 Result->Kind = Kind;
1055
1056 // Reparent any current global module fragment as a submodule of this module.
1057 for (auto &Submodule : PendingSubmodules)
1058 Submodule->setParent(Result);
1059 PendingSubmodules.clear();
1060 return Result;
1061}
1062
1064 StringRef Name) {
1065 assert(LangOpts.CurrentModule == Name && "module name mismatch");
1066 assert(!Modules[Name] && "redefining existing module");
1067
1068 auto *Result =
1070 Modules[Name] = SourceModule = Result;
1071
1072 // Mark the main source file as being within the newly-created module so that
1073 // declarations and macros are properly visibility-restricted to it.
1074 auto MainFile = SourceMgr.getFileEntryRefForID(SourceMgr.getMainFileID());
1075 assert(MainFile && "no input file for module interface");
1076 Headers[*MainFile].push_back(KnownHeader(Result, PrivateHeader));
1077
1078 return Result;
1079}
1080
1082 StringRef Name) {
1083 assert(LangOpts.CurrentModule == Name && "module name mismatch");
1084 // The interface for this implementation must exist and be loaded.
1085 assert(Modules[Name] && Modules[Name]->Kind == Module::ModuleInterfaceUnit &&
1086 "creating implementation module without an interface");
1087
1088 // Create an entry in the modules map to own the implementation unit module.
1089 // User module names must not start with a period (so that this cannot clash
1090 // with any legal user-defined module name).
1091 StringRef IName = ".ImplementationUnit";
1092 assert(!Modules[IName] && "multiple implementation units?");
1093
1094 auto *Result =
1096 Modules[IName] = SourceModule = Result;
1097
1098 // Check that the main file is present.
1099 assert(SourceMgr.getFileEntryForID(SourceMgr.getMainFileID()) &&
1100 "no input file for module implementation");
1101
1102 return Result;
1103}
1104
1106 Module::Header H) {
1107 assert(LangOpts.CurrentModule == Name && "module name mismatch");
1108 assert(!Modules[Name] && "redefining existing module");
1109
1110 auto *Result = new (ModulesAlloc.Allocate())
1111 Module(ModuleConstructorTag{}, Name, Loc, nullptr, /*IsFramework=*/false,
1112 /*IsExplicit=*/false, NumCreatedModules++);
1114 Modules[Name] = SourceModule = Result;
1116 return Result;
1117}
1118
1119/// For a framework module, infer the framework against which we
1120/// should link.
1121static void inferFrameworkLink(Module *Mod) {
1122 assert(Mod->IsFramework && "Can only infer linking for framework modules");
1123 assert(!Mod->isSubFramework() &&
1124 "Can only infer linking for top-level frameworks");
1125
1126 StringRef FrameworkName(Mod->Name);
1127 FrameworkName.consume_back("_Private");
1128 Mod->LinkLibraries.push_back(Module::LinkLibrary(FrameworkName.str(),
1129 /*IsFramework=*/true));
1130}
1131
1132Module *ModuleMap::inferFrameworkModule(DirectoryEntryRef FrameworkDir,
1133 bool IsSystem, Module *Parent) {
1134 Attributes Attrs;
1135 Attrs.IsSystem = IsSystem;
1136 return inferFrameworkModule(FrameworkDir, Attrs, Parent);
1137}
1138
1139Module *ModuleMap::inferFrameworkModule(DirectoryEntryRef FrameworkDir,
1140 Attributes Attrs, Module *Parent) {
1141 // Note: as an egregious but useful hack we use the real path here, because
1142 // we might be looking at an embedded framework that symlinks out to a
1143 // top-level framework, and we need to infer as if we were naming the
1144 // top-level framework.
1145 StringRef FrameworkDirName =
1146 SourceMgr.getFileManager().getCanonicalName(FrameworkDir);
1147
1148 // In case this is a case-insensitive filesystem, use the canonical
1149 // directory name as the ModuleName, since modules are case-sensitive.
1150 // FIXME: we should be able to give a fix-it hint for the correct spelling.
1151 SmallString<32> ModuleNameStorage;
1152 StringRef ModuleName = sanitizeFilenameAsIdentifier(
1153 llvm::sys::path::stem(FrameworkDirName), ModuleNameStorage);
1154
1155 // Check whether we've already found this module.
1156 if (Module *Mod = lookupModuleQualified(ModuleName, Parent))
1157 return Mod;
1158
1159 FileManager &FileMgr = SourceMgr.getFileManager();
1160
1161 // If the framework has a parent path from which we're allowed to infer
1162 // a framework module, do so.
1163 FileID ModuleMapFID;
1164 if (!Parent) {
1165 // Determine whether we're allowed to infer a module map.
1166 bool canInfer = false;
1167 if (llvm::sys::path::has_parent_path(FrameworkDirName)) {
1168 // Figure out the parent path.
1169 StringRef Parent = llvm::sys::path::parent_path(FrameworkDirName);
1170 if (auto ParentDir = FileMgr.getOptionalDirectoryRef(Parent)) {
1171 // Check whether we have already looked into the parent directory
1172 // for a module map.
1173 llvm::DenseMap<const DirectoryEntry *, InferredDirectory>::const_iterator
1174 inferred = InferredDirectories.find(*ParentDir);
1175 if (inferred == InferredDirectories.end()) {
1176 // We haven't looked here before. Load a module map, if there is
1177 // one.
1178 bool IsFrameworkDir = Parent.ends_with(".framework");
1179 if (OptionalFileEntryRef ModMapFile =
1180 HeaderInfo.lookupModuleMapFile(*ParentDir, IsFrameworkDir)) {
1181 // TODO: Parsing a module map should populate `InferredDirectories`
1182 // so we don't need to do a full load here.
1183 parseAndLoadModuleMapFile(*ModMapFile, Attrs.IsSystem,
1184 /*ImplicitlyDiscovered=*/true,
1185 *ParentDir);
1186 inferred = InferredDirectories.find(*ParentDir);
1187 }
1188
1189 if (inferred == InferredDirectories.end())
1190 inferred = InferredDirectories.insert(
1191 std::make_pair(*ParentDir, InferredDirectory())).first;
1192 }
1193
1194 if (inferred->second.InferModules) {
1195 // We're allowed to infer for this directory, but make sure it's okay
1196 // to infer this particular module.
1197 StringRef Name = llvm::sys::path::stem(FrameworkDirName);
1198 canInfer =
1199 !llvm::is_contained(inferred->second.ExcludedModules, Name);
1200
1201 Attrs.IsSystem |= inferred->second.Attrs.IsSystem;
1202 Attrs.IsExternC |= inferred->second.Attrs.IsExternC;
1203 Attrs.IsExhaustive |= inferred->second.Attrs.IsExhaustive;
1204 Attrs.NoUndeclaredIncludes |=
1205 inferred->second.Attrs.NoUndeclaredIncludes;
1206 ModuleMapFID = inferred->second.ModuleMapFID;
1207 }
1208 }
1209 }
1210
1211 // If we're not allowed to infer a framework module, don't.
1212 if (!canInfer)
1213 return nullptr;
1214 } else {
1215 ModuleMapFID = getModuleMapFileIDForUniquing(Parent);
1216 }
1217
1218 // Look for an umbrella header.
1219 SmallString<128> UmbrellaName = FrameworkDir.getName();
1220 llvm::sys::path::append(UmbrellaName, "Headers", ModuleName + ".h");
1221 auto UmbrellaHeader = FileMgr.getOptionalFileRef(UmbrellaName);
1222
1223 // FIXME: If there's no umbrella header, we could probably scan the
1224 // framework to load *everything*. But, it's not clear that this is a good
1225 // idea.
1226 if (!UmbrellaHeader)
1227 return nullptr;
1228
1229 Module *Result = new (ModulesAlloc.Allocate())
1230 Module(ModuleConstructorTag{}, ModuleName, SourceLocation(), Parent,
1231 /*IsFramework=*/true, /*IsExplicit=*/false, NumCreatedModules++);
1232 setInferredModuleAllowedBy(Result, ModuleMapFID);
1233 if (!Parent) {
1234 if (LangOpts.CurrentModule == ModuleName)
1235 SourceModule = Result;
1236 Modules[ModuleName] = Result;
1237 ModuleScopeIDs[Result] = CurrentModuleScopeID;
1238 }
1239
1240 Result->IsSystem |= Attrs.IsSystem;
1241 Result->IsExternC |= Attrs.IsExternC;
1242 Result->ConfigMacrosExhaustive |= Attrs.IsExhaustive;
1243 Result->NoUndeclaredIncludes |= Attrs.NoUndeclaredIncludes;
1244 Result->Directory = FrameworkDir;
1245
1246 // Chop off the first framework bit, as that is implied.
1247 StringRef RelativePath = UmbrellaName.str().substr(
1248 Result->getTopLevelModule()->Directory->getName().size());
1249 RelativePath = llvm::sys::path::relative_path(RelativePath);
1250
1251 // umbrella header "umbrella-header-name"
1252 setUmbrellaHeaderAsWritten(Result, *UmbrellaHeader, ModuleName + ".h",
1253 RelativePath);
1254
1255 // export *
1256 Result->Exports.push_back(Module::ExportDecl(nullptr, true));
1257
1258 // module * { export * }
1259 Result->InferSubmodules = true;
1260 Result->InferExportWildcard = true;
1261
1262 // Look for subframeworks.
1263 std::error_code EC;
1264 SmallString<128> SubframeworksDirName = FrameworkDir.getName();
1265 llvm::sys::path::append(SubframeworksDirName, "Frameworks");
1266 llvm::sys::path::native(SubframeworksDirName);
1267 llvm::vfs::FileSystem &FS = FileMgr.getVirtualFileSystem();
1268 for (llvm::vfs::directory_iterator
1269 Dir = FS.dir_begin(SubframeworksDirName, EC),
1270 DirEnd;
1271 Dir != DirEnd && !EC; Dir.increment(EC)) {
1272 if (!StringRef(Dir->path()).ends_with(".framework"))
1273 continue;
1274
1275 if (auto SubframeworkDir = FileMgr.getOptionalDirectoryRef(Dir->path())) {
1276 // Note: as an egregious but useful hack, we use the real path here and
1277 // check whether it is actually a subdirectory of the parent directory.
1278 // This will not be the case if the 'subframework' is actually a symlink
1279 // out to a top-level framework.
1280 StringRef SubframeworkDirName =
1281 FileMgr.getCanonicalName(*SubframeworkDir);
1282 bool FoundParent = false;
1283 do {
1284 // Get the parent directory name.
1285 SubframeworkDirName
1286 = llvm::sys::path::parent_path(SubframeworkDirName);
1287 if (SubframeworkDirName.empty())
1288 break;
1289
1290 if (auto SubDir =
1291 FileMgr.getOptionalDirectoryRef(SubframeworkDirName)) {
1292 if (*SubDir == FrameworkDir) {
1293 FoundParent = true;
1294 break;
1295 }
1296 }
1297 } while (true);
1298
1299 if (!FoundParent)
1300 continue;
1301
1302 // FIXME: Do we want to warn about subframeworks without umbrella headers?
1303 inferFrameworkModule(*SubframeworkDir, Attrs, Result);
1304 }
1305 }
1306
1307 // If the module is a top-level framework, automatically link against the
1308 // framework.
1309 if (!Result->isSubFramework())
1311
1312 return Result;
1313}
1314
1315Module *ModuleMap::createShadowedModule(StringRef Name, bool IsFramework,
1316 Module *ShadowingModule) {
1317
1318 // Create a new module with this name.
1319 Module *Result = new (ModulesAlloc.Allocate())
1320 Module(ModuleConstructorTag{}, Name, SourceLocation(), /*Parent=*/nullptr,
1321 IsFramework, /*IsExplicit=*/false, NumCreatedModules++);
1322 Result->ShadowingModule = ShadowingModule;
1323 Result->markUnavailable(/*Unimportable*/true);
1324 ModuleScopeIDs[Result] = CurrentModuleScopeID;
1325 ShadowModules.push_back(Result);
1326
1327 return Result;
1328}
1329
1331 Module *Mod, FileEntryRef UmbrellaHeader, const Twine &NameAsWritten,
1332 const Twine &PathRelativeToRootModuleDirectory, SourceLocation Loc) {
1333 Headers[UmbrellaHeader].push_back(KnownHeader(Mod, NormalHeader));
1334 if (Loc.isValid())
1335 HeaderOwnerLocs[{&UmbrellaHeader.getFileEntry(), Mod}] = Loc;
1336 Mod->Umbrella = UmbrellaHeader;
1337 Mod->UmbrellaDeclLoc = Loc;
1338 Mod->UmbrellaAsWritten = NameAsWritten.str();
1340 PathRelativeToRootModuleDirectory.str();
1341 UmbrellaDirs[UmbrellaHeader.getDir()] = Mod;
1342
1343 // Notify callbacks that we just added a new header.
1344 for (const auto &Cb : Callbacks)
1345 Cb->moduleMapAddUmbrellaHeader(UmbrellaHeader);
1346}
1347
1349 Module *Mod, DirectoryEntryRef UmbrellaDir, const Twine &NameAsWritten,
1350 const Twine &PathRelativeToRootModuleDirectory, SourceLocation Loc) {
1351 Mod->Umbrella = UmbrellaDir;
1352 Mod->UmbrellaDeclLoc = Loc;
1353 Mod->UmbrellaAsWritten = NameAsWritten.str();
1355 PathRelativeToRootModuleDirectory.str();
1356 UmbrellaDirs[UmbrellaDir] = Mod;
1357}
1358
1359void ModuleMap::addUnresolvedHeader(Module *Mod,
1361 bool &NeedsFramework) {
1362 // If there is a builtin counterpart to this file, add it now so it can
1363 // wrap the system header.
1364 if (resolveAsBuiltinHeader(Mod, Header)) {
1365 // If we have both a builtin and system version of the file, the
1366 // builtin version may want to inject macros into the system header, so
1367 // force the system header to be treated as a textual header in this
1368 // case.
1371 Header.HasBuiltinHeader = true;
1372 }
1373
1374 // If possible, don't stat the header until we need to. This requires the
1375 // user to have provided us with some stat information about the file.
1376 // FIXME: Add support for lazily stat'ing umbrella headers and excluded
1377 // headers.
1378 if ((Header.Size || Header.ModTime) && !Header.IsUmbrella &&
1379 Header.Kind != Module::HK_Excluded) {
1380 // We expect more variation in mtime than size, so if we're given both,
1381 // use the mtime as the key.
1382 if (Header.ModTime)
1383 LazyHeadersByModTime[*Header.ModTime].push_back(Mod);
1384 else
1385 LazyHeadersBySize[*Header.Size].push_back(Mod);
1386 Mod->UnresolvedHeaders.push_back(Header);
1387 return;
1388 }
1389
1390 // We don't have stat information or can't defer looking this file up.
1391 // Perform the lookup now.
1392 resolveHeader(Mod, Header, NeedsFramework);
1393}
1394
1396 auto BySize = LazyHeadersBySize.find(File->getSize());
1397 if (BySize != LazyHeadersBySize.end()) {
1398 for (auto *M : BySize->second)
1400 LazyHeadersBySize.erase(BySize);
1401 }
1402
1403 auto ByModTime = LazyHeadersByModTime.find(File->getModificationTime());
1404 if (ByModTime != LazyHeadersByModTime.end()) {
1405 for (auto *M : ByModTime->second)
1407 LazyHeadersByModTime.erase(ByModTime);
1408 }
1409}
1410
1412 Module *Mod, std::optional<const FileEntry *> File) const {
1413 bool NeedsFramework = false;
1415 const auto Size = File ? (*File)->getSize() : 0;
1416 const auto ModTime = File ? (*File)->getModificationTime() : 0;
1417
1418 for (auto &Header : Mod->UnresolvedHeaders) {
1419 if (File && ((Header.ModTime && Header.ModTime != ModTime) ||
1420 (Header.Size && Header.Size != Size)))
1421 NewHeaders.push_back(Header);
1422 else
1423 // This operation is logically const; we're just changing how we represent
1424 // the header information for this file.
1425 const_cast<ModuleMap *>(this)->resolveHeader(Mod, Header, NeedsFramework);
1426 }
1427 Mod->UnresolvedHeaders.swap(NewHeaders);
1428}
1429
1431 ModuleHeaderRole Role, bool Imported,
1432 SourceLocation Loc) {
1433 KnownHeader KH(Mod, Role);
1434
1435 FileEntryRef HeaderEntry = Header.Entry;
1436
1437 // Only add each header to the headers list once.
1438 // FIXME: Should we diagnose if a header is listed twice in the
1439 // same module definition?
1440 auto &HeaderList = Headers[HeaderEntry];
1441 if (llvm::is_contained(HeaderList, KH))
1442 return;
1443
1444 if (Loc.isValid())
1445 HeaderOwnerLocs[{&HeaderEntry.getFileEntry(), Mod}] = Loc;
1446
1447 HeaderList.push_back(KH);
1448 Mod->addHeader(headerRoleToKind(Role), std::move(Header));
1449
1450 bool isCompilingModuleHeader = Mod->isForBuilding(LangOpts);
1451 if (!Imported || isCompilingModuleHeader) {
1452 // When we import HeaderFileInfo, the external source is expected to
1453 // set the isModuleHeader flag itself.
1454 HeaderInfo.MarkFileModuleHeader(HeaderEntry, Role, isCompilingModuleHeader);
1455 }
1456
1457 // Notify callbacks that we just added a new header.
1458 for (const auto &Cb : Callbacks)
1459 Cb->moduleMapAddHeader(HeaderEntry.getName());
1460}
1461
1463 bool ImplicitlyDiscovered,
1464 DirectoryEntryRef Dir, FileID ID,
1465 SourceLocation ExternModuleLoc) {
1466 llvm::DenseMap<const FileEntry *, const modulemap::ModuleMapFile *>::iterator
1467 Known = ParsedModuleMap.find(File);
1468 if (Known != ParsedModuleMap.end())
1469 return Known->second == nullptr;
1470
1471 // If the module map file wasn't already entered, do so now.
1472 if (ID.isInvalid()) {
1473 FileID &LocalFID = ModuleMapLocalFileID[File];
1474 if (LocalFID.isInvalid()) {
1475 auto FileCharacter =
1477 LocalFID = SourceMgr.createFileID(File, ExternModuleLoc, FileCharacter);
1478 }
1479 ID = LocalFID;
1480 }
1481
1482 std::optional<llvm::MemoryBufferRef> Buffer = SourceMgr.getBufferOrNone(ID);
1483 if (!Buffer) {
1484 ParsedModuleMap[File] = nullptr;
1485 return true;
1486 }
1487
1488 Diags.Report(diag::remark_mmap_parse) << File.getName();
1489 std::optional<modulemap::ModuleMapFile> MaybeMMF = modulemap::parseModuleMap(
1490 ID, Dir, SourceMgr, Diags, IsSystem, ImplicitlyDiscovered, nullptr);
1491
1492 if (!MaybeMMF) {
1493 ParsedModuleMap[File] = nullptr;
1494 return true;
1495 }
1496
1497 ParsedModuleMaps.push_back(
1498 std::make_unique<modulemap::ModuleMapFile>(std::move(*MaybeMMF)));
1499 const modulemap::ModuleMapFile &MMF = *ParsedModuleMaps.back();
1500 std::vector<const modulemap::ExternModuleDecl *> PendingExternalModuleMaps;
1501 std::function<void(const modulemap::ModuleDecl &)> CollectExternDecls =
1502 [&](const modulemap::ModuleDecl &MD) {
1503 for (const auto &Decl : MD.Decls) {
1504 std::visit(llvm::makeVisitor(
1505 [&](const modulemap::ModuleDecl &SubMD) {
1506 // Skip inferred submodules (module *)
1507 if (SubMD.Id.front().first == "*")
1508 return;
1509 CollectExternDecls(SubMD);
1510 },
1511 [&](const modulemap::ExternModuleDecl &EMD) {
1512 PendingExternalModuleMaps.push_back(&EMD);
1513 },
1514 [&](const auto &) {
1515 // Ignore other decls
1516 }),
1517 Decl);
1518 }
1519 };
1520
1521 for (const auto &Decl : MMF.Decls) {
1522 std::visit(llvm::makeVisitor(
1523 [&](const modulemap::ModuleDecl &MD) {
1524 // Only use the first part of the name even for submodules.
1525 // This will correctly load the submodule declarations when
1526 // the module is loaded.
1527 auto &ModuleDecls =
1528 ParsedModules[StringRef(MD.Id.front().first)];
1529 ModuleDecls.push_back(std::pair(&MMF, &MD));
1530 CollectExternDecls(MD);
1531 },
1532 [&](const modulemap::ExternModuleDecl &EMD) {
1533 PendingExternalModuleMaps.push_back(&EMD);
1534 }),
1535 Decl);
1536 }
1537
1538 for (const modulemap::ExternModuleDecl *EMD : PendingExternalModuleMaps) {
1539 StringRef FileNameRef = EMD->Path;
1540 SmallString<128> ModuleMapFileName;
1541 if (llvm::sys::path::is_relative(FileNameRef)) {
1542 ModuleMapFileName += Dir.getName();
1543 llvm::sys::path::append(ModuleMapFileName, EMD->Path);
1544 FileNameRef = ModuleMapFileName;
1545 }
1546
1547 if (auto EFile =
1548 SourceMgr.getFileManager().getOptionalFileRef(FileNameRef)) {
1549 parseModuleMapFile(*EFile, IsSystem, ImplicitlyDiscovered,
1550 EFile->getDir(), FileID(), ExternModuleLoc);
1551 }
1552 }
1553
1554 ParsedModuleMap[File] = &MMF;
1555
1556 for (const auto &Cb : Callbacks)
1557 Cb->moduleMapFileRead(SourceLocation(), File, IsSystem);
1558
1559 return false;
1560}
1561
1563 for (const auto &Entry : ParsedModules)
1564 findOrLoadModule(Entry.first());
1565}
1566
1569 return {};
1570
1571 return SourceMgr.getFileID(Module->DefinitionLoc);
1572}
1573
1576 return SourceMgr.getFileEntryRefForID(getContainingModuleMapFileID(Module));
1577}
1578
1580 if (M->IsInferred) {
1581 assert(InferredModuleAllowedBy.count(M) && "missing inferred module map");
1582 return InferredModuleAllowedBy.find(M)->second;
1583 }
1585}
1586
1589 return SourceMgr.getFileEntryRefForID(getModuleMapFileIDForUniquing(M));
1590}
1591
1593 M->IsInferred = true;
1594 InferredModuleAllowedBy[M] = ModMapFID;
1595}
1596
1597std::error_code
1599 StringRef Dir = llvm::sys::path::parent_path({Path.data(), Path.size()});
1600
1601 // Do not canonicalize within the framework; the module map loader expects
1602 // Modules/ not Versions/A/Modules.
1603 if (llvm::sys::path::filename(Dir) == "Modules") {
1604 StringRef Parent = llvm::sys::path::parent_path(Dir);
1605 if (Parent.ends_with(".framework"))
1606 Dir = Parent;
1607 }
1608
1609 FileManager &FM = SourceMgr.getFileManager();
1610 auto DirEntry = FM.getDirectoryRef(Dir.empty() ? "." : Dir);
1611 if (!DirEntry)
1612 return llvm::errorToErrorCode(DirEntry.takeError());
1613
1614 // Canonicalize the directory.
1615 StringRef CanonicalDir = FM.getCanonicalName(*DirEntry);
1616 if (CanonicalDir != Dir)
1617 llvm::sys::path::replace_path_prefix(Path, Dir, CanonicalDir);
1618
1619 // In theory, the filename component should also be canonicalized if it
1620 // on a case-insensitive filesystem. However, the extra canonicalization is
1621 // expensive and if clang looked up the filename it will always be lowercase.
1622
1623 // Remove ., remove redundant separators, and switch to native separators.
1624 // This is needed for separators between CanonicalDir and the filename.
1625 llvm::sys::path::remove_dots(Path);
1626
1627 return std::error_code();
1628}
1629
1632 AdditionalModMaps[M].insert(ModuleMap);
1633}
1634
1635LLVM_DUMP_METHOD void ModuleMap::dump() {
1636 llvm::errs() << "Modules:";
1637 for (llvm::StringMap<Module *>::iterator M = Modules.begin(),
1638 MEnd = Modules.end();
1639 M != MEnd; ++M)
1640 M->getValue()->print(llvm::errs(), 2);
1641
1642 llvm::errs() << "Headers:";
1643 for (HeadersMap::iterator H = Headers.begin(), HEnd = Headers.end();
1644 H != HEnd; ++H) {
1645 llvm::errs() << " \"" << H->first.getName() << "\" -> ";
1646 for (SmallVectorImpl<KnownHeader>::const_iterator I = H->second.begin(),
1647 E = H->second.end();
1648 I != E; ++I) {
1649 if (I != H->second.begin())
1650 llvm::errs() << ",";
1651 llvm::errs() << I->getModule()->getFullModuleName();
1652 }
1653 llvm::errs() << "\n";
1654 }
1655}
1656
1657bool ModuleMap::resolveExports(Module *Mod, bool Complain) {
1658 auto Unresolved = std::move(Mod->UnresolvedExports);
1659 Mod->UnresolvedExports.clear();
1660 for (auto &UE : Unresolved) {
1661 Module::ExportDecl Export = resolveExport(Mod, UE, Complain);
1662 if (Export.first || Export.second)
1663 Mod->Exports.push_back(Export);
1664 else
1665 Mod->UnresolvedExports.push_back(UE);
1666 }
1667 return !Mod->UnresolvedExports.empty();
1668}
1669
1670bool ModuleMap::resolveUses(Module *Mod, bool Complain) {
1671 auto *Top = Mod->getTopLevelModule();
1672 auto Unresolved = std::move(Top->UnresolvedDirectUses);
1673 Top->UnresolvedDirectUses.clear();
1674 for (auto &UDU : Unresolved) {
1675 Module *DirectUse = resolveModuleId(UDU, Top, Complain);
1676 if (DirectUse)
1677 Top->DirectUses.push_back(DirectUse);
1678 else
1679 Top->UnresolvedDirectUses.push_back(UDU);
1680 }
1681 return !Top->UnresolvedDirectUses.empty();
1682}
1683
1684bool ModuleMap::resolveConflicts(Module *Mod, bool Complain) {
1685 auto Unresolved = std::move(Mod->UnresolvedConflicts);
1686 Mod->UnresolvedConflicts.clear();
1687 for (auto &UC : Unresolved) {
1688 if (Module *OtherMod = resolveModuleId(UC.Id, Mod, Complain)) {
1689 Module::Conflict Conflict;
1690 Conflict.Other = OtherMod;
1691 Conflict.Message = UC.Message;
1692 Mod->Conflicts.push_back(Conflict);
1693 } else
1694 Mod->UnresolvedConflicts.push_back(UC);
1695 }
1696 return !Mod->UnresolvedConflicts.empty();
1697}
1698
1699//----------------------------------------------------------------------------//
1700// Module map file loader
1701//----------------------------------------------------------------------------//
1702
1703namespace clang {
1705 SourceManager &SourceMgr;
1706
1707 DiagnosticsEngine &Diags;
1708 ModuleMap &Map;
1709
1710 /// The current module map file.
1711 FileID ModuleMapFID;
1712
1713 /// Source location of most recent loaded module declaration
1714 SourceLocation CurrModuleDeclLoc;
1715
1716 /// The directory that file names in this module map file should
1717 /// be resolved relative to.
1718 DirectoryEntryRef Directory;
1719
1720 /// Whether this module map is in a system header directory.
1721 bool IsSystem;
1722
1723 bool ImplicitlyDiscovered;
1724
1725 /// Whether an error occurred.
1726 bool HadError = false;
1727
1728 /// The active module.
1729 Module *ActiveModule = nullptr;
1730
1731 /// Whether a module uses the 'requires excluded' hack to mark its
1732 /// contents as 'textual'.
1733 ///
1734 /// On older Darwin SDK versions, 'requires excluded' is used to mark the
1735 /// contents of the Darwin.C.excluded (assert.h) and Tcl.Private modules as
1736 /// non-modular headers. For backwards compatibility, we continue to
1737 /// support this idiom for just these modules, and map the headers to
1738 /// 'textual' to match the original intent.
1739 llvm::SmallPtrSet<Module *, 2> UsesRequiresExcludedHack;
1740
1741 void handleModuleDecl(const modulemap::ModuleDecl &MD);
1742 void handleExternModuleDecl(const modulemap::ExternModuleDecl &EMD);
1743 void handleRequiresDecl(const modulemap::RequiresDecl &RD);
1744 void handleHeaderDecl(const modulemap::HeaderDecl &HD);
1745 void handleUmbrellaDirDecl(const modulemap::UmbrellaDirDecl &UDD);
1746 void handleExportDecl(const modulemap::ExportDecl &ED);
1747 void handleExportAsDecl(const modulemap::ExportAsDecl &EAD);
1748 void handleUseDecl(const modulemap::UseDecl &UD);
1749 void handleLinkDecl(const modulemap::LinkDecl &LD);
1750 void handleConfigMacros(const modulemap::ConfigMacrosDecl &CMD);
1751 void handleConflict(const modulemap::ConflictDecl &CD);
1752 void handleInferredModuleDecl(const modulemap::ModuleDecl &MD);
1753
1754 /// Private modules are canonicalized as Foo_Private. Clang provides extra
1755 /// module map search logic to find the appropriate private module when PCH
1756 /// is used with implicit module maps. Warn when private modules are written
1757 /// in other ways (FooPrivate and Foo.Private), providing notes and fixits.
1758 void diagnosePrivateModules(SourceLocation StartLoc);
1759
1760 using Attributes = ModuleMap::Attributes;
1761
1762public:
1764 ModuleMap &Map, FileID ModuleMapFID,
1765 DirectoryEntryRef Directory, bool IsSystem,
1766 bool ImplicitlyDiscovered)
1767 : SourceMgr(SourceMgr), Diags(Diags), Map(Map),
1768 ModuleMapFID(ModuleMapFID), Directory(Directory), IsSystem(IsSystem),
1769 ImplicitlyDiscovered(ImplicitlyDiscovered) {}
1770
1771 bool loadModuleDecl(const modulemap::ModuleDecl &MD);
1774};
1775
1776} // namespace clang
1777
1778/// Private modules are canonicalized as Foo_Private. Clang provides extra
1779/// module map search logic to find the appropriate private module when PCH
1780/// is used with implicit module maps. Warn when private modules are written
1781/// in other ways (FooPrivate and Foo.Private), providing notes and fixits.
1782void ModuleMapLoader::diagnosePrivateModules(SourceLocation StartLoc) {
1783 auto GenNoteAndFixIt = [&](StringRef BadName, StringRef Canonical,
1784 const Module *M, SourceRange ReplLoc) {
1785 auto D = Diags.Report(ActiveModule->DefinitionLoc,
1786 diag::note_mmap_rename_top_level_private_module);
1787 D << BadName << M->Name;
1788 D << FixItHint::CreateReplacement(ReplLoc, Canonical);
1789 };
1790
1791 for (auto E = Map.module_begin(); E != Map.module_end(); ++E) {
1792 auto const *M = E->getValue();
1793 if (M->Directory != ActiveModule->Directory)
1794 continue;
1795
1796 SmallString<128> FullName(ActiveModule->getFullModuleName());
1797 if (!FullName.starts_with(M->Name) && !FullName.ends_with("Private"))
1798 continue;
1799 SmallString<128> FixedPrivModDecl;
1800 SmallString<128> Canonical(M->Name);
1801 Canonical.append("_Private");
1802
1803 // Foo.Private -> Foo_Private
1804 if (ActiveModule->Parent && ActiveModule->Name == "Private" && !M->Parent &&
1805 M->Name == ActiveModule->Parent->Name) {
1806 Diags.Report(ActiveModule->DefinitionLoc,
1807 diag::warn_mmap_mismatched_private_submodule)
1808 << FullName;
1809
1810 SourceLocation FixItInitBegin = CurrModuleDeclLoc;
1811 if (StartLoc.isValid())
1812 FixItInitBegin = StartLoc;
1813
1814 if (ActiveModule->Parent->IsFramework)
1815 FixedPrivModDecl.append("framework ");
1816 FixedPrivModDecl.append("module ");
1817 FixedPrivModDecl.append(Canonical);
1818
1819 GenNoteAndFixIt(FullName, FixedPrivModDecl, M,
1820 SourceRange(FixItInitBegin, ActiveModule->DefinitionLoc));
1821 continue;
1822 }
1823
1824 // FooPrivate and whatnots -> Foo_Private
1825 if (!ActiveModule->Parent && !M->Parent && M->Name != ActiveModule->Name &&
1826 ActiveModule->Name != Canonical) {
1827 Diags.Report(ActiveModule->DefinitionLoc,
1828 diag::warn_mmap_mismatched_private_module_name)
1829 << ActiveModule->Name;
1830 GenNoteAndFixIt(ActiveModule->Name, Canonical, M,
1831 SourceRange(ActiveModule->DefinitionLoc));
1832 }
1833 }
1834}
1835
1836void ModuleMapLoader::handleModuleDecl(const modulemap::ModuleDecl &MD) {
1837 if (MD.Id.front().first == "*")
1838 return handleInferredModuleDecl(MD);
1839
1840 CurrModuleDeclLoc = MD.Location;
1841
1842 Module *PreviousActiveModule = ActiveModule;
1843 if (MD.Id.size() > 1) {
1844 // This module map defines a submodule. Go find the module of which it
1845 // is a submodule.
1846 ActiveModule = nullptr;
1847 const Module *TopLevelModule = nullptr;
1848 for (unsigned I = 0, N = MD.Id.size() - 1; I != N; ++I) {
1849 if (Module *Next =
1850 Map.lookupModuleQualified(MD.Id[I].first, ActiveModule)) {
1851 if (I == 0)
1852 TopLevelModule = Next;
1853 ActiveModule = Next;
1854 continue;
1855 }
1856
1857 Diags.Report(MD.Id[I].second, diag::err_mmap_missing_parent_module)
1858 << MD.Id[I].first << (ActiveModule != nullptr)
1859 << (ActiveModule
1860 ? ActiveModule->getTopLevelModule()->getFullModuleName()
1861 : "");
1862 HadError = true;
1863 }
1864
1865 if (TopLevelModule &&
1866 ModuleMapFID != Map.getContainingModuleMapFileID(TopLevelModule)) {
1867 assert(ModuleMapFID !=
1868 Map.getModuleMapFileIDForUniquing(TopLevelModule) &&
1869 "submodule defined in same file as 'module *' that allowed its "
1870 "top-level module");
1871 Map.addAdditionalModuleMapFile(
1872 TopLevelModule, *SourceMgr.getFileEntryRefForID(ModuleMapFID));
1873 }
1874 }
1875
1876 StringRef ModuleName = MD.Id.back().first;
1877 SourceLocation ModuleNameLoc = MD.Id.back().second;
1878
1879 // Determine whether this (sub)module has already been defined.
1880 Module *ShadowingModule = nullptr;
1881 if (Module *Existing = Map.lookupModuleQualified(ModuleName, ActiveModule)) {
1882 // We might see a (re)definition of a module that we already have a
1883 // definition for in four cases:
1884 // - If the Existing module was loaded from an AST file and we've found its
1885 // original source module map, or we cannot determine Existing's
1886 // definition location.
1887 bool LoadedFromASTFile = Existing->IsFromModuleFile;
1888 if (LoadedFromASTFile) {
1889 OptionalFileEntryRef ExistingModMapFile =
1890 Map.getContainingModuleMapFile(Existing);
1891 OptionalFileEntryRef CurrentModMapFile =
1892 SourceMgr.getFileEntryRefForID(ModuleMapFID);
1893 if ((ExistingModMapFile && CurrentModMapFile &&
1894 *ExistingModMapFile == *CurrentModMapFile) ||
1895 Existing->DefinitionLoc.isInvalid()) {
1896 // If we do not know Existing's definition location, we have
1897 // no way of checking against it, and hence we stay conservative and do
1898 // not check for duplicating module definitions.
1899 LoadedFromASTFile = true;
1900 } else
1901 LoadedFromASTFile = false;
1902 }
1903 // - If we previously inferred this module from different module map file.
1904 bool Inferred = Existing->IsInferred;
1905 // - If we're building a framework that vends a module map, we might've
1906 // previously seen the one in intermediate products and now the system
1907 // one.
1908 // FIXME: If we're parsing module map file that looks like this:
1909 // framework module FW { ... }
1910 // module FW.Sub { ... }
1911 // We can't check the framework qualifier, since it's not attached to
1912 // the definition of Sub. Checking that qualifier on \c Existing is
1913 // not correct either, since we might've previously seen:
1914 // module FW { ... }
1915 // module FW.Sub { ... }
1916 // We should enforce consistency of redefinitions so that we can rely
1917 // that \c Existing is part of a framework iff the redefinition of FW
1918 // we have just skipped had it too. Once we do that, stop checking
1919 // the local framework qualifier and only rely on \c Existing.
1920 bool PartOfFramework = MD.Framework || Existing->isPartOfFramework();
1921 // - If we're building a (preprocessed) module and we've just loaded the
1922 // module map file from which it was created.
1923 bool ParsedAsMainInput =
1924 Map.LangOpts.getCompilingModule() == LangOptions::CMK_ModuleMap &&
1925 Map.LangOpts.CurrentModule == ModuleName &&
1926 SourceMgr.getDecomposedLoc(ModuleNameLoc).first !=
1927 SourceMgr.getDecomposedLoc(Existing->DefinitionLoc).first;
1928 // TODO: Remove this check when we can avoid loading module maps multiple
1929 // times.
1930 bool SameModuleDecl = ModuleNameLoc == Existing->DefinitionLoc;
1931 if (LoadedFromASTFile || Inferred || PartOfFramework || ParsedAsMainInput ||
1932 SameModuleDecl) {
1933 ActiveModule = PreviousActiveModule;
1934 // Skip the module definition.
1935 return;
1936 }
1937
1938 if (!Existing->Parent && Map.mayShadowNewModule(Existing)) {
1939 ShadowingModule = Existing;
1940 } else {
1941 // This is not a shawdowed module decl, it is an illegal redefinition.
1942 Diags.Report(ModuleNameLoc, diag::err_mmap_module_redefinition)
1943 << ModuleName;
1944 Diags.Report(Existing->DefinitionLoc, diag::note_mmap_prev_definition);
1945 HadError = true;
1946 return;
1947 }
1948 }
1949
1950 // Start defining this module.
1951 if (ShadowingModule) {
1952 ActiveModule =
1953 Map.createShadowedModule(ModuleName, MD.Framework, ShadowingModule);
1954 } else {
1955 ActiveModule = Map.findOrCreateModuleFirst(ModuleName, ActiveModule,
1956 MD.Framework, MD.Explicit);
1957 }
1958
1959 ActiveModule->DefinitionLoc = ModuleNameLoc;
1960 if (MD.Attrs.IsSystem || IsSystem)
1961 ActiveModule->IsSystem = true;
1962 if (MD.Attrs.IsExternC)
1963 ActiveModule->IsExternC = true;
1965 ActiveModule->NoUndeclaredIncludes = true;
1966 ActiveModule->Directory = Directory;
1967
1968 StringRef MapFileName(
1969 SourceMgr.getFileEntryRefForID(ModuleMapFID)->getName());
1970 if (MapFileName.ends_with("module.private.modulemap") ||
1971 MapFileName.ends_with("module_private.map")) {
1972 ActiveModule->ModuleMapIsPrivate = true;
1973 }
1974
1975 // Private modules named as FooPrivate, Foo.Private or similar are likely a
1976 // user error; provide warnings, notes and fixits to direct users to use
1977 // Foo_Private instead.
1978 SourceLocation StartLoc =
1979 SourceMgr.getLocForStartOfFile(SourceMgr.getMainFileID());
1980 if (Map.HeaderInfo.getHeaderSearchOpts().ImplicitModuleMaps &&
1981 !Diags.isIgnored(diag::warn_mmap_mismatched_private_submodule,
1982 StartLoc) &&
1983 !Diags.isIgnored(diag::warn_mmap_mismatched_private_module_name,
1984 StartLoc) &&
1985 ActiveModule->ModuleMapIsPrivate)
1986 diagnosePrivateModules(MD.Location);
1987
1988 for (const modulemap::Decl &Decl : MD.Decls) {
1989 std::visit(
1990 llvm::makeVisitor(
1991 [&](const modulemap::RequiresDecl &RD) { handleRequiresDecl(RD); },
1992 [&](const modulemap::HeaderDecl &HD) { handleHeaderDecl(HD); },
1993 [&](const modulemap::UmbrellaDirDecl &UDD) {
1994 handleUmbrellaDirDecl(UDD);
1995 },
1996 [&](const modulemap::ModuleDecl &MD) { handleModuleDecl(MD); },
1997 [&](const modulemap::ExportDecl &ED) { handleExportDecl(ED); },
1998 [&](const modulemap::ExportAsDecl &EAD) {
1999 handleExportAsDecl(EAD);
2000 },
2001 [&](const modulemap::ExternModuleDecl &EMD) {
2002 handleExternModuleDecl(EMD);
2003 },
2004 [&](const modulemap::UseDecl &UD) { handleUseDecl(UD); },
2005 [&](const modulemap::LinkDecl &LD) { handleLinkDecl(LD); },
2006 [&](const modulemap::ConfigMacrosDecl &CMD) {
2007 handleConfigMacros(CMD);
2008 },
2009 [&](const modulemap::ConflictDecl &CD) { handleConflict(CD); },
2010 [&](const modulemap::ExcludeDecl &ED) {
2011 Diags.Report(ED.Location, diag::err_mmap_expected_member);
2012 }),
2013 Decl);
2014 }
2015
2016 // If the active module is a top-level framework, and there are no link
2017 // libraries, automatically link against the framework.
2018 if (ActiveModule->IsFramework && !ActiveModule->isSubFramework() &&
2019 ActiveModule->LinkLibraries.empty())
2020 inferFrameworkLink(ActiveModule);
2021
2022 // If the module meets all requirements but is still unavailable, mark the
2023 // whole tree as unavailable to prevent it from building.
2024 if (!ActiveModule->IsAvailable && !ActiveModule->IsUnimportable &&
2025 ActiveModule->Parent) {
2026 ActiveModule->getTopLevelModule()->markUnavailable(/*Unimportable=*/false);
2027 ActiveModule->getTopLevelModule()->MissingHeaders.append(
2028 ActiveModule->MissingHeaders.begin(), ActiveModule->MissingHeaders.end());
2029 }
2030
2031 // We're done parsing this module. Pop back to the previous module.
2032 ActiveModule = PreviousActiveModule;
2033}
2034
2035void ModuleMapLoader::handleExternModuleDecl(
2036 const modulemap::ExternModuleDecl &EMD) {
2037 StringRef FileNameRef = EMD.Path;
2038 SmallString<128> ModuleMapFileName;
2039 if (llvm::sys::path::is_relative(FileNameRef)) {
2040 ModuleMapFileName += Directory.getName();
2041 llvm::sys::path::append(ModuleMapFileName, EMD.Path);
2042 // As extern module declarations are parsed recursively, relative paths
2043 // to those modules can become arbitrarily long.
2044 // If the OS name length limit is exceeded when trying to get the file ref
2045 // we can silently fail to find an extern module that exists.
2046 // To mitigate this, collapse relative paths containing '../' for when
2047 // constructing the name of each module file referenced as an extern module.
2048 llvm::sys::path::remove_dots(ModuleMapFileName, /*remove_dot_dot=*/true);
2049 FileNameRef = ModuleMapFileName;
2050 }
2051 if (auto File = SourceMgr.getFileManager().getOptionalFileRef(FileNameRef))
2052 Map.parseAndLoadModuleMapFile(
2053 *File, IsSystem, ImplicitlyDiscovered,
2054 Map.HeaderInfo.getHeaderSearchOpts().ModuleMapFileHomeIsCwd
2055 ? Directory
2056 : File->getDir(),
2057 FileID(), nullptr, EMD.Location);
2058}
2059
2060/// Whether to add the requirement \p Feature to the module \p M.
2061///
2062/// This preserves backwards compatibility for two hacks in the Darwin system
2063/// module map files:
2064///
2065/// 1. The use of 'requires excluded' to make headers non-modular, which
2066/// should really be mapped to 'textual' now that we have this feature. We
2067/// drop the 'excluded' requirement, and set \p IsRequiresExcludedHack to
2068/// true. Later, this bit will be used to map all the headers inside this
2069/// module to 'textual'.
2070///
2071/// This affects Darwin.C.excluded (for assert.h) and Tcl.Private.
2072///
2073/// 2. Removes a bogus cplusplus requirement from IOKit.avc. This requirement
2074/// was never correct and causes issues now that we check it, so drop it.
2075static bool shouldAddRequirement(Module *M, StringRef Feature,
2076 bool &IsRequiresExcludedHack) {
2077 if (Feature == "excluded" &&
2078 (M->fullModuleNameIs({"Darwin", "C", "excluded"}) ||
2079 M->fullModuleNameIs({"Tcl", "Private"}))) {
2080 IsRequiresExcludedHack = true;
2081 return false;
2082 } else if (Feature == "cplusplus" && M->fullModuleNameIs({"IOKit", "avc"})) {
2083 return false;
2084 }
2085
2086 return true;
2087}
2088
2089void ModuleMapLoader::handleRequiresDecl(const modulemap::RequiresDecl &RD) {
2090
2091 for (const modulemap::RequiresFeature &RF : RD.Features) {
2092 bool IsRequiresExcludedHack = false;
2093 bool ShouldAddRequirement =
2094 shouldAddRequirement(ActiveModule, RF.Feature, IsRequiresExcludedHack);
2095
2096 if (IsRequiresExcludedHack)
2097 UsesRequiresExcludedHack.insert(ActiveModule);
2098
2099 if (ShouldAddRequirement) {
2100 // Add this feature.
2101 ActiveModule->addRequirement(RF.Feature, RF.RequiredState, Map.LangOpts,
2102 *Map.Target);
2103 }
2104 }
2105}
2106
2107void ModuleMapLoader::handleHeaderDecl(const modulemap::HeaderDecl &HD) {
2108 // We've already consumed the first token.
2110
2111 if (HD.Private) {
2113 } else if (HD.Excluded) {
2115 }
2116
2117 if (HD.Textual)
2119
2120 if (UsesRequiresExcludedHack.count(ActiveModule)) {
2121 // Mark this header 'textual' (see doc comment for
2122 // Module::UsesRequiresExcludedHack).
2124 }
2125
2126 Module::UnresolvedHeaderDirective Header;
2127 Header.FileName = HD.Path;
2128 Header.FileNameLoc = HD.PathLoc;
2129 Header.IsUmbrella = HD.Umbrella;
2130 Header.Kind = Map.headerRoleToKind(Role);
2131
2132 // Check whether we already have an umbrella.
2133 if (Header.IsUmbrella &&
2134 !std::holds_alternative<std::monostate>(ActiveModule->Umbrella)) {
2135 Diags.Report(Header.FileNameLoc, diag::err_mmap_umbrella_clash)
2136 << ActiveModule->getFullModuleName();
2137 HadError = true;
2138 return;
2139 }
2140
2141 if (ImplicitlyDiscovered) {
2142 SmallString<128> NormalizedPath(HD.Path);
2143 llvm::sys::path::remove_dots(NormalizedPath, /*remove_dot_dot=*/true);
2144 if (NormalizedPath.starts_with(".."))
2145 Diags.Report(HD.PathLoc, diag::warn_mmap_path_outside_directory);
2146 }
2147
2148 if (HD.Size)
2149 Header.Size = HD.Size;
2150 if (HD.MTime)
2151 Header.ModTime = HD.MTime;
2152
2153 bool NeedsFramework = false;
2154 // Don't add headers to the builtin modules if the builtin headers belong to
2155 // the system modules, with the exception of __stddef_max_align_t.h which
2156 // always had its own module.
2157 if (!Map.LangOpts.BuiltinHeadersInSystemModules ||
2158 !isBuiltInModuleName(ActiveModule->getTopLevelModuleName()) ||
2159 ActiveModule->fullModuleNameIs({"_Builtin_stddef", "max_align_t"}))
2160 Map.addUnresolvedHeader(ActiveModule, std::move(Header), NeedsFramework);
2161
2162 if (NeedsFramework)
2163 Diags.Report(CurrModuleDeclLoc, diag::note_mmap_add_framework_keyword)
2164 << ActiveModule->getFullModuleName()
2165 << FixItHint::CreateReplacement(CurrModuleDeclLoc, "framework module");
2166}
2167
2169 const Module::Header &B) {
2170 return A.NameAsWritten < B.NameAsWritten;
2171}
2172
2173void ModuleMapLoader::handleUmbrellaDirDecl(
2174 const modulemap::UmbrellaDirDecl &UDD) {
2175 std::string DirName = std::string(UDD.Path);
2176 std::string DirNameAsWritten = DirName;
2177
2178 // Check whether we already have an umbrella.
2179 if (!std::holds_alternative<std::monostate>(ActiveModule->Umbrella)) {
2180 Diags.Report(UDD.Location, diag::err_mmap_umbrella_clash)
2181 << ActiveModule->getFullModuleName();
2182 HadError = true;
2183 return;
2184 }
2185
2186 if (ImplicitlyDiscovered) {
2187 SmallString<128> NormalizedPath(UDD.Path);
2188 llvm::sys::path::remove_dots(NormalizedPath, /*remove_dot_dot=*/true);
2189 if (NormalizedPath.starts_with(".."))
2190 Diags.Report(UDD.Location, diag::warn_mmap_path_outside_directory);
2191 }
2192
2193 // Look for this file.
2195 if (llvm::sys::path::is_absolute(DirName)) {
2196 Dir = SourceMgr.getFileManager().getOptionalDirectoryRef(DirName);
2197 } else {
2198 SmallString<128> PathName;
2199 PathName = Directory.getName();
2200 llvm::sys::path::append(PathName, DirName);
2201 Dir = SourceMgr.getFileManager().getOptionalDirectoryRef(PathName);
2202 }
2203
2204 if (!Dir) {
2205 Diags.Report(UDD.Location, diag::warn_mmap_umbrella_dir_not_found)
2206 << DirName;
2207 return;
2208 }
2209
2210 if (UsesRequiresExcludedHack.count(ActiveModule)) {
2211 // Mark this header 'textual' (see doc comment for
2212 // ModuleMapLoader::UsesRequiresExcludedHack). Although iterating over the
2213 // directory is relatively expensive, in practice this only applies to the
2214 // uncommonly used Tcl module on Darwin platforms.
2215 std::error_code EC;
2216 SmallVector<Module::Header, 6> Headers;
2217 llvm::vfs::FileSystem &FS =
2218 SourceMgr.getFileManager().getVirtualFileSystem();
2219 for (llvm::vfs::recursive_directory_iterator I(FS, Dir->getName(), EC), E;
2220 I != E && !EC; I.increment(EC)) {
2221 if (auto FE = SourceMgr.getFileManager().getOptionalFileRef(I->path())) {
2222 Module::Header Header = {"", std::string(I->path()), *FE};
2223 Headers.push_back(std::move(Header));
2224 }
2225 }
2226
2227 // Sort header paths so that the pcm doesn't depend on iteration order.
2228 llvm::stable_sort(Headers, compareModuleHeaders);
2229
2230 for (auto &Header : Headers)
2231 Map.addHeader(ActiveModule, std::move(Header), ModuleMap::TextualHeader);
2232 return;
2233 }
2234
2235 if (Module *OwningModule = Map.UmbrellaDirs[*Dir]) {
2236 Diags.Report(UDD.Location, diag::err_mmap_umbrella_clash)
2237 << OwningModule->getFullModuleName();
2238 HadError = true;
2239 return;
2240 }
2241
2242 // Record this umbrella directory.
2243 Map.setUmbrellaDirAsWritten(ActiveModule, *Dir, DirNameAsWritten, DirName,
2244 UDD.Location);
2245}
2246
2247void ModuleMapLoader::handleExportDecl(const modulemap::ExportDecl &ED) {
2248 Module::UnresolvedExportDecl Unresolved = {ED.Location, ED.Id, ED.Wildcard};
2249 ActiveModule->UnresolvedExports.push_back(Unresolved);
2250}
2251
2252void ModuleMapLoader::handleExportAsDecl(const modulemap::ExportAsDecl &EAD) {
2253 const auto &ModName = EAD.Id.front();
2254
2255 if (!ActiveModule->ExportAsModule.empty()) {
2256 if (ActiveModule->ExportAsModule == ModName.first) {
2257 Diags.Report(ModName.second, diag::warn_mmap_redundant_export_as)
2258 << ActiveModule->Name << ModName.first;
2259 } else {
2260 Diags.Report(ModName.second, diag::err_mmap_conflicting_export_as)
2261 << ActiveModule->Name << ActiveModule->ExportAsModule
2262 << ModName.first;
2263 }
2264 }
2265
2266 ActiveModule->ExportAsModule = ModName.first;
2267 Map.addLinkAsDependency(ActiveModule);
2268}
2269
2270void ModuleMapLoader::handleUseDecl(const modulemap::UseDecl &UD) {
2271 if (ActiveModule->Parent)
2272 Diags.Report(UD.Location, diag::err_mmap_use_decl_submodule);
2273 else
2274 ActiveModule->UnresolvedDirectUses.push_back(UD.Id);
2275}
2276
2277void ModuleMapLoader::handleLinkDecl(const modulemap::LinkDecl &LD) {
2278 ActiveModule->LinkLibraries.push_back(
2279 Module::LinkLibrary(std::string{LD.Library}, LD.Framework));
2280}
2281
2282void ModuleMapLoader::handleConfigMacros(
2283 const modulemap::ConfigMacrosDecl &CMD) {
2284 if (ActiveModule->Parent) {
2285 Diags.Report(CMD.Location, diag::err_mmap_config_macro_submodule);
2286 return;
2287 }
2288
2289 // TODO: Is this really the behavior we want for multiple config_macros
2290 // declarations? If any of them are exhaustive then all of them are.
2291 if (CMD.Exhaustive) {
2292 ActiveModule->ConfigMacrosExhaustive = true;
2293 }
2294 ActiveModule->ConfigMacros.insert(ActiveModule->ConfigMacros.end(),
2295 CMD.Macros.begin(), CMD.Macros.end());
2296}
2297
2298void ModuleMapLoader::handleConflict(const modulemap::ConflictDecl &CD) {
2299 Module::UnresolvedConflict Conflict;
2300
2301 Conflict.Id = CD.Id;
2302 Conflict.Message = CD.Message;
2303
2304 // FIXME: when we move to C++20 we should consider using emplace_back
2305 ActiveModule->UnresolvedConflicts.push_back(std::move(Conflict));
2306}
2307
2308void ModuleMapLoader::handleInferredModuleDecl(
2309 const modulemap::ModuleDecl &MD) {
2310 SourceLocation StarLoc = MD.Id.front().second;
2311
2312 // Inferred modules must be submodules.
2313 if (!ActiveModule && !MD.Framework) {
2314 Diags.Report(StarLoc, diag::err_mmap_top_level_inferred_submodule);
2315 return;
2316 }
2317
2318 if (ActiveModule) {
2319 // Inferred modules must have umbrella directories.
2320 if (ActiveModule->IsAvailable && !ActiveModule->getEffectiveUmbrellaDir()) {
2321 Diags.Report(StarLoc, diag::err_mmap_inferred_no_umbrella);
2322 return;
2323 }
2324
2325 // Check for redefinition of an inferred module.
2326 if (ActiveModule->InferSubmodules) {
2327 Diags.Report(StarLoc, diag::err_mmap_inferred_redef);
2328 if (ActiveModule->InferredSubmoduleLoc.isValid())
2329 Diags.Report(ActiveModule->InferredSubmoduleLoc,
2330 diag::note_mmap_prev_definition);
2331 return;
2332 }
2333
2334 // Check for the 'framework' keyword, which is not permitted here.
2335 if (MD.Framework) {
2336 Diags.Report(StarLoc, diag::err_mmap_inferred_framework_submodule);
2337 return;
2338 }
2339 } else if (MD.Explicit) {
2340 Diags.Report(StarLoc, diag::err_mmap_explicit_inferred_framework);
2341 return;
2342 }
2343
2344 if (ActiveModule) {
2345 // Note that we have an inferred submodule.
2346 ActiveModule->InferSubmodules = true;
2347 ActiveModule->InferredSubmoduleLoc = StarLoc;
2348 ActiveModule->InferExplicitSubmodules = MD.Explicit;
2349 } else {
2350 // We'll be inferring framework modules for this directory.
2351 auto &InfDir = Map.InferredDirectories[Directory];
2352 InfDir.InferModules = true;
2353 InfDir.Attrs = MD.Attrs;
2354 InfDir.ModuleMapFID = ModuleMapFID;
2355 // FIXME: Handle the 'framework' keyword.
2356 }
2357
2358 for (const modulemap::Decl &Decl : MD.Decls) {
2359 std::visit(
2360 llvm::makeVisitor(
2361 [&](const auto &Other) {
2362 Diags.Report(Other.Location,
2363 diag::err_mmap_expected_inferred_member)
2364 << (ActiveModule != nullptr);
2365 },
2366 [&](const modulemap::ExcludeDecl &ED) {
2367 // Only inferred frameworks can have exclude decls
2368 if (ActiveModule) {
2369 Diags.Report(ED.Location,
2370 diag::err_mmap_expected_inferred_member)
2371 << (ActiveModule != nullptr);
2372 HadError = true;
2373 return;
2374 }
2375 Map.InferredDirectories[Directory].ExcludedModules.emplace_back(
2376 ED.Module);
2377 },
2378 [&](const modulemap::ExportDecl &ED) {
2379 // Only inferred submodules can have export decls
2380 if (!ActiveModule) {
2381 Diags.Report(ED.Location,
2382 diag::err_mmap_expected_inferred_member)
2383 << (ActiveModule != nullptr);
2384 HadError = true;
2385 return;
2386 }
2387
2388 if (ED.Wildcard && ED.Id.size() == 0)
2389 ActiveModule->InferExportWildcard = true;
2390 else
2391 Diags.Report(ED.Id.front().second,
2392 diag::err_mmap_expected_export_wildcard);
2393 }),
2394 Decl);
2395 }
2396}
2397
2399 handleModuleDecl(MD);
2400 return HadError;
2401}
2402
2404 const modulemap::ExternModuleDecl &EMD) {
2405 handleExternModuleDecl(EMD);
2406 return HadError;
2407}
2408
2410 const modulemap::ModuleMapFile &MMF) {
2411 for (const auto &Decl : MMF.Decls) {
2412 std::visit(
2413 llvm::makeVisitor(
2414 [&](const modulemap::ModuleDecl &MD) { handleModuleDecl(MD); },
2415 [&](const modulemap::ExternModuleDecl &EMD) {
2416 handleExternModuleDecl(EMD);
2417 }),
2418 Decl);
2419 }
2420 return HadError;
2421}
2422
2424 llvm::StringMap<Module *>::const_iterator Known = Modules.find(Name);
2425 if (Known != Modules.end())
2426 return Known->getValue();
2427
2428 auto ParsedMod = ParsedModules.find(Name);
2429 if (ParsedMod == ParsedModules.end())
2430 return nullptr;
2431
2432 Diags.Report(diag::remark_mmap_load_module) << Name;
2433
2434 for (const auto &ModuleDecl : ParsedMod->second) {
2435 const modulemap::ModuleMapFile &MMF = *ModuleDecl.first;
2436 ModuleMapLoader Loader(SourceMgr, Diags, const_cast<ModuleMap &>(*this),
2437 MMF.ID, *MMF.Dir, MMF.IsSystem,
2439 if (Loader.loadModuleDecl(*ModuleDecl.second))
2440 return nullptr;
2441 }
2442
2443 return findModule(Name);
2444}
2445
2447 bool ImplicitlyDiscovered,
2448 DirectoryEntryRef Dir, FileID ID,
2449 unsigned *Offset,
2450 SourceLocation ExternModuleLoc) {
2451 assert(Target && "Missing target information");
2452 llvm::DenseMap<const FileEntry *, bool>::iterator Known =
2453 LoadedModuleMap.find(File);
2454 if (Known != LoadedModuleMap.end())
2455 return Known->second;
2456
2457 // If the module map file wasn't already entered, do so now.
2458 if (ID.isInvalid()) {
2459 // TODO: The way we compute affecting module maps requires this to be a
2460 // local FileID. This should be changed to reuse loaded FileIDs when
2461 // available, and change the way that affecting module maps are
2462 // computed to not require this.
2463 FileID &LocalFID = ModuleMapLocalFileID[File];
2464 if (LocalFID.isInvalid()) {
2465 auto FileCharacter =
2467 LocalFID = SourceMgr.createFileID(File, ExternModuleLoc, FileCharacter);
2468 }
2469 ID = LocalFID;
2470 }
2471
2472 assert(Target && "Missing target information");
2473 std::optional<llvm::MemoryBufferRef> Buffer = SourceMgr.getBufferOrNone(ID);
2474 if (!Buffer)
2475 return LoadedModuleMap[File] = true;
2476 assert((!Offset || *Offset <= Buffer->getBufferSize()) &&
2477 "invalid buffer offset");
2478
2479 std::optional<modulemap::ModuleMapFile> MMF = modulemap::parseModuleMap(
2480 ID, Dir, SourceMgr, Diags, IsSystem, ImplicitlyDiscovered, Offset);
2481 bool Result = false;
2482 if (MMF) {
2483 Diags.Report(diag::remark_mmap_load) << File.getName();
2484 ModuleMapLoader Loader(SourceMgr, Diags, *this, ID, Dir, IsSystem,
2485 ImplicitlyDiscovered);
2486 Result = Loader.parseAndLoadModuleMapFile(*MMF);
2487
2488 // Also record that this was parsed if it wasn't previously. This is used
2489 // for diagnostics.
2490 llvm::DenseMap<const FileEntry *,
2491 const modulemap::ModuleMapFile *>::iterator PKnown =
2492 ParsedModuleMap.find(File);
2493 if (PKnown == ParsedModuleMap.end()) {
2494 ParsedModuleMaps.push_back(
2495 std::make_unique<modulemap::ModuleMapFile>(std::move(*MMF)));
2496 ParsedModuleMap[File] = &*ParsedModuleMaps.back();
2497 }
2498 }
2499 LoadedModuleMap[File] = Result;
2500
2501 // Notify callbacks that we observed it.
2502 // FIXME: We should only report module maps that were actually used.
2503 for (const auto &Cb : Callbacks)
2504 Cb->moduleMapFileRead(MMF ? MMF->Start : SourceLocation(), File, IsSystem);
2505
2506 return Result;
2507}
Defines the Diagnostic-related interfaces.
Defines the clang::FileManager interface and associated types.
std::shared_ptr< TokenRole > Role
A token can have a special role that can carry extra information about the token's formatting.
FormatToken * Next
The next token in the unwrapped line.
#define ALIAS(NAME, TOK, FLAGS)
#define KEYWORD(NAME, FLAGS)
Result
Implement __builtin_bit_cast and related operations.
Forward-declares and imports various common LLVM datatypes that clang wants to use unqualified.
Defines the clang::LangOptions interface.
static bool isBuiltinHeaderName(StringRef FileName)
Determine whether the given file name is the name of a builtin header, supplied by Clang to replace,...
static bool isBuiltInModuleName(StringRef ModuleName)
Determine whether the given module name is the name of a builtin module that is cyclic with a system ...
static Module * getTopLevelOrNull(Module *M)
static bool violatesPrivateInclude(Module *RequestingModule, const FileEntry *IncFileEnt, ModuleMap::KnownHeader Header)
static void inferFrameworkLink(Module *Mod)
For a framework module, infer the framework against which we should link.
static StringRef sanitizeFilenameAsIdentifier(StringRef Name, SmallVectorImpl< char > &Buffer)
"Sanitize" a filename so that it can be used as an identifier.
static constexpr llvm::StringRef kPrivateModuleSuffix
Definition ModuleMap.cpp:49
static void appendSubframeworkPaths(Module *Mod, SmallVectorImpl< char > &Path)
Append to Paths the set of paths needed to get to the subframework in which the given module lives.
static bool shouldAddRequirement(Module *M, StringRef Feature, bool &IsRequiresExcludedHack)
Whether to add the requirement Feature to the module M.
static bool isBetterKnownHeader(const ModuleMap::KnownHeader &New, const ModuleMap::KnownHeader &Old)
static bool compareModuleHeaders(const Module::Header &A, const Module::Header &B)
Defines the clang::Module class, which describes a module in the source code.
Defines the clang::SourceLocation class and associated facilities.
Defines the SourceManager interface.
Decl - This represents one declaration (or definition), e.g.
Definition DeclBase.h:86
Concrete class used by the front-end to report problems and issues.
Definition Diagnostic.h:233
bool isIgnored(unsigned DiagID, SourceLocation Loc) const
Determine whether the diagnostic is known to be ignored.
Definition Diagnostic.h:960
A reference to a DirectoryEntry that includes the name of the directory as it was accessed by the Fil...
StringRef getName() const
A reference to a FileEntry that includes the name of the file as it was accessed by the FileManager's...
Definition FileEntry.h:57
const FileEntry & getFileEntry() const
Definition FileEntry.h:70
StringRef getName() const
The name of this FileEntry.
Definition FileEntry.h:61
DirectoryEntryRef getDir() const
Definition FileEntry.h:78
Cached information about one file (either on disk or in the virtual file system).
Definition FileEntry.h:302
An opaque identifier used by SourceManager which refers to a source file (MemoryBuffer) along with it...
bool isInvalid() const
Implements support for file system lookup, file system caching, and directory search management.
Definition FileManager.h:53
llvm::vfs::FileSystem & getVirtualFileSystem() const
StringRef getCanonicalName(DirectoryEntryRef Dir)
Retrieve the canonical name for a given directory.
llvm::Expected< DirectoryEntryRef > getDirectoryRef(StringRef DirName, bool CacheFailure=true)
Lookup, cache, and verify the specified directory (real or virtual).
OptionalFileEntryRef getOptionalFileRef(StringRef Filename, bool OpenFile=false, bool CacheFailure=true, bool IsText=true)
Get a FileEntryRef if it exists, without doing anything on error.
OptionalDirectoryEntryRef getOptionalDirectoryRef(StringRef DirName, bool CacheFailure=true)
Get a DirectoryEntryRef if it exists, without doing anything on error.
static FixItHint CreateReplacement(CharSourceRange RemoveRange, StringRef Code)
Create a code modification hint that replaces the given source range with the given code string.
Definition Diagnostic.h:141
unsigned ImplicitModuleMaps
Implicit module maps.
Encapsulates the information needed to find the file referenced by a #include or #include_next,...
void loadTopLevelSystemModules()
Load all known, top-level system modules.
const HeaderSearchOptions & getHeaderSearchOpts() const
Retrieve the header-search options with which this header search was initialized.
OptionalFileEntryRef lookupModuleMapFile(DirectoryEntryRef Dir, bool IsFramework)
Try to find a module map file in the given directory, returning nullopt if none is found.
@ CMK_ModuleMap
Compiling a module from a module map.
Keeps track of the various options that can be enabled, which controls the dialect of C or C++ that i...
Required to construct a Module.
Definition Module.h:332
ModuleMapLoader(SourceManager &SourceMgr, DiagnosticsEngine &Diags, ModuleMap &Map, FileID ModuleMapFID, DirectoryEntryRef Directory, bool IsSystem, bool ImplicitlyDiscovered)
bool loadExternModuleDecl(const modulemap::ExternModuleDecl &EMD)
bool parseAndLoadModuleMapFile(const modulemap::ModuleMapFile &MMF)
bool loadModuleDecl(const modulemap::ModuleDecl &MD)
A header that is known to reside within a given module, whether it was included or excluded.
Definition ModuleMap.h:158
bool isAccessibleFrom(Module *M) const
Whether this header is accessible from the specified module.
Definition ModuleMap.h:184
ModuleHeaderRole getRole() const
The role of this header within the module.
Definition ModuleMap.h:176
Module * getModule() const
Retrieve the module the header is stored in.
Definition ModuleMap.h:173
Module * createShadowedModule(StringRef Name, bool IsFramework, Module *ShadowingModule)
Create a new top-level module that is shadowed by ShadowingModule.
bool resolveExports(Module *Mod, bool Complain)
Resolve all of the unresolved exports in the given module.
void addLinkAsDependency(Module *Mod)
Make module to use export_as as the link dependency name if enough information is available or add it...
Definition ModuleMap.cpp:64
friend class ModuleMapLoader
Definition ModuleMap.h:199
bool parseModuleMapFile(FileEntryRef File, bool IsSystem, bool ImplicitlyDiscovered, DirectoryEntryRef Dir, FileID ID=FileID(), SourceLocation ExternModuleLoc=SourceLocation())
Parse a module map without creating clang::Module instances.
void dump()
Dump the contents of the module map, for debugging purposes.
std::pair< Module *, bool > findOrCreateModule(StringRef Name, Module *Parent, bool IsFramework, bool IsExplicit)
Find a new module or submodule, or create it if it does not already exist.
void diagnoseHeaderInclusion(Module *RequestingModule, bool RequestingModuleIsModuleInterface, SourceLocation FilenameLoc, StringRef Filename, FileEntryRef File)
Reports errors if a module must not include a specific file.
void addAdditionalModuleMapFile(const Module *M, FileEntryRef ModuleMap)
ModuleRef lookupModuleQualified(StringRef Name, Module *Context) const
Retrieve a module with the given name within the given context, using direct (qualified) name lookup.
OptionalFileEntryRef getContainingModuleMapFile(const Module *Module) const
static Module::HeaderKind headerRoleToKind(ModuleHeaderRole Role)
Convert a header role to a kind.
Definition ModuleMap.cpp:71
Module * findModule(StringRef Name) const
Retrieve a module with the given name.
KnownHeader findModuleForHeader(FileEntryRef File, bool AllowTextual=false, bool AllowExcluded=false)
Retrieve the module that owns the given header file, if any.
Module * createHeaderUnit(SourceLocation Loc, StringRef Name, Module::Header H)
Create a C++20 header unit.
void setUmbrellaHeaderAsWritten(Module *Mod, FileEntryRef UmbrellaHeader, const Twine &NameAsWritten, const Twine &PathRelativeToRootModuleDirectory, SourceLocation Loc=SourceLocation())
Sets the umbrella header of the given module to the given header.
void addHeader(Module *Mod, Module::Header Header, ModuleHeaderRole Role, bool Imported=false, SourceLocation Loc=SourceLocation())
Adds this header to the given module.
static bool isModular(ModuleHeaderRole Role)
Check if the header with the given role is a modular one.
bool resolveConflicts(Module *Mod, bool Complain)
Resolve all of the unresolved conflicts in the given module.
bool isHeaderUnavailableInModule(FileEntryRef Header, const Module *RequestingModule) const
Determine whether the given header is unavailable as part of the specified module.
void resolveHeaderDirectives(const FileEntry *File) const
Resolve all lazy header directives for the specified file.
ArrayRef< KnownHeader > findResolvedModulesForHeader(FileEntryRef File) const
Like findAllModulesForHeader, but do not attempt to infer module ownership from umbrella headers if w...
OptionalFileEntryRef getModuleMapFileForUniquing(const Module *M) const
bool shouldImportRelativeToBuiltinIncludeDir(StringRef FileName, Module *Module) const
bool parseAndLoadModuleMapFile(FileEntryRef File, bool IsSystem, bool ImplicitlyDiscovered, DirectoryEntryRef HomeDir, FileID ID=FileID(), unsigned *Offset=nullptr, SourceLocation ExternModuleLoc=SourceLocation())
Load the given module map file, and record any modules we encounter.
Module * createModuleForImplementationUnit(SourceLocation Loc, StringRef Name)
Create a new module for a C++ module implementation unit.
ModuleMap(SourceManager &SourceMgr, DiagnosticsEngine &Diags, const LangOptions &LangOpts, const TargetInfo *Target, HeaderSearch &HeaderInfo)
Construct a new module map.
std::error_code canonicalizeModuleMapPath(SmallVectorImpl< char > &Path)
Canonicalize Path in a manner suitable for a module map file.
OptionalFileEntryRef findUmbrellaHeaderForModule(Module *M, std::string NameAsWritten, SmallVectorImpl< char > &RelativePathName)
Find the FileEntry for an umbrella header in a module as if it was written in the module map as a hea...
FileID getModuleMapFileIDForUniquing(const Module *M) const
Get the module map file that (along with the module name) uniquely identifies this module.
void setInferredModuleAllowedBy(Module *M, FileID ModMapFID)
void setUmbrellaDirAsWritten(Module *Mod, DirectoryEntryRef UmbrellaDir, const Twine &NameAsWritten, const Twine &PathRelativeToRootModuleDirectory, SourceLocation Loc=SourceLocation())
Sets the umbrella directory of the given module to the given directory.
Module * findOrCreateModuleFirst(StringRef Name, Module *Parent, bool IsFramework, bool IsExplicit)
Call ModuleMap::findOrCreateModule and throw away the information whether the module was found or cre...
Definition ModuleMap.h:572
Module * lookupModuleUnqualified(StringRef Name, Module *Context) const
Retrieve a module with the given name using lexical name lookup, starting at the given context.
bool isBuiltinHeader(FileEntryRef File)
Is this a compiler builtin header?
Module * createModule(StringRef Name, Module *Parent, bool IsFramework, bool IsExplicit)
Create new submodule, assuming it does not exist.
bool isHeaderInUnavailableModule(FileEntryRef Header) const
Determine whether the given header is part of a module marked 'unavailable'.
FileID getContainingModuleMapFileID(const Module *Module) const
Retrieve the module map file containing the definition of the given module.
~ModuleMap()
Destroy the module map.
Module * createGlobalModuleFragmentForModuleUnit(SourceLocation Loc, Module *Parent=nullptr)
Create a global module fragment for a C++ module unit.
void setTarget(const TargetInfo &Target)
Set the target information.
void resolveLinkAsDependencies(Module *Mod)
Use PendingLinkAsModule information to mark top level link names that are going to be replaced by exp...
Definition ModuleMap.cpp:53
ModuleHeaderRole
Flags describing the role of a module header.
Definition ModuleMap.h:126
@ PrivateHeader
This header is included but private.
Definition ModuleMap.h:131
@ ExcludedHeader
This header is explicitly excluded from the module.
Definition ModuleMap.h:138
@ NormalHeader
This header is normally included in the module.
Definition ModuleMap.h:128
@ TextualHeader
This header is part of the module (for layering purposes) but should be textually included.
Definition ModuleMap.h:135
Module * createModuleForInterfaceUnit(SourceLocation Loc, StringRef Name)
Create a new module for a C++ module interface unit.
Module * createPrivateModuleFragmentForInterfaceUnit(Module *Parent, SourceLocation Loc)
Create a global module fragment for a C++ module interface unit.
Module * findOrInferSubmodule(Module *Parent, StringRef Name)
ArrayRef< KnownHeader > findAllModulesForHeader(FileEntryRef File)
Retrieve all the modules that contain the given header file.
Module * createImplicitGlobalModuleFragmentForModuleUnit(SourceLocation Loc, Module *Parent)
void loadAllParsedModules()
Module * createModuleUnitWithKind(SourceLocation Loc, StringRef Name, Module::ModuleKind Kind)
Create a new C++ module with the specified kind, and reparent any pending global module fragment(s) t...
Module * findOrLoadModule(StringRef Name)
static ModuleHeaderRole headerKindToRole(Module::HeaderKind Kind)
Convert a header kind to a role. Requires Kind to not be HK_Excluded.
Definition ModuleMap.cpp:88
bool resolveUses(Module *Mod, bool Complain)
Resolve all of the unresolved uses in the given module.
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
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
SourceLocation UmbrellaDeclLoc
The location of the umbrella header or directory declaration.
Definition Module.h:404
bool directlyUses(const Module *Requested)
Determine whether this module has declared its intention to directly use another module.
Definition Module.cpp:287
std::pair< ModuleRef, bool > ExportDecl
Describes an exported module.
Definition Module.h:668
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
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 * 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
@ HK_PrivateTextual
Definition Module.h:482
bool fullModuleNameIs(ArrayRef< StringRef > nameParts) const
Whether the full name of this module is equal to joining nameParts with "."s.
Definition Module.cpp:254
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
bool isSubFramework() const
Determine whether this module is a subframework of another framework.
Definition Module.h:835
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
void addHeader(HeaderKind HK, Header H)
Definition Module.h:508
std::string UmbrellaRelativeToRootModuleDirectory
Definition Module.h:413
OptionalDirectoryEntryRef Directory
The build directory of this module.
Definition Module.h:394
ModuleRef findSubmodule(StringRef Name) const
Find the submodule with the given name.
Definition Module.cpp:350
ArrayRef< Header > getHeaders(HeaderKind HK) const
Definition Module.h:502
unsigned InferExportWildcard
Whether, when inferring submodules, the inferr submodules should export all modules they import (e....
Definition Module.h:616
std::vector< UnresolvedConflict > UnresolvedConflicts
The list of conflicts for which the module-id has not yet been resolved.
Definition Module.h:741
bool isSubModuleOf(const Module *Other) const
Check if this module is a (possibly transitive) submodule of Other.
Definition Module.cpp:193
bool isPartOfFramework() const
Determine whether this module is a part of a framework, either because it is a framework module or be...
Definition Module.h:825
bool isAvailable() const
Determine whether this module is available for use within the current translation unit.
Definition Module.h:786
@ ModuleImplementationUnit
This is a C++20 module implementation unit.
Definition Module.h:363
@ ImplicitGlobalModuleFragment
This is an implicit fragment of the global module which contains only language linkage declarations (...
Definition Module.h:381
@ ModuleInterfaceUnit
This is a C++20 module interface unit.
Definition Module.h:360
@ ModuleHeaderUnit
This is a C++20 header unit.
Definition Module.h:357
@ PrivateModuleFragment
This is the private module fragment within some C++ module.
Definition Module.h:376
@ ExplicitGlobalModuleFragment
This is the explicit Global Module Fragment of a modular TU.
Definition Module.h:373
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
std::string UmbrellaAsWritten
The name of the umbrella entry, as written in the module map.
Definition Module.h:410
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
OptionalDirectoryEntryRef getEffectiveUmbrellaDir() const
Get the effective umbrella directory for this module: either the one explicitly written in the module...
Definition Module.cpp:263
bool UseExportAsModuleLinkName
Autolinking uses the framework name for linking purposes when this is false and the export_as name ot...
Definition Module.h:724
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.
This class handles loading and caching of source files into memory.
Exposes information about the current target.
Definition TargetInfo.h:227
Defines the clang::TargetInfo interface.
unsigned kind
All of the diagnostics that can be emitted by the frontend.
bool Sub(InterpState &S, CodePtr OpPC)
Definition Interp.h:410
std::optional< ModuleMapFile > parseModuleMap(FileID ID, clang::DirectoryEntryRef Dir, SourceManager &SM, DiagnosticsEngine &Diags, bool IsSystem, bool ImplicitlyDiscovered, unsigned *Offset)
Parse a module map file into an in memory representation.
std::variant< struct RequiresDecl, struct HeaderDecl, struct UmbrellaDirDecl, struct ModuleDecl, struct ExcludeDecl, struct ExportDecl, struct ExportAsDecl, struct ExternModuleDecl, struct UseDecl, struct LinkDecl, struct ConfigMacrosDecl, struct ConflictDecl > Decl
All declarations that can appear in a module declaration.
The JSON file list parser is used to communicate input to InstallAPI.
CustomizableOptional< FileEntryRef > OptionalFileEntryRef
Definition FileEntry.h:208
LLVM_READONLY bool isAsciiIdentifierContinue(unsigned char c)
Definition CharInfo.h:61
SmallVector< std::pair< std::string, SourceLocation >, 2 > ModuleId
Describes the name of a module.
Definition Module.h:63
@ Private
'private' clause, allowed on 'parallel', 'serial', 'loop', 'parallel loop', and 'serial loop' constru...
LLVM_READONLY bool isValidAsciiIdentifier(StringRef S, bool AllowDollar=false)
Return true if this is a valid ASCII identifier.
Definition CharInfo.h:244
@ Module
Module linkage, which indicates that the entity can be referred to from other translation units withi...
Definition Linkage.h:54
@ Result
The result type of a method or function.
Definition TypeBase.h:905
LLVM_READONLY bool isDigit(unsigned char c)
Return true if this character is an ASCII digit: [0-9].
Definition CharInfo.h:114
@ Keyword
The name has been typo-corrected to a keyword.
Definition Sema.h:562
CustomizableOptional< DirectoryEntryRef > OptionalDirectoryEntryRef
@ Other
Other implicit parameter.
Definition Decl.h:1763
int const char * function
Definition c++config.h:31
unsigned IsExternC
Whether this is an extern "C" module.
Definition Module.h:256
unsigned IsSystem
Whether this is a system module.
Definition Module.h:252
unsigned NoUndeclaredIncludes
Whether files in this module can only include non-modular headers and headers from used modules.
Definition Module.h:265
A conflict between two modules.
Definition Module.h:744
std::string Message
The message provided to the user when there is a conflict.
Definition Module.h:749
ModuleRef Other
The module that this module conflicts with.
Definition Module.h:746
Information about a header directive as found in the module map file.
Definition Module.h:487
std::string NameAsWritten
Definition Module.h:488
FileEntryRef Entry
Definition Module.h:490
A library or framework to link against when an entity from this module is used.
Definition Module.h:703
std::string Message
The message provided to the user when there is a conflict.
Definition Module.h:736
ModuleId Id
The (unresolved) module id.
Definition Module.h:733
Describes an exported module that has not yet been resolved (perhaps because the module it refers to ...
Definition Module.h:675
Stored information about a header directive that was found in the module map file but has not been re...
Definition Module.h:525
std::optional< time_t > ModTime
Definition Module.h:532
std::vector< StringRef > Macros
std::optional< int64_t > Size
std::optional< int64_t > MTime
ModuleAttributes Attrs
Points to the first keyword in the decl.
std::vector< Decl > Decls
Represents the parsed form of a module map file.
std::vector< TopLevelDecl > Decls
FileID ID
The FileID used to parse this module map. This is always a local ID.
OptionalDirectoryEntryRef Dir
The directory in which the module map was discovered.
std::vector< RequiresFeature > Features