llvm-project

Форк
0
/
ModuleMap.cpp 
3164 строки · 103.8 Кб
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"
15
#include "clang/Basic/CharInfo.h"
16
#include "clang/Basic/Diagnostic.h"
17
#include "clang/Basic/FileManager.h"
18
#include "clang/Basic/LLVM.h"
19
#include "clang/Basic/LangOptions.h"
20
#include "clang/Basic/Module.h"
21
#include "clang/Basic/SourceLocation.h"
22
#include "clang/Basic/SourceManager.h"
23
#include "clang/Basic/TargetInfo.h"
24
#include "clang/Lex/HeaderSearch.h"
25
#include "clang/Lex/HeaderSearchOptions.h"
26
#include "clang/Lex/LexDiagnostic.h"
27
#include "clang/Lex/Lexer.h"
28
#include "clang/Lex/LiteralSupport.h"
29
#include "clang/Lex/Token.h"
30
#include "llvm/ADT/DenseMap.h"
31
#include "llvm/ADT/STLExtras.h"
32
#include "llvm/ADT/SmallPtrSet.h"
33
#include "llvm/ADT/SmallString.h"
34
#include "llvm/ADT/SmallVector.h"
35
#include "llvm/ADT/StringMap.h"
36
#include "llvm/ADT/StringRef.h"
37
#include "llvm/ADT/StringSwitch.h"
38
#include "llvm/Support/Allocator.h"
39
#include "llvm/Support/Compiler.h"
40
#include "llvm/Support/ErrorHandling.h"
41
#include "llvm/Support/MemoryBuffer.h"
42
#include "llvm/Support/Path.h"
43
#include "llvm/Support/VirtualFileSystem.h"
44
#include "llvm/Support/raw_ostream.h"
45
#include <algorithm>
46
#include <cassert>
47
#include <cstdint>
48
#include <cstring>
49
#include <optional>
50
#include <string>
51
#include <system_error>
52
#include <utility>
53

54
using namespace clang;
55

56
void ModuleMapCallbacks::anchor() {}
57

58
void ModuleMap::resolveLinkAsDependencies(Module *Mod) {
59
  auto PendingLinkAs = PendingLinkAsModule.find(Mod->Name);
60
  if (PendingLinkAs != PendingLinkAsModule.end()) {
61
    for (auto &Name : PendingLinkAs->second) {
62
      auto *M = findModule(Name.getKey());
63
      if (M)
64
        M->UseExportAsModuleLinkName = true;
65
    }
66
  }
67
}
68

69
void ModuleMap::addLinkAsDependency(Module *Mod) {
70
  if (findModule(Mod->ExportAsModule))
71
    Mod->UseExportAsModuleLinkName = true;
72
  else
73
    PendingLinkAsModule[Mod->ExportAsModule].insert(Mod->Name);
74
}
75

76
Module::HeaderKind ModuleMap::headerRoleToKind(ModuleHeaderRole Role) {
77
  switch ((int)Role) {
78
  case NormalHeader:
79
    return Module::HK_Normal;
80
  case PrivateHeader:
81
    return Module::HK_Private;
82
  case TextualHeader:
83
    return Module::HK_Textual;
84
  case PrivateHeader | TextualHeader:
85
    return Module::HK_PrivateTextual;
86
  case ExcludedHeader:
87
    return Module::HK_Excluded;
88
  }
89
  llvm_unreachable("unknown header role");
90
}
91

92
ModuleMap::ModuleHeaderRole
93
ModuleMap::headerKindToRole(Module::HeaderKind Kind) {
94
  switch ((int)Kind) {
95
  case Module::HK_Normal:
96
    return NormalHeader;
97
  case Module::HK_Private:
98
    return PrivateHeader;
99
  case Module::HK_Textual:
100
    return TextualHeader;
101
  case Module::HK_PrivateTextual:
102
    return ModuleHeaderRole(PrivateHeader | TextualHeader);
103
  case Module::HK_Excluded:
104
    return ExcludedHeader;
105
  }
106
  llvm_unreachable("unknown header kind");
107
}
108

109
bool ModuleMap::isModular(ModuleHeaderRole Role) {
110
  return !(Role & (ModuleMap::TextualHeader | ModuleMap::ExcludedHeader));
111
}
112

113
Module::ExportDecl
114
ModuleMap::resolveExport(Module *Mod,
115
                         const Module::UnresolvedExportDecl &Unresolved,
116
                         bool Complain) const {
117
  // We may have just a wildcard.
118
  if (Unresolved.Id.empty()) {
119
    assert(Unresolved.Wildcard && "Invalid unresolved export");
120
    return Module::ExportDecl(nullptr, true);
121
  }
122

123
  // Resolve the module-id.
124
  Module *Context = resolveModuleId(Unresolved.Id, Mod, Complain);
125
  if (!Context)
126
    return {};
127

128
  return Module::ExportDecl(Context, Unresolved.Wildcard);
129
}
130

131
Module *ModuleMap::resolveModuleId(const ModuleId &Id, Module *Mod,
132
                                   bool Complain) const {
133
  // Find the starting module.
134
  Module *Context = lookupModuleUnqualified(Id[0].first, Mod);
135
  if (!Context) {
136
    if (Complain)
137
      Diags.Report(Id[0].second, diag::err_mmap_missing_module_unqualified)
138
      << Id[0].first << Mod->getFullModuleName();
139

140
    return nullptr;
141
  }
142

143
  // Dig into the module path.
144
  for (unsigned I = 1, N = Id.size(); I != N; ++I) {
145
    Module *Sub = lookupModuleQualified(Id[I].first, Context);
146
    if (!Sub) {
147
      if (Complain)
148
        Diags.Report(Id[I].second, diag::err_mmap_missing_module_qualified)
149
        << Id[I].first << Context->getFullModuleName()
150
        << SourceRange(Id[0].second, Id[I-1].second);
151

152
      return nullptr;
153
    }
154

155
    Context = Sub;
156
  }
157

158
  return Context;
159
}
160

161
/// Append to \p Paths the set of paths needed to get to the
162
/// subframework in which the given module lives.
163
static void appendSubframeworkPaths(Module *Mod,
164
                                    SmallVectorImpl<char> &Path) {
165
  // Collect the framework names from the given module to the top-level module.
166
  SmallVector<StringRef, 2> Paths;
167
  for (; Mod; Mod = Mod->Parent) {
168
    if (Mod->IsFramework)
169
      Paths.push_back(Mod->Name);
170
  }
171

172
  if (Paths.empty())
173
    return;
174

175
  // Add Frameworks/Name.framework for each subframework.
176
  for (StringRef Framework : llvm::drop_begin(llvm::reverse(Paths)))
177
    llvm::sys::path::append(Path, "Frameworks", Framework + ".framework");
178
}
179

180
OptionalFileEntryRef ModuleMap::findHeader(
181
    Module *M, const Module::UnresolvedHeaderDirective &Header,
182
    SmallVectorImpl<char> &RelativePathName, bool &NeedsFramework) {
183
  // Search for the header file within the module's home directory.
184
  auto Directory = M->Directory;
185
  SmallString<128> FullPathName(Directory->getName());
186

187
  auto GetFile = [&](StringRef Filename) -> OptionalFileEntryRef {
188
    auto File =
189
        expectedToOptional(SourceMgr.getFileManager().getFileRef(Filename));
190
    if (!File || (Header.Size && File->getSize() != *Header.Size) ||
191
        (Header.ModTime && File->getModificationTime() != *Header.ModTime))
192
      return std::nullopt;
193
    return *File;
194
  };
195

196
  auto GetFrameworkFile = [&]() -> OptionalFileEntryRef {
197
    unsigned FullPathLength = FullPathName.size();
198
    appendSubframeworkPaths(M, RelativePathName);
199
    unsigned RelativePathLength = RelativePathName.size();
200

201
    // Check whether this file is in the public headers.
202
    llvm::sys::path::append(RelativePathName, "Headers", Header.FileName);
203
    llvm::sys::path::append(FullPathName, RelativePathName);
204
    if (auto File = GetFile(FullPathName))
205
      return File;
206

207
    // Check whether this file is in the private headers.
208
    // Ideally, private modules in the form 'FrameworkName.Private' should
209
    // be defined as 'module FrameworkName.Private', and not as
210
    // 'framework module FrameworkName.Private', since a 'Private.Framework'
211
    // does not usually exist. However, since both are currently widely used
212
    // for private modules, make sure we find the right path in both cases.
213
    if (M->IsFramework && M->Name == "Private")
214
      RelativePathName.clear();
215
    else
216
      RelativePathName.resize(RelativePathLength);
217
    FullPathName.resize(FullPathLength);
218
    llvm::sys::path::append(RelativePathName, "PrivateHeaders",
219
                            Header.FileName);
220
    llvm::sys::path::append(FullPathName, RelativePathName);
221
    return GetFile(FullPathName);
222
  };
223

224
  if (llvm::sys::path::is_absolute(Header.FileName)) {
225
    RelativePathName.clear();
226
    RelativePathName.append(Header.FileName.begin(), Header.FileName.end());
227
    return GetFile(Header.FileName);
228
  }
229

230
  if (M->isPartOfFramework())
231
    return GetFrameworkFile();
232

233
  // Lookup for normal headers.
234
  llvm::sys::path::append(RelativePathName, Header.FileName);
235
  llvm::sys::path::append(FullPathName, RelativePathName);
236
  auto NormalHdrFile = GetFile(FullPathName);
237

238
  if (!NormalHdrFile && Directory->getName().ends_with(".framework")) {
239
    // The lack of 'framework' keyword in a module declaration it's a simple
240
    // mistake we can diagnose when the header exists within the proper
241
    // framework style path.
242
    FullPathName.assign(Directory->getName());
243
    RelativePathName.clear();
244
    if (GetFrameworkFile()) {
245
      Diags.Report(Header.FileNameLoc,
246
                   diag::warn_mmap_incomplete_framework_module_declaration)
247
          << Header.FileName << M->getFullModuleName();
248
      NeedsFramework = true;
249
    }
250
    return std::nullopt;
251
  }
252

253
  return NormalHdrFile;
254
}
255

256
/// Determine whether the given file name is the name of a builtin
257
/// header, supplied by Clang to replace, override, or augment existing system
258
/// headers.
259
static bool isBuiltinHeaderName(StringRef FileName) {
260
  return llvm::StringSwitch<bool>(FileName)
261
           .Case("float.h", true)
262
           .Case("iso646.h", true)
263
           .Case("limits.h", true)
264
           .Case("stdalign.h", true)
265
           .Case("stdarg.h", true)
266
           .Case("stdatomic.h", true)
267
           .Case("stdbool.h", true)
268
           .Case("stddef.h", true)
269
           .Case("stdint.h", true)
270
           .Case("tgmath.h", true)
271
           .Case("unwind.h", true)
272
           .Default(false);
273
}
274

275
/// Determine whether the given module name is the name of a builtin
276
/// module that is cyclic with a system module  on some platforms.
277
static bool isBuiltInModuleName(StringRef ModuleName) {
278
  return llvm::StringSwitch<bool>(ModuleName)
279
           .Case("_Builtin_float", true)
280
           .Case("_Builtin_inttypes", true)
281
           .Case("_Builtin_iso646", true)
282
           .Case("_Builtin_limits", true)
283
           .Case("_Builtin_stdalign", true)
284
           .Case("_Builtin_stdarg", true)
285
           .Case("_Builtin_stdatomic", true)
286
           .Case("_Builtin_stdbool", true)
287
           .Case("_Builtin_stddef", true)
288
           .Case("_Builtin_stdint", true)
289
           .Case("_Builtin_stdnoreturn", true)
290
           .Case("_Builtin_tgmath", true)
291
           .Case("_Builtin_unwind", true)
292
           .Default(false);
293
}
294

295
void ModuleMap::resolveHeader(Module *Mod,
296
                              const Module::UnresolvedHeaderDirective &Header,
297
                              bool &NeedsFramework) {
298
  SmallString<128> RelativePathName;
299
  if (OptionalFileEntryRef File =
300
          findHeader(Mod, Header, RelativePathName, NeedsFramework)) {
301
    if (Header.IsUmbrella) {
302
      const DirectoryEntry *UmbrellaDir = &File->getDir().getDirEntry();
303
      if (Module *UmbrellaMod = UmbrellaDirs[UmbrellaDir])
304
        Diags.Report(Header.FileNameLoc, diag::err_mmap_umbrella_clash)
305
          << UmbrellaMod->getFullModuleName();
306
      else
307
        // Record this umbrella header.
308
        setUmbrellaHeaderAsWritten(Mod, *File, Header.FileName,
309
                                   RelativePathName.str());
310
    } else {
311
      Module::Header H = {Header.FileName, std::string(RelativePathName),
312
                          *File};
313
      addHeader(Mod, H, headerKindToRole(Header.Kind));
314
    }
315
  } else if (Header.HasBuiltinHeader && !Header.Size && !Header.ModTime) {
316
    // There's a builtin header but no corresponding on-disk header. Assume
317
    // this was supposed to modularize the builtin header alone.
318
  } else if (Header.Kind == Module::HK_Excluded) {
319
    // Ignore missing excluded header files. They're optional anyway.
320
  } else {
321
    // If we find a module that has a missing header, we mark this module as
322
    // unavailable and store the header directive for displaying diagnostics.
323
    Mod->MissingHeaders.push_back(Header);
324
    // A missing header with stat information doesn't make the module
325
    // unavailable; this keeps our behavior consistent as headers are lazily
326
    // resolved. (Such a module still can't be built though, except from
327
    // preprocessed source.)
328
    if (!Header.Size && !Header.ModTime)
329
      Mod->markUnavailable(/*Unimportable=*/false);
330
  }
331
}
332

333
bool ModuleMap::resolveAsBuiltinHeader(
334
    Module *Mod, const Module::UnresolvedHeaderDirective &Header) {
335
  if (Header.Kind == Module::HK_Excluded ||
336
      llvm::sys::path::is_absolute(Header.FileName) ||
337
      Mod->isPartOfFramework() || !Mod->IsSystem || Header.IsUmbrella ||
338
      !BuiltinIncludeDir || BuiltinIncludeDir == Mod->Directory ||
339
      !LangOpts.BuiltinHeadersInSystemModules || !isBuiltinHeaderName(Header.FileName))
340
    return false;
341

342
  // This is a system module with a top-level header. This header
343
  // may have a counterpart (or replacement) in the set of headers
344
  // supplied by Clang. Find that builtin header.
345
  SmallString<128> Path;
346
  llvm::sys::path::append(Path, BuiltinIncludeDir->getName(), Header.FileName);
347
  auto File = SourceMgr.getFileManager().getOptionalFileRef(Path);
348
  if (!File)
349
    return false;
350

351
  Module::Header H = {Header.FileName, Header.FileName, *File};
352
  auto Role = headerKindToRole(Header.Kind);
353
  addHeader(Mod, H, Role);
354
  return true;
355
}
356

357
ModuleMap::ModuleMap(SourceManager &SourceMgr, DiagnosticsEngine &Diags,
358
                     const LangOptions &LangOpts, const TargetInfo *Target,
359
                     HeaderSearch &HeaderInfo)
360
    : SourceMgr(SourceMgr), Diags(Diags), LangOpts(LangOpts), Target(Target),
361
      HeaderInfo(HeaderInfo) {
362
  MMapLangOpts.LineComment = true;
363
}
364

365
ModuleMap::~ModuleMap() {
366
  for (auto &M : Modules)
367
    delete M.getValue();
368
  for (auto *M : ShadowModules)
369
    delete M;
370
}
371

372
void ModuleMap::setTarget(const TargetInfo &Target) {
373
  assert((!this->Target || this->Target == &Target) &&
374
         "Improper target override");
375
  this->Target = &Target;
376
}
377

378
/// "Sanitize" a filename so that it can be used as an identifier.
379
static StringRef sanitizeFilenameAsIdentifier(StringRef Name,
380
                                              SmallVectorImpl<char> &Buffer) {
381
  if (Name.empty())
382
    return Name;
383

384
  if (!isValidAsciiIdentifier(Name)) {
385
    // If we don't already have something with the form of an identifier,
386
    // create a buffer with the sanitized name.
387
    Buffer.clear();
388
    if (isDigit(Name[0]))
389
      Buffer.push_back('_');
390
    Buffer.reserve(Buffer.size() + Name.size());
391
    for (unsigned I = 0, N = Name.size(); I != N; ++I) {
392
      if (isAsciiIdentifierContinue(Name[I]))
393
        Buffer.push_back(Name[I]);
394
      else
395
        Buffer.push_back('_');
396
    }
397

398
    Name = StringRef(Buffer.data(), Buffer.size());
399
  }
400

401
  while (llvm::StringSwitch<bool>(Name)
402
#define KEYWORD(Keyword,Conditions) .Case(#Keyword, true)
403
#define ALIAS(Keyword, AliasOf, Conditions) .Case(Keyword, true)
404
#include "clang/Basic/TokenKinds.def"
405
           .Default(false)) {
406
    if (Name.data() != Buffer.data())
407
      Buffer.append(Name.begin(), Name.end());
408
    Buffer.push_back('_');
409
    Name = StringRef(Buffer.data(), Buffer.size());
410
  }
411

412
  return Name;
413
}
414

