Commit c9a39a89 authored by Raphael Isemann's avatar Raphael Isemann
Browse files

[lldb] Add a display name to ClangASTContext instances

Summary:
I often struggle to understand what exactly LLDB is doing by looking at our expression evaluation logging as our messages look like this:
```
CompleteTagDecl[2] on (ASTContext*)0x7ff31f01d240 Completing (TagDecl*)0x7ff31f01d568 named DeclName1
```

From the log messages it's unclear what this ASTContext is. Is it the scratch context, the expression context, some decl vendor context or a context from a module?
The pointer value isn't helpful for anyone unless I'm in a debugger where I could inspect the memory at the address. But even with a debugger it's not easy to
figure out what this ASTContext is without having deeper understanding about all the different ASTContext instances in LLDB (e.g., valid SourceLocation
from the file system usually means that this is the Objective-C decl vendor, a file name from multiple expressions is probably the scratch context, etc.).

This patch adds a name field to ClangASTContext instances that we can use to store a name which can be used for logging and debugging. With this
our log messages now look like this:
```
CompleteTagDecl[2] on scratch ASTContext. Completing (TagDecl*)0x7ff31f01d568 named Foo
```
We can now also just print a ClangASTContext from the debugger and see a useful name in the `m_display_name` field, e.g.
```
  m_display_name = "AST for /Users/user/test/main.o";
```

Reviewers: shafik, labath, JDevlieghere, mib

Reviewed By: shafik

Subscribers: clayborg, lldb-commits

Tags: #lldb

Differential Revision: https://reviews.llvm.org/D72391
parent 2e25d75a
Loading
Loading
Loading
Loading
+13 −2
Original line number Diff line number Diff line
@@ -57,17 +57,20 @@ public:

  /// Constructs a ClangASTContext with an ASTContext using the given triple.
  ///
  /// \param name The name for the ClangASTContext (for logging purposes)
  /// \param triple The llvm::Triple used for the ASTContext. The triple defines
  ///               certain characteristics of the ASTContext and its types
  ///               (e.g., whether certain primitive types exist or what their
  ///               signedness is).
  explicit ClangASTContext(llvm::Triple triple);
  explicit ClangASTContext(llvm::StringRef name, llvm::Triple triple);

  /// Constructs a ClangASTContext that uses an existing ASTContext internally.
  /// Useful when having an existing ASTContext created by Clang.
  ///
  /// \param name The name for the ClangASTContext (for logging purposes)
  /// \param existing_ctxt An existing ASTContext.
  explicit ClangASTContext(clang::ASTContext &existing_ctxt);
  explicit ClangASTContext(llvm::StringRef name,
                           clang::ASTContext &existing_ctxt);

  ~ClangASTContext() override;

@@ -104,6 +107,10 @@ public:
    return llvm::dyn_cast<ClangASTContext>(&type_system_or_err.get());
  }

  /// Returns the display name of this ClangASTContext that indicates what
  /// purpose it serves in LLDB. Used for example in logs.
  llvm::StringRef getDisplayName() const { return m_display_name; }

  clang::ASTContext &getASTContext();

  clang::MangleContext *getMangleContext();
@@ -947,6 +954,10 @@ private:
  std::unique_ptr<clang::MangleContext> m_mangle_ctx_up;
  uint32_t m_pointer_byte_size = 0;
  bool m_ast_owned = false;
  /// A string describing what this ClangASTContext represents (e.g.,
  /// AST for debug information, an expression, some other utility ClangAST).
  /// Useful for logging and debugging.
  std::string m_display_name;

  typedef llvm::DenseMap<const clang::Decl *, ClangASTMetadata> DeclMetadataMap;
  /// Maps Decls to their associated ClangASTMetadata.
+52 −45
Original line number Diff line number Diff line
@@ -203,8 +203,8 @@ void ClangASTSource::CompleteType(TagDecl *tag_decl) {
    LLDB_LOG(log,
             "    CompleteTagDecl[{0}] on (ASTContext*){1} Completing "
             "(TagDecl*){2} named {3}",
             current_id, static_cast<void *>(m_ast_context),
             static_cast<void *>(tag_decl), tag_decl->getName());
             current_id, m_clang_ast_context->getDisplayName(), tag_decl,
             tag_decl->getName());

    LLDB_LOG(log, "      CTD[%u] Before:\n{0}", current_id,
             ClangUtil::DumpDecl(tag_decl));
@@ -336,9 +336,10 @@ void ClangASTSource::CompleteType(clang::ObjCInterfaceDecl *interface_decl) {
  Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_EXPRESSIONS));

  LLDB_LOG(log,
           "    [CompleteObjCInterfaceDecl] on (ASTContext*){0} Completing "
           "an ObjCInterfaceDecl named {1}",
           m_ast_context, interface_decl->getName());
           "    [CompleteObjCInterfaceDecl] on (ASTContext*){0} '{1}' "
           "Completing an ObjCInterfaceDecl named {1}",
           m_ast_context, m_clang_ast_context->getDisplayName(),
           interface_decl->getName());
  LLDB_LOG(log, "      [COID] Before:\n{0}",
           ClangUtil::DumpDecl(interface_decl));

