Skip to content

Commit

Permalink
[clangd] Skip (most) predefined macros when scanning for preamble pat…
Browse files Browse the repository at this point in the history
…ching.

This is unneccesary work.
With this change, we skip generating and lexing ~10k of predefines twice.

A dumb benchmark of building a preamble for an empty file in a loop shows:
 - before: 1.90ms/run
 - after: 1.36ms/run
So this should be worth 0.5ms for each AST build and code completion.

There can be a functional difference, but it's very minor.
If the preamble contains e.g. `#ifndef __llvm__ ... #endif` then before we would
not take it. After this change we will take the branch (single-file mode takes
all branches with unknown conditions) and so gather different directives.

However I think this is negligible:
 - this is already true of non-builtin macros (from included headers).
   We've had no complaints.
 - this affects the baseline and modified in the same way, so only makes a
   difference transiently when code guarded by such an #ifdef is being edited

Differential Revision: https://reviews.llvm.org/D125179
  • Loading branch information
sam-mccall committed May 9, 2022
1 parent a425cac commit f1a9c4b
Showing 1 changed file with 1 addition and 0 deletions.
1 change: 1 addition & 0 deletions clang-tools-extra/clangd/Preamble.cpp
Expand Up @@ -302,6 +302,7 @@ scanPreamble(llvm::StringRef Contents, const tooling::CompileCommand &Cmd) {
return error("compiler instance had no inputs");
// We are only interested in main file includes.
Clang->getPreprocessorOpts().SingleFileParseMode = true;
Clang->getPreprocessorOpts().UsePredefines = false;
PreprocessOnlyAction Action;
if (!Action.BeginSourceFile(*Clang, Clang->getFrontendOpts().Inputs[0]))
return error("failed BeginSourceFile");
Expand Down

0 comments on commit f1a9c4b

Please sign in to comment.