415
bool ModuleMap::isBuiltinHeader(FileEntryRef File) {
416
  return File.getDir() == BuiltinIncludeDir && LangOpts.BuiltinHeadersInSystemModules &&
417
         isBuiltinHeaderName(llvm::sys::path::filename(File.getName()));
418
}
419

420
bool ModuleMap::shouldImportRelativeToBuiltinIncludeDir(StringRef FileName,
421
                                                        Module *Module) const {
422
  return LangOpts.BuiltinHeadersInSystemModules && BuiltinIncludeDir &&
423
         Module->IsSystem && !Module->isPartOfFramework() &&
424
         isBuiltinHeaderName(FileName);
425
}
426

427
ModuleMap::HeadersMap::iterator ModuleMap::findKnownHeader(FileEntryRef File) {
428
  resolveHeaderDirectives(File);
429
  HeadersMap::iterator Known = Headers.find(File);
430
  if (HeaderInfo.getHeaderSearchOpts().ImplicitModuleMaps &&
431
      Known == Headers.end() && ModuleMap::isBuiltinHeader(File)) {
432
    HeaderInfo.loadTopLevelSystemModules();
433
    return Headers.find(File);
434
  }
435
  return Known;
436
}
437

438
ModuleMap::KnownHeader ModuleMap::findHeaderInUmbrellaDirs(
439
    FileEntryRef File, SmallVectorImpl<DirectoryEntryRef> &IntermediateDirs) {
440
  if (UmbrellaDirs.empty())
441
    return {};
442

443
  OptionalDirectoryEntryRef Dir = File.getDir();
444

445
  // Note: as an egregious but useful hack we use the real path here, because
446
  // frameworks moving from top-level frameworks to embedded frameworks tend
447
  // to be symlinked from the top-level location to the embedded location,
448
  // and we need to resolve lookups as if we had found the embedded location.
449
  StringRef DirName = SourceMgr.getFileManager().getCanonicalName(*Dir);
450

451
  // Keep walking up the directory hierarchy, looking for a directory with
452
  // an umbrella header.
453
  do {
454
    auto KnownDir = UmbrellaDirs.find(*Dir);
455
    if (KnownDir != UmbrellaDirs.end())
456
      return KnownHeader(KnownDir->second, NormalHeader);
457

458
    IntermediateDirs.push_back(*Dir);
459

460
    // Retrieve our parent path.
461
    DirName = llvm::sys::path::parent_path(DirName);
462
    if (DirName.empty())
463
      break;
464

465
    // Resolve the parent path to a directory entry.
466
    Dir = SourceMgr.getFileManager().getOptionalDirectoryRef(DirName);
467
  } while (Dir);
468
  return {};
469
}
470

471
static bool violatesPrivateInclude(Module *RequestingModule,
472
                                   const FileEntry *IncFileEnt,
473
                                   ModuleMap::KnownHeader Header) {
474
#ifndef NDEBUG
475
  if (Header.getRole() & ModuleMap::PrivateHeader) {
476
    // Check for consistency between the module header role
477
    // as obtained from the lookup and as obtained from the module.
478
    // This check is not cheap, so enable it only for debugging.
479
    bool IsPrivate = false;
480
    SmallVectorImpl<Module::Header> *HeaderList[] = {
481
        &Header.getModule()->Headers[Module::HK_Private],
482
        &Header.getModule()->Headers[Module::HK_PrivateTextual]};
483
    for (auto *Hs : HeaderList)
484
      IsPrivate |= llvm::any_of(
485
          *Hs, [&](const Module::Header &H) { return H.Entry == IncFileEnt; });
486
    assert(IsPrivate && "inconsistent headers and roles");
487
  }
488
#endif
489
  return !Header.isAccessibleFrom(RequestingModule);
490
}
491

492
static Module *getTopLevelOrNull(Module *M) {
493
  return M ? M->getTopLevelModule() : nullptr;
494
}
495

496
void ModuleMap::diagnoseHeaderInclusion(Module *RequestingModule,
497
                                        bool RequestingModuleIsModuleInterface,
498
                                        SourceLocation FilenameLoc,
499
                                        StringRef Filename, FileEntryRef File) {
500
  // No errors for indirect modules. This may be a bit of a problem for modules
501
  // with no source files.
502
  if (getTopLevelOrNull(RequestingModule) != getTopLevelOrNull(SourceModule))
503
    return;
504

505
  if (RequestingModule) {
506
    resolveUses(RequestingModule, /*Complain=*/false);
507
    resolveHeaderDirectives(RequestingModule, /*File=*/std::nullopt);
508
  }
509

510
  bool Excluded = false;
511
  Module *Private = nullptr;
512
  Module *NotUsed = nullptr;
513

514
  HeadersMap::iterator Known = findKnownHeader(File);
515
  if (Known != Headers.end()) {
516
    for (const KnownHeader &Header : Known->second) {
517
      // Excluded headers don't really belong to a module.
518
      if (Header.getRole() == ModuleMap::ExcludedHeader) {
519
        Excluded = true;
520
        continue;
521
      }
522

523
      // Remember private headers for later printing of a diagnostic.
524
      if (violatesPrivateInclude(RequestingModule, File, Header)) {
525
        Private = Header.getModule();
526
        continue;
527
      }
528

529
      // If uses need to be specified explicitly, we are only allowed to return
530
      // modules that are explicitly used by the requesting module.
531
      if (RequestingModule && LangOpts.ModulesDeclUse &&
532
          !RequestingModule->directlyUses(Header.getModule())) {
533
        NotUsed = Header.getModule();
534
        continue;
535
      }
536

537
      // We have found a module that we can happily use.
538
      return;
539
    }
540

541
    Excluded = true;
542
  }
543

544
  // We have found a header, but it is private.
545
  if (Private) {
546
    Diags.Report(FilenameLoc, diag::warn_use_of_private_header_outside_module)
547
        << Filename;
548
    return;
549
  }
550

551
  // We have found a module, but we don't use it.
552
  if (NotUsed) {
553
    Diags.Report(FilenameLoc, diag::err_undeclared_use_of_module_indirect)
554
        << RequestingModule->getTopLevelModule()->Name << Filename
555
        << NotUsed->Name;
556
    return;
557
  }
558

559
  if (Excluded || isHeaderInUmbrellaDirs(File))
560
    return;
561

562
  // At this point, only non-modular includes remain.
563

564
  if (RequestingModule && LangOpts.ModulesStrictDeclUse) {
565
    Diags.Report(FilenameLoc, diag::err_undeclared_use_of_module)
566
        << RequestingModule->getTopLevelModule()->Name << Filename;
567
  } else if (RequestingModule && RequestingModuleIsModuleInterface &&
568
             LangOpts.isCompilingModule()) {
569
    // Do not diagnose when we are not compiling a module.
570
    diag::kind DiagID = RequestingModule->getTopLevelModule()->IsFramework ?
571
        diag::warn_non_modular_include_in_framework_module :
572
        diag::warn_non_modular_include_in_module;
573
    Diags.Report(FilenameLoc, DiagID) << RequestingModule->getFullModuleName()
574
        << File.getName();
575
  }
576
}
577

578
static bool isBetterKnownHeader(const ModuleMap::KnownHeader &New,
579
                                const ModuleMap::KnownHeader &Old) {
580
  // Prefer available modules.
581
  // FIXME: Considering whether the module is available rather than merely
582
  // importable is non-hermetic and can result in surprising behavior for
583
  // prebuilt modules. Consider only checking for importability here.
584
  if (New.getModule()->isAvailable() && !Old.getModule()->isAvailable())
585
    return true;
586

587
  // Prefer a public header over a private header.
588
  if ((New.getRole() & ModuleMap::PrivateHeader) !=
589
      (Old.getRole() & ModuleMap::PrivateHeader))
590
    return !(New.getRole() & ModuleMap::PrivateHeader);
591

592
  // Prefer a non-textual header over a textual header.
593
  if ((New.getRole() & ModuleMap::TextualHeader) !=
594
      (Old.getRole() & ModuleMap::TextualHeader))
595
    return !(New.getRole() & ModuleMap::TextualHeader);
596

597
  // Prefer a non-excluded header over an excluded header.
598
  if ((New.getRole() == ModuleMap::ExcludedHeader) !=
599
      (Old.getRole() == ModuleMap::ExcludedHeader))
600
    return New.getRole() != ModuleMap::ExcludedHeader;
601

602
  // Don't have a reason to choose between these. Just keep the first one.
603
  return false;
604
}
605

606
ModuleMap::KnownHeader ModuleMap::findModuleForHeader(FileEntryRef File,
607
                                                      bool AllowTextual,
608
                                                      bool AllowExcluded) {
609
  auto MakeResult = [&](ModuleMap::KnownHeader R) -> ModuleMap::KnownHeader {
610
    if (!AllowTextual && R.getRole() & ModuleMap::TextualHeader)
611
      return {};
612
    return R;
613
  };
614

615
  HeadersMap::iterator Known = findKnownHeader(File);
616
  if (Known != Headers.end()) {
617
    ModuleMap::KnownHeader Result;
618
    // Iterate over all modules that 'File' is part of to find the best fit.
619
    for (KnownHeader &H : Known->second) {
620
      // Cannot use a module if the header is excluded in it.
621
      if (!AllowExcluded && H.getRole() == ModuleMap::ExcludedHeader)
622
        continue;
623
      // Prefer a header from the source module over all others.
624
      if (H.getModule()->getTopLevelModule() == SourceModule)
625
        return MakeResult(H);
626
      if (!Result || isBetterKnownHeader(H, Result))
627
        Result = H;
628
    }
629
    return MakeResult(Result);
630
  }
631

632
  return MakeResult(findOrCreateModuleForHeaderInUmbrellaDir(File));
633
}
634

635
ModuleMap::KnownHeader
636
ModuleMap::findOrCreateModuleForHeaderInUmbrellaDir(FileEntryRef File) {
637
  assert(!Headers.count(File) && "already have a module for this header");
638

639
  SmallVector<DirectoryEntryRef, 2> SkippedDirs;
640
  KnownHeader H = findHeaderInUmbrellaDirs(File, SkippedDirs);
641
  if (H) {
642
    Module *Result = H.getModule();
643

644
    // Search up the module stack until we find a module with an umbrella
645
    // directory.
646
    Module *UmbrellaModule = Result;
647
    while (!UmbrellaModule->getEffectiveUmbrellaDir() && UmbrellaModule->Parent)
648
      UmbrellaModule = UmbrellaModule->Parent;
649

650
    if (UmbrellaModule->InferSubmodules) {
651
      FileID UmbrellaModuleMap = getModuleMapFileIDForUniquing(UmbrellaModule);
652

653
      // Infer submodules for each of the directories we found between
654
      // the directory of the umbrella header and the directory where
655
      // the actual header is located.
656
      bool Explicit = UmbrellaModule->InferExplicitSubmodules;
657

658
      for (DirectoryEntryRef SkippedDir : llvm::reverse(SkippedDirs)) {
659
        // Find or create the module that corresponds to this directory name.
660
        SmallString<32> NameBuf;
661
        StringRef Name = sanitizeFilenameAsIdentifier(
662
            llvm::sys::path::stem(SkippedDir.getName()), NameBuf);
663
        Result = findOrCreateModule(Name, Result, /*IsFramework=*/false,
664
                                    Explicit).first;
665
        InferredModuleAllowedBy[Result] = UmbrellaModuleMap;
666
        Result->IsInferred = true;
667

668
        // Associate the module and the directory.
669
        UmbrellaDirs[SkippedDir] = Result;
670

671
        // If inferred submodules export everything they import, add a
672
        // wildcard to the set of exports.
673
        if (UmbrellaModule->InferExportWildcard && Result->Exports.empty())
674
          Result->Exports.push_back(Module::ExportDecl(nullptr, true));
675
      }
676

677
      // Infer a submodule with the same name as this header file.
678
      SmallString<32> NameBuf;
679
      StringRef Name = sanitizeFilenameAsIdentifier(
680
                         llvm::sys::path::stem(File.getName()), NameBuf);
681
      Result = findOrCreateModule(Name, Result, /*IsFramework=*/false,
682
                                  Explicit).first;
683
      InferredModuleAllowedBy[Result] = UmbrellaModuleMap;
684
      Result->IsInferred = true;
685
      Result->addTopHeader(File);
686

687
      // If inferred submodules export everything they import, add a
688
      // wildcard to the set of exports.
689
      if (UmbrellaModule->InferExportWildcard && Result->Exports.empty())
690
        Result->Exports.push_back(Module::ExportDecl(nullptr, true));
691
    } else {
692
      // Record each of the directories we stepped through as being part of
693
      // the module we found, since the umbrella header covers them all.
694
      for (unsigned I = 0, N = SkippedDirs.size(); I != N; ++I)
695
        UmbrellaDirs[SkippedDirs[I]] = Result;
696
    }
697

698
    KnownHeader Header(Result, NormalHeader);
699
    Headers[File].push_back(Header);
700
    return Header;
701
  }
702

703
  return {};
704
}
705

706
ArrayRef<ModuleMap::KnownHeader>
707
ModuleMap::findAllModulesForHeader(FileEntryRef File) {
708
  HeadersMap::iterator Known = findKnownHeader(File);
709
  if (Known != Headers.end())
710
    return Known->second;
711

712
  if (findOrCreateModuleForHeaderInUmbrellaDir(File))
713
    return Headers.find(File)->second;
714

715
  return std::nullopt;
716
}
717

718
ArrayRef<ModuleMap::KnownHeader>
719
ModuleMap::findResolvedModulesForHeader(FileEntryRef File) const {
720
  // FIXME: Is this necessary?
721
  resolveHeaderDirectives(File);
722
  auto It = Headers.find(File);
723
  if (It == Headers.end())
724
    return std::nullopt;
725
  return It->second;
726
}
727

728
bool ModuleMap::isHeaderInUnavailableModule(FileEntryRef Header) const {
729
  return isHeaderUnavailableInModule(Header, nullptr);
730
}
731

732
bool ModuleMap::isHeaderUnavailableInModule(
733
    FileEntryRef Header, const Module *RequestingModule) const {
734
  resolveHeaderDirectives(Header);
735
  HeadersMap::const_iterator Known = Headers.find(Header);
736
  if (Known != Headers.end()) {
737
    for (SmallVectorImpl<KnownHeader>::const_iterator
738
             I = Known->second.begin(),
739
             E = Known->second.end();
740
         I != E; ++I) {
741

742
      if (I->getRole() == ModuleMap::ExcludedHeader)
743
        continue;
744

745
      if (I->isAvailable() &&
746
          (!RequestingModule ||
747
           I->getModule()->isSubModuleOf(RequestingModule))) {
748
        // When no requesting module is available, the caller is looking if a
749
        // header is part a module by only looking into the module map. This is
750
        // done by warn_uncovered_module_header checks; don't consider textual
751
        // headers part of it in this mode, otherwise we get misleading warnings
752
        // that a umbrella header is not including a textual header.
753
        if (!RequestingModule && I->getRole() == ModuleMap::TextualHeader)
754
          continue;
755
        return false;
756
      }
757
    }
758
    return true;
759
  }
760

761
  OptionalDirectoryEntryRef Dir = Header.getDir();
762
  SmallVector<DirectoryEntryRef, 2> SkippedDirs;
763
  StringRef DirName = Dir->getName();
764

765
  auto IsUnavailable = [&](const Module *M) {
766
    return !M->isAvailable() && (!RequestingModule ||
767
                                 M->isSubModuleOf(RequestingModule));
768
  };
769

770
  // Keep walking up the directory hierarchy, looking for a directory with
771
  // an umbrella header.
772
  do {
773
    auto KnownDir = UmbrellaDirs.find(*Dir);
774
    if (KnownDir != UmbrellaDirs.end()) {
775
      Module *Found = KnownDir->second;
776
      if (IsUnavailable(Found))
777
        return true;
778

779
      // Search up the module stack until we find a module with an umbrella
780
      // directory.
781
      Module *UmbrellaModule = Found;
782
      while (!UmbrellaModule->getEffectiveUmbrellaDir() &&
783
             UmbrellaModule->Parent)
784
        UmbrellaModule = UmbrellaModule->Parent;
785

786
      if (UmbrellaModule->InferSubmodules) {
787
        for (DirectoryEntryRef SkippedDir : llvm::reverse(SkippedDirs)) {
788
          // Find or create the module that corresponds to this directory name.
789
          SmallString<32> NameBuf;
790
          StringRef Name = sanitizeFilenameAsIdentifier(
791
              llvm::sys::path::stem(SkippedDir.getName()), NameBuf);
792
          Found = lookupModuleQualified(Name, Found);
793
          if (!Found)
794
            return false;
795
          if (IsUnavailable(Found))
796
            return true;
797
        }
798

799
        // Infer a submodule with the same name as this header file.
800
        SmallString<32> NameBuf;
801
        StringRef Name = sanitizeFilenameAsIdentifier(
802
                           llvm::sys::path::stem(Header.getName()),
803
                           NameBuf);
804
        Found = lookupModuleQualified(Name, Found);
805
        if (!Found)
806
          return false;
807
      }
808

809
      return IsUnavailable(Found);
810
    }
811

812
    SkippedDirs.push_back(*Dir);
813

814
    // Retrieve our parent path.
815
    DirName = llvm::sys::path::parent_path(DirName);
816
    if (DirName.empty())
817
      break;
818

819
    // Resolve the parent path to a directory entry.
820
    Dir = SourceMgr.getFileManager().getOptionalDirectoryRef(DirName);
821
  } while (Dir);
822

823
  return false;
824
}
825

