[cfe-dev] [preprocessor] How to customize preprocessor directive handling
Juraj Ivančić
juraj.ivancic at gmail.com
Tue Jul 16 06:02:19 PDT 2013
I am writing a clang-based preprocessor tool. Its goal is, given a
source file and preprocessor state (i.e. input macros and include
paths), to find a set of headers which are needed to successfully
compile that source file. I need this tool to be as fast as possible. (I
am writing something similar to distcc's include server)
I managed to get this working rather easily using PPCallbacks. However,
even though clang's preprocessor is the fastest I found around, I could
use more speed. As my tool will generally process multiple source files
at once, I started building a cache to short-circuit an #include
directive in case header has previously been processed. So far so good.
The problem is that there is no way to customize how preprocessor
processes #include directive, so I am unable to use cached results. In
case of a cache hit I would like to update preprocessor with macro
definitions from cache in order to avoid lexing the entire header once
again.
I tried various approaches and concluded that this currently cannot be done.
I ended up with adding another event to clang::PPCallbacks. It is called
before PPCallbacks::InclusionDirective, and allows me to manually set
clang::FileEntry to use when #include directive is found. This way I can
generate a virtual FileEntry with custom contents in case of a cache
hit, or use default behavior as a fallback. With this I got everything
working, but unfortunately I had to patch Clang.
I would like to ask - is it possible to make Clang support this scenario
out-of-the-box? I attached a patch which does the job for me. I'm pretty
sure the patch will raise an eyebrow on every clang developer, I
included it merely as an illustration of what I need.
Thank you in advance for any help on this issue.
-------------- next part --------------
A non-text attachment was scrubbed...
Name: ppcallbacks.patch
Type: text/x-patch
Size: 2551 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/cfe-dev/attachments/20130716/a30b377f/attachment.bin>
More information about the cfe-dev
mailing list