[PATCH] D80681: [clang][SourceManager] cache Macro Expansions

Kadir Cetinkaya via Phabricator via cfe-commits cfe-commits at lists.llvm.org
Wed Jun 17 02:40:06 PDT 2020


kadircet added a comment.

In D80681#2096886 <https://reviews.llvm.org/D80681#2096886>, @nickdesaulniers wrote:

> Heh, those were painstakingly written in markdown by hand, using `CC="/usr/bin/time -v clang"` to test.  The weren't statistically significant (N=1), nor were they autogenerated.  My claims about builds of LLVM are similarly non-scientific in terms of statistical significance.


Thanks, I believe it would be still good to provide those numbers for LLVM too (even if they are non-scientific), for the sake of future travellers that want to play with caching logic here.

> I will break this up into 3 patches, and ask you kindly to review once I have them ready.  I will post them here, too, in case other reviewers or subscribers would like to follow along, then I'll Abandon this revision.

thanks a lot, I've provided some details on your libclang interface comment below. but you might want to hold off on dead-code elimination patch, as it is in a quite fragile state and libclang stability is a concern I am not too familiar with.



================
Comment at: clang/include/clang/Basic/SourceManager.h:1747
       return getLoadedSLocEntryByID(ID, Invalid);
-    return getLocalSLocEntry(static_cast<unsigned>(ID), Invalid);
+    return getLocalSLocEntry(static_cast<unsigned>(ID));
   }
----------------
nickdesaulniers wrote:
> kadircet wrote:
> > i think this deserves its separate patch.
> > 
> > We still can satisfy the interface requirements of libclang by introducing another member `getLocalSLocEntryWithInvalid` and change the assertion into an if check, populating `Invalid` in case of failure, what to return is more tricky though it is a const ref, I suppose we can return a dummy entry.
> > 
> > Feel free to keep the newly added calls without an `Invalid` argument, but I wouldn't modify the already existing ones in this patch.
> > the interface requirements of libclang 
> 
> Oh? I must have missed that. Can you tell me more about that interface?  I would have thought this would fail to build if I messed up an interface?
signature requirement is specified in https://github.com/llvm/llvm-project/blob/master/clang/tools/libclang/CIndexInclusionStack.cpp#L21, but that's actually an implementation file. So one could change the details instead and keep libclang API the same (or as mentioned above, you can just introduce a new SourceManager member that will fill in Invalid)

But the more I looked at this code, it started looking more iffy. It's `getLoadedSLocEntry` sibling is operating on a vector, asserting in a couple places and as a fallback just creating a new entry at given index via `lodadedentriesvector[index] = something`without caring about OOB access as it asserted previously. So this whole `Invalid` shenanigan looks ... weird.

Satisfying a const ref return type with an optional `Invalid` flag seems implausible to me :/


Repository:
  rG LLVM Github Monorepo

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

https://reviews.llvm.org/D80681





More information about the cfe-commits mailing list