826
Module *ModuleMap::findModule(StringRef Name) const {
827
  llvm::StringMap<Module *>::const_iterator Known = Modules.find(Name);
828
  if (Known != Modules.end())
829
    return Known->getValue();
830

831
  return nullptr;
832
}
833

834
Module *ModuleMap::lookupModuleUnqualified(StringRef Name,
835
                                           Module *Context) const {
836
  for(; Context; Context = Context->Parent) {
837
    if (Module *Sub = lookupModuleQualified(Name, Context))
838
      return Sub;
839
  }
840

841
  return findModule(Name);
842
}
843

844
Module *ModuleMap::lookupModuleQualified(StringRef Name, Module *Context) const{
845
  if (!Context)
846
    return findModule(Name);
847

848
  return Context->findSubmodule(Name);
849
}
850

851
std::pair<Module *, bool> ModuleMap::findOrCreateModule(StringRef Name,
852
                                                        Module *Parent,
853
                                                        bool IsFramework,
854
                                                        bool IsExplicit) {
855
  // Try to find an existing module with this name.
856
  if (Module *Sub = lookupModuleQualified(Name, Parent))
857
    return std::make_pair(Sub, false);
858

859
  // Create a new module with this name.
860
  Module *Result = new Module(Name, SourceLocation(), Parent, IsFramework,
861
                              IsExplicit, NumCreatedModules++);
862
  if (!Parent) {
863
    if (LangOpts.CurrentModule == Name)
864
      SourceModule = Result;
865
    Modules[Name] = Result;
866
    ModuleScopeIDs[Result] = CurrentModuleScopeID;
867
  }
868
  return std::make_pair(Result, true);
869
}
870

871
Module *ModuleMap::createGlobalModuleFragmentForModuleUnit(SourceLocation Loc,
872
                                                           Module *Parent) {
873
  auto *Result = new Module("<global>", Loc, Parent, /*IsFramework*/ false,
874
                            /*IsExplicit*/ true, NumCreatedModules++);
875
  Result->Kind = Module::ExplicitGlobalModuleFragment;
876
  // If the created module isn't owned by a parent, send it to PendingSubmodules
877
  // to wait for its parent.
878
  if (!Result->Parent)
879
    PendingSubmodules.emplace_back(Result);
880
  return Result;
881
}
882

883
Module *
884
ModuleMap::createImplicitGlobalModuleFragmentForModuleUnit(SourceLocation Loc,
885
                                                           Module *Parent) {
886
  assert(Parent && "We should only create an implicit global module fragment "
887
                   "in a module purview");
888
  // Note: Here the `IsExplicit` parameter refers to the semantics in clang
889
  // modules. All the non-explicit submodules in clang modules will be exported
890
  // too. Here we simplify the implementation by using the concept.
891
  auto *Result =
892
      new Module("<implicit global>", Loc, Parent, /*IsFramework=*/false,
893
                 /*IsExplicit=*/false, NumCreatedModules++);
894
  Result->Kind = Module::ImplicitGlobalModuleFragment;
895
  return Result;
896
}
897

898
Module *
899
ModuleMap::createPrivateModuleFragmentForInterfaceUnit(Module *Parent,
900
                                                       SourceLocation Loc) {
901
  auto *Result =
902
      new Module("<private>", Loc, Parent, /*IsFramework*/ false,
903
                 /*IsExplicit*/ true, NumCreatedModules++);
904
  Result->Kind = Module::PrivateModuleFragment;
905
  return Result;
906
}
907

908
Module *ModuleMap::createModuleUnitWithKind(SourceLocation Loc, StringRef Name,
909
                                            Module::ModuleKind Kind) {
910
  auto *Result =
911
      new Module(Name, Loc, nullptr, /*IsFramework*/ false,
912
                 /*IsExplicit*/ false, NumCreatedModules++);
913
  Result->Kind = Kind;
914

915
  // Reparent any current global module fragment as a submodule of this module.
916
  for (auto &Submodule : PendingSubmodules) {
917
    Submodule->setParent(Result);
918
    Submodule.release(); // now owned by parent
919
  }
920
  PendingSubmodules.clear();
921
  return Result;
922
}
923

924
Module *ModuleMap::createModuleForInterfaceUnit(SourceLocation Loc,
925
                                                StringRef Name) {
926
  assert(LangOpts.CurrentModule == Name && "module name mismatch");
927
  assert(!Modules[Name] && "redefining existing module");
928

929
  auto *Result =
930
      createModuleUnitWithKind(Loc, Name, Module::ModuleInterfaceUnit);
931
  Modules[Name] = SourceModule = Result;
932

933
  // Mark the main source file as being within the newly-created module so that
934
  // declarations and macros are properly visibility-restricted to it.
935
  auto MainFile = SourceMgr.getFileEntryRefForID(SourceMgr.getMainFileID());
936
  assert(MainFile && "no input file for module interface");
937
  Headers[*MainFile].push_back(KnownHeader(Result, PrivateHeader));
938

939
  return Result;
940
}
941

942
Module *ModuleMap::createModuleForImplementationUnit(SourceLocation Loc,
943
                                                     StringRef Name) {
944
  assert(LangOpts.CurrentModule == Name && "module name mismatch");
945
  // The interface for this implementation must exist and be loaded.
946
  assert(Modules[Name] && Modules[Name]->Kind == Module::ModuleInterfaceUnit &&
947
         "creating implementation module without an interface");
948

949
  // Create an entry in the modules map to own the implementation unit module.
950
  // User module names must not start with a period (so that this cannot clash
951
  // with any legal user-defined module name).
952
  StringRef IName = ".ImplementationUnit";
953
  assert(!Modules[IName] && "multiple implementation units?");
954

955
  auto *Result =
956
      createModuleUnitWithKind(Loc, Name, Module::ModuleImplementationUnit);
957
  Modules[IName] = SourceModule = Result;
958

959
  // Check that the main file is present.
960
  assert(SourceMgr.getFileEntryForID(SourceMgr.getMainFileID()) &&
961
         "no input file for module implementation");
962

963
  return Result;
964
}
965

966
Module *ModuleMap::createHeaderUnit(SourceLocation Loc, StringRef Name,
967
                                    Module::Header H) {
968
  assert(LangOpts.CurrentModule == Name && "module name mismatch");
969
  assert(!Modules[Name] && "redefining existing module");
970

971
  auto *Result = new Module(Name, Loc, nullptr, /*IsFramework*/ false,
972
                            /*IsExplicit*/ false, NumCreatedModules++);
973
  Result->Kind = Module::ModuleHeaderUnit;
974
  Modules[Name] = SourceModule = Result;
975
  addHeader(Result, H, NormalHeader);
976
  return Result;
977
}
978

979
/// For a framework module, infer the framework against which we
980
/// should link.
981
static void inferFrameworkLink(Module *Mod) {
982
  assert(Mod->IsFramework && "Can only infer linking for framework modules");
983
  assert(!Mod->isSubFramework() &&
984
         "Can only infer linking for top-level frameworks");
985

986
  StringRef FrameworkName(Mod->Name);
987
  FrameworkName.consume_back("_Private");
988
  Mod->LinkLibraries.push_back(Module::LinkLibrary(FrameworkName.str(),
989
                                                   /*IsFramework=*/true));
990
}
991

992
Module *ModuleMap::inferFrameworkModule(DirectoryEntryRef FrameworkDir,
993
                                        bool IsSystem, Module *Parent) {
994
  Attributes Attrs;
995
  Attrs.IsSystem = IsSystem;
996
  return inferFrameworkModule(FrameworkDir, Attrs, Parent);
997
}
998

999
Module *ModuleMap::inferFrameworkModule(DirectoryEntryRef FrameworkDir,
1000
                                        Attributes Attrs, Module *Parent) {
1001
  // Note: as an egregious but useful hack we use the real path here, because
1002
  // we might be looking at an embedded framework that symlinks out to a
1003
  // top-level framework, and we need to infer as if we were naming the
1004
  // top-level framework.
1005
  StringRef FrameworkDirName =
1006
      SourceMgr.getFileManager().getCanonicalName(FrameworkDir);
1007

1008
  // In case this is a case-insensitive filesystem, use the canonical
1009
  // directory name as the ModuleName, since modules are case-sensitive.
1010
  // FIXME: we should be able to give a fix-it hint for the correct spelling.
1011
  SmallString<32> ModuleNameStorage;
1012
  StringRef ModuleName = sanitizeFilenameAsIdentifier(
1013
      llvm::sys::path::stem(FrameworkDirName), ModuleNameStorage);
1014

1015
  // Check whether we've already found this module.
1016
  if (Module *Mod = lookupModuleQualified(ModuleName, Parent))
1017
    return Mod;
1018

1019
  FileManager &FileMgr = SourceMgr.getFileManager();
1020

1021
  // If the framework has a parent path from which we're allowed to infer
1022
  // a framework module, do so.
1023
  FileID ModuleMapFID;
1024
  if (!Parent) {
1025
    // Determine whether we're allowed to infer a module map.
1026
    bool canInfer = false;
1027
    if (llvm::sys::path::has_parent_path(FrameworkDirName)) {
1028
      // Figure out the parent path.
1029
      StringRef Parent = llvm::sys::path::parent_path(FrameworkDirName);
1030
      if (auto ParentDir = FileMgr.getOptionalDirectoryRef(Parent)) {
1031
        // Check whether we have already looked into the parent directory
1032
        // for a module map.
1033
        llvm::DenseMap<const DirectoryEntry *, InferredDirectory>::const_iterator
1034
          inferred = InferredDirectories.find(*ParentDir);
1035
        if (inferred == InferredDirectories.end()) {
1036
          // We haven't looked here before. Load a module map, if there is
1037
          // one.
1038
          bool IsFrameworkDir = Parent.ends_with(".framework");
1039
          if (OptionalFileEntryRef ModMapFile =
1040
                  HeaderInfo.lookupModuleMapFile(*ParentDir, IsFrameworkDir)) {
1041
            parseModuleMapFile(*ModMapFile, Attrs.IsSystem, *ParentDir);
1042
            inferred = InferredDirectories.find(*ParentDir);
1043
          }
1044

1045
          if (inferred == InferredDirectories.end())
1046
            inferred = InferredDirectories.insert(
1047
                         std::make_pair(*ParentDir, InferredDirectory())).first;
1048
        }
1049

1050
        if (inferred->second.InferModules) {
1051
          // We're allowed to infer for this directory, but make sure it's okay
1052
          // to infer this particular module.
1053
          StringRef Name = llvm::sys::path::stem(FrameworkDirName);
1054
          canInfer =
1055
              !llvm::is_contained(inferred->second.ExcludedModules, Name);
1056

1057
          Attrs.IsSystem |= inferred->second.Attrs.IsSystem;
1058
          Attrs.IsExternC |= inferred->second.Attrs.IsExternC;
1059
          Attrs.IsExhaustive |= inferred->second.Attrs.IsExhaustive;
1060
          Attrs.NoUndeclaredIncludes |=
1061
              inferred->second.Attrs.NoUndeclaredIncludes;
1062
          ModuleMapFID = inferred->second.ModuleMapFID;
1063
        }
1064
      }
1065
    }
1066

1067
    // If we're not allowed to infer a framework module, don't.
1068
    if (!canInfer)
1069
      return nullptr;
1070
  } else {
1071
    ModuleMapFID = getModuleMapFileIDForUniquing(Parent);
1072
  }
1073

1074
  // Look for an umbrella header.
1075
  SmallString<128> UmbrellaName = FrameworkDir.getName();
1076
  llvm::sys::path::append(UmbrellaName, "Headers", ModuleName + ".h");
1077
  auto UmbrellaHeader = FileMgr.getOptionalFileRef(UmbrellaName);
1078

1079
  // FIXME: If there's no umbrella header, we could probably scan the
1080
  // framework to load *everything*. But, it's not clear that this is a good
1081
  // idea.
1082
  if (!UmbrellaHeader)
1083
    return nullptr;
1084

1085
  Module *Result = new Module(ModuleName, SourceLocation(), Parent,
1086
                              /*IsFramework=*/true, /*IsExplicit=*/false,
1087
                              NumCreatedModules++);
1088
  InferredModuleAllowedBy[Result] = ModuleMapFID;
1089
  Result->IsInferred = true;
1090
  if (!Parent) {
1091
    if (LangOpts.CurrentModule == ModuleName)
1092
      SourceModule = Result;
1093
    Modules[ModuleName] = Result;
1094
    ModuleScopeIDs[Result] = CurrentModuleScopeID;
1095
  }
1096

1097
  Result->IsSystem |= Attrs.IsSystem;
1098
  Result->IsExternC |= Attrs.IsExternC;
1099
  Result->ConfigMacrosExhaustive |= Attrs.IsExhaustive;
1100
  Result->NoUndeclaredIncludes |= Attrs.NoUndeclaredIncludes;
1101
  Result->Directory = FrameworkDir;
1102

1103
  // Chop off the first framework bit, as that is implied.
1104
  StringRef RelativePath = UmbrellaName.str().substr(
1105
      Result->getTopLevelModule()->Directory->getName().size());
1106
  RelativePath = llvm::sys::path::relative_path(RelativePath);
1107

1108
  // umbrella header "umbrella-header-name"
1109
  setUmbrellaHeaderAsWritten(Result, *UmbrellaHeader, ModuleName + ".h",
1110
                             RelativePath);
1111

1112
  // export *
1113
  Result->Exports.push_back(Module::ExportDecl(nullptr, true));
1114

1115
  // module * { export * }
1116
  Result->InferSubmodules = true;
1117
  Result->InferExportWildcard = true;
1118

1119
  // Look for subframeworks.
1120
  std::error_code EC;
1121
  SmallString<128> SubframeworksDirName = FrameworkDir.getName();
1122
  llvm::sys::path::append(SubframeworksDirName, "Frameworks");
1123
  llvm::sys::path::native(SubframeworksDirName);
1124
  llvm::vfs::FileSystem &FS = FileMgr.getVirtualFileSystem();
1125
  for (llvm::vfs::directory_iterator
1126
           Dir = FS.dir_begin(SubframeworksDirName, EC),
1127
           DirEnd;
1128
       Dir != DirEnd && !EC; Dir.increment(EC)) {
1129
    if (!StringRef(Dir->path()).ends_with(".framework"))
1130
      continue;
1131

1132
    if (auto SubframeworkDir = FileMgr.getOptionalDirectoryRef(Dir->path())) {
1133
      // Note: as an egregious but useful hack, we use the real path here and
1134
      // check whether it is actually a subdirectory of the parent directory.
1135
      // This will not be the case if the 'subframework' is actually a symlink
1136
      // out to a top-level framework.
1137
      StringRef SubframeworkDirName =
1138
          FileMgr.getCanonicalName(*SubframeworkDir);
1139
      bool FoundParent = false;
1140
      do {
1141
        // Get the parent directory name.
1142
        SubframeworkDirName
1143
          = llvm::sys::path::parent_path(SubframeworkDirName);
1144
        if (SubframeworkDirName.empty())
1145
          break;
1146

1147
        if (auto SubDir = FileMgr.getDirectory(SubframeworkDirName)) {
1148
          if (*SubDir == FrameworkDir) {
1149
            FoundParent = true;
1150
            break;
1151
          }
1152
        }
1153
      } while (true);
1154

1155
      if (!FoundParent)
1156
        continue;
1157

1158
      // FIXME: Do we want to warn about subframeworks without umbrella headers?
1159
      inferFrameworkModule(*SubframeworkDir, Attrs, Result);
1160
    }
1161
  }
1162

1163
  // If the module is a top-level framework, automatically link against the
1164
  // framework.
1165
  if (!Result->isSubFramework())
1166
    inferFrameworkLink(Result);
1167

1168
  return Result;
1169
}
1170

