From 64ebf313a7e485e1a90da9cd69c412e06615a9bc Mon Sep 17 00:00:00 2001 From: Volodymyr Sapsai Date: Tue, 15 Jun 2021 18:44:38 -0700 Subject: [PATCH] [HeaderSearch] Use `isImport` only for imported headers and not for `#pragma once`. There is a separate field `isPragmaOnce` and when `isImport` combines both, it complicates HeaderFileInfo serialization as `#pragma once` is the inherent property of the header while `isImport` reflects how other headers use it. The usage of the header can be different in different contexts, that's why `isImport` requires tracking separate from `#pragma once`. Differential Revision: https://reviews.llvm.org/D104351 --- clang/include/clang/Lex/HeaderSearch.h | 8 +++----- clang/lib/Lex/HeaderSearch.cpp | 4 ++-- 2 files changed, 5 insertions(+), 7 deletions(-) diff --git a/clang/include/clang/Lex/HeaderSearch.h b/clang/include/clang/Lex/HeaderSearch.h index a35a394..7df1127 100644 --- a/clang/include/clang/Lex/HeaderSearch.h +++ b/clang/include/clang/Lex/HeaderSearch.h @@ -51,7 +51,7 @@ class TargetInfo; /// The preprocessor keeps track of this information for each /// file that is \#included. struct HeaderFileInfo { - /// True if this is a \#import'd or \#pragma once file. + /// True if this is a \#import'd file. unsigned isImport : 1; /// True if this is a \#pragma once file. @@ -450,11 +450,10 @@ public: return (SrcMgr::CharacteristicKind)getFileInfo(File).DirInfo; } - /// Mark the specified file as a "once only" file, e.g. due to + /// Mark the specified file as a "once only" file due to /// \#pragma once. void MarkFileIncludeOnce(const FileEntry *File) { HeaderFileInfo &FI = getFileInfo(File); - FI.isImport = true; FI.isPragmaOnce = true; } @@ -500,8 +499,7 @@ public: /// This routine does not consider the effect of \#import bool isFileMultipleIncludeGuarded(const FileEntry *File); - /// Determine whether the given file is known to have ever been \#imported - /// (or if it has been \#included and we've encountered a \#pragma once). + /// Determine whether the given file is known to have ever been \#imported. bool hasFileBeenImported(const FileEntry *File) { const HeaderFileInfo *FI = getExistingFileInfo(File); return FI && FI->isImport; diff --git a/clang/lib/Lex/HeaderSearch.cpp b/clang/lib/Lex/HeaderSearch.cpp index d5adbcf..8bf61a2 100644 --- a/clang/lib/Lex/HeaderSearch.cpp +++ b/clang/lib/Lex/HeaderSearch.cpp @@ -91,7 +91,7 @@ void HeaderSearch::PrintStats() { << FileInfo.size() << " files tracked.\n"; unsigned NumOnceOnlyFiles = 0, MaxNumIncludes = 0, NumSingleIncludedFiles = 0; for (unsigned i = 0, e = FileInfo.size(); i != e; ++i) { - NumOnceOnlyFiles += FileInfo[i].isImport; + NumOnceOnlyFiles += (FileInfo[i].isPragmaOnce || FileInfo[i].isImport); if (MaxNumIncludes < FileInfo[i].NumIncludes) MaxNumIncludes = FileInfo[i].NumIncludes; NumSingleIncludedFiles += FileInfo[i].NumIncludes == 1; @@ -1325,7 +1325,7 @@ bool HeaderSearch::ShouldEnterIncludeFile(Preprocessor &PP, } else { // Otherwise, if this is a #include of a file that was previously #import'd // or if this is the second #include of a #pragma once file, ignore it. - if (FileInfo.isImport && !TryEnterImported()) + if ((FileInfo.isPragmaOnce || FileInfo.isImport) && !TryEnterImported()) return false; } -- 2.7.4