kbobyrev added a comment.

In D112608#3090910 <https://reviews.llvm.org/D112608#3090910>, @sammccall wrote:

> Sorry to be late to the party, just some efficiency concerns

No problem, thank you for the comments, I'll send a follow-up!



================
Comment at: clang-tools-extra/clangd/IncludeCleaner.cpp:133
+    // Check if Loc is not written in a physical file.
+    if (FID.isInvalid() || SM.isWrittenInBuiltinFile(Loc) ||
+        SM.isWrittenInCommandLineFile(Loc))
----------------
sammccall wrote:
> This part of the function is a hot path: we haven't deduplicated FileIDs yet. 
> And isWrittenInBulitinFile/CommandLineFile are not cheap (seriously, go look 
> at the implementation of getPresumedLoc. I'm not sure *why* we need to handle 
> the 'presumed' cases there, either).
> 
> I think the simple/good thing is to allow this to hit Files.insert(FID) and 
> then filter those out later instead.
> 
> This could be in a simple walk over the DenseSet at the end, but 
> translateToHeaderIDs is actually looking at the FileEntries for each header 
> anyway. My guess is we're crashing in this code:
> 
> ```
>     const FileEntry *FE = SM.getFileEntryForID(FID);
>     assert(FE); // this assert passes, we get a fake FE for "<built in>", 
> "<command line>" or "<scratch>"
>     // Option 1: we could bail out here with a simple check on FE->getName().
>     const auto File = Includes.getID(FE);
>     assert(File); // this assert fails. Option 2: turn this assert into an if 
> instead. 
> ```
Hmm, good idea, I'll resolve this in a follow-up!

P.S. Yes, we're crashing on `assert(FE)` in here.


================
Comment at: clang-tools-extra/clangd/IncludeCleaner.cpp:148
     // ScratchBuffer). That is not a real file we can include.
     if (!SM.isWrittenInScratchSpace(Exp.getSpellingLoc()))
       add(Exp.getSpellingLoc());
----------------
sammccall wrote:
> FWIW, the same seems to apply here (though at least we've deduplicated file 
> IDs).
> 
> I don't think we need to do the expensive check to avoid adding scratch 
> buffers to the list, when we can just filter them out at the end with a 
> cheaper check.
> (In any case I don't think it makes much sense to check for scratch *before* 
> calling add(), but check for builtin/cli *inside* add()).
Yeah, I was trying to figure out if this would apply to the macro 
expansions/spellings but couldn't figure out a reasonable example, so I left it 
out. I agree that it should probably be handled, too, I just wasn't sure when 
this could happen.

If we do post-filtering, I guess we can handle all of the locations at once, so 
probably safe to even remove these checks.


Repository:
  rG LLVM Github Monorepo

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

https://reviews.llvm.org/D112608

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

Reply via email to