1171
Module *ModuleMap::createShadowedModule(StringRef Name, bool IsFramework,
1172
                                        Module *ShadowingModule) {
1173

1174
  // Create a new module with this name.
1175
  Module *Result =
1176
      new Module(Name, SourceLocation(), /*Parent=*/nullptr, IsFramework,
1177
                 /*IsExplicit=*/false, NumCreatedModules++);
1178
  Result->ShadowingModule = ShadowingModule;
1179
  Result->markUnavailable(/*Unimportable*/true);
1180
  ModuleScopeIDs[Result] = CurrentModuleScopeID;
1181
  ShadowModules.push_back(Result);
1182

1183
  return Result;
1184
}
1185

1186
void ModuleMap::setUmbrellaHeaderAsWritten(
1187
    Module *Mod, FileEntryRef UmbrellaHeader, const Twine &NameAsWritten,
1188
    const Twine &PathRelativeToRootModuleDirectory) {
1189
  Headers[UmbrellaHeader].push_back(KnownHeader(Mod, NormalHeader));
1190
  Mod->Umbrella = UmbrellaHeader;
1191
  Mod->UmbrellaAsWritten = NameAsWritten.str();
1192
  Mod->UmbrellaRelativeToRootModuleDirectory =
1193
      PathRelativeToRootModuleDirectory.str();
1194
  UmbrellaDirs[UmbrellaHeader.getDir()] = Mod;
1195

1196
  // Notify callbacks that we just added a new header.
1197
  for (const auto &Cb : Callbacks)
1198
    Cb->moduleMapAddUmbrellaHeader(UmbrellaHeader);
1199
}
1200

1201
void ModuleMap::setUmbrellaDirAsWritten(
1202
    Module *Mod, DirectoryEntryRef UmbrellaDir, const Twine &NameAsWritten,
1203
    const Twine &PathRelativeToRootModuleDirectory) {
1204
  Mod->Umbrella = UmbrellaDir;
1205
  Mod->UmbrellaAsWritten = NameAsWritten.str();
1206
  Mod->UmbrellaRelativeToRootModuleDirectory =
1207
      PathRelativeToRootModuleDirectory.str();
1208
  UmbrellaDirs[UmbrellaDir] = Mod;
1209
}
1210

1211
void ModuleMap::addUnresolvedHeader(Module *Mod,
1212
                                    Module::UnresolvedHeaderDirective Header,
1213
                                    bool &NeedsFramework) {
1214
  // If there is a builtin counterpart to this file, add it now so it can
1215
  // wrap the system header.
1216
  if (resolveAsBuiltinHeader(Mod, Header)) {
1217
    // If we have both a builtin and system version of the file, the
1218
    // builtin version may want to inject macros into the system header, so
1219
    // force the system header to be treated as a textual header in this
1220
    // case.
1221
    Header.Kind = headerRoleToKind(ModuleMap::ModuleHeaderRole(
1222
        headerKindToRole(Header.Kind) | ModuleMap::TextualHeader));
1223
    Header.HasBuiltinHeader = true;
1224
  }
1225

1226
  // If possible, don't stat the header until we need to. This requires the
1227
  // user to have provided us with some stat information about the file.
1228
  // FIXME: Add support for lazily stat'ing umbrella headers and excluded
1229
  // headers.
1230
  if ((Header.Size || Header.ModTime) && !Header.IsUmbrella &&
1231
      Header.Kind != Module::HK_Excluded) {
1232
    // We expect more variation in mtime than size, so if we're given both,
1233
    // use the mtime as the key.
1234
    if (Header.ModTime)
1235
      LazyHeadersByModTime[*Header.ModTime].push_back(Mod);
1236
    else
1237
      LazyHeadersBySize[*Header.Size].push_back(Mod);
1238
    Mod->UnresolvedHeaders.push_back(Header);
1239
    return;
1240
  }
1241

1242
  // We don't have stat information or can't defer looking this file up.
1243
  // Perform the lookup now.
1244
  resolveHeader(Mod, Header, NeedsFramework);
1245
}
1246

1247
void ModuleMap::resolveHeaderDirectives(const FileEntry *File) const {
1248
  auto BySize = LazyHeadersBySize.find(File->getSize());
1249
  if (BySize != LazyHeadersBySize.end()) {
1250
    for (auto *M : BySize->second)
1251
      resolveHeaderDirectives(M, File);
1252
    LazyHeadersBySize.erase(BySize);
1253
  }
1254

1255
  auto ByModTime = LazyHeadersByModTime.find(File->getModificationTime());
1256
  if (ByModTime != LazyHeadersByModTime.end()) {
1257
    for (auto *M : ByModTime->second)
1258
      resolveHeaderDirectives(M, File);
1259
    LazyHeadersByModTime.erase(ByModTime);
1260
  }
1261
}
1262

1263
void ModuleMap::resolveHeaderDirectives(
1264
    Module *Mod, std::optional<const FileEntry *> File) const {
1265
  bool NeedsFramework = false;
1266
  SmallVector<Module::UnresolvedHeaderDirective, 1> NewHeaders;
1267
  const auto Size = File ? (*File)->getSize() : 0;
1268
  const auto ModTime = File ? (*File)->getModificationTime() : 0;
1269

1270
  for (auto &Header : Mod->UnresolvedHeaders) {
1271
    if (File && ((Header.ModTime && Header.ModTime != ModTime) ||
1272
                 (Header.Size && Header.Size != Size)))
1273
      NewHeaders.push_back(Header);
1274
    else
1275
      // This operation is logically const; we're just changing how we represent
1276
      // the header information for this file.
1277
      const_cast<ModuleMap *>(this)->resolveHeader(Mod, Header, NeedsFramework);
1278
  }
1279
  Mod->UnresolvedHeaders.swap(NewHeaders);
1280
}
1281

1282
void ModuleMap::addHeader(Module *Mod, Module::Header Header,
1283
                          ModuleHeaderRole Role, bool Imported) {
1284
  KnownHeader KH(Mod, Role);
1285

1286
  // Only add each header to the headers list once.
1287
  // FIXME: Should we diagnose if a header is listed twice in the
1288
  // same module definition?
1289
  auto &HeaderList = Headers[Header.Entry];
1290
  if (llvm::is_contained(HeaderList, KH))
1291
    return;
1292

1293
  HeaderList.push_back(KH);
1294
  Mod->Headers[headerRoleToKind(Role)].push_back(Header);
1295

1296
  bool isCompilingModuleHeader = Mod->isForBuilding(LangOpts);
1297
  if (!Imported || isCompilingModuleHeader) {
1298
    // When we import HeaderFileInfo, the external source is expected to
1299
    // set the isModuleHeader flag itself.
1300
    HeaderInfo.MarkFileModuleHeader(Header.Entry, Role,
1301
                                    isCompilingModuleHeader);
1302
  }
1303

1304
  // Notify callbacks that we just added a new header.
1305
  for (const auto &Cb : Callbacks)
1306
    Cb->moduleMapAddHeader(Header.Entry.getName());
1307
}
1308

1309
FileID ModuleMap::getContainingModuleMapFileID(const Module *Module) const {
1310
  if (Module->DefinitionLoc.isInvalid())
1311
    return {};
1312

1313
  return SourceMgr.getFileID(Module->DefinitionLoc);
1314
}
1315

1316
OptionalFileEntryRef
1317
ModuleMap::getContainingModuleMapFile(const Module *Module) const {
1318
  return SourceMgr.getFileEntryRefForID(getContainingModuleMapFileID(Module));
1319
}
1320

1321
FileID ModuleMap::getModuleMapFileIDForUniquing(const Module *M) const {
1322
  if (M->IsInferred) {
1323
    assert(InferredModuleAllowedBy.count(M) && "missing inferred module map");
1324
    return InferredModuleAllowedBy.find(M)->second;
1325
  }
1326
  return getContainingModuleMapFileID(M);
1327
}
1328

1329
OptionalFileEntryRef
1330
ModuleMap::getModuleMapFileForUniquing(const Module *M) const {
1331
  return SourceMgr.getFileEntryRefForID(getModuleMapFileIDForUniquing(M));
1332
}
1333

1334
void ModuleMap::setInferredModuleAllowedBy(Module *M, FileID ModMapFID) {
1335
  assert(M->IsInferred && "module not inferred");
1336
  InferredModuleAllowedBy[M] = ModMapFID;
1337
}
1338

1339
std::error_code
1340
ModuleMap::canonicalizeModuleMapPath(SmallVectorImpl<char> &Path) {
1341
  StringRef Dir = llvm::sys::path::parent_path({Path.data(), Path.size()});
1342

1343
  // Do not canonicalize within the framework; the module map parser expects
1344
  // Modules/ not Versions/A/Modules.
1345
  if (llvm::sys::path::filename(Dir) == "Modules") {
1346
    StringRef Parent = llvm::sys::path::parent_path(Dir);
1347
    if (Parent.ends_with(".framework"))
1348
      Dir = Parent;
1349
  }
1350

1351
  FileManager &FM = SourceMgr.getFileManager();
1352
  auto DirEntry = FM.getDirectoryRef(Dir.empty() ? "." : Dir);
1353
  if (!DirEntry)
1354
    return llvm::errorToErrorCode(DirEntry.takeError());
1355

1356
  // Canonicalize the directory.
1357
  StringRef CanonicalDir = FM.getCanonicalName(*DirEntry);
1358
  if (CanonicalDir != Dir)
1359
    llvm::sys::path::replace_path_prefix(Path, Dir, CanonicalDir);
1360

1361
  // In theory, the filename component should also be canonicalized if it
1362
  // on a case-insensitive filesystem. However, the extra canonicalization is
1363
  // expensive and if clang looked up the filename it will always be lowercase.
1364

1365
  // Remove ., remove redundant separators, and switch to native separators.
1366
  // This is needed for separators between CanonicalDir and the filename.
1367
  llvm::sys::path::remove_dots(Path);
1368

1369
  return std::error_code();
1370
}
1371

1372
void ModuleMap::addAdditionalModuleMapFile(const Module *M,
1373
                                           FileEntryRef ModuleMap) {
1374
  AdditionalModMaps[M].insert(ModuleMap);
1375
}
1376

1377
LLVM_DUMP_METHOD void ModuleMap::dump() {
1378
  llvm::errs() << "Modules:";
1379
  for (llvm::StringMap<Module *>::iterator M = Modules.begin(),
1380
                                        MEnd = Modules.end();
1381
       M != MEnd; ++M)
1382
    M->getValue()->print(llvm::errs(), 2);
1383

1384
  llvm::errs() << "Headers:";
1385
  for (HeadersMap::iterator H = Headers.begin(), HEnd = Headers.end();
1386
       H != HEnd; ++H) {
1387
    llvm::errs() << "  \"" << H->first.getName() << "\" -> ";
1388
    for (SmallVectorImpl<KnownHeader>::const_iterator I = H->second.begin(),
1389
                                                      E = H->second.end();
1390
         I != E; ++I) {
1391
      if (I != H->second.begin())
1392
        llvm::errs() << ",";
1393
      llvm::errs() << I->getModule()->getFullModuleName();
1394
    }
1395
    llvm::errs() << "\n";
1396
  }
1397
}
1398

1399
bool ModuleMap::resolveExports(Module *Mod, bool Complain) {
1400
  auto Unresolved = std::move(Mod->UnresolvedExports);
1401
  Mod->UnresolvedExports.clear();
1402
  for (auto &UE : Unresolved) {
1403
    Module::ExportDecl Export = resolveExport(Mod, UE, Complain);
1404
    if (Export.getPointer() || Export.getInt())
1405
      Mod->Exports.push_back(Export);
1406
    else
1407
      Mod->UnresolvedExports.push_back(UE);
1408
  }
1409
  return !Mod->UnresolvedExports.empty();
1410
}
1411

1412
bool ModuleMap::resolveUses(Module *Mod, bool Complain) {
1413
  auto *Top = Mod->getTopLevelModule();
1414
  auto Unresolved = std::move(Top->UnresolvedDirectUses);
1415
  Top->UnresolvedDirectUses.clear();
1416
  for (auto &UDU : Unresolved) {
1417
    Module *DirectUse = resolveModuleId(UDU, Top, Complain);
1418
    if (DirectUse)
1419
      Top->DirectUses.push_back(DirectUse);
1420
    else
1421
      Top->UnresolvedDirectUses.push_back(UDU);
1422
  }
1423
  return !Top->UnresolvedDirectUses.empty();
1424
}
1425

1426
bool ModuleMap::resolveConflicts(Module *Mod, bool Complain) {
1427
  auto Unresolved = std::move(Mod->UnresolvedConflicts);
1428
  Mod->UnresolvedConflicts.clear();
1429
  for (auto &UC : Unresolved) {
1430
    if (Module *OtherMod = resolveModuleId(UC.Id, Mod, Complain)) {
1431
      Module::Conflict Conflict;
1432
      Conflict.Other = OtherMod;
1433
      Conflict.Message = UC.Message;
1434
      Mod->Conflicts.push_back(Conflict);
1435
    } else
1436
      Mod->UnresolvedConflicts.push_back(UC);
1437
  }
1438
  return !Mod->UnresolvedConflicts.empty();
1439
}
1440

1441
//----------------------------------------------------------------------------//
1442
// Module map file parser
1443
//----------------------------------------------------------------------------//
1444

