Author: sammccall Date: Tue Jan 30 09:20:54 2018 New Revision: 323792 URL: http://llvm.org/viewvc/llvm-project?rev=323792&view=rev Log: [clangd] Trace code completion.
Context passing is a little messy, but will go away with TLS soon. Modified: clang-tools-extra/trunk/clangd/CodeComplete.cpp Modified: clang-tools-extra/trunk/clangd/CodeComplete.cpp URL: http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/clangd/CodeComplete.cpp?rev=323792&r1=323791&r2=323792&view=diff ============================================================================== --- clang-tools-extra/trunk/clangd/CodeComplete.cpp (original) +++ clang-tools-extra/trunk/clangd/CodeComplete.cpp Tue Jan 30 09:20:54 2018 @@ -19,6 +19,7 @@ #include "Compiler.h" #include "FuzzyMatch.h" #include "Logger.h" +#include "Trace.h" #include "index/Index.h" #include "clang/Frontend/CompilerInstance.h" #include "clang/Frontend/FrontendActions.h" @@ -637,6 +638,7 @@ bool semaCodeComplete(const Context &Ctx const clang::CodeCompleteOptions &Options, const SemaCompleteInput &Input, llvm::function_ref<void()> Callback = nullptr) { + auto Tracer = llvm::make_unique<trace::Span>(Ctx, "Sema completion"); std::vector<const char *> ArgStrs; for (const auto &S : Input.Command.CommandLine) ArgStrs.push_back(S.c_str()); @@ -697,9 +699,12 @@ bool semaCodeComplete(const Context &Ctx "Execute() failed when running codeComplete for " + Input.FileName); return false; } + Tracer.reset(); if (Callback) Callback(); + + Tracer = llvm::make_unique<trace::Span>(Ctx, "Sema completion cleanup"); Action.EndSourceFile(); return true; @@ -796,6 +801,7 @@ clang::CodeCompleteOptions CodeCompleteO // This score is combined with the result quality score for the final score. // - TopN determines the results with the best score. class CodeCompleteFlow { + trace::Span Tracer; const Context &Ctx; const CodeCompleteOptions &Opts; // Sema takes ownership of Recorder. Recorder is valid until Sema cleanup. @@ -808,8 +814,8 @@ class CodeCompleteFlow { public: // A CodeCompleteFlow object is only useful for calling run() exactly once. CodeCompleteFlow(const Context &Ctx, const CodeCompleteOptions &Opts) - : Ctx(Ctx), Opts(Opts), RecorderOwner(new CompletionRecorder(Opts)), - Recorder(*RecorderOwner) {} + : Tracer(Ctx, "CodeCompleteFlow"), Ctx(Tracer.Ctx), Opts(Opts), + RecorderOwner(new CompletionRecorder(Opts)), Recorder(*RecorderOwner) {} CompletionList run(const SemaCompleteInput &SemaCCInput) && { // We run Sema code completion first. It builds an AST and calculates: @@ -824,6 +830,11 @@ public: log(Ctx, "Code complete: no Sema callback, 0 results"); }); + SPAN_ATTACH(Tracer, "sema_results", NSema); + SPAN_ATTACH(Tracer, "index_results", NIndex); + SPAN_ATTACH(Tracer, "merged_results", NBoth); + SPAN_ATTACH(Tracer, "returned_results", Output.items.size()); + SPAN_ATTACH(Tracer, "incomplete", Output.isIncomplete); log(Ctx, llvm::formatv("Code complete: {0} results from Sema, {1} from Index, " "{2} matched, {3} returned{4}.", @@ -860,6 +871,9 @@ private: SymbolSlab queryIndex() { if (!Opts.Index || !allowIndex(Recorder.CCContext.getKind())) return SymbolSlab(); + trace::Span Tracer(Ctx, "Query index"); + SPAN_ATTACH(Tracer, "limit", Opts.Limit); + SymbolSlab::Builder ResultsBuilder; // Build the query. FuzzyFindRequest Req; @@ -868,12 +882,15 @@ private: Req.Query = Filter->pattern(); Req.Scopes = getQueryScopes(Recorder.CCContext, Recorder.CCSema->getSourceManager()); - log(Ctx, llvm::formatv( - "Code complete: fuzzyFind(\"{0}\", Scopes: [{1}]", Req.Query, - llvm::join(Req.Scopes.begin(), Req.Scopes.end(), ","))); + log(Tracer.Ctx, + llvm::formatv("Code complete: fuzzyFind(\"{0}\", Scopes: [{1}]", + Req.Query, + llvm::join(Req.Scopes.begin(), Req.Scopes.end(), ","))); // Run the query against the index. - Incomplete |= !Opts.Index->fuzzyFind( - Ctx, Req, [&](const Symbol &Sym) { ResultsBuilder.insert(Sym); }); + Incomplete |= + !Opts.Index->fuzzyFind(Tracer.Ctx, Req, [&](const Symbol &Sym) { + ResultsBuilder.insert(Sym); + }); return std::move(ResultsBuilder).build(); } @@ -882,6 +899,7 @@ private: std::vector<std::pair<CompletionCandidate, CompletionItemScores>> mergeResults(const std::vector<CodeCompletionResult> &SemaResults, const SymbolSlab &IndexResults) { + trace::Span Tracer(Ctx, "Merge and score results"); // We only keep the best N results at any time, in "native" format. TopN Top(Opts.Limit == 0 ? TopN::Unbounded : Opts.Limit); llvm::DenseSet<const Symbol *> UsedIndexResults; _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits