================
@@ -3871,7 +3874,8 @@ class ASTIdentifierTableTrait {
     if (isInterestingIdentifier(II, MacroOffset)) {
       DataLen += 2; // 2 bytes for builtin ID
       DataLen += 2; // 2 bytes for flags
-      if (MacroOffset)
+      if (MacroOffset || (II->hasMacroDefinition() &&
+                          II->hasFETokenInfoChangedSinceDeserialization()))
----------------
vsapsai wrote:

This is a really good question, thanks for noticing and asking it.

The suggested change worked correctly even before my change. In my debugging 
function parameter "__P" isn't emitted in MacroTransitive because that's not an 
"interesting" identifier. So during the module traversal it doesn't prevent us 
from visiting MacroDefinition and discovering the macro.

Struct "__Q" does get serialized in MacroTransitive but it has non-zero 
MacroOffset, so we serialize the macro definition in MacroTransitive. And 
MacroOffset is non-zero because we've added "__Q" to 
`IdentMacroDirectivesOffsetMap` and that's because in the snippet
```c++
    for (auto &Id : PP.getIdentifierTable())
      if (Id.second->hadMacroDefinition() &&
          (!Id.second->isFromAST() ||
          Id.second->hasChangedSinceDeserialization()))
        MacroIdentifiers.push_back(Id.second);
```
`hasChangedSinceDeserialization()` returns true for "__Q". Which I believe is 
triggered by ASTReader in
```c++
static void markIdentifierFromAST(ASTReader &Reader, IdentifierInfo &II,
                                  bool IsModule) {
  if (!II.isFromAST()) {
    II.setIsFromAST();
    if (isInterestingIdentifier(Reader, II, IsModule))
      II.setChangedSinceDeserialization();
  }
}
```

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

Reply via email to