1445
namespace clang {
1446

1447
  /// A token in a module map file.
1448
  struct MMToken {
1449
    enum TokenKind {
1450
      Comma,
1451
      ConfigMacros,
1452
      Conflict,
1453
      EndOfFile,
1454
      HeaderKeyword,
1455
      Identifier,
1456
      Exclaim,
1457
      ExcludeKeyword,
1458
      ExplicitKeyword,
1459
      ExportKeyword,
1460
      ExportAsKeyword,
1461
      ExternKeyword,
1462
      FrameworkKeyword,
1463
      LinkKeyword,
1464
      ModuleKeyword,
1465
      Period,
1466
      PrivateKeyword,
1467
      UmbrellaKeyword,
1468
      UseKeyword,
1469
      RequiresKeyword,
1470
      Star,
1471
      StringLiteral,
1472
      IntegerLiteral,
1473
      TextualKeyword,
1474
      LBrace,
1475
      RBrace,
1476
      LSquare,
1477
      RSquare
1478
    } Kind;
1479

1480
    SourceLocation::UIntTy Location;
1481
    unsigned StringLength;
1482
    union {
1483
      // If Kind != IntegerLiteral.
1484
      const char *StringData;
1485

1486
      // If Kind == IntegerLiteral.
1487
      uint64_t IntegerValue;
1488
    };
1489

1490
    void clear() {
1491
      Kind = EndOfFile;
1492
      Location = 0;
1493
      StringLength = 0;
1494
      StringData = nullptr;
1495
    }
1496

1497
    bool is(TokenKind K) const { return Kind == K; }
1498

1499
    SourceLocation getLocation() const {
1500
      return SourceLocation::getFromRawEncoding(Location);
1501
    }
1502

1503
    uint64_t getInteger() const {
1504
      return Kind == IntegerLiteral ? IntegerValue : 0;
1505
    }
1506

1507
    StringRef getString() const {
1508
      return Kind == IntegerLiteral ? StringRef()
1509
                                    : StringRef(StringData, StringLength);
1510
    }
1511
  };
1512

1513
  class ModuleMapParser {
1514
    Lexer &L;
1515
    SourceManager &SourceMgr;
1516

1517
    /// Default target information, used only for string literal
1518
    /// parsing.
1519
    const TargetInfo *Target;
1520

1521
    DiagnosticsEngine &Diags;
1522
    ModuleMap &Map;
1523

1524
    /// The current module map file.
1525
    FileID ModuleMapFID;
1526

1527
    /// Source location of most recent parsed module declaration
1528
    SourceLocation CurrModuleDeclLoc;
1529

1530
    /// The directory that file names in this module map file should
1531
    /// be resolved relative to.
1532
    DirectoryEntryRef Directory;
1533

1534
    /// Whether this module map is in a system header directory.
1535
    bool IsSystem;
1536

1537
    /// Whether an error occurred.
1538
    bool HadError = false;
1539

1540
    /// Stores string data for the various string literals referenced
1541
    /// during parsing.
1542
    llvm::BumpPtrAllocator StringData;
1543

1544
    /// The current token.
1545
    MMToken Tok;
1546

1547
    /// The active module.
1548
    Module *ActiveModule = nullptr;
1549

1550
    /// Whether a module uses the 'requires excluded' hack to mark its
1551
    /// contents as 'textual'.
1552
    ///
1553
    /// On older Darwin SDK versions, 'requires excluded' is used to mark the
1554
    /// contents of the Darwin.C.excluded (assert.h) and Tcl.Private modules as
1555
    /// non-modular headers.  For backwards compatibility, we continue to
1556
    /// support this idiom for just these modules, and map the headers to
1557
    /// 'textual' to match the original intent.
1558
    llvm::SmallPtrSet<Module *, 2> UsesRequiresExcludedHack;
1559

1560
    /// Consume the current token and return its location.
1561
    SourceLocation consumeToken();
1562

1563
    /// Skip tokens until we reach the a token with the given kind
1564
    /// (or the end of the file).
1565
    void skipUntil(MMToken::TokenKind K);
1566

1567
    bool parseModuleId(ModuleId &Id);
1568
    void parseModuleDecl();
1569
    void parseExternModuleDecl();
1570
    void parseRequiresDecl();
1571
    void parseHeaderDecl(MMToken::TokenKind, SourceLocation LeadingLoc);
1572
    void parseUmbrellaDirDecl(SourceLocation UmbrellaLoc);
1573
    void parseExportDecl();
1574
    void parseExportAsDecl();
1575
    void parseUseDecl();
1576
    void parseLinkDecl();
1577
    void parseConfigMacros();
1578
    void parseConflict();
1579
    void parseInferredModuleDecl(bool Framework, bool Explicit);
1580

1581
    /// Private modules are canonicalized as Foo_Private. Clang provides extra
1582
    /// module map search logic to find the appropriate private module when PCH
1583
    /// is used with implicit module maps. Warn when private modules are written
1584
    /// in other ways (FooPrivate and Foo.Private), providing notes and fixits.
1585
    void diagnosePrivateModules(SourceLocation ExplicitLoc,
1586
                                SourceLocation FrameworkLoc);
1587

1588
    using Attributes = ModuleMap::Attributes;
1589

1590
    bool parseOptionalAttributes(Attributes &Attrs);
1591

1592
  public:
1593
    ModuleMapParser(Lexer &L, SourceManager &SourceMgr,
1594
                    const TargetInfo *Target, DiagnosticsEngine &Diags,
1595
                    ModuleMap &Map, FileID ModuleMapFID,
1596
                    DirectoryEntryRef Directory, bool IsSystem)
1597
        : L(L), SourceMgr(SourceMgr), Target(Target), Diags(Diags), Map(Map),
1598
          ModuleMapFID(ModuleMapFID), Directory(Directory), IsSystem(IsSystem) {
1599
      Tok.clear();
1600
      consumeToken();
1601
    }
1602

1603
    bool parseModuleMapFile();
1604

1605
    bool terminatedByDirective() { return false; }
1606
    SourceLocation getLocation() { return Tok.getLocation(); }
1607
  };
1608

1609
} // namespace clang
1610

1611
SourceLocation ModuleMapParser::consumeToken() {
1612
  SourceLocation Result = Tok.getLocation();
1613

1614
retry:
1615
  Tok.clear();
1616
  Token LToken;
1617
  L.LexFromRawLexer(LToken);
1618
  Tok.Location = LToken.getLocation().getRawEncoding();
1619
  switch (LToken.getKind()) {
1620
  case tok::raw_identifier: {
1621
    StringRef RI = LToken.getRawIdentifier();
1622
    Tok.StringData = RI.data();
1623
    Tok.StringLength = RI.size();
1624
    Tok.Kind = llvm::StringSwitch<MMToken::TokenKind>(RI)
1625
                 .Case("config_macros", MMToken::ConfigMacros)
1626
                 .Case("conflict", MMToken::Conflict)
1627
                 .Case("exclude", MMToken::ExcludeKeyword)
1628
                 .Case("explicit", MMToken::ExplicitKeyword)
1629
                 .Case("export", MMToken::ExportKeyword)
1630
                 .Case("export_as", MMToken::ExportAsKeyword)
1631
                 .Case("extern", MMToken::ExternKeyword)
1632
                 .Case("framework", MMToken::FrameworkKeyword)
1633
                 .Case("header", MMToken::HeaderKeyword)
1634
                 .Case("link", MMToken::LinkKeyword)
1635
                 .Case("module", MMToken::ModuleKeyword)
1636
                 .Case("private", MMToken::PrivateKeyword)
1637
                 .Case("requires", MMToken::RequiresKeyword)
1638
                 .Case("textual", MMToken::TextualKeyword)
1639
                 .Case("umbrella", MMToken::UmbrellaKeyword)
1640
                 .Case("use", MMToken::UseKeyword)
1641
                 .Default(MMToken::Identifier);
1642
    break;
1643
  }
1644

1645
  case tok::comma:
1646
    Tok.Kind = MMToken::Comma;
1647
    break;
1648

1649
  case tok::eof:
1650
    Tok.Kind = MMToken::EndOfFile;
1651
    break;
1652

1653
  case tok::l_brace:
1654
    Tok.Kind = MMToken::LBrace;
1655
    break;
1656

1657
  case tok::l_square:
1658
    Tok.Kind = MMToken::LSquare;
1659
    break;
1660

1661
  case tok::period:
1662
    Tok.Kind = MMToken::Period;
1663
    break;
1664

1665
  case tok::r_brace:
1666
    Tok.Kind = MMToken::RBrace;
1667
    break;
1668

1669
  case tok::r_square:
1670
    Tok.Kind = MMToken::RSquare;
1671
    break;
1672

1673
  case tok::star:
1674
    Tok.Kind = MMToken::Star;
1675
    break;
1676

1677
  case tok::exclaim:
1678
    Tok.Kind = MMToken::Exclaim;
1679
    break;
1680

1681
  case tok::string_literal: {
1682
    if (LToken.hasUDSuffix()) {
1683
      Diags.Report(LToken.getLocation(), diag::err_invalid_string_udl);
1684
      HadError = true;
1685
      goto retry;
1686
    }
1687

1688
    // Parse the string literal.
1689
    LangOptions LangOpts;
1690
    StringLiteralParser StringLiteral(LToken, SourceMgr, LangOpts, *Target);
1691
    if (StringLiteral.hadError)
1692
      goto retry;
1693

1694
    // Copy the string literal into our string data allocator.
1695
    unsigned Length = StringLiteral.GetStringLength();
1696
    char *Saved = StringData.Allocate<char>(Length + 1);
1697
    memcpy(Saved, StringLiteral.GetString().data(), Length);
1698
    Saved[Length] = 0;
1699

1700
    // Form the token.
1701
    Tok.Kind = MMToken::StringLiteral;
1702
    Tok.StringData = Saved;
1703
    Tok.StringLength = Length;
1704
    break;
1705
  }
1706

1707
  case tok::numeric_constant: {
1708
    // We don't support any suffixes or other complications.
1709
    SmallString<32> SpellingBuffer;
1710
    SpellingBuffer.resize(LToken.getLength() + 1);
1711
    const char *Start = SpellingBuffer.data();
1712
    unsigned Length =
1713
        Lexer::getSpelling(LToken, Start, SourceMgr, Map.LangOpts);
1714
    uint64_t Value;
1715
    if (StringRef(Start, Length).getAsInteger(0, Value)) {
1716
      Diags.Report(Tok.getLocation(), diag::err_mmap_unknown_token);
1717
      HadError = true;
1718
      goto retry;
1719
    }
1720

1721
    Tok.Kind = MMToken::IntegerLiteral;
1722
    Tok.IntegerValue = Value;
1723
    break;
1724
  }
1725

1726
  case tok::comment:
1727
    goto retry;
1728

1729
  case tok::hash:
1730
    // A module map can be terminated prematurely by
1731
    //   #pragma clang module contents
1732
    // When building the module, we'll treat the rest of the file as the
1733
    // contents of the module.
1734
    {
1735
      auto NextIsIdent = [&](StringRef Str) -> bool {
1736
        L.LexFromRawLexer(LToken);
1737
        return !LToken.isAtStartOfLine() && LToken.is(tok::raw_identifier) &&
1738
               LToken.getRawIdentifier() == Str;
1739
      };
1740
      if (NextIsIdent("pragma") && NextIsIdent("clang") &&
1741
          NextIsIdent("module") && NextIsIdent("contents")) {
1742
        Tok.Kind = MMToken::EndOfFile;
1743
        break;
1744
      }
1745
    }
1746
    [[fallthrough]];
1747

1748
  default:
1749
    Diags.Report(Tok.getLocation(), diag::err_mmap_unknown_token);
1750
    HadError = true;
1751
    goto retry;
1752
  }
1753

1754
  return Result;
1755
}
1756

1757
void ModuleMapParser::skipUntil(MMToken::TokenKind K) {
1758
  unsigned braceDepth = 0;
1759
  unsigned squareDepth = 0;
1760
  do {
1761
    switch (Tok.Kind) {
1762
    case MMToken::EndOfFile:
1763
      return;
1764

1765
    case MMToken::LBrace:
1766
      if (Tok.is(K) && braceDepth == 0 && squareDepth == 0)
1767
        return;
1768

1769
      ++braceDepth;
1770
      break;
1771

1772
    case MMToken::LSquare:
1773
      if (Tok.is(K) && braceDepth == 0 && squareDepth == 0)
1774
        return;
1775

1776
      ++squareDepth;
1777
      break;
1778

1779
    case MMToken::RBrace:
1780
      if (braceDepth > 0)
1781
        --braceDepth;
1782
      else if (Tok.is(K))
1783
        return;
1784
      break;
1785

1786
    case MMToken::RSquare:
1787
      if (squareDepth > 0)
1788
        --squareDepth;
1789
      else if (Tok.is(K))
1790
        return;
1791
      break;
1792

1793
    default:
1794
      if (braceDepth == 0 && squareDepth == 0 && Tok.is(K))
1795
        return;
1796
      break;
1797
    }
1798

1799
   consumeToken();
1800
  } while (true);
1801
}
1802

1803
/// Parse a module-id.
1804
///
1805
///   module-id:
1806
///     identifier
1807
///     identifier '.' module-id
1808
///
1809
/// \returns true if an error occurred, false otherwise.
1810
bool ModuleMapParser::parseModuleId(ModuleId &Id) {
1811
  Id.clear();
1812
  do {
1813
    if (Tok.is(MMToken::Identifier) || Tok.is(MMToken::StringLiteral)) {
1814
      Id.push_back(
1815
          std::make_pair(std::string(Tok.getString()), Tok.getLocation()));
1816
      consumeToken();
1817
    } else {
1818
      Diags.Report(Tok.getLocation(), diag::err_mmap_expected_module_name);
1819
      return true;
1820
    }
1821

1822
    if (!Tok.is(MMToken::Period))
1823
      break;
1824

1825
    consumeToken();
1826
  } while (true);
1827

1828
  return false;
1829
}
1830

1831
namespace {
1832

1833
  /// Enumerates the known attributes.
1834
  enum AttributeKind {
1835
    /// An unknown attribute.
1836
    AT_unknown,
1837

1838
    /// The 'system' attribute.
1839
    AT_system,
1840

1841
    /// The 'extern_c' attribute.
1842
    AT_extern_c,
1843

1844
    /// The 'exhaustive' attribute.
1845
    AT_exhaustive,
1846

1847
    /// The 'no_undeclared_includes' attribute.
1848
    AT_no_undeclared_includes
1849
  };
1850

1851
} // namespace
1852

1853
/// Private modules are canonicalized as Foo_Private. Clang provides extra
1854
/// module map search logic to find the appropriate private module when PCH
1855
/// is used with implicit module maps. Warn when private modules are written
1856
/// in other ways (FooPrivate and Foo.Private), providing notes and fixits.
1857
void ModuleMapParser::diagnosePrivateModules(SourceLocation ExplicitLoc,
1858
                                             SourceLocation FrameworkLoc) {
1859
  auto GenNoteAndFixIt = [&](StringRef BadName, StringRef Canonical,
1860
                             const Module *M, SourceRange ReplLoc) {
1861
    auto D = Diags.Report(ActiveModule->DefinitionLoc,
1862
                          diag::note_mmap_rename_top_level_private_module);
1863
    D << BadName << M->Name;
1864
    D << FixItHint::CreateReplacement(ReplLoc, Canonical);
1865
  };
1866

1867
  for (auto E = Map.module_begin(); E != Map.module_end(); ++E) {
1868
    auto const *M = E->getValue();
1869
    if (M->Directory != ActiveModule->Directory)
1870
      continue;
1871

1872
    SmallString<128> FullName(ActiveModule->getFullModuleName());
1873
    if (!FullName.starts_with(M->Name) && !FullName.ends_with("Private"))
1874
      continue;
1875
    SmallString<128> FixedPrivModDecl;
1876
    SmallString<128> Canonical(M->Name);
1877
    Canonical.append("_Private");
1878

1879
    // Foo.Private -> Foo_Private
1880
    if (ActiveModule->Parent && ActiveModule->Name == "Private" && !M->Parent &&
1881
        M->Name == ActiveModule->Parent->Name) {
1882
      Diags.Report(ActiveModule->DefinitionLoc,
1883
                   diag::warn_mmap_mismatched_private_submodule)
1884
          << FullName;
1885

1886
      SourceLocation FixItInitBegin = CurrModuleDeclLoc;
1887
      if (FrameworkLoc.isValid())
1888
        FixItInitBegin = FrameworkLoc;
1889
      if (ExplicitLoc.isValid())
1890
        FixItInitBegin = ExplicitLoc;
1891

1892
      if (FrameworkLoc.isValid() || ActiveModule->Parent->IsFramework)
1893
        FixedPrivModDecl.append("framework ");
1894
      FixedPrivModDecl.append("module ");
1895
      FixedPrivModDecl.append(Canonical);
1896

1897
      GenNoteAndFixIt(FullName, FixedPrivModDecl, M,
1898
                      SourceRange(FixItInitBegin, ActiveModule->DefinitionLoc));
1899
      continue;
1900
    }
1901

1902
    // FooPrivate and whatnots -> Foo_Private
1903
    if (!ActiveModule->Parent && !M->Parent && M->Name != ActiveModule->Name &&
1904
        ActiveModule->Name != Canonical) {
1905
      Diags.Report(ActiveModule->DefinitionLoc,
1906
                   diag::warn_mmap_mismatched_private_module_name)
1907
          << ActiveModule->Name;
1908
      GenNoteAndFixIt(ActiveModule->Name, Canonical, M,
1909
                      SourceRange(ActiveModule->DefinitionLoc));
1910
    }
1911
  }
1912
}
1913

