alexfh added inline comments.

================
Comment at: clang/lib/Serialization/ASTReader.cpp:6343
              "Invalid data, missing pragma diagnostic states");
-      SourceLocation Loc = ReadSourceLocation(F, Record[Idx++]);
-      auto IDAndOffset = SourceMgr.getDecomposedLoc(Loc);
-      assert(IDAndOffset.first.isValid() && "invalid FileID for transition");
-      assert(IDAndOffset.second == 0 && "not a start location for a FileID");
+      FileID FID = ReadFileID(F, Record, Idx);
+      assert(FID.isValid() && "invalid FileID for transition");
----------------
alexfh wrote:
> dexonsmith wrote:
> > alexfh wrote:
> > > alexfh wrote:
> > > > jansvoboda11 wrote:
> > > > > alexfh wrote:
> > > > > > dexonsmith wrote:
> > > > > > > eaeltsin wrote:
> > > > > > > > This doesn't work as before, likely because ReadFileID doesn't 
> > > > > > > > do TranslateSourceLocation.
> > > > > > > > 
> > > > > > > > Our tests fail.
> > > > > > > > 
> > > > > > > > I tried calling TranslateSourceLocation here and the tests 
> > > > > > > > passed:
> > > > > > > > ```
> > > > > > > >       SourceLocation Loc = Diag.SourceMgr->getComposedLoc(FID, 
> > > > > > > > 0);
> > > > > > > >       SourceLocation Loc2 = TranslateSourceLocation(F, Loc);
> > > > > > > >       auto IDAndOffset = SourceMgr.getDecomposedLoc(Loc2);
> > > > > > > > 
> > > > > > > >       // Note that we don't need to set up Parent/ParentOffset 
> > > > > > > > here, because
> > > > > > > >       // we won't be changing the diagnostic state within 
> > > > > > > > imported FileIDs
> > > > > > > >       // (other than perhaps appending to the main source file, 
> > > > > > > > which has no
> > > > > > > >       // parent).
> > > > > > > >       auto &F = Diag.DiagStatesByLoc.Files[IDAndOffset.first];
> > > > > > > > ```
> > > > > > > > 
> > > > > > > > Sorry I don't know the codebase, so this fix is definitely ugly 
> > > > > > > > :) But it shows the problem.
> > > > > > > > 
> > > > > > > I don't think that's the issue, since `ReadFileID()` calls 
> > > > > > > `TranslateFileID`, which should seems like it should be 
> > > > > > > equivalent.
> > > > > > > 
> > > > > > > However, I notice that the post-increment for `Idx` got dropped! 
> > > > > > > Can you try replacing the line of code with the following and see 
> > > > > > > if that fixes your tests (without any extra 
> > > > > > > TranslateSourceLocation logic)?
> > > > > > > ```
> > > > > > > lang=c++
> > > > > > > FileID FID = ReadFileID(F, Record, Idx++);
> > > > > > > ```
> > > > > > > 
> > > > > > > If so, maybe you can contribute that fix with a reduced testcase? 
> > > > > > > I suggest adding me, @vsapsai, @Bigcheese, and @jansvoboda11 as 
> > > > > > > reviewers.
> > > > > > > 
> > > > > > > @alexfh, maybe you can check if this fixes your tests as well?
> > > > > > > 
> > > > > > > (If this is the issue, it's a bit surprising we don't have 
> > > > > > > existing tests covering this case... and embarrassing I missed it 
> > > > > > > when reviewing initially!)
> > > > > > I've noticed the dropped `Idx` post-increment as well, but I went a 
> > > > > > step further and looked at the `ReadFileID` implementation, which 
> > > > > > is actually doing a post-increment itself, and accepts `Idx` by 
> > > > > > reference:
> > > > > > ```
> > > > > >   FileID ReadFileID(ModuleFile &F, const RecordDataImpl &Record,
> > > > > >                     unsigned &Idx) const {
> > > > > >     return TranslateFileID(F, FileID::get(Record[Idx++]));
> > > > > >   }
> > > > > > ```
> > > > > > 
> > > > > > Thus, it seems to be correct. But what @eaeltsin  has found is 
> > > > > > actually a problem for us.  I'm currently trying to make an 
> > > > > > isolated test case, but it's quite tricky (as header modules are 
> > > > > > =\). It may be the case that our build setup relies on something 
> > > > > > clang doesn't explicitly promises, but the fact is that the 
> > > > > > behavior (as observed by our build setup) has changed. I'll try to 
> > > > > > revert the commit for now to get us unblocked and provide a test 
> > > > > > case as soon as I can.
> > > > > Thanks for helping out @dexonsmith, we did have the week off.
> > > > > 
> > > > > @eaeltsin @alexfhDone, are you able to provide the failing test case? 
> > > > > I'm happy to look into it and re-land this with a fix.
> > > > I've spent multiple hours trying to extract an observable test case. It 
> > > > turned out to be too hairy of a yaq to shave: for each compilation a 
> > > > separate sandboxed environment is created with a separate symlink tree 
> > > > with just the inputs necessary for that action. Some of the inputs are 
> > > > prebuilt module files (e.g. for libc++) that are version-locked with 
> > > > the compiler. So far @jgorbe and I could reduce this to four 
> > > > compilation steps with their own symlink trees with inputs. While I 
> > > > could figure out some of the factors that affect reproducibility (for 
> > > > example, symlinks are important, since making a deep copy of the input 
> > > > directories makes the issue disappear), it will take a few more hours 
> > > > of concentrated yak shaving to bring this to a shareable state. I'm not 
> > > > sure I have much more time to sink into investigating this. 
> > > > 
> > > > It seems like examining code based on @eaeltsin's finding may be a more 
> > > > fruitful path to synthesizing a regression test. Could you try 
> > > > following that path?
> > > One more observation: `-fmodules-embed-all-files` and 
> > > `-Wno-mismatched-tags` compiler options turned out to be important.
> > Maybe @eaeltsin can help, but I don't see any reason to think that testcase 
> > will be easier. Typically we don't revert without a testcase or at least 
> > some way to understand the problem and make progress.
> > 
> > (Maybe @jansvoboda11 has ideas for extra instrumentation in the compiler to 
> > better understand what's going on with your setup?)
> I've managed to get rid of the precompiled module files and now I have 
> something much more observable. It will take some more time to brush it up 
> though.
The standalone repro is here: {F25463527}

The files should be unpacked to a directory (e.g. /tmp/repro/standalone) and 
the repro.sh script can be invoked with CLANG environment variable pointing to 
the clang binary being tested. The script will create two symlink trees and 
start clang twice. The second clang invocation fails with clang containing this 
patch.

```
$ CLANG=/tmp/repro/clang-good /tmp/repro/standalone/repro.sh
++ dirname /tmp/repro/standalone/repro.sh
+ DIR=/tmp/repro/standalone
+ cd /tmp/repro/standalone
+ rm -rf 1 2
+ mkdir -p 1/q/a_proto/mypkg 1/p/a_proto/mypkg 2/q/a_proto/mypkg 
2/p/b_proto/mypkg
+ ln -sf /tmp/repro/standalone/files/a_proto.cppmap 1/
+ ln -sf /tmp/repro/standalone/files/a.pb.h 
/tmp/repro/standalone/files/a.proto.h 1/p/a_proto/mypkg/
+ ln -sf /tmp/repro/standalone/files/a.pb.h 
/tmp/repro/standalone/files/a.proto.h 1/q/a_proto/mypkg/
+ ln -sf /tmp/repro/standalone/files/a_proto.cppmap 
/tmp/repro/standalone/files/b_proto.cppmap 2/
+ ln -sf /tmp/repro/standalone/files/a.pb.h 2/q/a_proto/mypkg/
+ ln -sf /tmp/repro/standalone/files/b.pb.h 2/p/b_proto/mypkg/
+ CC_ARGS=('-Wno-mismatched-tags' '-Xclang=-fmodules-embed-all-files' 
'-Xclang=-fmodules-local-submodule-visibility' '-fmodules' 
'-fno-implicit-modules' '-fno-implicit-module-maps' '-std=gnu++17' 
'-Xclang=-fmodule-map-file-home-is-cwd')
+ export CC_ARGS
+ : /tmp
+ cd /tmp/repro/standalone/1
+ /tmp/repro/clang-good -Wno-mismatched-tags -Xclang=-fmodules-embed-all-files 
-Xclang=-fmodules-local-submodule-visibility -fmodules -fno-implicit-modules 
-fno-implicit-module-maps -std=gnu++17 -Xclang=-fmodule-map-file-home-is-cwd -I 
q/a_proto -fmodule-name=//a -fmodule-map-file=a_proto.cppmap -xc++ 
-Xclang=-emit-module -c a_proto.cppmap -o /tmp/a.pcm
+ cd /tmp/repro/standalone/2
+ /tmp/repro/clang-good -Wno-mismatched-tags -Xclang=-fmodules-embed-all-files 
-Xclang=-fmodules-local-submodule-visibility -fmodules -fno-implicit-modules 
-fno-implicit-module-maps -std=gnu++17 -Xclang=-fmodule-map-file-home-is-cwd -I 
q/b_proto -I q/a_proto -fmodule-name=//b -fmodule-map-file=b_proto.cppmap 
-Xclang=-fmodule-file=/tmp/a.pcm -xc++ -Xclang=-emit-module -c b_proto.cppmap 
-o /tmp/b.pcm

$ CLANG=/tmp/repro/clang-bad /tmp/repro/standalone/repro.sh
++ dirname /tmp/repro/standalone/repro.sh
+ DIR=/tmp/repro/standalone
+ cd /tmp/repro/standalone
+ rm -rf 1 2
+ mkdir -p 1/q/a_proto/mypkg 1/p/a_proto/mypkg 2/q/a_proto/mypkg 
2/p/b_proto/mypkg
+ ln -sf /tmp/repro/standalone/files/a_proto.cppmap 1/
+ ln -sf /tmp/repro/standalone/files/a.pb.h 
/tmp/repro/standalone/files/a.proto.h 1/p/a_proto/mypkg/
+ ln -sf /tmp/repro/standalone/files/a.pb.h 
/tmp/repro/standalone/files/a.proto.h 1/q/a_proto/mypkg/
+ ln -sf /tmp/repro/standalone/files/a_proto.cppmap 
/tmp/repro/standalone/files/b_proto.cppmap 2/
+ ln -sf /tmp/repro/standalone/files/a.pb.h 2/q/a_proto/mypkg/
+ ln -sf /tmp/repro/standalone/files/b.pb.h 2/p/b_proto/mypkg/
+ CC_ARGS=('-Wno-mismatched-tags' '-Xclang=-fmodules-embed-all-files' 
'-Xclang=-fmodules-local-submodule-visibility' '-fmodules' 
'-fno-implicit-modules' '-fno-implicit-module-maps' '-std=gnu++17' 
'-Xclang=-fmodule-map-file-home-is-cwd')
+ export CC_ARGS
+ : /tmp
+ cd /tmp/repro/standalone/1
+ /tmp/repro/clang-bad -Wno-mismatched-tags -Xclang=-fmodules-embed-all-files 
-Xclang=-fmodules-local-submodule-visibility -fmodules -fno-implicit-modules 
-fno-implicit-module-maps -std=gnu++17 -Xclang=-fmodule-map-file-home-is-cwd -I 
q/a_proto -fmodule-name=//a -fmodule-map-file=a_proto.cppmap -xc++ 
-Xclang=-emit-module -c a_proto.cppmap -o /tmp/a.pcm
+ cd /tmp/repro/standalone/2
+ /tmp/repro/clang-bad -Wno-mismatched-tags -Xclang=-fmodules-embed-all-files 
-Xclang=-fmodules-local-submodule-visibility -fmodules -fno-implicit-modules 
-fno-implicit-module-maps -std=gnu++17 -Xclang=-fmodule-map-file-home-is-cwd -I 
q/b_proto -I q/a_proto -fmodule-name=//b -fmodule-map-file=b_proto.cppmap 
-Xclang=-fmodule-file=/tmp/a.pcm -xc++ -Xclang=-emit-module -c b_proto.cppmap 
-o /tmp/b.pcm
While building module '//b':
In file included from <module-includes>:1:
In file included from ./p/b_proto/mypkg/b.pb.h:3:
q/a_proto/mypkg/a.pb.h:3:10: fatal error: 'mypkg/a.proto.h' file not found
#include "mypkg/a.proto.h"
         ^~~~~~~~~~~~~~~~~
1 error generated.
```


Repository:
  rG LLVM Github Monorepo

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

https://reviews.llvm.org/D137213

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

Reply via email to