rsmith added a comment.

I wonder if perhaps we're tracking this state in the wrong way. The "has been 
included" information for `#pragma once` / `#import` should behave exactly like 
macro definition visibility: it should be reset whenever we enter a new "clean 
slate" state and should be saved and restored suitably when switching 
visibility states. If we track, for each header file, a map from module to 
include information, then we'll be paying a fairly high cost: each time we see 
a `#include` we'll need to look up every currently-visible module in the map to 
see if the header was included in that module. It might be better to track an 
up-to-date list of the headers that have been either `#import`ed in the current 
preprocessor state (including via imported modules) or that have been both 
`#include`d and contain `#pragma once`. You could stash that in the 
`Preprocessor::SubmoduleState` so that it's suitably swapped out when we switch 
to a new preprocessing state.



================
Comment at: clang/include/clang/Lex/HeaderSearch.h:126
+  /// Bool represents if the header was included (false) or imported (true).
+  llvm::DenseMap<const Module *, bool> ModuleIncludersMap;
+
----------------
This seems like a very expensive thing to include in `HeaderFileInfo`, which we 
may have many thousands of in some compilations. (I have similar concerns about 
`Aliases` FWIW.)


================
Comment at: clang/include/clang/Serialization/ASTBitCodes.h:44
 /// AST files at this time.
-const unsigned VERSION_MAJOR = 15;
+const unsigned VERSION_MAJOR = 16;
 
----------------
Do we really need to bump the version number? (Does this affect something we 
read before we read the Clang version number and reject on a version mismatch?)


================
Comment at: clang/lib/Serialization/ASTReader.cpp:1912-1916
+    // Update isImport and NumIncludes based on including module.
+    if (Mod->NameVisibility == Module::NameVisibilityKind::AllVisible) {
+      HFI.isImport |= IsImport;
+      ++HFI.NumIncludes;
+    }
----------------
This doesn't do the right thing in local submodule visibility mode. We need to 
compute visibility locally from within `HeaderSearch` based on the currently 
visible modules at the point of the query instead.


Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D104344/new/

https://reviews.llvm.org/D104344

_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
  • [PATCH] D104344: ... Richard Smith - zygoloid via Phabricator via cfe-commits

Reply via email to