jansvoboda11 added a comment.

In D112915#3104873 <https://reviews.llvm.org/D112915#3104873>, @vsapsai wrote:

> There can be other reasons to keep `IncludeMap` out of `SubmoduleState` but 
> I'm not sure the local submodule visibility is the right reason. I might be 
> reading the code incorrectly but looks like `CurSubmoduleState` is used when 
> local submodule visibility is disabled. The difference is it's tracking the 
> aggregate state instead of per-submodule state. Need to experiment more but 
> so far tracking includes in `SubmoduleState` follows the spirit of local 
> submodule visibility. Though it's not guaranteed it'll work perfectly from 
> the technical perspective.

Yes, `CurSubmoduleState` is being used unconditionally. However, without local 
submodule visibility enabled, it always points to `NullSubmoduleState`. Only 
with the feature enabled does it point to the current submodule state (stored 
in `Submodules`). The change happens in `Preprocessor::{Enter,Leave}Submodule`.

> Also I think we'll need to increase granularity to track other HeaderFileInfo 
> attributes, not just NumIncludes. Don't have a test case to illustrate that 
> right now and no need to change that now but something to keep in mind.

That's interesting. I think `HeaderFileInfo::isImport` should definitely be 
tracked in the preprocessor, not in `HeaderFileInfo`. The fact that the header 
was `#import`ed is not an intrinsic property of the file itself, but rather a 
preprocessor state. Can you think of other fields that don't really belong to 
`HeaderFileInfo`?

Based on your feedback, I simplified the patch quite a bit. We're no longer 
copying the include state between submodules. In its current form, this patch 
essentially moves `HeaderFileInfo::NumIncludes` into 
`Preprocessor::NumIncludes` and still uses it as the source of truth.
However, we're also tracking `NumIncludes` separately in each submodule and 
serializing this into the PCM. Instead of merging `NumIncludes` of the whole 
module when loading it (which we did before), we can merge `NumIncludes` only 
of the modules we actually import.



================
Comment at: clang/lib/Lex/Preprocessor.cpp:1323
+        auto &ModNumIncludes = SubmoduleIncludeStates[M].NumIncludes;
+        for (unsigned UID = 0; UID <= ModNumIncludes.maxUID(); ++UID) {
+          CurSubmoduleIncludeState->NumIncludes[UID] += ModNumIncludes[UID];
----------------
Iterating over all FileEntries is probably not very efficient, as Volodymyr 
mentioned. Thinking about how to make this more efficient...


Repository:
  rG LLVM Github Monorepo

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

https://reviews.llvm.org/D112915

_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to