@@ -441,24 +442,25 @@ void ClangASTSource::FindExternalLexicalDecls(
  if (log) {
    if (const NamedDecl *context_named_decl = dyn_cast<NamedDecl>(context_decl))
      LLDB_LOG(log,
               "FindExternalLexicalDecls[{0}] on (ASTContext*){1} in '{2}' "
               "(%sDecl*){3}",
               current_id, static_cast<void *>(m_ast_context),
               "FindExternalLexicalDecls[{0}] on (ASTContext*){1} '{2}' in "
               "'{3}' (%sDecl*){4}",
               current_id, m_ast_context, m_clang_ast_context->getDisplayName(),
               context_named_decl->getNameAsString().c_str(),
               context_decl->getDeclKindName(),
               static_cast<const void *>(context_decl));
    else if (context_decl)
      LLDB_LOG(
          log,
          "FindExternalLexicalDecls[{0}] on (ASTContext*){1} in ({2}Decl*){3}",
          current_id, static_cast<void *>(m_ast_context),
      LLDB_LOG(log,
               "FindExternalLexicalDecls[{0}] on (ASTContext*){1} '{2}' in "
               "({3}Decl*){4}",
               current_id, m_ast_context, m_clang_ast_context->getDisplayName(),
               context_decl->getDeclKindName(),
               static_cast<const void *>(context_decl));
    else
      LLDB_LOG(
          log,
          "FindExternalLexicalDecls[{0}] on (ASTContext*){1} in a NULL context",
          current_id, static_cast<const void *>(m_ast_context));
      LLDB_LOG(log,
               "FindExternalLexicalDecls[{0}] on (ASTContext*){1} '{2}' in a "
               "NULL context",
               current_id, m_ast_context,
               m_clang_ast_context->getDisplayName());
  }

  ClangASTImporter::DeclOrigin original = m_ast_importer_sp->GetDeclOrigin(context_decl);
@@ -466,10 +468,10 @@ void ClangASTSource::FindExternalLexicalDecls(
  if (!original.Valid())
    return;

  LLDB_LOG(
      log, "  FELD[{0}] Original decl (ASTContext*){1:x} (Decl*){2:x}:\n{3}",
      current_id, static_cast<void *>(original.ctx),
      static_cast<void *>(original.decl), ClangUtil::DumpDecl(original.decl));
  LLDB_LOG(log, "  FELD[{0}] Original decl {1} (Decl*){2:x}:\n{3}", current_id,
           static_cast<void *>(original.ctx),
           static_cast<void *>(original.decl),
           ClangUtil::DumpDecl(original.decl));

  if (ObjCInterfaceDecl *original_iface_decl =
          dyn_cast<ObjCInterfaceDecl>(original.decl)) {
@@ -563,20 +565,22 @@ void ClangASTSource::FindExternalVisibleDecls(NameSearchContext &context) {
    if (!context.m_decl_context)
      LLDB_LOG(log,
               "ClangASTSource::FindExternalVisibleDecls[{0}] on "
               "(ASTContext*){1} for '{2}' in a NULL DeclContext",
               current_id, m_ast_context, name);
               "(ASTContext*){1} '{2}' for '{3}' in a NULL DeclContext",
               current_id, m_ast_context, m_clang_ast_context->getDisplayName(),
               name);
    else if (const NamedDecl *context_named_decl =
                 dyn_cast<NamedDecl>(context.m_decl_context))
      LLDB_LOG(log,
               "ClangASTSource::FindExternalVisibleDecls[{0}] on "
               "(ASTContext*){1} for '{2}' in '{3}'",
               current_id, m_ast_context, name, context_named_decl->getName());
               "(ASTContext*){1} '{2}' for '{3}' in '{4}'",
               current_id, m_ast_context, m_clang_ast_context->getDisplayName(),
               name, context_named_decl->getName());
    else
      LLDB_LOG(log,
               "ClangASTSource::FindExternalVisibleDecls[{0}] on "
               "(ASTContext*){1} for '{2}' in a '{3}'",
               current_id, m_ast_context, name,
               context.m_decl_context->getDeclKindName());
               "(ASTContext*){1} '{2}' for '{3}' in a '{4}'",
               current_id, m_ast_context, m_clang_ast_context->getDisplayName(),
               name, context.m_decl_context->getDeclKindName());
  }

  context.m_namespace_map = std::make_shared<ClangASTImporter::NamespaceMap>();
@@ -1042,9 +1046,10 @@ void ClangASTSource::FindObjCMethodDecls(NameSearchContext &context) {
  ConstString selector_name(ss.GetString());

  LLDB_LOG(log,
           "ClangASTSource::FindObjCMethodDecls[{0}] on (ASTContext*){1} "
           "for selector [{2} {3}]",
           current_id, m_ast_context, interface_decl->getName(), selector_name);
           "ClangASTSource::FindObjCMethodDecls[{0}] on (ASTContext*){1} '{2}' "
           "for selector [{3} {4}]",
           current_id, m_ast_context, m_clang_ast_context->getDisplayName(),
           interface_decl->getName(), selector_name);
  SymbolContextList sc_list;

  const bool include_symbols = false;
@@ -1337,9 +1342,9 @@ void ClangASTSource::FindObjCPropertyAndIvarDecls(NameSearchContext &context) {

  LLDB_LOG(log,
           "ClangASTSource::FindObjCPropertyAndIvarDecls[{0}] on "
           "(ASTContext*){1} for '{2}.{3}'",
           current_id, m_ast_context, parser_iface_decl->getName(),
           context.m_decl_name.getAsString());
           "(ASTContext*){1} '{2}' for '{3}.{4}'",
           current_id, m_ast_context, m_clang_ast_context->getDisplayName(),
           parser_iface_decl->getName(), context.m_decl_name.getAsString());

  if (FindObjCPropertyAndIvarDeclsWithOrigin(
          current_id, context, *this, origin_iface_decl))
@@ -1553,9 +1558,10 @@ bool ClangASTSource::layoutRecordType(const RecordDecl *record, uint64_t &size,
  Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_EXPRESSIONS));

  LLDB_LOG(log,
           "LayoutRecordType[{0}] on (ASTContext*){1} for (RecordDecl*){2} "
           "[name = '{3}']",
           current_id, m_ast_context, record, record->getName());
           "LayoutRecordType[{0}] on (ASTContext*){1} '{2}' for (RecordDecl*)"
           "{3} [name = '{4}']",
           current_id, m_ast_context, m_clang_ast_context->getDisplayName(),
           record, record->getName());

  DeclFromParser<const RecordDecl> parser_record(record);
  DeclFromUser<const RecordDecl> origin_record(
@@ -1676,15 +1682,16 @@ void ClangASTSource::CompleteNamespaceMap(
  if (log) {
    if (parent_map && parent_map->size())
      LLDB_LOG(log,
               "CompleteNamespaceMap[{0}] on (ASTContext*){1} Searching for "
               "namespace {2} in namespace {3}",
               current_id, m_ast_context, name,
               parent_map->begin()->second.GetName());
               "CompleteNamespaceMap[{0}] on (ASTContext*){1} '{2}' Searching "
               "for namespace {3} in namespace {4}",
               current_id, m_ast_context, m_clang_ast_context->getDisplayName(),
               name, parent_map->begin()->second.GetName());
    else
      LLDB_LOG(log,
               "CompleteNamespaceMap[{0}] on (ASTContext*){1} Searching for "
               "namespace {2}",
               current_id, m_ast_context, name);
               "CompleteNamespaceMap[{0}] on (ASTContext*){1} '{2}' Searching "
               "for namespace {3}",
               current_id, m_ast_context, m_clang_ast_context->getDisplayName(),
               name);
  }

  if (parent_map) {
+2 −1
Original line number Diff line number Diff line
@@ -606,7 +606,8 @@ ClangExpressionParser::ClangExpressionParser(
  m_compiler->createASTContext();
  clang::ASTContext &ast_context = m_compiler->getASTContext();

  m_ast_context.reset(new ClangASTContext(ast_context));
  m_ast_context.reset(new ClangASTContext(
      "Expression ASTContext for '" + m_filename + "'", ast_context));

  std::string module_name("$__lldb_module");

+3 −1
Original line number Diff line number Diff line
@@ -160,7 +160,9 @@ ClangModulesDeclVendorImpl::ClangModulesDeclVendorImpl(
      m_parser(std::move(parser)) {

  // Initialize our ClangASTContext.
  m_ast_context.reset(new ClangASTContext(m_compiler_instance->getASTContext()));
  m_ast_context.reset(
      new ClangASTContext("ClangModulesDeclVendor ASTContext",
                          m_compiler_instance->getASTContext()));
}

void ClangModulesDeclVendorImpl::ReportModuleExportsHelper(
+3 −4
Original line number Diff line number Diff line
@@ -143,10 +143,9 @@ private:

AppleObjCDeclVendor::AppleObjCDeclVendor(ObjCLanguageRuntime &runtime)
    : ClangDeclVendor(eAppleObjCDeclVendor), m_runtime(runtime),
      m_ast_ctx(runtime.GetProcess()
                    ->GetTarget()
                    .GetArchitecture()
                    .GetTriple()),
      m_ast_ctx(
          "AppleObjCDeclVendor AST",
          runtime.GetProcess()->GetTarget().GetArchitecture().GetTriple()),
      m_type_realizer_sp(m_runtime.GetEncodingToType()) {
  m_external_source = new AppleObjCExternalASTSource(*this);
  llvm::IntrusiveRefCntPtr<clang::ExternalASTSource> external_source_owning_ptr(
Loading