llvm-project/clang-tools-extra/clangd
Utkarsh Saxena aa979084df [clang][Syntax] Optimize expandedTokens for token ranges.
`expandedTokens(SourceRange)` used to do a binary search to get the
expanded tokens belonging to a source range. Each binary search uses
`isBeforeInTranslationUnit` to order two source locations. This is
inherently very slow.
By profiling clangd we found out that users like clangd::SelectionTree
spend 95% of time in `isBeforeInTranslationUnit`. Also it is worth
noting that users of `expandedTokens(SourceRange)` majorly use ranges
provided by AST to query this funciton. The ranges provided by AST are
token ranges (starting at the beginning of a token and ending at the
beginning of another token).

Therefore we can avoid the binary search in majority of the cases by
maintaining an index of ExpandedToken by their SourceLocations. We still
do binary search for ranges which are not token ranges but such
instances are quite low.

Performance:
`~/build/bin/clangd --check=clang/lib/Serialization/ASTReader.cpp`
Before: Took 2:10s to complete.
Now: Took 1:13s to complete.

Differential Revision: https://reviews.llvm.org/D99086
2021-03-25 18:54:15 +01:00
..
benchmarks [cte][NFC] Remove all references to stdlib stream headers. 2021-03-02 21:57:16 +00:00
fuzzer [clangd] Replace usages of dummy with more descriptive words 2021-03-22 12:49:24 +01:00
include-mapping
index [clangd] Replace usages of dummy with more descriptive words 2021-03-22 12:49:24 +01:00
indexer [clangd] Improve clangd-indexer performance 2020-11-11 14:38:06 +03:00
quality Make clangd CompletionModel usable even with non-standard (but supported) layout 2021-03-22 10:05:25 +01:00
refactor [clangd] Replace usages of dummy with more descriptive words 2021-03-22 12:49:24 +01:00
support [clangd] Replace usages of dummy with more descriptive words 2021-03-22 12:49:24 +01:00
test [clangd] Introduce a CommandLineConfigProvider 2021-03-11 13:35:05 +01:00
tool [clangd] Introduce pullDiags endpoint 2021-03-16 12:52:15 +01:00
unittests [clangd] Replace usages of dummy with more descriptive words 2021-03-22 12:49:24 +01:00
xpc [clangd] makeStringError,make_error<StringError> -> error() 2020-09-14 11:48:31 +02:00
AST.cpp Improve hover scopes for Objective-C code 2021-02-12 10:27:32 -05:00
AST.h Improve hover scopes for Objective-C code 2021-02-12 10:27:32 -05:00
ASTSignals.cpp [clangd] Factor out the heuristic resolver code into its own class 2021-02-16 04:10:52 -05:00
ASTSignals.h [clangd] Trivial: Documentation fix in ASTSignals. 2021-01-14 18:38:42 +01:00
CMakeLists.txt [clangd] Optionally add reflection for clangd-index-server 2021-03-15 21:07:25 +01:00
CSymbolMap.inc
ClangdLSPServer.cpp [clangd] Add `limit` extension on completion and workspace-symbols 2021-03-16 12:28:01 +01:00
ClangdLSPServer.h [clangd] Introduce a CommandLineConfigProvider 2021-03-11 13:35:05 +01:00
ClangdServer.cpp [clangd] Replace usages of dummy with more descriptive words 2021-03-22 12:49:24 +01:00
ClangdServer.h [clangd] Introduce pullDiags endpoint 2021-03-16 12:52:15 +01:00
CodeComplete.cpp [clangd] Drop template argument lists from completions followed by < 2021-02-18 13:06:11 +01:00
CodeComplete.h Revert "Revert "[clangd] Use ML Code completion ranking as default."" 2021-03-02 18:03:52 +01:00
CodeCompletionStrings.cpp [clangd] Fix invalid UTF8 when extracting doc comments. 2020-09-30 16:05:12 +02:00
CodeCompletionStrings.h
CollectMacros.cpp [clangd] Add main file macros into the main-file index. 2021-01-14 15:10:17 +03:00
CollectMacros.h [clangd] Add main file macros into the main-file index. 2021-01-14 15:10:17 +03:00
CompileCommands.cpp [clangd] Replace usages of dummy with more descriptive words 2021-03-22 12:49:24 +01:00
CompileCommands.h Reland [clangd] Quote/escape argv included in log messages. 2021-01-31 16:39:47 +01:00
Compiler.cpp [clangd] Remove the recovery-ast options. 2021-01-20 11:23:57 +01:00
Compiler.h [clangd] Retire some flags for uncontroversial, stable features. 2021-01-20 11:47:12 +01:00
Config.cpp [clangd] config() -> Config::current to avoid confict with NS 2020-06-29 23:05:19 +02:00
Config.h [clangd] Add config block for Completion and option for AllScopes 2021-03-11 20:30:35 +01:00
ConfigCompile.cpp [clangd] Fix a use-after-free 2021-03-25 18:26:17 +01:00
ConfigFragment.h [clangd] Add config block for Completion and option for AllScopes 2021-03-11 20:30:35 +01:00
ConfigProvider.cpp [clangd] Expose absoluteParent helper 2021-02-19 13:40:21 +01:00
ConfigProvider.h [clangd] Publish config file errors over LSP 2020-12-07 11:07:32 +01:00
ConfigYAML.cpp [clangd] Add config block for Completion and option for AllScopes 2021-03-11 20:30:35 +01:00
Diagnostics.cpp [clangd] Allow diagnostics to be suppressed with configuration 2021-01-25 15:59:07 +01:00
Diagnostics.h [clangd] Allow diagnostics to be suppressed with configuration 2021-01-25 15:59:07 +01:00
DraftStore.cpp [clangd][NFC] Silence some buildbot warnings after 0250b053 2021-03-09 14:55:55 +00:00
DraftStore.h [clangd][NFC] Silence some buildbot warnings after 0250b053 2021-03-09 14:55:55 +00:00
DumpAST.cpp Revert "Following up on PR48517, fix handling of template arguments that refer" 2021-01-20 15:55:35 +01:00
DumpAST.h [clangd] Add textDocument/ast extension method to dump the AST 2020-11-20 01:13:28 +01:00
ExpectedTypes.cpp Make llvm::StringRef to std::string conversions explicit. 2020-01-28 23:25:25 +01:00
ExpectedTypes.h
FS.cpp Make llvm::StringRef to std::string conversions explicit. 2020-01-28 23:25:25 +01:00
FS.h [clangd] Move non-clang base pieces into separate support/ lib. NFCI 2020-04-29 15:57:12 +02:00
FeatureModule.cpp [clangd] Rename Module -> FeatureModule to avoid confusion. NFC 2021-03-05 10:04:00 +01:00
FeatureModule.h [clangd] Rename Module -> FeatureModule to avoid confusion. NFC 2021-03-05 10:04:00 +01:00
Features.inc.in [clangd] Optionally add reflection for clangd-index-server 2021-03-15 21:07:25 +01:00
FileDistance.cpp [clangd] NFC: Use SmallVector<T> where possible 2020-12-10 13:36:49 +01:00
FileDistance.h Move endian constant from Host.h to SwapByteOrder.h, prune include 2019-10-19 00:48:11 +00:00
FindSymbols.cpp [clangd] Replace usages of dummy with more descriptive words 2021-03-22 12:49:24 +01:00
FindSymbols.h [clang-tools-extra] NFC: Fix trivial typo in documents and comments 2020-04-05 15:28:40 +09:00
FindTarget.cpp [clangd] ObjC fixes for semantic highlighting and xref highlights 2021-03-03 20:16:08 +01:00
FindTarget.h [clangd] Factor out the heuristic resolver code into its own class 2021-02-16 04:10:52 -05:00
Format.cpp [clangd] Replace usages of dummy with more descriptive words 2021-03-22 12:49:24 +01:00
Format.h
FuzzyMatch.cpp
FuzzyMatch.h
GlobalCompilationDatabase.cpp [clangd] Expose absoluteParent helper 2021-02-19 13:40:21 +01:00
GlobalCompilationDatabase.h [clangd] Allow configuration database to be specified in config. 2021-01-25 23:15:48 +01:00
HeaderSourceSwitch.cpp [clangd][NFC] Use PathRef for getCorrespondingHeaderOrSource 2021-01-07 02:41:19 +00:00
HeaderSourceSwitch.h [clangd][NFC] Use PathRef for getCorrespondingHeaderOrSource 2021-01-07 02:41:19 +00:00
Headers.cpp [clangd] Introduce Modules 2021-02-12 18:37:16 +01:00
Headers.h [clangd] Use flags from open files when opening headers they include 2021-03-01 09:43:59 +01:00
HeuristicResolver.cpp [clangd] Factor out the heuristic resolver code into its own class 2021-02-16 04:10:52 -05:00
HeuristicResolver.h [clangd] Factor out the heuristic resolver code into its own class 2021-02-16 04:10:52 -05:00
Hover.cpp [clangd] Show hex value of numeric constants 2021-03-02 16:33:02 +01:00
Hover.h [clangd] Improve hover on arguments to function call 2020-07-03 11:51:15 +02:00
IncludeFixer.cpp [clangd] Deduplicate scopes in IncludeFixer queries 2021-02-05 14:02:50 +01:00
IncludeFixer.h
JSONTransport.cpp [clangd] Avoid reallocating buffers for each message read: 2021-01-13 17:40:33 +01:00
LSPBinder.h [clangd] Bind outgoing calls through LSPBinder too. NFC 2021-02-17 10:56:06 +01:00
ParsedAST.cpp [clang][Syntax] Optimize expandedTokens for token ranges. 2021-03-25 18:54:15 +01:00
ParsedAST.h [clangd] Introduce pullDiags endpoint 2021-03-16 12:52:15 +01:00
PathMapping.cpp [clangd] Add error() function for creating formatv-style llvm::Errors. NFC 2020-09-14 10:43:42 +02:00
PathMapping.h [clangd] Add path mappings functionality 2020-01-07 12:40:51 +01:00
Preamble.cpp Frontend: Take VFS and MainFileBuffer by reference in PrecompiledPreamble::CanReuse, NFC 2021-01-25 17:50:56 -08:00
Preamble.h [clangd] Introduce pullDiags endpoint 2021-03-16 12:52:15 +01:00
Protocol.cpp [clangd] Add `limit` extension on completion and workspace-symbols 2021-03-16 12:28:01 +01:00
Protocol.h [clangd] Add `limit` extension on completion and workspace-symbols 2021-03-16 12:28:01 +01:00
Quality.cpp Revert "Revert "[clangd] Use ML Code completion ranking as default."" 2021-03-02 18:03:52 +01:00
Quality.h Revert "[clangd] Extract symbol-scope logic out of Quality, add tests. NFC" 2021-01-29 14:59:16 +01:00
QueryDriverDatabase.cpp Reland [clangd] Quote/escape argv included in log messages. 2021-01-31 16:39:47 +01:00
README.md [Branch-Rename] Fix some links 2021-02-01 16:43:21 +05:30
RIFF.cpp [clangd] Add error() function for creating formatv-style llvm::Errors. NFC 2020-09-14 10:43:42 +02:00
RIFF.h [clangd] Improve serialization error messages. NFC 2020-07-08 17:31:40 +02:00
Selection.cpp [clangd] Selection handles CXXBaseSpecifier 2021-01-26 18:58:53 +00:00
Selection.h Remove references to the ast_type_traits namespace 2020-12-11 00:58:46 +01:00
SemanticHighlighting.cpp [clangd] Replace usages of dummy with more descriptive words 2021-03-22 12:49:24 +01:00
SemanticHighlighting.h [clangd] ObjC fixes for semantic highlighting and xref highlights 2021-03-03 20:16:08 +01:00
SemanticSelection.cpp [clang] Simplify buildSyntaxTree API 2020-11-09 22:49:54 +01:00
SemanticSelection.h [clangd] Implement textDocument/foldingRange 2020-07-14 09:28:42 +02:00
SourceCode.cpp [clangd] Replace usages of dummy with more descriptive words 2021-03-22 12:49:24 +01:00
SourceCode.h [clangd] Move DraftStore from ClangdLSPServer into ClangdServer. 2021-03-02 22:58:50 +01:00
StdSymbolMap.inc
TUScheduler.cpp [clangd] Use Dirty Filesystem for cross file rename. 2021-03-10 13:41:29 +00:00
TUScheduler.h [clangd] Use Dirty Filesystem for cross file rename. 2021-03-10 13:41:29 +00:00
TidyProvider.cpp [clangd] Expose absoluteParent helper 2021-02-19 13:40:21 +01:00
TidyProvider.h [clangd] Validate clang-tidy Checks in clangd config. 2020-12-15 21:10:57 +00:00
Transport.h [NFC] Fix typos in Clangd and Clang 2019-12-16 10:54:40 +01:00
URI.cpp [clangd] Remove dead variable. NFC 2020-09-30 23:19:15 +02:00
URI.h [clangd] Simplify the callside of URI::resolve, NFC. 2019-09-23 14:39:37 +00:00
XRefs.cpp [clangd] Replace usages of dummy with more descriptive words 2021-03-22 12:49:24 +01:00
XRefs.h [clangd] Report only decl of overridding method in xref. 2021-02-02 13:06:20 +01:00

README.md

clangd

clangd is a language server, and provides C++ IDE features to editors. This is not its documentation.

Communication channels

If you have any questions or feedback, you can reach community and developers through one of these channels:

Building and testing clangd

For a minimal setup on building clangd:

  • Clone the LLVM repo to $LLVM_ROOT.

  • Create a build directory, for example at $LLVM_ROOT/build.

  • Inside the build directory run: cmake $LLVM_ROOT/llvm/ -DCMAKE_BUILD_TYPE=Release -DLLVM_ENABLE_PROJECTS="clang;clang-tools-extra".

    • We suggest building in Release mode as building DEBUG binaries requires considerably more resources. You can check Building LLVM with CMake documentation for more details about cmake flags.
    • In addition to that using Ninja as a generator rather than default make is preferred. To do that consider passing -G Ninja to cmake invocation.
    • Finally, you can turn on assertions via -DLLVM_ENABLE_ASSERTS=On.
  • Afterwards you can build clangd with cmake --build $LLVM_ROOT/build --target clangd, similarly run tests by changing target to check-clangd.