1914
/// Parse a module declaration.
1915
///
1916
///   module-declaration:
1917
///     'extern' 'module' module-id string-literal
1918
///     'explicit'[opt] 'framework'[opt] 'module' module-id attributes[opt]
1919
///       { module-member* }
1920
///
1921
///   module-member:
1922
///     requires-declaration
1923
///     header-declaration
1924
///     submodule-declaration
1925
///     export-declaration
1926
///     export-as-declaration
1927
///     link-declaration
1928
///
1929
///   submodule-declaration:
1930
///     module-declaration
1931
///     inferred-submodule-declaration
1932
void ModuleMapParser::parseModuleDecl() {
1933
  assert(Tok.is(MMToken::ExplicitKeyword) || Tok.is(MMToken::ModuleKeyword) ||
1934
         Tok.is(MMToken::FrameworkKeyword) || Tok.is(MMToken::ExternKeyword));
1935
  if (Tok.is(MMToken::ExternKeyword)) {
1936
    parseExternModuleDecl();
1937
    return;
1938
  }
1939

1940
  // Parse 'explicit' or 'framework' keyword, if present.
1941
  SourceLocation ExplicitLoc;
1942
  SourceLocation FrameworkLoc;
1943
  bool Explicit = false;
1944
  bool Framework = false;
1945

1946
  // Parse 'explicit' keyword, if present.
1947
  if (Tok.is(MMToken::ExplicitKeyword)) {
1948
    ExplicitLoc = consumeToken();
1949
    Explicit = true;
1950
  }
1951

1952
  // Parse 'framework' keyword, if present.
1953
  if (Tok.is(MMToken::FrameworkKeyword)) {
1954
    FrameworkLoc = consumeToken();
1955
    Framework = true;
1956
  }
1957

1958
  // Parse 'module' keyword.
1959
  if (!Tok.is(MMToken::ModuleKeyword)) {
1960
    Diags.Report(Tok.getLocation(), diag::err_mmap_expected_module);
1961
    consumeToken();
1962
    HadError = true;
1963
    return;
1964
  }
1965
  CurrModuleDeclLoc = consumeToken(); // 'module' keyword
1966

1967
  // If we have a wildcard for the module name, this is an inferred submodule.
1968
  // Parse it.
1969
  if (Tok.is(MMToken::Star))
1970
    return parseInferredModuleDecl(Framework, Explicit);
1971

1972
  // Parse the module name.
1973
  ModuleId Id;
1974
  if (parseModuleId(Id)) {
1975
    HadError = true;
1976
    return;
1977
  }
1978

1979
  if (ActiveModule) {
1980
    if (Id.size() > 1) {
1981
      Diags.Report(Id.front().second, diag::err_mmap_nested_submodule_id)
1982
        << SourceRange(Id.front().second, Id.back().second);
1983

1984
      HadError = true;
1985
      return;
1986
    }
1987
  } else if (Id.size() == 1 && Explicit) {
1988
    // Top-level modules can't be explicit.
1989
    Diags.Report(ExplicitLoc, diag::err_mmap_explicit_top_level);
1990
    Explicit = false;
1991
    ExplicitLoc = SourceLocation();
1992
    HadError = true;
1993
  }
1994

1995
  Module *PreviousActiveModule = ActiveModule;
1996
  if (Id.size() > 1) {
1997
    // This module map defines a submodule. Go find the module of which it
1998
    // is a submodule.
1999
    ActiveModule = nullptr;
2000
    const Module *TopLevelModule = nullptr;
2001
    for (unsigned I = 0, N = Id.size() - 1; I != N; ++I) {
2002
      if (Module *Next = Map.lookupModuleQualified(Id[I].first, ActiveModule)) {
2003
        if (I == 0)
2004
          TopLevelModule = Next;
2005
        ActiveModule = Next;
2006
        continue;
2007
      }
2008

2009
      Diags.Report(Id[I].second, diag::err_mmap_missing_parent_module)
2010
          << Id[I].first << (ActiveModule != nullptr)
2011
          << (ActiveModule
2012
                  ? ActiveModule->getTopLevelModule()->getFullModuleName()
2013
                  : "");
2014
      HadError = true;
2015
    }
2016

2017
    if (TopLevelModule &&
2018
        ModuleMapFID != Map.getContainingModuleMapFileID(TopLevelModule)) {
2019
      assert(ModuleMapFID !=
2020
                 Map.getModuleMapFileIDForUniquing(TopLevelModule) &&
2021
             "submodule defined in same file as 'module *' that allowed its "
2022
             "top-level module");
2023
      Map.addAdditionalModuleMapFile(
2024
          TopLevelModule, *SourceMgr.getFileEntryRefForID(ModuleMapFID));
2025
    }
2026
  }
2027

2028
  StringRef ModuleName = Id.back().first;
2029
  SourceLocation ModuleNameLoc = Id.back().second;
2030

2031
  // Parse the optional attribute list.
2032
  Attributes Attrs;
2033
  if (parseOptionalAttributes(Attrs))
2034
    return;
2035

2036
  // Parse the opening brace.
2037
  if (!Tok.is(MMToken::LBrace)) {
2038
    Diags.Report(Tok.getLocation(), diag::err_mmap_expected_lbrace)
2039
      << ModuleName;
2040
    HadError = true;
2041
    return;
2042
  }
2043
  SourceLocation LBraceLoc = consumeToken();
2044

2045
  // Determine whether this (sub)module has already been defined.
2046
  Module *ShadowingModule = nullptr;
2047
  if (Module *Existing = Map.lookupModuleQualified(ModuleName, ActiveModule)) {
2048
    // We might see a (re)definition of a module that we already have a
2049
    // definition for in four cases:
2050
    //  - If we loaded one definition from an AST file and we've just found a
2051
    //    corresponding definition in a module map file, or
2052
    bool LoadedFromASTFile = Existing->IsFromModuleFile;
2053
    //  - If we previously inferred this module from different module map file.
2054
    bool Inferred = Existing->IsInferred;
2055
    //  - If we're building a framework that vends a module map, we might've
2056
    //    previously seen the one in intermediate products and now the system
2057
    //    one.
2058
    // FIXME: If we're parsing module map file that looks like this:
2059
    //          framework module FW { ... }
2060
    //          module FW.Sub { ... }
2061
    //        We can't check the framework qualifier, since it's not attached to
2062
    //        the definition of Sub. Checking that qualifier on \c Existing is
2063
    //        not correct either, since we might've previously seen:
2064
    //          module FW { ... }
2065
    //          module FW.Sub { ... }
2066
    //        We should enforce consistency of redefinitions so that we can rely
2067
    //        that \c Existing is part of a framework iff the redefinition of FW
2068
    //        we have just skipped had it too. Once we do that, stop checking
2069
    //        the local framework qualifier and only rely on \c Existing.
2070
    bool PartOfFramework = Framework || Existing->isPartOfFramework();
2071
    //  - If we're building a (preprocessed) module and we've just loaded the
2072
    //    module map file from which it was created.
2073
    bool ParsedAsMainInput =
2074
        Map.LangOpts.getCompilingModule() == LangOptions::CMK_ModuleMap &&
2075
        Map.LangOpts.CurrentModule == ModuleName &&
2076
        SourceMgr.getDecomposedLoc(ModuleNameLoc).first !=
2077
            SourceMgr.getDecomposedLoc(Existing->DefinitionLoc).first;
2078
    if (LoadedFromASTFile || Inferred || PartOfFramework || ParsedAsMainInput) {
2079
      ActiveModule = PreviousActiveModule;
2080
      // Skip the module definition.
2081
      skipUntil(MMToken::RBrace);
2082
      if (Tok.is(MMToken::RBrace))
2083
        consumeToken();
2084
      else {
2085
        Diags.Report(Tok.getLocation(), diag::err_mmap_expected_rbrace);
2086
        Diags.Report(LBraceLoc, diag::note_mmap_lbrace_match);
2087
        HadError = true;
2088
      }
2089
      return;
2090
    }
2091

2092
    if (!Existing->Parent && Map.mayShadowNewModule(Existing)) {
2093
      ShadowingModule = Existing;
2094
    } else {
2095
      // This is not a shawdowed module decl, it is an illegal redefinition.
2096
      Diags.Report(ModuleNameLoc, diag::err_mmap_module_redefinition)
2097
          << ModuleName;
2098
      Diags.Report(Existing->DefinitionLoc, diag::note_mmap_prev_definition);
2099

2100
      // Skip the module definition.
2101
      skipUntil(MMToken::RBrace);
2102
      if (Tok.is(MMToken::RBrace))
2103
        consumeToken();
2104

2105
      HadError = true;
2106
      return;
2107
    }
2108
  }
2109

2110
  // Start defining this module.
2111
  if (ShadowingModule) {
2112
    ActiveModule =
2113
        Map.createShadowedModule(ModuleName, Framework, ShadowingModule);
2114
  } else {
2115
    ActiveModule =
2116
        Map.findOrCreateModule(ModuleName, ActiveModule, Framework, Explicit)
2117
            .first;
2118
  }
2119

2120
  ActiveModule->DefinitionLoc = ModuleNameLoc;
2121
  if (Attrs.IsSystem || IsSystem)
2122
    ActiveModule->IsSystem = true;
2123
  if (Attrs.IsExternC)
2124
    ActiveModule->IsExternC = true;
2125
  if (Attrs.NoUndeclaredIncludes)
2126
    ActiveModule->NoUndeclaredIncludes = true;
2127
  ActiveModule->Directory = Directory;
2128

2129
  StringRef MapFileName(
2130
      SourceMgr.getFileEntryRefForID(ModuleMapFID)->getName());
2131
  if (MapFileName.ends_with("module.private.modulemap") ||
2132
      MapFileName.ends_with("module_private.map")) {
2133
    ActiveModule->ModuleMapIsPrivate = true;
2134
  }
2135

2136
  // Private modules named as FooPrivate, Foo.Private or similar are likely a
2137
  // user error; provide warnings, notes and fixits to direct users to use
2138
  // Foo_Private instead.
2139
  SourceLocation StartLoc =
2140
      SourceMgr.getLocForStartOfFile(SourceMgr.getMainFileID());
2141
  if (Map.HeaderInfo.getHeaderSearchOpts().ImplicitModuleMaps &&
2142
      !Diags.isIgnored(diag::warn_mmap_mismatched_private_submodule,
2143
                       StartLoc) &&
2144
      !Diags.isIgnored(diag::warn_mmap_mismatched_private_module_name,
2145
                       StartLoc) &&
2146
      ActiveModule->ModuleMapIsPrivate)
2147
    diagnosePrivateModules(ExplicitLoc, FrameworkLoc);
2148

2149
  bool Done = false;
2150
  do {
2151
    switch (Tok.Kind) {
2152
    case MMToken::EndOfFile:
2153
    case MMToken::RBrace:
2154
      Done = true;
2155
      break;
2156

2157
    case MMToken::ConfigMacros:
2158
      parseConfigMacros();
2159
      break;
2160

2161
    case MMToken::Conflict:
2162
      parseConflict();
2163
      break;
2164

2165
    case MMToken::ExplicitKeyword:
2166
    case MMToken::ExternKeyword:
2167
    case MMToken::FrameworkKeyword:
2168
    case MMToken::ModuleKeyword:
2169
      parseModuleDecl();
2170
      break;
2171

2172
    case MMToken::ExportKeyword:
2173
      parseExportDecl();
2174
      break;
2175

2176
    case MMToken::ExportAsKeyword:
2177
      parseExportAsDecl();
2178
      break;
2179

2180
    case MMToken::UseKeyword:
2181
      parseUseDecl();
2182
      break;
2183

2184
    case MMToken::RequiresKeyword:
2185
      parseRequiresDecl();
2186
      break;
2187

2188
    case MMToken::TextualKeyword:
2189
      parseHeaderDecl(MMToken::TextualKeyword, consumeToken());
2190
      break;
2191

2192
    case MMToken::UmbrellaKeyword: {
2193
      SourceLocation UmbrellaLoc = consumeToken();
2194
      if (Tok.is(MMToken::HeaderKeyword))
2195
        parseHeaderDecl(MMToken::UmbrellaKeyword, UmbrellaLoc);
2196
      else
2197
        parseUmbrellaDirDecl(UmbrellaLoc);
2198
      break;
2199
    }
2200

2201
    case MMToken::ExcludeKeyword:
2202
      parseHeaderDecl(MMToken::ExcludeKeyword, consumeToken());
2203
      break;
2204

2205
    case MMToken::PrivateKeyword:
2206
      parseHeaderDecl(MMToken::PrivateKeyword, consumeToken());
2207
      break;
2208

2209
    case MMToken::HeaderKeyword:
2210
      parseHeaderDecl(MMToken::HeaderKeyword, consumeToken());
2211
      break;
2212

2213
    case MMToken::LinkKeyword:
2214
      parseLinkDecl();
2215
      break;
2216

2217
    default:
2218
      Diags.Report(Tok.getLocation(), diag::err_mmap_expected_member);
2219
      consumeToken();
2220
      break;
2221
    }
2222
  } while (!Done);
2223

2224
  if (Tok.is(MMToken::RBrace))
2225
    consumeToken();
2226
  else {
2227
    Diags.Report(Tok.getLocation(), diag::err_mmap_expected_rbrace);
2228
    Diags.Report(LBraceLoc, diag::note_mmap_lbrace_match);
2229
    HadError = true;
2230
  }
2231

2232
  // If the active module is a top-level framework, and there are no link
2233
  // libraries, automatically link against the framework.
2234
  if (ActiveModule->IsFramework && !ActiveModule->isSubFramework() &&
2235
      ActiveModule->LinkLibraries.empty())
2236
    inferFrameworkLink(ActiveModule);
2237

2238
  // If the module meets all requirements but is still unavailable, mark the
2239
  // whole tree as unavailable to prevent it from building.
2240
  if (!ActiveModule->IsAvailable && !ActiveModule->IsUnimportable &&
2241
      ActiveModule->Parent) {
2242
    ActiveModule->getTopLevelModule()->markUnavailable(/*Unimportable=*/false);
2243
    ActiveModule->getTopLevelModule()->MissingHeaders.append(
2244
      ActiveModule->MissingHeaders.begin(), ActiveModule->MissingHeaders.end());
2245
  }
2246

2247
  // We're done parsing this module. Pop back to the previous module.
2248
  ActiveModule = PreviousActiveModule;
2249
}
2250

2251
/// Parse an extern module declaration.
2252
///
2253
///   extern module-declaration:
2254
///     'extern' 'module' module-id string-literal
2255
void ModuleMapParser::parseExternModuleDecl() {
2256
  assert(Tok.is(MMToken::ExternKeyword));
2257
  SourceLocation ExternLoc = consumeToken(); // 'extern' keyword
2258

2259
  // Parse 'module' keyword.
2260
  if (!Tok.is(MMToken::ModuleKeyword)) {
2261
    Diags.Report(Tok.getLocation(), diag::err_mmap_expected_module);
2262
    consumeToken();
2263
    HadError = true;
2264
    return;
2265
  }
2266
  consumeToken(); // 'module' keyword
2267

2268
  // Parse the module name.
2269
  ModuleId Id;
2270
  if (parseModuleId(Id)) {
2271
    HadError = true;
2272
    return;
2273
  }
2274

2275
  // Parse the referenced module map file name.
2276
  if (!Tok.is(MMToken::StringLiteral)) {
2277
    Diags.Report(Tok.getLocation(), diag::err_mmap_expected_mmap_file);
2278
    HadError = true;
2279
    return;
2280
  }
2281
  std::string FileName = std::string(Tok.getString());
2282
  consumeToken(); // filename
2283

2284
  StringRef FileNameRef = FileName;
2285
  SmallString<128> ModuleMapFileName;
2286
  if (llvm::sys::path::is_relative(FileNameRef)) {
2287
    ModuleMapFileName += Directory.getName();
2288
    llvm::sys::path::append(ModuleMapFileName, FileName);
2289
    FileNameRef = ModuleMapFileName;
2290
  }
2291
  if (auto File = SourceMgr.getFileManager().getOptionalFileRef(FileNameRef))
2292
    Map.parseModuleMapFile(
2293
        *File, IsSystem,
2294
        Map.HeaderInfo.getHeaderSearchOpts().ModuleMapFileHomeIsCwd
2295
            ? Directory
2296
            : File->getDir(),
2297
        FileID(), nullptr, ExternLoc);
2298
}
2299

2300
/// Whether to add the requirement \p Feature to the module \p M.
2301
///
2302
/// This preserves backwards compatibility for two hacks in the Darwin system
2303
/// module map files:
2304
///
2305
/// 1. The use of 'requires excluded' to make headers non-modular, which
2306
///    should really be mapped to 'textual' now that we have this feature.  We
2307
///    drop the 'excluded' requirement, and set \p IsRequiresExcludedHack to
2308
///    true.  Later, this bit will be used to map all the headers inside this
2309
///    module to 'textual'.
2310
///
2311
///    This affects Darwin.C.excluded (for assert.h) and Tcl.Private.
2312
///
2313
/// 2. Removes a bogus cplusplus requirement from IOKit.avc.  This requirement
2314
///    was never correct and causes issues now that we check it, so drop it.
2315
static bool shouldAddRequirement(Module *M, StringRef Feature,
2316
                                 bool &IsRequiresExcludedHack) {
2317
  if (Feature == "excluded" &&
2318
      (M->fullModuleNameIs({"Darwin", "C", "excluded"}) ||
2319
       M->fullModuleNameIs({"Tcl", "Private"}))) {
2320
    IsRequiresExcludedHack = true;
2321
    return false;
2322
  } else if (Feature == "cplusplus" && M->fullModuleNameIs({"IOKit", "avc"})) {
2323
    return false;
2324
  }
2325

2326
  return true;
2327
}
2328

