Using precompiled headers with libtooling?


We are using clang libtooling, and we think about enabling precompiled headers to speed-up our processing, but I’ve not found any document about that, so I have a few questions:

  • If we do so, will the content of the pch be visited with a RecursiveASTVisitor? With an ast matcher?
  • Will code location inside the PCH refer to the files that generated the pch?
  • Are there any other caveat?
  • Is there a tool to generate the pch with an interface similar to ClangTool, or should I just spawn a sub process the create the pch before starting the tool?

Thank you for your help,


I’ve made some progress in that direction, but I’m not done yet, and I have some hard time putting it all together, so I’m thinking I may be missing something obvious. So I’d like to describe what I’ve done so far:

  • I gave up using a ClangTool to run the preprocessing step, it just did not work. Instead, I’m creating a CompilerInvocation and pass it to a custom FrontendActionFactory that returns a GeneratePCHAction.
  • This sort of works (assuming I pass to the CompilerInvocation all the arguments equivalent to the ones I pass to the ClangTool that I use later). But then, when I have any error in the PCH code, the PCH is not saved on disk (for what I do, I really don’t mind having incomplete results, so I’d like to save it anyway)
  • So I created a new action that inherits from GeneratePCHAction but in CreateASTConsumer has the same code as its base class, but uses true instead of false for the argument AllowASTWithErrors of the PCHGenerator constructor. But still, the PCH file does not get generated in case of errors.

Do you think I’m going in the right direction? Do you have any idea what I should do to achieve my goal?

I’ve got another question: Many tooling function have a shared_ptr argument. Does it mean I could use a PCH in memory without ever saving it to the disk, or is if just to be used for modules, as the documentation seems to imply? Do you have any hint about how this can be used?

Thank you!