jansvoboda11 wrote:

I was looking at the affecting module map logic for a reason unrelated to 
yours, but ended up needing something similar to what you're trying to achieve. 
Here's an example:

```
//--- X1.modulemap
module X1 { header "X1.h" }
//--- X2.modulemap
module X2 { header "X2.h" }
//--- A.modulemap
module A { header "A.h" }
//--- B.modulemap
module B { header "B.h" }
//--- X1.h
#include "A.h"
#include "B.h"
//--- X2.h
#include "B.h"
#include "A.h"
//--- A.h
#include "B.h"
//--- B.h
```

Intuitively, I would expect the set of affecting files between modules X1 and 
X2 to be the same (at least when it comes to files related to modules A and B).

Assuming implicit module maps, the problem is as follows:

* In module X1:
  * The first include in X1.h reads A.modulemap and creates local SLocEntry.
  * A.pcm is loaded and `Module::DefinitionLoc` is re-associated with the 
loaded SLocEntry for A.modulemap.
  * The second include in X2.h reads B.modulemap and creates local SLocEntry.
  * B.pcm is loaded and `Module::DefinitionLoc` is re-associated with the 
loaded SLocEntry for B.modulemap.
  * When computing the set of affecting input files, we start out assuming all 
files tied to local SLocEntries are affecting, so both A.modulemap and 
B.modulemap are candidates at the start.
  * Then we say only module map files that are not in the set derived from 
`Module::DefinitionLoc` are non-affecting.
  * Both A.modulemap and B.modulemap are in the set, so both end up being 
affecting.

* In module X2:
  * The first include in X2.h reads B.modulemap and creates local SLocEntry.
  * B.pcm is loaded and `Module::DefinitionLoc` is re-associated with the 
loaded SLocEntry for B.modulemap.
  * A.pcm is transitively loaded and `ModuleDefinitionLoc` is associated with 
the loaded SLocEntry for A.modulemap.
  * The second include in X2.h doesn't read any module map file, since all 
necessary information is known thanks to A.pcm.
  * When computing the set of affecting input files, the initial set only 
contains B.modulemap (because it's associated with the local SLocEntry), but 
not A.modulemap (because it's only associated with the loaded SLocEntry).
  * B.modulemap is in the set derived from `Module::DefinitionLoc` so it ends 
up being affecting.

This is unexpected and I think it breaks the correctness of clang-scan-deps. I 
think we might need to take your patch a bit further and make it so that 
`ASTWriter::WriteInputFiles()` doesn't care whether the SLocEntry associated 
with the file through `Module::DefinitionLoc` is loaded or local.

https://github.com/llvm/llvm-project/pull/112015
_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to