2329
/// Parse a requires declaration.
2330
///
2331
///   requires-declaration:
2332
///     'requires' feature-list
2333
///
2334
///   feature-list:
2335
///     feature ',' feature-list
2336
///     feature
2337
///
2338
///   feature:
2339
///     '!'[opt] identifier
2340
void ModuleMapParser::parseRequiresDecl() {
2341
  assert(Tok.is(MMToken::RequiresKeyword));
2342

2343
  // Parse 'requires' keyword.
2344
  consumeToken();
2345

2346
  // Parse the feature-list.
2347
  do {
2348
    bool RequiredState = true;
2349
    if (Tok.is(MMToken::Exclaim)) {
2350
      RequiredState = false;
2351
      consumeToken();
2352
    }
2353

2354
    if (!Tok.is(MMToken::Identifier)) {
2355
      Diags.Report(Tok.getLocation(), diag::err_mmap_expected_feature);
2356
      HadError = true;
2357
      return;
2358
    }
2359

2360
    // Consume the feature name.
2361
    std::string Feature = std::string(Tok.getString());
2362
    consumeToken();
2363

2364
    bool IsRequiresExcludedHack = false;
2365
    bool ShouldAddRequirement =
2366
        shouldAddRequirement(ActiveModule, Feature, IsRequiresExcludedHack);
2367

2368
    if (IsRequiresExcludedHack)
2369
      UsesRequiresExcludedHack.insert(ActiveModule);
2370

2371
    if (ShouldAddRequirement) {
2372
      // Add this feature.
2373
      ActiveModule->addRequirement(Feature, RequiredState, Map.LangOpts,
2374
                                   *Map.Target);
2375
    }
2376

2377
    if (!Tok.is(MMToken::Comma))
2378
      break;
2379

2380
    // Consume the comma.
2381
    consumeToken();
2382
  } while (true);
2383
}
2384

2385
/// Parse a header declaration.
2386
///
2387
///   header-declaration:
2388
///     'textual'[opt] 'header' string-literal
2389
///     'private' 'textual'[opt] 'header' string-literal
2390
///     'exclude' 'header' string-literal
2391
///     'umbrella' 'header' string-literal
2392
///
2393
/// FIXME: Support 'private textual header'.
2394
void ModuleMapParser::parseHeaderDecl(MMToken::TokenKind LeadingToken,
2395
                                      SourceLocation LeadingLoc) {
2396
  // We've already consumed the first token.
2397
  ModuleMap::ModuleHeaderRole Role = ModuleMap::NormalHeader;
2398

2399
  if (LeadingToken == MMToken::PrivateKeyword) {
2400
    Role = ModuleMap::PrivateHeader;
2401
    // 'private' may optionally be followed by 'textual'.
2402
    if (Tok.is(MMToken::TextualKeyword)) {
2403
      LeadingToken = Tok.Kind;
2404
      consumeToken();
2405
    }
2406
  } else if (LeadingToken == MMToken::ExcludeKeyword) {
2407
    Role = ModuleMap::ExcludedHeader;
2408
  }
2409

2410
  if (LeadingToken == MMToken::TextualKeyword)
2411
    Role = ModuleMap::ModuleHeaderRole(Role | ModuleMap::TextualHeader);
2412

2413
  if (UsesRequiresExcludedHack.count(ActiveModule)) {
2414
    // Mark this header 'textual' (see doc comment for
2415
    // Module::UsesRequiresExcludedHack).
2416
    Role = ModuleMap::ModuleHeaderRole(Role | ModuleMap::TextualHeader);
2417
  }
2418

2419
  if (LeadingToken != MMToken::HeaderKeyword) {
2420
    if (!Tok.is(MMToken::HeaderKeyword)) {
2421
      Diags.Report(Tok.getLocation(), diag::err_mmap_expected_header)
2422
          << (LeadingToken == MMToken::PrivateKeyword ? "private" :
2423
              LeadingToken == MMToken::ExcludeKeyword ? "exclude" :
2424
              LeadingToken == MMToken::TextualKeyword ? "textual" : "umbrella");
2425
      return;
2426
    }
2427
    consumeToken();
2428
  }
2429

2430
  // Parse the header name.
2431
  if (!Tok.is(MMToken::StringLiteral)) {
2432
    Diags.Report(Tok.getLocation(), diag::err_mmap_expected_header)
2433
      << "header";
2434
    HadError = true;
2435
    return;
2436
  }
2437
  Module::UnresolvedHeaderDirective Header;
2438
  Header.FileName = std::string(Tok.getString());
2439
  Header.FileNameLoc = consumeToken();
2440
  Header.IsUmbrella = LeadingToken == MMToken::UmbrellaKeyword;
2441
  Header.Kind = Map.headerRoleToKind(Role);
2442

2443
  // Check whether we already have an umbrella.
2444
  if (Header.IsUmbrella &&
2445
      !std::holds_alternative<std::monostate>(ActiveModule->Umbrella)) {
2446
    Diags.Report(Header.FileNameLoc, diag::err_mmap_umbrella_clash)
2447
      << ActiveModule->getFullModuleName();
2448
    HadError = true;
2449
    return;
2450
  }
2451

2452
  // If we were given stat information, parse it so we can skip looking for
2453
  // the file.
2454
  if (Tok.is(MMToken::LBrace)) {
2455
    SourceLocation LBraceLoc = consumeToken();
2456

2457
    while (!Tok.is(MMToken::RBrace) && !Tok.is(MMToken::EndOfFile)) {
2458
      enum Attribute { Size, ModTime, Unknown };
2459
      StringRef Str = Tok.getString();
2460
      SourceLocation Loc = consumeToken();
2461
      switch (llvm::StringSwitch<Attribute>(Str)
2462
                  .Case("size", Size)
2463
                  .Case("mtime", ModTime)
2464
                  .Default(Unknown)) {
2465
      case Size:
2466
        if (Header.Size)
2467
          Diags.Report(Loc, diag::err_mmap_duplicate_header_attribute) << Str;
2468
        if (!Tok.is(MMToken::IntegerLiteral)) {
2469
          Diags.Report(Tok.getLocation(),
2470
                       diag::err_mmap_invalid_header_attribute_value) << Str;
2471
          skipUntil(MMToken::RBrace);
2472
          break;
2473
        }
2474
        Header.Size = Tok.getInteger();
2475
        consumeToken();
2476
        break;
2477

2478
      case ModTime:
2479
        if (Header.ModTime)
2480
          Diags.Report(Loc, diag::err_mmap_duplicate_header_attribute) << Str;
2481
        if (!Tok.is(MMToken::IntegerLiteral)) {
2482
          Diags.Report(Tok.getLocation(),
2483
                       diag::err_mmap_invalid_header_attribute_value) << Str;
2484
          skipUntil(MMToken::RBrace);
2485
          break;
2486
        }
2487
        Header.ModTime = Tok.getInteger();
2488
        consumeToken();
2489
        break;
2490

2491
      case Unknown:
2492
        Diags.Report(Loc, diag::err_mmap_expected_header_attribute);
2493
        skipUntil(MMToken::RBrace);
2494
        break;
2495
      }
2496
    }
2497

2498
    if (Tok.is(MMToken::RBrace))
2499
      consumeToken();
2500
    else {
2501
      Diags.Report(Tok.getLocation(), diag::err_mmap_expected_rbrace);
2502
      Diags.Report(LBraceLoc, diag::note_mmap_lbrace_match);
2503
      HadError = true;
2504
    }
2505
  }
2506

2507
  bool NeedsFramework = false;
2508
  // Don't add headers to the builtin modules if the builtin headers belong to
2509
  // the system modules, with the exception of __stddef_max_align_t.h which
2510
  // always had its own module.
2511
  if (!Map.LangOpts.BuiltinHeadersInSystemModules ||
2512
      !isBuiltInModuleName(ActiveModule->getTopLevelModuleName()) ||
2513
      ActiveModule->fullModuleNameIs({"_Builtin_stddef", "max_align_t"}))
2514
    Map.addUnresolvedHeader(ActiveModule, std::move(Header), NeedsFramework);
2515

2516
  if (NeedsFramework)
2517
    Diags.Report(CurrModuleDeclLoc, diag::note_mmap_add_framework_keyword)
2518
      << ActiveModule->getFullModuleName()
2519
      << FixItHint::CreateReplacement(CurrModuleDeclLoc, "framework module");
2520
}
2521

2522
static bool compareModuleHeaders(const Module::Header &A,
2523
                                 const Module::Header &B) {
2524
  return A.NameAsWritten < B.NameAsWritten;
2525
}
2526

2527
/// Parse an umbrella directory declaration.
2528
///
2529
///   umbrella-dir-declaration:
2530
///     umbrella string-literal
2531
void ModuleMapParser::parseUmbrellaDirDecl(SourceLocation UmbrellaLoc) {
2532
  // Parse the directory name.
2533
  if (!Tok.is(MMToken::StringLiteral)) {
2534
    Diags.Report(Tok.getLocation(), diag::err_mmap_expected_header)
2535
      << "umbrella";
2536
    HadError = true;
2537
    return;
2538
  }
2539

2540
  std::string DirName = std::string(Tok.getString());
2541
  std::string DirNameAsWritten = DirName;
2542
  SourceLocation DirNameLoc = consumeToken();
2543

2544
  // Check whether we already have an umbrella.
2545
  if (!std::holds_alternative<std::monostate>(ActiveModule->Umbrella)) {
2546
    Diags.Report(DirNameLoc, diag::err_mmap_umbrella_clash)
2547
      << ActiveModule->getFullModuleName();
2548
    HadError = true;
2549
    return;
2550
  }
2551

2552
  // Look for this file.
2553
  OptionalDirectoryEntryRef Dir;
2554
  if (llvm::sys::path::is_absolute(DirName)) {
2555
    Dir = SourceMgr.getFileManager().getOptionalDirectoryRef(DirName);
2556
  } else {
2557
    SmallString<128> PathName;
2558
    PathName = Directory.getName();
2559
    llvm::sys::path::append(PathName, DirName);
2560
    Dir = SourceMgr.getFileManager().getOptionalDirectoryRef(PathName);
2561
  }
2562

2563
  if (!Dir) {
2564
    Diags.Report(DirNameLoc, diag::warn_mmap_umbrella_dir_not_found)
2565
      << DirName;
2566
    return;
2567
  }
2568

2569
  if (UsesRequiresExcludedHack.count(ActiveModule)) {
2570
    // Mark this header 'textual' (see doc comment for
2571
    // ModuleMapParser::UsesRequiresExcludedHack). Although iterating over the
2572
    // directory is relatively expensive, in practice this only applies to the
2573
    // uncommonly used Tcl module on Darwin platforms.
2574
    std::error_code EC;
2575
    SmallVector<Module::Header, 6> Headers;
2576
    llvm::vfs::FileSystem &FS =
2577
        SourceMgr.getFileManager().getVirtualFileSystem();
2578
    for (llvm::vfs::recursive_directory_iterator I(FS, Dir->getName(), EC), E;
2579
         I != E && !EC; I.increment(EC)) {
2580
      if (auto FE = SourceMgr.getFileManager().getOptionalFileRef(I->path())) {
2581
        Module::Header Header = {"", std::string(I->path()), *FE};
2582
        Headers.push_back(std::move(Header));
2583
      }
2584
    }
2585

2586
    // Sort header paths so that the pcm doesn't depend on iteration order.
2587
    std::stable_sort(Headers.begin(), Headers.end(), compareModuleHeaders);
2588

2589
    for (auto &Header : Headers)
2590
      Map.addHeader(ActiveModule, std::move(Header), ModuleMap::TextualHeader);
2591
    return;
2592
  }
2593

2594
  if (Module *OwningModule = Map.UmbrellaDirs[*Dir]) {
2595
    Diags.Report(UmbrellaLoc, diag::err_mmap_umbrella_clash)
2596
      << OwningModule->getFullModuleName();
2597
    HadError = true;
2598
    return;
2599
  }
2600

2601
  // Record this umbrella directory.
2602
  Map.setUmbrellaDirAsWritten(ActiveModule, *Dir, DirNameAsWritten, DirName);
2603
}
2604

2605
/// Parse a module export declaration.
2606
///
2607
///   export-declaration:
2608
///     'export' wildcard-module-id
2609
///
2610
///   wildcard-module-id:
2611
///     identifier
2612
///     '*'
2613
///     identifier '.' wildcard-module-id
2614
void ModuleMapParser::parseExportDecl() {
2615
  assert(Tok.is(MMToken::ExportKeyword));
2616
  SourceLocation ExportLoc = consumeToken();
2617

2618
  // Parse the module-id with an optional wildcard at the end.
2619
  ModuleId ParsedModuleId;
2620
  bool Wildcard = false;
2621
  do {
2622
    // FIXME: Support string-literal module names here.
2623
    if (Tok.is(MMToken::Identifier)) {
2624
      ParsedModuleId.push_back(
2625
          std::make_pair(std::string(Tok.getString()), Tok.getLocation()));
2626
      consumeToken();
2627

2628
      if (Tok.is(MMToken::Period)) {
2629
        consumeToken();
2630
        continue;
2631
      }
2632

2633
      break;
2634
    }
2635

2636
    if(Tok.is(MMToken::Star)) {
2637
      Wildcard = true;
2638
      consumeToken();
2639
      break;
2640
    }
2641

2642
    Diags.Report(Tok.getLocation(), diag::err_mmap_module_id);
2643
    HadError = true;
2644
    return;
2645
  } while (true);
2646

2647
  Module::UnresolvedExportDecl Unresolved = {
2648
    ExportLoc, ParsedModuleId, Wildcard
2649
  };
2650
  ActiveModule->UnresolvedExports.push_back(Unresolved);
2651
}
2652

2653
/// Parse a module export_as declaration.
2654
///
2655
///   export-as-declaration:
2656
///     'export_as' identifier
2657
void ModuleMapParser::parseExportAsDecl() {
2658
  assert(Tok.is(MMToken::ExportAsKeyword));
2659
  consumeToken();
2660

2661
  if (!Tok.is(MMToken::Identifier)) {
2662
    Diags.Report(Tok.getLocation(), diag::err_mmap_module_id);
2663
    HadError = true;
2664
    return;
2665
  }
2666

2667
  if (ActiveModule->Parent) {
2668
    Diags.Report(Tok.getLocation(), diag::err_mmap_submodule_export_as);
2669
    consumeToken();
2670
    return;
2671
  }
2672

2673
  if (!ActiveModule->ExportAsModule.empty()) {
2674
    if (ActiveModule->ExportAsModule == Tok.getString()) {
2675
      Diags.Report(Tok.getLocation(), diag::warn_mmap_redundant_export_as)
2676
        << ActiveModule->Name << Tok.getString();
2677
    } else {
2678
      Diags.Report(Tok.getLocation(), diag::err_mmap_conflicting_export_as)
2679
        << ActiveModule->Name << ActiveModule->ExportAsModule
2680
        << Tok.getString();
2681
    }
2682
  }
2683

2684
  ActiveModule->ExportAsModule = std::string(Tok.getString());
2685
  Map.addLinkAsDependency(ActiveModule);
2686

2687
  consumeToken();
2688
}
2689

2690
/// Parse a module use declaration.
2691
///
2692
///   use-declaration:
2693
///     'use' wildcard-module-id
2694
void ModuleMapParser::parseUseDecl() {
2695
  assert(Tok.is(MMToken::UseKeyword));
2696
  auto KWLoc = consumeToken();
2697
  // Parse the module-id.
2698
  ModuleId ParsedModuleId;
2699
  parseModuleId(ParsedModuleId);
2700

2701
  if (ActiveModule->Parent)
2702
    Diags.Report(KWLoc, diag::err_mmap_use_decl_submodule);
2703
  else
2704
    ActiveModule->UnresolvedDirectUses.push_back(ParsedModuleId);
2705
}
2706

2707
/// Parse a link declaration.
2708
///
2709
///   module-declaration:
2710
///     'link' 'framework'[opt] string-literal
2711
void ModuleMapParser::parseLinkDecl() {
2712
  assert(Tok.is(MMToken::LinkKeyword));
2713
  SourceLocation LinkLoc = consumeToken();
2714

2715
  // Parse the optional 'framework' keyword.
2716
  bool IsFramework = false;
2717
  if (Tok.is(MMToken::FrameworkKeyword)) {
2718
    consumeToken();
2719
    IsFramework = true;
2720
  }
2721

2722
  // Parse the library name
2723
  if (!Tok.is(MMToken::StringLiteral)) {
2724
    Diags.Report(Tok.getLocation(), diag::err_mmap_expected_library_name)
2725
      << IsFramework << SourceRange(LinkLoc);
2726
    HadError = true;
2727
    return;
2728
  }
2729

2730
  std::string LibraryName = std::string(Tok.getString());
2731
  consumeToken();
2732
  ActiveModule->LinkLibraries.push_back(Module::LinkLibrary(LibraryName,
2733
                                                            IsFramework));
2734
}
2735

