summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--lldb/include/lldb/Symbol/ClangASTImporter.h62
-rw-r--r--lldb/source/Expression/ClangASTSource.cpp12
-rw-r--r--lldb/source/Expression/ClangExpressionDeclMap.cpp11
-rw-r--r--lldb/source/Symbol/ClangASTImporter.cpp37
4 files changed, 117 insertions, 5 deletions
diff --git a/lldb/include/lldb/Symbol/ClangASTImporter.h b/lldb/include/lldb/Symbol/ClangASTImporter.h
index 587237e90ca..15f5cc37d82 100644
--- a/lldb/include/lldb/Symbol/ClangASTImporter.h
+++ b/lldb/include/lldb/Symbol/ClangASTImporter.h
@@ -20,6 +20,68 @@
#include "lldb/Symbol/ClangNamespaceDecl.h"
namespace lldb_private {
+
+class ClangASTMetrics
+{
+public:
+ static void DumpCounters (lldb::LogSP log);
+ static void ClearLocalCounters ()
+ {
+ local_counters = { 0, 0, 0, 0, 0, 0 };
+ }
+
+ static void RegisterVisibleQuery ()
+ {
+ ++global_counters.m_visible_query_count;
+ ++local_counters.m_visible_query_count;
+ }
+
+ static void RegisterLexicalQuery ()
+ {
+ ++global_counters.m_lexical_query_count;
+ ++local_counters.m_lexical_query_count;
+ }
+
+ static void RegisterLLDBImport ()
+ {
+ ++global_counters.m_lldb_import_count;
+ ++local_counters.m_lldb_import_count;
+ }
+
+ static void RegisterClangImport ()
+ {
+ ++global_counters.m_clang_import_count;
+ ++local_counters.m_clang_import_count;
+ }
+
+ static void RegisterDeclCompletion ()
+ {
+ ++global_counters.m_decls_completed_count;
+ ++local_counters.m_decls_completed_count;
+ }
+
+ static void RegisterRecordLayout ()
+ {
+ ++global_counters.m_record_layout_count;
+ ++local_counters.m_record_layout_count;
+ }
+
+private:
+ struct Counters
+ {
+ uint64_t m_visible_query_count;
+ uint64_t m_lexical_query_count;
+ uint64_t m_lldb_import_count;
+ uint64_t m_clang_import_count;
+ uint64_t m_decls_completed_count;
+ uint64_t m_record_layout_count;
+ };
+
+ static Counters global_counters;
+ static Counters local_counters;
+
+ static void DumpCounters (lldb::LogSP log, Counters &counters);
+};
class ClangASTImporter
{
diff --git a/lldb/source/Expression/ClangASTSource.cpp b/lldb/source/Expression/ClangASTSource.cpp
index 266dce84464..c394a8cb6f0 100644
--- a/lldb/source/Expression/ClangASTSource.cpp
+++ b/lldb/source/Expression/ClangASTSource.cpp
@@ -367,7 +367,9 @@ clang::ExternalLoadResult
ClangASTSource::FindExternalLexicalDecls (const DeclContext *decl_context,
bool (*predicate)(Decl::Kind),
llvm::SmallVectorImpl<Decl*> &decls)
-{
+{
+ ClangASTMetrics::RegisterLexicalQuery();
+
lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
const Decl *context_decl = dyn_cast<Decl>(decl_context);
@@ -485,6 +487,8 @@ ClangASTSource::FindExternalVisibleDecls (NameSearchContext &context)
{
assert (m_ast_context);
+ ClangASTMetrics::RegisterVisibleQuery();
+
const ConstString name(context.m_decl_name.getAsString().c_str());
lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
@@ -1435,6 +1439,8 @@ ClangASTSource::layoutRecordType(const RecordDecl *record,
BaseOffsetMap &base_offsets,
BaseOffsetMap &virtual_base_offsets)
{
+ ClangASTMetrics::RegisterRecordLayout();
+
static unsigned int invocation_id = 0;
unsigned int current_id = invocation_id++;
@@ -1677,7 +1683,9 @@ void *
ClangASTSource::GuardedCopyType (ASTContext *dest_context,
ASTContext *source_context,
void *clang_type)
-{
+{
+ ClangASTMetrics::RegisterLLDBImport();
+
SetImportInProgress(true);
QualType ret_qual_type = m_ast_importer->CopyType (m_ast_context, source_context, QualType::getFromOpaquePtr(clang_type));
diff --git a/lldb/source/Expression/ClangExpressionDeclMap.cpp b/lldb/source/Expression/ClangExpressionDeclMap.cpp
index 1b621224be6..078825797dc 100644
--- a/lldb/source/Expression/ClangExpressionDeclMap.cpp
+++ b/lldb/source/Expression/ClangExpressionDeclMap.cpp
@@ -75,7 +75,9 @@ ClangExpressionDeclMap::~ClangExpressionDeclMap()
bool
ClangExpressionDeclMap::WillParse(ExecutionContext &exe_ctx)
-{
+{
+ ClangASTMetrics::ClearLocalCounters();
+
EnableParserVars();
m_parser_vars->m_exe_ctx = exe_ctx;
@@ -111,6 +113,11 @@ ClangExpressionDeclMap::WillParse(ExecutionContext &exe_ctx)
void
ClangExpressionDeclMap::DidParse()
{
+ lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
+
+ if (log)
+ ClangASTMetrics::DumpCounters(log);
+
if (m_parser_vars.get())
{
for (size_t entity_index = 0, num_entities = m_found_entities.GetSize();
@@ -2605,6 +2612,8 @@ ClangExpressionDeclMap::FindExternalVisibleDecls (NameSearchContext &context)
{
assert (m_ast_context);
+ ClangASTMetrics::RegisterVisibleQuery();
+
const ConstString name(context.m_decl_name.getAsString().c_str());
lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
diff --git a/lldb/source/Symbol/ClangASTImporter.cpp b/lldb/source/Symbol/ClangASTImporter.cpp
index 0e810cfa210..25dfbef9010 100644
--- a/lldb/source/Symbol/ClangASTImporter.cpp
+++ b/lldb/source/Symbol/ClangASTImporter.cpp
@@ -21,7 +21,32 @@
using namespace lldb_private;
using namespace clang;
-clang::QualType
+ClangASTMetrics::Counters ClangASTMetrics::global_counters = { 0, 0, 0, 0, 0, 0 };
+ClangASTMetrics::Counters ClangASTMetrics::local_counters = { 0, 0, 0, 0, 0, 0 };
+
+void ClangASTMetrics::DumpCounters (lldb::LogSP log, ClangASTMetrics::Counters &counters)
+{
+ log->Printf(" Number of visible Decl queries by name : %llu", counters.m_visible_query_count);
+ log->Printf(" Number of lexical Decl queries : %llu", counters.m_lexical_query_count);
+ log->Printf(" Number of imports initiated by LLDB : %llu", counters.m_lldb_import_count);
+ log->Printf(" Number of imports conducted by Clang : %llu", counters.m_clang_import_count);
+ log->Printf(" Number of Decls completed : %llu", counters.m_decls_completed_count);
+ log->Printf(" Number of records laid out : %llu", counters.m_record_layout_count);
+}
+
+void ClangASTMetrics::DumpCounters (lldb::LogSP log)
+{
+ if (!log)
+ return;
+
+ log->Printf("== ClangASTMetrics output ==");
+ log->Printf("-- Global metrics --");
+ DumpCounters (log, global_counters);
+ log->Printf("-- Local metrics --");
+ DumpCounters (log, local_counters);
+}
+
+clang::QualType
ClangASTImporter::CopyType (clang::ASTContext *dst_ast,
clang::ASTContext *src_ast,
clang::QualType type)
@@ -211,7 +236,9 @@ ClangASTImporter::CompleteDecl (clang::Decl *decl)
bool
ClangASTImporter::CompleteTagDecl (clang::TagDecl *decl)
-{
+{
+ ClangASTMetrics::RegisterDeclCompletion();
+
DeclOrigin decl_origin = GetDeclOrigin(decl);
if (!decl_origin.Valid())
@@ -231,6 +258,8 @@ ClangASTImporter::CompleteTagDecl (clang::TagDecl *decl)
bool
ClangASTImporter::CompleteTagDeclWithOrigin(clang::TagDecl *decl, clang::TagDecl *origin_decl)
{
+ ClangASTMetrics::RegisterDeclCompletion();
+
clang::ASTContext *origin_ast_ctx = &origin_decl->getASTContext();
if (!ClangASTContext::GetCompleteDecl(origin_ast_ctx, origin_decl))
@@ -253,6 +282,8 @@ ClangASTImporter::CompleteTagDeclWithOrigin(clang::TagDecl *decl, clang::TagDecl
bool
ClangASTImporter::CompleteObjCInterfaceDecl (clang::ObjCInterfaceDecl *interface_decl)
{
+ ClangASTMetrics::RegisterDeclCompletion();
+
lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
DeclOrigin decl_origin = GetDeclOrigin(interface_decl);
@@ -474,6 +505,8 @@ ClangASTImporter::Minion::ImportDefinitionTo (clang::Decl *to, clang::Decl *from
clang::Decl
*ClangASTImporter::Minion::Imported (clang::Decl *from, clang::Decl *to)
{
+ ClangASTMetrics::RegisterClangImport();
+
lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
if (log)
OpenPOWER on IntegriCloud