jansvoboda11 wrote:

> Can you clarify how this bug occurs in terms of what information about the 
> header is stored that causes us to get the wrong module?

I updated the test case to be more in line with how the bug manifested in the 
wild. Let me annotate the test case here to hopefully clarify things:

```c
//--- tu.c
#include "poison.h" // This imports Poison.pcm. In its HEADER_SEARCH_TABLE 
record, this PCM stores
                    // information that "FW/B.h" is textual. This happens 
because the compiler never
                    // looked for the module map when it encountered 
`__has_include(<FW/B.h>)`, and
                    // therefore set 
`HeaderFileInfo::{isModuleHeader,isCompilingModuleHeader}` to
                    // `false` for that header. `ASTWriter` then decided to 
serialize info on that header:
                    // 
https://github.com/llvm/llvm-project/blob/740582fa4c9512b34128dc97b2eff56820984421/clang/lib/Serialization/ASTWriter.cpp#L2023

#if __has_include(<FW/B.h>) // This looks into Poison.pcm, finds out that 
"FW/B.h" is textual,
                            // and caches that in HeaderSearch::FileInfo.
#endif

#include "import.h" // This transitively imports FW_Private.pcm.
                    // This does not parse FW_Private module map, that would 
actually tell us that "FW/B.h"
                    // is most likely part of FW_Private (via the 
PrivateHeaders umbrella header).
                    // FW_Private.pcm does contain the information that 
"FW/B.h" is part of FW_Private, but...

#include <FW/B.h> // ... this does not deserialize the info on "FW/B.h" from 
FW_Private.pcm
                  // due to the unimplemented FIXME here:
                  // 
https://github.com/llvm/llvm-project/blob/740582fa4c9512b34128dc97b2eff56820984421/clang/lib/Lex/HeaderSearch.cpp#L1320
                  // This header is therefore considered textual.
```

So an alternative solution would be to implement that fixme and ensure we do 
deserialize `HeaderFileInfo` from newly loaded PCM files. That would tell us 
the FW_Private.pcm considers "FW/B.h" modular. I'd rather fix what we actually 
serialize into PCM files first.

> It seems bad that passing `nullptr` to `LookupFile` could cause incorrect 
> behavior and makes me wonder if we need to always trigger module lookup or if 
> there is another way to fix this that would make it safe to not do module 
> lookup here.

Yeah. I did try to fix up all calls to `LookupFile` to perform module map 
lookup, but a bunch of tests started failing (mostly standard C++ modules tests 
IIRC), so there's probably more nuance required there.

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

Reply via email to