Mercurial > hg > CbC > CbC_llvm
diff clang/lib/Lex/HeaderSearch.cpp @ 207:2e18cbf3894f
LLVM12
author | Shinji KONO <kono@ie.u-ryukyu.ac.jp> |
---|---|
date | Tue, 08 Jun 2021 06:07:14 +0900 |
parents | 0572611fdcc8 |
children | 5f17cb93ff66 |
line wrap: on
line diff
--- a/clang/lib/Lex/HeaderSearch.cpp Mon May 25 11:55:54 2020 +0900 +++ b/clang/lib/Lex/HeaderSearch.cpp Tue Jun 08 06:07:14 2021 +0900 @@ -164,14 +164,39 @@ return {}; } +std::string HeaderSearch::getPrebuiltImplicitModuleFileName(Module *Module) { + const FileEntry *ModuleMap = + getModuleMap().getModuleMapFileForUniquing(Module); + StringRef ModuleName = Module->Name; + StringRef ModuleMapPath = ModuleMap->getName(); + StringRef ModuleCacheHash = HSOpts->DisableModuleHash ? "" : getModuleHash(); + for (const std::string &Dir : HSOpts->PrebuiltModulePaths) { + SmallString<256> CachePath(Dir); + llvm::sys::fs::make_absolute(CachePath); + llvm::sys::path::append(CachePath, ModuleCacheHash); + std::string FileName = + getCachedModuleFileNameImpl(ModuleName, ModuleMapPath, CachePath); + if (!FileName.empty() && getFileMgr().getFile(FileName)) + return FileName; + } + return {}; +} + std::string HeaderSearch::getCachedModuleFileName(StringRef ModuleName, StringRef ModuleMapPath) { + return getCachedModuleFileNameImpl(ModuleName, ModuleMapPath, + getModuleCachePath()); +} + +std::string HeaderSearch::getCachedModuleFileNameImpl(StringRef ModuleName, + StringRef ModuleMapPath, + StringRef CachePath) { // If we don't have a module cache path or aren't supposed to use one, we // can't do anything. - if (getModuleCachePath().empty()) + if (CachePath.empty()) return {}; - SmallString<256> Result(getModuleCachePath()); + SmallString<256> Result(CachePath); llvm::sys::fs::make_absolute(Result); if (HSOpts->DisableModuleHash) { @@ -765,8 +790,7 @@ // This is the header that MSVC's header search would have found. ModuleMap::KnownHeader MSSuggestedModule; - const FileEntry *MSFE_FE = nullptr; - StringRef MSFE_Name; + Optional<FileEntryRef> MSFE; // Unless disabled, check to see if the file is in the #includer's // directory. This cannot be based on CurDir, because each includer could be @@ -841,8 +865,7 @@ if (Diags.isIgnored(diag::ext_pp_include_search_ms, IncludeLoc)) { return FE; } else { - MSFE_FE = &FE->getFileEntry(); - MSFE_Name = FE->getName(); + MSFE = FE; if (SuggestedModule) { MSSuggestedModule = *SuggestedModule; *SuggestedModule = ModuleMap::KnownHeader(); @@ -854,9 +877,6 @@ } } - Optional<FileEntryRef> MSFE(MSFE_FE ? FileEntryRef(MSFE_Name, *MSFE_FE) - : Optional<FileEntryRef>()); - CurDir = nullptr; // If this is a system #include, ignore the user #include locs. @@ -1167,12 +1187,12 @@ HeaderFileInfo *HFI = &FileInfo[FE->getUID()]; // FIXME: Use a generation count to check whether this is really up to date. if (ExternalSource && !HFI->Resolved) { - HFI->Resolved = true; auto ExternalHFI = ExternalSource->GetHeaderFileInfo(FE); - - HFI = &FileInfo[FE->getUID()]; - if (ExternalHFI.External) - mergeHeaderFileInfo(*HFI, ExternalHFI); + if (ExternalHFI.IsValid) { + HFI->Resolved = true; + if (ExternalHFI.External) + mergeHeaderFileInfo(*HFI, ExternalHFI); + } } HFI->IsValid = true; @@ -1199,12 +1219,12 @@ if (!WantExternal && (!HFI->IsValid || HFI->External)) return nullptr; if (!HFI->Resolved) { - HFI->Resolved = true; auto ExternalHFI = ExternalSource->GetHeaderFileInfo(FE); - - HFI = &FileInfo[FE->getUID()]; - if (ExternalHFI.External) - mergeHeaderFileInfo(*HFI, ExternalHFI); + if (ExternalHFI.IsValid) { + HFI->Resolved = true; + if (ExternalHFI.External) + mergeHeaderFileInfo(*HFI, ExternalHFI); + } } } else if (FE->getUID() >= FileInfo.size()) { return nullptr; @@ -1276,14 +1296,12 @@ // // It's common that libc++ and system modules will both define such // submodules. Make sure cached results for a builtin header won't - // prevent other builtin modules to potentially enter the builtin header. - // Note that builtins are header guarded and the decision to actually - // enter them is postponed to the controlling macros logic below. + // prevent other builtin modules from potentially entering the builtin + // header. Note that builtins are header guarded and the decision to + // actually enter them is postponed to the controlling macros logic below. bool TryEnterHdr = false; if (FileInfo.isCompilingModuleHeader && FileInfo.isModuleHeader) - TryEnterHdr = File->getDir() == ModMap.getBuiltinDir() && - ModuleMap::isBuiltinHeader( - llvm::sys::path::filename(File->getName())); + TryEnterHdr = ModMap.isBuiltinHeader(File); // Textual headers can be #imported from different modules. Since ObjC // headers find in the wild might rely only on #import and do not contain @@ -1416,20 +1434,31 @@ ModuleMap::KnownHeader *SuggestedModule) { ModuleMap::KnownHeader Module = HS.findModuleForHeader(File, /*AllowTextual*/true); + + // If this module specifies [no_undeclared_includes], we cannot find any + // file that's in a non-dependency module. + if (RequestingModule && Module && RequestingModule->NoUndeclaredIncludes) { + HS.getModuleMap().resolveUses(RequestingModule, /*Complain*/ false); + if (!RequestingModule->directlyUses(Module.getModule())) { + // Builtin headers are a special case. Multiple modules can use the same + // builtin as a modular header (see also comment in + // ShouldEnterIncludeFile()), so the builtin header may have been + // "claimed" by an unrelated module. This shouldn't prevent us from + // including the builtin header textually in this module. + if (HS.getModuleMap().isBuiltinHeader(File)) { + if (SuggestedModule) + *SuggestedModule = ModuleMap::KnownHeader(); + return true; + } + return false; + } + } + if (SuggestedModule) *SuggestedModule = (Module.getRole() & ModuleMap::TextualHeader) ? ModuleMap::KnownHeader() : Module; - // If this module specifies [no_undeclared_includes], we cannot find any - // file that's in a non-dependency module. - if (RequestingModule && Module && RequestingModule->NoUndeclaredIncludes) { - HS.getModuleMap().resolveUses(RequestingModule, /*Complain*/false); - if (!RequestingModule->directlyUses(Module.getModule())) { - return false; - } - } - return true; } @@ -1805,7 +1834,7 @@ }; for (unsigned I = 0; I != SearchDirs.size(); ++I) { - // FIXME: Support this search within frameworks and header maps. + // FIXME: Support this search within frameworks. if (!SearchDirs[I].isNormalDir()) continue; @@ -1819,6 +1848,19 @@ if (!BestPrefixLength && CheckDir(path::parent_path(MainFile)) && IsSystem) *IsSystem = false; + // Try resolving resulting filename via reverse search in header maps, + // key from header name is user prefered name for the include file. + StringRef Filename = File.drop_front(BestPrefixLength); + for (unsigned I = 0; I != SearchDirs.size(); ++I) { + if (!SearchDirs[I].isHeaderMap()) + continue; - return path::convert_to_slash(File.drop_front(BestPrefixLength)); + StringRef SpelledFilename = + SearchDirs[I].getHeaderMap()->reverseLookupFilename(Filename); + if (!SpelledFilename.empty()) { + Filename = SpelledFilename; + break; + } + } + return path::convert_to_slash(Filename); }