2736
/// Parse a configuration macro declaration.
2737
///
2738
///   module-declaration:
2739
///     'config_macros' attributes[opt] config-macro-list?
2740
///
2741
///   config-macro-list:
2742
///     identifier (',' identifier)?
2743
void ModuleMapParser::parseConfigMacros() {
2744
  assert(Tok.is(MMToken::ConfigMacros));
2745
  SourceLocation ConfigMacrosLoc = consumeToken();
2746

2747
  // Only top-level modules can have configuration macros.
2748
  if (ActiveModule->Parent) {
2749
    Diags.Report(ConfigMacrosLoc, diag::err_mmap_config_macro_submodule);
2750
  }
2751

2752
  // Parse the optional attributes.
2753
  Attributes Attrs;
2754
  if (parseOptionalAttributes(Attrs))
2755
    return;
2756

2757
  if (Attrs.IsExhaustive && !ActiveModule->Parent) {
2758
    ActiveModule->ConfigMacrosExhaustive = true;
2759
  }
2760

2761
  // If we don't have an identifier, we're done.
2762
  // FIXME: Support macros with the same name as a keyword here.
2763
  if (!Tok.is(MMToken::Identifier))
2764
    return;
2765

2766
  // Consume the first identifier.
2767
  if (!ActiveModule->Parent) {
2768
    ActiveModule->ConfigMacros.push_back(Tok.getString().str());
2769
  }
2770
  consumeToken();
2771

2772
  do {
2773
    // If there's a comma, consume it.
2774
    if (!Tok.is(MMToken::Comma))
2775
      break;
2776
    consumeToken();
2777

2778
    // We expect to see a macro name here.
2779
    // FIXME: Support macros with the same name as a keyword here.
2780
    if (!Tok.is(MMToken::Identifier)) {
2781
      Diags.Report(Tok.getLocation(), diag::err_mmap_expected_config_macro);
2782
      break;
2783
    }
2784

2785
    // Consume the macro name.
2786
    if (!ActiveModule->Parent) {
2787
      ActiveModule->ConfigMacros.push_back(Tok.getString().str());
2788
    }
2789
    consumeToken();
2790
  } while (true);
2791
}
2792

2793
/// Format a module-id into a string.
2794
static std::string formatModuleId(const ModuleId &Id) {
2795
  std::string result;
2796
  {
2797
    llvm::raw_string_ostream OS(result);
2798

2799
    for (unsigned I = 0, N = Id.size(); I != N; ++I) {
2800
      if (I)
2801
        OS << ".";
2802
      OS << Id[I].first;
2803
    }
2804
  }
2805

2806
  return result;
2807
}
2808

2809
/// Parse a conflict declaration.
2810
///
2811
///   module-declaration:
2812
///     'conflict' module-id ',' string-literal
2813
void ModuleMapParser::parseConflict() {
2814
  assert(Tok.is(MMToken::Conflict));
2815
  SourceLocation ConflictLoc = consumeToken();
2816
  Module::UnresolvedConflict Conflict;
2817

2818
  // Parse the module-id.
2819
  if (parseModuleId(Conflict.Id))
2820
    return;
2821

2822
  // Parse the ','.
2823
  if (!Tok.is(MMToken::Comma)) {
2824
    Diags.Report(Tok.getLocation(), diag::err_mmap_expected_conflicts_comma)
2825
      << SourceRange(ConflictLoc);
2826
    return;
2827
  }
2828
  consumeToken();
2829

2830
  // Parse the message.
2831
  if (!Tok.is(MMToken::StringLiteral)) {
2832
    Diags.Report(Tok.getLocation(), diag::err_mmap_expected_conflicts_message)
2833
      << formatModuleId(Conflict.Id);
2834
    return;
2835
  }
2836
  Conflict.Message = Tok.getString().str();
2837
  consumeToken();
2838

2839
  // Add this unresolved conflict.
2840
  ActiveModule->UnresolvedConflicts.push_back(Conflict);
2841
}
2842

2843
/// Parse an inferred module declaration (wildcard modules).
2844
///
2845
///   module-declaration:
2846
///     'explicit'[opt] 'framework'[opt] 'module' * attributes[opt]
2847
///       { inferred-module-member* }
2848
///
2849
///   inferred-module-member:
2850
///     'export' '*'
2851
///     'exclude' identifier
2852
void ModuleMapParser::parseInferredModuleDecl(bool Framework, bool Explicit) {
2853
  assert(Tok.is(MMToken::Star));
2854
  SourceLocation StarLoc = consumeToken();
2855
  bool Failed = false;
2856

2857
  // Inferred modules must be submodules.
2858
  if (!ActiveModule && !Framework) {
2859
    Diags.Report(StarLoc, diag::err_mmap_top_level_inferred_submodule);
2860
    Failed = true;
2861
  }
2862

2863
  if (ActiveModule) {
2864
    // Inferred modules must have umbrella directories.
2865
    if (!Failed && ActiveModule->IsAvailable &&
2866
        !ActiveModule->getEffectiveUmbrellaDir()) {
2867
      Diags.Report(StarLoc, diag::err_mmap_inferred_no_umbrella);
2868
      Failed = true;
2869
    }
2870

2871
    // Check for redefinition of an inferred module.
2872
    if (!Failed && ActiveModule->InferSubmodules) {
2873
      Diags.Report(StarLoc, diag::err_mmap_inferred_redef);
2874
      if (ActiveModule->InferredSubmoduleLoc.isValid())
2875
        Diags.Report(ActiveModule->InferredSubmoduleLoc,
2876
                     diag::note_mmap_prev_definition);
2877
      Failed = true;
2878
    }
2879

2880
    // Check for the 'framework' keyword, which is not permitted here.
2881
    if (Framework) {
2882
      Diags.Report(StarLoc, diag::err_mmap_inferred_framework_submodule);
2883
      Framework = false;
2884
    }
2885
  } else if (Explicit) {
2886
    Diags.Report(StarLoc, diag::err_mmap_explicit_inferred_framework);
2887
    Explicit = false;
2888
  }
2889

2890
  // If there were any problems with this inferred submodule, skip its body.
2891
  if (Failed) {
2892
    if (Tok.is(MMToken::LBrace)) {
2893
      consumeToken();
2894
      skipUntil(MMToken::RBrace);
2895
      if (Tok.is(MMToken::RBrace))
2896
        consumeToken();
2897
    }
2898
    HadError = true;
2899
    return;
2900
  }
2901

2902
  // Parse optional attributes.
2903
  Attributes Attrs;
2904
  if (parseOptionalAttributes(Attrs))
2905
    return;
2906

2907
  if (ActiveModule) {
2908
    // Note that we have an inferred submodule.
2909
    ActiveModule->InferSubmodules = true;
2910
    ActiveModule->InferredSubmoduleLoc = StarLoc;
2911
    ActiveModule->InferExplicitSubmodules = Explicit;
2912
  } else {
2913
    // We'll be inferring framework modules for this directory.
2914
    Map.InferredDirectories[Directory].InferModules = true;
2915
    Map.InferredDirectories[Directory].Attrs = Attrs;
2916
    Map.InferredDirectories[Directory].ModuleMapFID = ModuleMapFID;
2917
    // FIXME: Handle the 'framework' keyword.
2918
  }
2919

2920
  // Parse the opening brace.
2921
  if (!Tok.is(MMToken::LBrace)) {
2922
    Diags.Report(Tok.getLocation(), diag::err_mmap_expected_lbrace_wildcard);
2923
    HadError = true;
2924
    return;
2925
  }
2926
  SourceLocation LBraceLoc = consumeToken();
2927

2928
  // Parse the body of the inferred submodule.
2929
  bool Done = false;
2930
  do {
2931
    switch (Tok.Kind) {
2932
    case MMToken::EndOfFile:
2933
    case MMToken::RBrace:
2934
      Done = true;
2935
      break;
2936

2937
    case MMToken::ExcludeKeyword:
2938
      if (ActiveModule) {
2939
        Diags.Report(Tok.getLocation(), diag::err_mmap_expected_inferred_member)
2940
          << (ActiveModule != nullptr);
2941
        consumeToken();
2942
        break;
2943
      }
2944

2945
      consumeToken();
2946
      // FIXME: Support string-literal module names here.
2947
      if (!Tok.is(MMToken::Identifier)) {
2948
        Diags.Report(Tok.getLocation(), diag::err_mmap_missing_exclude_name);
2949
        break;
2950
      }
2951

2952
      Map.InferredDirectories[Directory].ExcludedModules.push_back(
2953
          std::string(Tok.getString()));
2954
      consumeToken();
2955
      break;
2956

2957
    case MMToken::ExportKeyword:
2958
      if (!ActiveModule) {
2959
        Diags.Report(Tok.getLocation(), diag::err_mmap_expected_inferred_member)
2960
          << (ActiveModule != nullptr);
2961
        consumeToken();
2962
        break;
2963
      }
2964

2965
      consumeToken();
2966
      if (Tok.is(MMToken::Star))
2967
        ActiveModule->InferExportWildcard = true;
2968
      else
2969
        Diags.Report(Tok.getLocation(),
2970
                     diag::err_mmap_expected_export_wildcard);
2971
      consumeToken();
2972
      break;
2973

2974
    case MMToken::ExplicitKeyword:
2975
    case MMToken::ModuleKeyword:
2976
    case MMToken::HeaderKeyword:
2977
    case MMToken::PrivateKeyword:
2978
    case MMToken::UmbrellaKeyword:
2979
    default:
2980
      Diags.Report(Tok.getLocation(), diag::err_mmap_expected_inferred_member)
2981
          << (ActiveModule != nullptr);
2982
      consumeToken();
2983
      break;
2984
    }
2985
  } while (!Done);
2986

2987
  if (Tok.is(MMToken::RBrace))
2988
    consumeToken();
2989
  else {
2990
    Diags.Report(Tok.getLocation(), diag::err_mmap_expected_rbrace);
2991
    Diags.Report(LBraceLoc, diag::note_mmap_lbrace_match);
2992
    HadError = true;
2993
  }
2994
}
2995

2996
/// Parse optional attributes.
2997
///
2998
///   attributes:
2999
///     attribute attributes
3000
///     attribute
3001
///
3002
///   attribute:
3003
///     [ identifier ]
3004
///
3005
/// \param Attrs Will be filled in with the parsed attributes.
3006
///
3007
/// \returns true if an error occurred, false otherwise.
3008
bool ModuleMapParser::parseOptionalAttributes(Attributes &Attrs) {
3009
  bool HadError = false;
3010

3011
  while (Tok.is(MMToken::LSquare)) {
3012
    // Consume the '['.
3013
    SourceLocation LSquareLoc = consumeToken();
3014

3015
    // Check whether we have an attribute name here.
3016
    if (!Tok.is(MMToken::Identifier)) {
3017
      Diags.Report(Tok.getLocation(), diag::err_mmap_expected_attribute);
3018
      skipUntil(MMToken::RSquare);
3019
      if (Tok.is(MMToken::RSquare))
3020
        consumeToken();
3021
      HadError = true;
3022
    }
3023

3024
    // Decode the attribute name.
3025
    AttributeKind Attribute
3026
      = llvm::StringSwitch<AttributeKind>(Tok.getString())
3027
          .Case("exhaustive", AT_exhaustive)
3028
          .Case("extern_c", AT_extern_c)
3029
          .Case("no_undeclared_includes", AT_no_undeclared_includes)
3030
          .Case("system", AT_system)
3031
          .Default(AT_unknown);
3032
    switch (Attribute) {
3033
    case AT_unknown:
3034
      Diags.Report(Tok.getLocation(), diag::warn_mmap_unknown_attribute)
3035
        << Tok.getString();
3036
      break;
3037

3038
    case AT_system:
3039
      Attrs.IsSystem = true;
3040
      break;
3041

3042
    case AT_extern_c:
3043
      Attrs.IsExternC = true;
3044
      break;
3045

3046
    case AT_exhaustive:
3047
      Attrs.IsExhaustive = true;
3048
      break;
3049

3050
    case AT_no_undeclared_includes:
3051
      Attrs.NoUndeclaredIncludes = true;
3052
      break;
3053
    }
3054
    consumeToken();
3055

3056
    // Consume the ']'.
3057
    if (!Tok.is(MMToken::RSquare)) {
3058
      Diags.Report(Tok.getLocation(), diag::err_mmap_expected_rsquare);
3059
      Diags.Report(LSquareLoc, diag::note_mmap_lsquare_match);
3060
      skipUntil(MMToken::RSquare);
3061
      HadError = true;
3062
    }
3063

3064
    if (Tok.is(MMToken::RSquare))
3065
      consumeToken();
3066
  }
3067

3068
  return HadError;
3069
}
3070

3071
/// Parse a module map file.
3072
///
3073
///   module-map-file:
3074
///     module-declaration*
3075
bool ModuleMapParser::parseModuleMapFile() {
3076
  do {
3077
    switch (Tok.Kind) {
3078
    case MMToken::EndOfFile:
3079
      return HadError;
3080

3081
    case MMToken::ExplicitKeyword:
3082
    case MMToken::ExternKeyword:
3083
    case MMToken::ModuleKeyword:
3084
    case MMToken::FrameworkKeyword:
3085
      parseModuleDecl();
3086
      break;
3087

3088
    case MMToken::Comma:
3089
    case MMToken::ConfigMacros:
3090
    case MMToken::Conflict:
3091
    case MMToken::Exclaim:
3092
    case MMToken::ExcludeKeyword:
3093
    case MMToken::ExportKeyword:
3094
    case MMToken::ExportAsKeyword:
3095
    case MMToken::HeaderKeyword:
3096
    case MMToken::Identifier:
3097
    case MMToken::LBrace:
3098
    case MMToken::LinkKeyword:
3099
    case MMToken::LSquare:
3100
    case MMToken::Period:
3101
    case MMToken::PrivateKeyword:
3102
    case MMToken::RBrace:
3103
    case MMToken::RSquare:
3104
    case MMToken::RequiresKeyword:
3105
    case MMToken::Star:
3106
    case MMToken::StringLiteral:
3107
    case MMToken::IntegerLiteral:
3108
    case MMToken::TextualKeyword:
3109
    case MMToken::UmbrellaKeyword:
3110
    case MMToken::UseKeyword:
3111
      Diags.Report(Tok.getLocation(), diag::err_mmap_expected_module);
3112
      HadError = true;
3113
      consumeToken();
3114
      break;
3115
    }
3116
  } while (true);
3117
}
3118

3119
bool ModuleMap::parseModuleMapFile(FileEntryRef File, bool IsSystem,
3120
                                   DirectoryEntryRef Dir, FileID ID,
3121
                                   unsigned *Offset,
3122
                                   SourceLocation ExternModuleLoc) {
3123
  assert(Target && "Missing target information");
3124
  llvm::DenseMap<const FileEntry *, bool>::iterator Known
3125
    = ParsedModuleMap.find(File);
3126
  if (Known != ParsedModuleMap.end())
3127
    return Known->second;
3128

3129
  // If the module map file wasn't already entered, do so now.
3130
  if (ID.isInvalid()) {
3131
    auto FileCharacter =
3132
        IsSystem ? SrcMgr::C_System_ModuleMap : SrcMgr::C_User_ModuleMap;
3133
    ID = SourceMgr.createFileID(File, ExternModuleLoc, FileCharacter);
3134
  }
3135

3136
  assert(Target && "Missing target information");
3137
  std::optional<llvm::MemoryBufferRef> Buffer = SourceMgr.getBufferOrNone(ID);
3138
  if (!Buffer)
3139
    return ParsedModuleMap[File] = true;
3140
  assert((!Offset || *Offset <= Buffer->getBufferSize()) &&
3141
         "invalid buffer offset");
3142

3143
  // Parse this module map file.
3144
  Lexer L(SourceMgr.getLocForStartOfFile(ID), MMapLangOpts,
3145
          Buffer->getBufferStart(),
3146
          Buffer->getBufferStart() + (Offset ? *Offset : 0),
3147
          Buffer->getBufferEnd());
3148
  SourceLocation Start = L.getSourceLocation();
3149
  ModuleMapParser Parser(L, SourceMgr, Target, Diags, *this, ID, Dir, IsSystem);
3150
  bool Result = Parser.parseModuleMapFile();
3151
  ParsedModuleMap[File] = Result;
3152

3153
  if (Offset) {
3154
    auto Loc = SourceMgr.getDecomposedLoc(Parser.getLocation());
3155
    assert(Loc.first == ID && "stopped in a different file?");
3156
    *Offset = Loc.second;
3157
  }
3158

3159
  // Notify callbacks that we parsed it.
3160
  for (const auto &Cb : Callbacks)
3161
    Cb->moduleMapFileRead(Start, File, IsSystem);
3162

3163
  return Result;
3164
}
3165

Использование cookies

Мы используем файлы cookie в соответствии с Политикой конфиденциальности и Политикой использования cookies.

Нажимая кнопку «Принимаю», Вы даете АО «СберТех» согласие на обработку Ваших персональных данных в целях совершенствования нашего веб-сайта и Сервиса GitVerse, а также повышения удобства их использования.

Запретить использование cookies Вы можете самостоятельно в настройках Вашего браузера.