Skip to content

Commit 9249129

Browse files
committed
[clang][modules] NFCI: Distinguish as-written and effective umbrella directories
For modules with umbrellas, we track how they were written in the module map. Unfortunately, the getter for the umbrella directory conflates the "as written" directory and the "effective" directory (either the written one or the parent of the written umbrella header). This patch makes the distinction between "as written" and "effective" umbrella directories clearer. No functional change intended. Reviewed By: benlangmuir Differential Revision: https://reviews.llvm.org/D151581
1 parent 7adff65 commit 9249129

File tree

10 files changed

+68
-54
lines changed

10 files changed

+68
-54
lines changed

clang-tools-extra/modularize/CoverageChecker.cpp

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -207,15 +207,16 @@ void CoverageChecker::collectModuleHeaders() {
207207
// FIXME: Doesn't collect files from umbrella header.
208208
bool CoverageChecker::collectModuleHeaders(const Module &Mod) {
209209

210-
if (const FileEntry *UmbrellaHeader = Mod.getUmbrellaHeader().Entry) {
210+
if (const FileEntry *UmbrellaHeader =
211+
Mod.getUmbrellaHeaderAsWritten().Entry) {
211212
// Collect umbrella header.
212213
ModuleMapHeadersSet.insert(ModularizeUtilities::getCanonicalPath(
213214
UmbrellaHeader->getName()));
214215
// Preprocess umbrella header and collect the headers it references.
215216
if (!collectUmbrellaHeaderHeaders(UmbrellaHeader->getName()))
216217
return false;
217-
}
218-
else if (const DirectoryEntry *UmbrellaDir = Mod.getUmbrellaDir().Entry) {
218+
} else if (const DirectoryEntry *UmbrellaDir =
219+
Mod.getUmbrellaDirAsWritten().Entry) {
219220
// Collect headers in umbrella directory.
220221
if (!collectUmbrellaHeaders(UmbrellaDir->getName()))
221222
return false;

clang-tools-extra/modularize/ModularizeUtilities.cpp

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -349,14 +349,15 @@ bool ModularizeUtilities::collectModuleHeaders(const clang::Module &Mod) {
349349
for (auto *Submodule : Mod.submodules())
350350
collectModuleHeaders(*Submodule);
351351

352-
if (const FileEntry *UmbrellaHeader = Mod.getUmbrellaHeader().Entry) {
352+
if (const FileEntry *UmbrellaHeader =
353+
Mod.getUmbrellaHeaderAsWritten().Entry) {
353354
std::string HeaderPath = getCanonicalPath(UmbrellaHeader->getName());
354355
// Collect umbrella header.
355356
HeaderFileNames.push_back(HeaderPath);
356357

357358
// FUTURE: When needed, umbrella header header collection goes here.
358-
}
359-
else if (const DirectoryEntry *UmbrellaDir = Mod.getUmbrellaDir().Entry) {
359+
} else if (const DirectoryEntry *UmbrellaDir =
360+
Mod.getUmbrellaDirAsWritten().Entry) {
360361
// If there normal headers, assume these are umbrellas and skip collection.
361362
if (Mod.Headers->size() == 0) {
362363
// Collect headers in umbrella directory.

clang/include/clang/Basic/Module.h

Lines changed: 15 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -651,19 +651,27 @@ class alignas(8) Module {
651651
getTopLevelModule()->ASTFile = File;
652652
}
653653

654-
/// Retrieve the directory for which this module serves as the
655-
/// umbrella.
656-
DirectoryName getUmbrellaDir() const;
654+
/// Retrieve the umbrella directory as written.
655+
DirectoryName getUmbrellaDirAsWritten() const {
656+
if (const auto *ME = Umbrella.dyn_cast<const DirectoryEntry *>())
657+
return DirectoryName{UmbrellaAsWritten,
658+
UmbrellaRelativeToRootModuleDirectory, ME};
659+
return DirectoryName{};
660+
}
657661

658-
/// Retrieve the header that serves as the umbrella header for this
659-
/// module.
660-
Header getUmbrellaHeader() const {
661-
if (auto *ME = Umbrella.dyn_cast<const FileEntryRef::MapEntry *>())
662+
/// Retrieve the umbrella header as written.
663+
Header getUmbrellaHeaderAsWritten() const {
664+
if (const auto *ME = Umbrella.dyn_cast<const FileEntryRef::MapEntry *>())
662665
return Header{UmbrellaAsWritten, UmbrellaRelativeToRootModuleDirectory,
663666
FileEntryRef(*ME)};
664667
return Header{};
665668
}
666669

670+
/// Get the effective umbrella directory for this module: either the one
671+
/// explicitly written in the module map file, or the parent of the umbrella
672+
/// header.
673+
const DirectoryEntry *getEffectiveUmbrellaDir() const;
674+
667675
/// Determine whether this module has an umbrella directory that is
668676
/// not based on an umbrella header.
669677
bool hasUmbrellaDir() const {

clang/include/clang/Lex/ModuleMap.h

Lines changed: 10 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -692,17 +692,16 @@ class ModuleMap {
692692
/// false otherwise.
693693
bool resolveConflicts(Module *Mod, bool Complain);
694694

695-
/// Sets the umbrella header of the given module to the given
696-
/// header.
697-
void setUmbrellaHeader(Module *Mod, FileEntryRef UmbrellaHeader,
698-
const Twine &NameAsWritten,
699-
const Twine &PathRelativeToRootModuleDirectory);
700-
701-
/// Sets the umbrella directory of the given module to the given
702-
/// directory.
703-
void setUmbrellaDir(Module *Mod, const DirectoryEntry *UmbrellaDir,
704-
const Twine &NameAsWritten,
705-
const Twine &PathRelativeToRootModuleDirectory);
695+
/// Sets the umbrella header of the given module to the given header.
696+
void
697+
setUmbrellaHeaderAsWritten(Module *Mod, FileEntryRef UmbrellaHeader,
698+
const Twine &NameAsWritten,
699+
const Twine &PathRelativeToRootModuleDirectory);
700+
701+
/// Sets the umbrella directory of the given module to the given directory.
702+
void setUmbrellaDirAsWritten(Module *Mod, const DirectoryEntry *UmbrellaDir,
703+
const Twine &NameAsWritten,
704+
const Twine &PathRelativeToRootModuleDirectory);
706705

707706
/// Adds this header to the given module.
708707
/// \param Role The role of the header wrt the module.

clang/lib/Basic/Module.cpp

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -263,12 +263,12 @@ bool Module::fullModuleNameIs(ArrayRef<StringRef> nameParts) const {
263263
return nameParts.empty();
264264
}
265265

266-
Module::DirectoryName Module::getUmbrellaDir() const {
267-
if (Header U = getUmbrellaHeader())
268-
return {"", "", U.Entry->getDir()};
269-
270-
return {UmbrellaAsWritten, UmbrellaRelativeToRootModuleDirectory,
271-
Umbrella.dyn_cast<const DirectoryEntry *>()};
266+
const DirectoryEntry *Module::getEffectiveUmbrellaDir() const {
267+
if (const auto *ME = Umbrella.dyn_cast<const FileEntryRef::MapEntry *>())
268+
return FileEntryRef(*ME).getDir();
269+
if (const auto *ME = Umbrella.dyn_cast<const DirectoryEntry *>())
270+
return ME;
271+
return nullptr;
272272
}
273273

274274
void Module::addTopHeader(const FileEntry *File) {
@@ -483,12 +483,12 @@ void Module::print(raw_ostream &OS, unsigned Indent, bool Dump) const {
483483
OS << "\n";
484484
}
485485

486-
if (Header H = getUmbrellaHeader()) {
486+
if (Header H = getUmbrellaHeaderAsWritten()) {
487487
OS.indent(Indent + 2);
488488
OS << "umbrella header \"";
489489
OS.write_escaped(H.NameAsWritten);
490490
OS << "\"\n";
491-
} else if (DirectoryName D = getUmbrellaDir()) {
491+
} else if (DirectoryName D = getUmbrellaDirAsWritten()) {
492492
OS.indent(Indent + 2);
493493
OS << "umbrella \"";
494494
OS.write_escaped(D.NameAsWritten);

clang/lib/Frontend/FrontendAction.cpp

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -364,13 +364,14 @@ static std::error_code collectModuleHeaderIncludes(
364364
}
365365
// Note that Module->PrivateHeaders will not be a TopHeader.
366366

367-
if (Module::Header UmbrellaHeader = Module->getUmbrellaHeader()) {
367+
if (Module::Header UmbrellaHeader = Module->getUmbrellaHeaderAsWritten()) {
368368
Module->addTopHeader(UmbrellaHeader.Entry);
369369
if (Module->Parent)
370370
// Include the umbrella header for submodules.
371371
addHeaderInclude(UmbrellaHeader.PathRelativeToRootModuleDirectory,
372372
Includes, LangOpts, Module->IsExternC);
373-
} else if (Module::DirectoryName UmbrellaDir = Module->getUmbrellaDir()) {
373+
} else if (Module::DirectoryName UmbrellaDir =
374+
Module->getUmbrellaDirAsWritten()) {
374375
// Add all of the headers we find in this subdirectory.
375376
std::error_code EC;
376377
SmallString<128> DirNative;
@@ -550,7 +551,7 @@ getInputBufferForModule(CompilerInstance &CI, Module *M) {
550551
// Collect the set of #includes we need to build the module.
551552
SmallString<256> HeaderContents;
552553
std::error_code Err = std::error_code();
553-
if (Module::Header UmbrellaHeader = M->getUmbrellaHeader())
554+
if (Module::Header UmbrellaHeader = M->getUmbrellaHeaderAsWritten())
554555
addHeaderInclude(UmbrellaHeader.PathRelativeToRootModuleDirectory,
555556
HeaderContents, CI.getLangOpts(), M->IsExternC);
556557
Err = collectModuleHeaderIncludes(

clang/lib/Lex/ModuleMap.cpp

Lines changed: 13 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -266,7 +266,8 @@ void ModuleMap::resolveHeader(Module *Mod,
266266
<< UmbrellaMod->getFullModuleName();
267267
else
268268
// Record this umbrella header.
269-
setUmbrellaHeader(Mod, *File, Header.FileName, RelativePathName.str());
269+
setUmbrellaHeaderAsWritten(Mod, *File, Header.FileName,
270+
RelativePathName.str());
270271
} else {
271272
Module::Header H = {Header.FileName, std::string(RelativePathName.str()),
272273
*File};
@@ -622,7 +623,7 @@ ModuleMap::findOrCreateModuleForHeaderInUmbrellaDir(const FileEntry *File) {
622623
// Search up the module stack until we find a module with an umbrella
623624
// directory.
624625
Module *UmbrellaModule = Result;
625-
while (!UmbrellaModule->getUmbrellaDir() && UmbrellaModule->Parent)
626+
while (!UmbrellaModule->getEffectiveUmbrellaDir() && UmbrellaModule->Parent)
626627
UmbrellaModule = UmbrellaModule->Parent;
627628

628629
if (UmbrellaModule->InferSubmodules) {
@@ -760,7 +761,8 @@ ModuleMap::isHeaderUnavailableInModule(const FileEntry *Header,
760761
// Search up the module stack until we find a module with an umbrella
761762
// directory.
762763
Module *UmbrellaModule = Found;
763-
while (!UmbrellaModule->getUmbrellaDir() && UmbrellaModule->Parent)
764+
while (!UmbrellaModule->getEffectiveUmbrellaDir() &&
765+
UmbrellaModule->Parent)
764766
UmbrellaModule = UmbrellaModule->Parent;
765767

766768
if (UmbrellaModule->InferSubmodules) {
@@ -1089,7 +1091,8 @@ Module *ModuleMap::inferFrameworkModule(const DirectoryEntry *FrameworkDir,
10891091
RelativePath = llvm::sys::path::relative_path(RelativePath);
10901092

10911093
// umbrella header "umbrella-header-name"
1092-
setUmbrellaHeader(Result, *UmbrellaHeader, ModuleName + ".h", RelativePath);
1094+
setUmbrellaHeaderAsWritten(Result, *UmbrellaHeader, ModuleName + ".h",
1095+
RelativePath);
10931096

10941097
// export *
10951098
Result->Exports.push_back(Module::ExportDecl(nullptr, true));
@@ -1167,7 +1170,7 @@ Module *ModuleMap::createShadowedModule(StringRef Name, bool IsFramework,
11671170
return Result;
11681171
}
11691172

1170-
void ModuleMap::setUmbrellaHeader(
1173+
void ModuleMap::setUmbrellaHeaderAsWritten(
11711174
Module *Mod, FileEntryRef UmbrellaHeader, const Twine &NameAsWritten,
11721175
const Twine &PathRelativeToRootModuleDirectory) {
11731176
Headers[UmbrellaHeader].push_back(KnownHeader(Mod, NormalHeader));
@@ -1182,9 +1185,9 @@ void ModuleMap::setUmbrellaHeader(
11821185
Cb->moduleMapAddUmbrellaHeader(&SourceMgr.getFileManager(), UmbrellaHeader);
11831186
}
11841187

1185-
void ModuleMap::setUmbrellaDir(Module *Mod, const DirectoryEntry *UmbrellaDir,
1186-
const Twine &NameAsWritten,
1187-
const Twine &PathRelativeToRootModuleDirectory) {
1188+
void ModuleMap::setUmbrellaDirAsWritten(
1189+
Module *Mod, const DirectoryEntry *UmbrellaDir, const Twine &NameAsWritten,
1190+
const Twine &PathRelativeToRootModuleDirectory) {
11881191
Mod->Umbrella = UmbrellaDir;
11891192
Mod->UmbrellaAsWritten = NameAsWritten.str();
11901193
Mod->UmbrellaRelativeToRootModuleDirectory =
@@ -2563,7 +2566,7 @@ void ModuleMapParser::parseUmbrellaDirDecl(SourceLocation UmbrellaLoc) {
25632566
}
25642567

25652568
// Record this umbrella directory.
2566-
Map.setUmbrellaDir(ActiveModule, Dir, DirNameAsWritten, DirName);
2569+
Map.setUmbrellaDirAsWritten(ActiveModule, Dir, DirNameAsWritten, DirName);
25672570
}
25682571

25692572
/// Parse a module export declaration.
@@ -2827,7 +2830,7 @@ void ModuleMapParser::parseInferredModuleDecl(bool Framework, bool Explicit) {
28272830
if (ActiveModule) {
28282831
// Inferred modules must have umbrella directories.
28292832
if (!Failed && ActiveModule->IsAvailable &&
2830-
!ActiveModule->getUmbrellaDir()) {
2833+
!ActiveModule->getEffectiveUmbrellaDir()) {
28312834
Diags.Report(StarLoc, diag::err_mmap_inferred_no_umbrella);
28322835
Failed = true;
28332836
}

clang/lib/Lex/PPLexerChange.cpp

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -282,14 +282,14 @@ const char *Preprocessor::getCurLexerEndPos() {
282282

283283
static void collectAllSubModulesWithUmbrellaHeader(
284284
const Module &Mod, SmallVectorImpl<const Module *> &SubMods) {
285-
if (Mod.getUmbrellaHeader())
285+
if (Mod.getUmbrellaHeaderAsWritten())
286286
SubMods.push_back(&Mod);
287287
for (auto *M : Mod.submodules())
288288
collectAllSubModulesWithUmbrellaHeader(*M, SubMods);
289289
}
290290

291291
void Preprocessor::diagnoseMissingHeaderInUmbrellaDir(const Module &Mod) {
292-
const Module::Header &UmbrellaHeader = Mod.getUmbrellaHeader();
292+
Module::Header UmbrellaHeader = Mod.getUmbrellaHeaderAsWritten();
293293
assert(UmbrellaHeader.Entry && "Module must use umbrella header");
294294
const FileID &File = SourceMgr.translateFile(UmbrellaHeader.Entry);
295295
SourceLocation ExpectedHeadersLoc = SourceMgr.getLocForEndOfFile(File);
@@ -298,7 +298,7 @@ void Preprocessor::diagnoseMissingHeaderInUmbrellaDir(const Module &Mod) {
298298
return;
299299

300300
ModuleMap &ModMap = getHeaderSearchInfo().getModuleMap();
301-
const DirectoryEntry *Dir = Mod.getUmbrellaDir().Entry;
301+
const DirectoryEntry *Dir = Mod.getEffectiveUmbrellaDir();
302302
llvm::vfs::FileSystem &FS = FileMgr.getVirtualFileSystem();
303303
std::error_code EC;
304304
for (llvm::vfs::recursive_directory_iterator Entry(FS, Dir->getName(), EC),

clang/lib/Serialization/ASTReader.cpp

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -5713,9 +5713,9 @@ llvm::Error ASTReader::ReadSubmoduleBlock(ModuleFile &F,
57135713
std::string Filename = std::string(Blob);
57145714
ResolveImportedPath(F, Filename);
57155715
if (auto Umbrella = PP.getFileManager().getOptionalFileRef(Filename)) {
5716-
if (!CurrentModule->getUmbrellaHeader()) {
5716+
if (!CurrentModule->getUmbrellaHeaderAsWritten()) {
57175717
// FIXME: NameAsWritten
5718-
ModMap.setUmbrellaHeader(CurrentModule, *Umbrella, Blob, "");
5718+
ModMap.setUmbrellaHeaderAsWritten(CurrentModule, *Umbrella, Blob, "");
57195719
}
57205720
// Note that it's too late at this point to return out of date if the
57215721
// name from the PCM doesn't match up with the one in the module map,
@@ -5751,9 +5751,9 @@ llvm::Error ASTReader::ReadSubmoduleBlock(ModuleFile &F,
57515751
std::string Dirname = std::string(Blob);
57525752
ResolveImportedPath(F, Dirname);
57535753
if (auto Umbrella = PP.getFileManager().getDirectory(Dirname)) {
5754-
if (!CurrentModule->getUmbrellaDir()) {
5754+
if (!CurrentModule->getUmbrellaDirAsWritten()) {
57555755
// FIXME: NameAsWritten
5756-
ModMap.setUmbrellaDir(CurrentModule, *Umbrella, Blob, "");
5756+
ModMap.setUmbrellaDirAsWritten(CurrentModule, *Umbrella, Blob, "");
57575757
}
57585758
}
57595759
break;

clang/lib/Serialization/ASTWriter.cpp

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2846,11 +2846,12 @@ void ASTWriter::WriteSubmodules(Module *WritingModule) {
28462846
}
28472847

28482848
// Emit the umbrella header, if there is one.
2849-
if (auto UmbrellaHeader = Mod->getUmbrellaHeader()) {
2849+
if (Module::Header UmbrellaHeader = Mod->getUmbrellaHeaderAsWritten()) {
28502850
RecordData::value_type Record[] = {SUBMODULE_UMBRELLA_HEADER};
28512851
Stream.EmitRecordWithBlob(UmbrellaAbbrev, Record,
28522852
UmbrellaHeader.NameAsWritten);
2853-
} else if (auto UmbrellaDir = Mod->getUmbrellaDir()) {
2853+
} else if (Module::DirectoryName UmbrellaDir =
2854+
Mod->getUmbrellaDirAsWritten()) {
28542855
RecordData::value_type Record[] = {SUBMODULE_UMBRELLA_DIR};
28552856
Stream.EmitRecordWithBlob(UmbrellaDirAbbrev, Record,
28562857
UmbrellaDir.NameAsWritten);

0 commit comments

Comments
 (0)