jansvoboda11 created this revision. jansvoboda11 added reviewers: rmaz, benlangmuir, bnbarham. Herald added a subscriber: ributzka. Herald added a project: All. jansvoboda11 requested review of this revision. Herald added a project: clang. Herald added a subscriber: cfe-commits.
Per the `FileManager` documentation, `VirtualFileEntries` is a subset of `SeenFileEntries`. This means we only have to iterate over the latter to create complete UID mapping. This allows us to map UID to `FileEntryRef` instead of `FileEntry`. Repository: rG LLVM Github Monorepo https://reviews.llvm.org/D142780 Files: clang/include/clang/Basic/FileManager.h clang/lib/Basic/FileManager.cpp clang/lib/Serialization/ASTWriter.cpp
Index: clang/lib/Serialization/ASTWriter.cpp =================================================================== --- clang/lib/Serialization/ASTWriter.cpp +++ clang/lib/Serialization/ASTWriter.cpp @@ -169,23 +169,23 @@ const HeaderSearch &HS = PP.getHeaderSearchInfo(); - SmallVector<const FileEntry *, 16> FilesByUID; - HS.getFileMgr().GetUniqueIDMapping(FilesByUID); + SmallVector<OptionalFileEntryRef, 16> FilesByUID; + HS.getFileMgr().getUniqueIDMapping(FilesByUID); if (FilesByUID.size() > HS.header_file_size()) FilesByUID.resize(HS.header_file_size()); for (unsigned UID = 0, LastUID = FilesByUID.size(); UID != LastUID; ++UID) { - const FileEntry *File = FilesByUID[UID]; + OptionalFileEntryRef File = FilesByUID[UID]; if (!File) continue; const HeaderFileInfo *HFI = - HS.getExistingFileInfo(File, /*WantExternal*/ false); + HS.getExistingFileInfo(*File, /*WantExternal=*/false); if (!HFI || (HFI->isModuleHeader && !HFI->isCompilingModuleHeader)) continue; - for (const auto &KH : HS.findAllModulesForHeader(File)) { + for (const auto &KH : HS.findAllModulesForHeader(*File)) { if (!KH.getModule()) continue; ModulesToProcess.push_back(KH.getModule()); @@ -1918,14 +1918,14 @@ } } - SmallVector<const FileEntry *, 16> FilesByUID; - HS.getFileMgr().GetUniqueIDMapping(FilesByUID); + SmallVector<OptionalFileEntryRef, 16> FilesByUID; + HS.getFileMgr().getUniqueIDMapping(FilesByUID); if (FilesByUID.size() > HS.header_file_size()) FilesByUID.resize(HS.header_file_size()); for (unsigned UID = 0, LastUID = FilesByUID.size(); UID != LastUID; ++UID) { - const FileEntry *File = FilesByUID[UID]; + OptionalFileEntryRef File = FilesByUID[UID]; if (!File) continue; @@ -1936,7 +1936,7 @@ // from a different module; in that case, we rely on the module(s) // containing the header to provide this information. const HeaderFileInfo *HFI = - HS.getExistingFileInfo(File, /*WantExternal*/!Chain); + HS.getExistingFileInfo(*File, /*WantExternal=*/!Chain); if (!HFI || (HFI->isModuleHeader && !HFI->isCompilingModuleHeader)) continue; @@ -1951,10 +1951,10 @@ } HeaderFileInfoTrait::key_type Key = { - Filename, File->getSize(), getTimestampForOutput(File) + Filename, File->getSize(), getTimestampForOutput(*File) }; HeaderFileInfoTrait::data_type Data = { - *HFI, HS.getModuleMap().findResolvedModulesForHeader(File), {} + *HFI, HS.getModuleMap().findResolvedModulesForHeader(*File), {} }; Generator.insert(Key, Data, GeneratorTrait); ++NumHeaderSearchEntries; Index: clang/lib/Basic/FileManager.cpp =================================================================== --- clang/lib/Basic/FileManager.cpp +++ clang/lib/Basic/FileManager.cpp @@ -611,25 +611,15 @@ return std::error_code(); } -void FileManager::GetUniqueIDMapping( - SmallVectorImpl<const FileEntry *> &UIDToFiles) const { +void FileManager::getUniqueIDMapping( + SmallVectorImpl<OptionalFileEntryRef> &UIDToFiles) const { UIDToFiles.clear(); UIDToFiles.resize(NextFileUID); - // Map file entries - for (llvm::StringMap<llvm::ErrorOr<FileEntryRef::MapValue>, - llvm::BumpPtrAllocator>::const_iterator - FE = SeenFileEntries.begin(), - FEEnd = SeenFileEntries.end(); - FE != FEEnd; ++FE) - if (llvm::ErrorOr<FileEntryRef::MapValue> Entry = FE->getValue()) { - if (const auto *FE = Entry->V.dyn_cast<FileEntry *>()) - UIDToFiles[FE->getUID()] = FE; - } - - // Map virtual file entries - for (const auto &VFE : VirtualFileEntries) - UIDToFiles[VFE->getUID()] = VFE; + for (const auto &Entry : SeenFileEntries) + if (llvm::ErrorOr<FileEntryRef::MapValue> Value = Entry.getValue()) + if (const auto *FE = Value->V.dyn_cast<FileEntry *>()) + UIDToFiles[FE->getUID()] = FileEntryRef(Entry); } StringRef FileManager::getCanonicalName(const DirectoryEntry *Dir) { Index: clang/include/clang/Basic/FileManager.h =================================================================== --- clang/include/clang/Basic/FileManager.h +++ clang/include/clang/Basic/FileManager.h @@ -311,9 +311,9 @@ bool makeAbsolutePath(SmallVectorImpl<char> &Path) const; /// Produce an array mapping from the unique IDs assigned to each - /// file to the corresponding FileEntry pointer. - void GetUniqueIDMapping( - SmallVectorImpl<const FileEntry *> &UIDToFiles) const; + /// file to the corresponding FileEntryRef. + void + getUniqueIDMapping(SmallVectorImpl<OptionalFileEntryRef> &UIDToFiles) const; /// Retrieve the canonical name for a given directory. ///
_______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits