[Lldb-commits] [lldb] r321802 - Look for external types in all clang modules imported by the current symbol file.

Davide Italiano via lldb-commits lldb-commits at lists.llvm.org
Thu Jan 4 08:55:07 PST 2018


thanks!

On Thu, Jan 4, 2018 at 5:42 PM, Adrian Prantl via lldb-commits
<lldb-commits at lists.llvm.org> wrote:
> Author: adrian
> Date: Thu Jan  4 08:42:05 2018
> New Revision: 321802
>
> URL: http://llvm.org/viewvc/llvm-project?rev=321802&view=rev
> Log:
> Look for external types in all clang modules imported by the current symbol file.
>
> This fixes a bug in -gmodules DWARF handling when debugging without a .dSYM bundle
> that was particularly noticable when debugging LLVM itself.
>
> Debugging without clang modules and DWO handling should be unaffected by this patch.
>
> <rdar://problem/32436209>
>
> Added:
>     lldb/trunk/packages/Python/lldbsuite/test/lang/cpp/gmodules-templates/
>     lldb/trunk/packages/Python/lldbsuite/test/lang/cpp/gmodules-templates/Makefile
>     lldb/trunk/packages/Python/lldbsuite/test/lang/cpp/gmodules-templates/TestGModules.py
>     lldb/trunk/packages/Python/lldbsuite/test/lang/cpp/gmodules-templates/a.h
>     lldb/trunk/packages/Python/lldbsuite/test/lang/cpp/gmodules-templates/b.h
>     lldb/trunk/packages/Python/lldbsuite/test/lang/cpp/gmodules-templates/main.cpp
>     lldb/trunk/packages/Python/lldbsuite/test/lang/cpp/gmodules-templates/memory.h
>     lldb/trunk/packages/Python/lldbsuite/test/lang/cpp/gmodules-templates/module.modulemap
> Modified:
>     lldb/trunk/source/Plugins/SymbolFile/DWARF/DWARFASTParserClang.cpp
>     lldb/trunk/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.cpp
>     lldb/trunk/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.h
>
> Added: lldb/trunk/packages/Python/lldbsuite/test/lang/cpp/gmodules-templates/Makefile
> URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/packages/Python/lldbsuite/test/lang/cpp/gmodules-templates/Makefile?rev=321802&view=auto
> ==============================================================================
> --- lldb/trunk/packages/Python/lldbsuite/test/lang/cpp/gmodules-templates/Makefile (added)
> +++ lldb/trunk/packages/Python/lldbsuite/test/lang/cpp/gmodules-templates/Makefile Thu Jan  4 08:42:05 2018
> @@ -0,0 +1,6 @@
> +LEVEL = ../../../make
> +
> +CXX_SOURCES = main.cpp
> +# CFLAGS_EXTRAS += $(MODULE_DEBUG_INFO_FLAGS)
> +
> +include $(LEVEL)/Makefile.rules
>
> Added: lldb/trunk/packages/Python/lldbsuite/test/lang/cpp/gmodules-templates/TestGModules.py
> URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/packages/Python/lldbsuite/test/lang/cpp/gmodules-templates/TestGModules.py?rev=321802&view=auto
> ==============================================================================
> --- lldb/trunk/packages/Python/lldbsuite/test/lang/cpp/gmodules-templates/TestGModules.py (added)
> +++ lldb/trunk/packages/Python/lldbsuite/test/lang/cpp/gmodules-templates/TestGModules.py Thu Jan  4 08:42:05 2018
> @@ -0,0 +1,4 @@
> +import lldbsuite.test.lldbinline as lldbinline
> +import lldbsuite.test.decorators
> +
> +lldbinline.MakeInlineTest(__file__, globals())
>
> Added: lldb/trunk/packages/Python/lldbsuite/test/lang/cpp/gmodules-templates/a.h
> URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/packages/Python/lldbsuite/test/lang/cpp/gmodules-templates/a.h?rev=321802&view=auto
> ==============================================================================
> --- lldb/trunk/packages/Python/lldbsuite/test/lang/cpp/gmodules-templates/a.h (added)
> +++ lldb/trunk/packages/Python/lldbsuite/test/lang/cpp/gmodules-templates/a.h Thu Jan  4 08:42:05 2018
> @@ -0,0 +1,7 @@
> +#include "memory.h"
> +
> +class MemoryBuffer { int buffer = 42; };
> +
> +struct SrcBuffer {
> +  my_std::unique_ptr<MemoryBuffer> Buffer;
> +};
>
> Added: lldb/trunk/packages/Python/lldbsuite/test/lang/cpp/gmodules-templates/b.h
> URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/packages/Python/lldbsuite/test/lang/cpp/gmodules-templates/b.h?rev=321802&view=auto
> ==============================================================================
> --- lldb/trunk/packages/Python/lldbsuite/test/lang/cpp/gmodules-templates/b.h (added)
> +++ lldb/trunk/packages/Python/lldbsuite/test/lang/cpp/gmodules-templates/b.h Thu Jan  4 08:42:05 2018
> @@ -0,0 +1,6 @@
> +#include "a.h"
> +#include "memory.h"
> +
> +class Module {
> +  my_std::unique_ptr<MemoryBuffer> MBptr;
> +};
>
> Added: lldb/trunk/packages/Python/lldbsuite/test/lang/cpp/gmodules-templates/main.cpp
> URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/packages/Python/lldbsuite/test/lang/cpp/gmodules-templates/main.cpp?rev=321802&view=auto
> ==============================================================================
> --- lldb/trunk/packages/Python/lldbsuite/test/lang/cpp/gmodules-templates/main.cpp (added)
> +++ lldb/trunk/packages/Python/lldbsuite/test/lang/cpp/gmodules-templates/main.cpp Thu Jan  4 08:42:05 2018
> @@ -0,0 +1,9 @@
> +#include "b.h"
> +
> +int main(int argc, const char * argv[])
> +{
> +    Module m;
> +    // Test that the type Module which contains a field that is a
> +    // template instantiation can be fully resolved.
> +    return 0; //% self.assertTrue(self.frame().FindVariable('m').GetChildAtIndex(0).GetChildAtIndex(0).GetChildAtIndex(0).GetName() == 'buffer', 'find template specializations in imported modules')
> +}
>
> Added: lldb/trunk/packages/Python/lldbsuite/test/lang/cpp/gmodules-templates/memory.h
> URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/packages/Python/lldbsuite/test/lang/cpp/gmodules-templates/memory.h?rev=321802&view=auto
> ==============================================================================
> --- lldb/trunk/packages/Python/lldbsuite/test/lang/cpp/gmodules-templates/memory.h (added)
> +++ lldb/trunk/packages/Python/lldbsuite/test/lang/cpp/gmodules-templates/memory.h Thu Jan  4 08:42:05 2018
> @@ -0,0 +1,8 @@
> +#ifndef MEMORY_H
> +#define MEMORY_H
> +namespace my_std {
> +  template<class T> class unique_ptr {
> +    T t;
> +  };
> +}
> +#endif
>
> Added: lldb/trunk/packages/Python/lldbsuite/test/lang/cpp/gmodules-templates/module.modulemap
> URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/packages/Python/lldbsuite/test/lang/cpp/gmodules-templates/module.modulemap?rev=321802&view=auto
> ==============================================================================
> --- lldb/trunk/packages/Python/lldbsuite/test/lang/cpp/gmodules-templates/module.modulemap (added)
> +++ lldb/trunk/packages/Python/lldbsuite/test/lang/cpp/gmodules-templates/module.modulemap Thu Jan  4 08:42:05 2018
> @@ -0,0 +1,11 @@
> +module A {
> +  header "a.h"
> +}
> +
> +module B {
> +  header "b.h"
> +}
> +
> +module std {
> +  header "memory.h"
> +}
>
> Modified: lldb/trunk/source/Plugins/SymbolFile/DWARF/DWARFASTParserClang.cpp
> URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Plugins/SymbolFile/DWARF/DWARFASTParserClang.cpp?rev=321802&r1=321801&r2=321802&view=diff
> ==============================================================================
> --- lldb/trunk/source/Plugins/SymbolFile/DWARF/DWARFASTParserClang.cpp (original)
> +++ lldb/trunk/source/Plugins/SymbolFile/DWARF/DWARFASTParserClang.cpp Thu Jan  4 08:42:05 2018
> @@ -17,6 +17,7 @@
>  #include "DWARFDeclContext.h"
>  #include "DWARFDefines.h"
>  #include "SymbolFileDWARF.h"
> +#include "SymbolFileDWARFDwo.h"
>  #include "SymbolFileDWARFDebugMap.h"
>  #include "UniqueDWARFASTType.h"
>
> @@ -123,57 +124,86 @@ ClangASTImporter &DWARFASTParserClang::G
>    return *m_clang_ast_importer_ap;
>  }
>
> +/// Detect a forward declaration that is nested in a DW_TAG_module.
> +static bool isClangModuleFwdDecl(const DWARFDIE &Die) {
> +  if (!Die.GetAttributeValueAsUnsigned(DW_AT_declaration, 0))
> +    return false;
> +  auto Parent = Die.GetParent();
> +  while (Parent.IsValid()) {
> +    if (Parent.Tag() == DW_TAG_module)
> +      return true;
> +    Parent = Parent.GetParent();
> +  }
> +  return false;
> +}
> +
>  TypeSP DWARFASTParserClang::ParseTypeFromDWO(const DWARFDIE &die, Log *log) {
>    ModuleSP dwo_module_sp = die.GetContainingDWOModule();
> -  if (dwo_module_sp) {
> -    // This type comes from an external DWO module
> -    std::vector<CompilerContext> dwo_context;
> -    die.GetDWOContext(dwo_context);
> -    TypeMap dwo_types;
> -    if (dwo_module_sp->GetSymbolVendor()->FindTypes(dwo_context, true,
> -                                                    dwo_types)) {
> -      const size_t num_dwo_types = dwo_types.GetSize();
> -      if (num_dwo_types == 1) {
> -        // We found a real definition for this type elsewhere
> -        // so lets use it and cache the fact that we found
> -        // a complete type for this die
> -        TypeSP dwo_type_sp = dwo_types.GetTypeAtIndex(0);
> -        if (dwo_type_sp) {
> -          lldb_private::CompilerType dwo_type =
> -              dwo_type_sp->GetForwardCompilerType();
> -
> -          lldb_private::CompilerType type =
> -              GetClangASTImporter().CopyType(m_ast, dwo_type);
> -
> -          // printf ("copied_qual_type: ast = %p, clang_type = %p, name =
> -          // '%s'\n", m_ast, copied_qual_type.getAsOpaquePtr(),
> -          // external_type->GetName().GetCString());
> -          if (type) {
> -            SymbolFileDWARF *dwarf = die.GetDWARF();
> -            TypeSP type_sp(new Type(die.GetID(), dwarf, dwo_type_sp->GetName(),
> -                                    dwo_type_sp->GetByteSize(), NULL,
> -                                    LLDB_INVALID_UID, Type::eEncodingInvalid,
> -                                    &dwo_type_sp->GetDeclaration(), type,
> -                                    Type::eResolveStateForward));
> -
> -            dwarf->GetTypeList()->Insert(type_sp);
> -            dwarf->GetDIEToType()[die.GetDIE()] = type_sp.get();
> -            clang::TagDecl *tag_decl = ClangASTContext::GetAsTagDecl(type);
> -            if (tag_decl)
> -              LinkDeclContextToDIE(tag_decl, die);
> -            else {
> -              clang::DeclContext *defn_decl_ctx =
> -                  GetCachedClangDeclContextForDIE(die);
> -              if (defn_decl_ctx)
> -                LinkDeclContextToDIE(defn_decl_ctx, die);
> -            }
> -            return type_sp;
> -          }
> -        }
> -      }
> +  if (!dwo_module_sp)
> +    return TypeSP();
> +
> +  // This type comes from an external DWO module.
> +  std::vector<CompilerContext> dwo_context;
> +  die.GetDWOContext(dwo_context);
> +  TypeMap dwo_types;
> +
> +  if (!dwo_module_sp->GetSymbolVendor()->FindTypes(dwo_context, true,
> +                                                   dwo_types)) {
> +    if (!isClangModuleFwdDecl(die))
> +      return TypeSP();
> +
> +    // Since this this type is defined in one of the Clang modules
> +    // imported by this symbol file, search all of them.
> +    auto *SymFile = die.GetCU()->GetSymbolFileDWARF();
> +    for (const auto &NameModule : SymFile->getExternalTypeModules()) {
> +      if (!NameModule.second)
> +        continue;
> +      SymbolVendor *SymVendor = NameModule.second->GetSymbolVendor();
> +      if (SymVendor->FindTypes(dwo_context, true, dwo_types))
> +        break;
>      }
>    }
> -  return TypeSP();
> +
> +  const size_t num_dwo_types = dwo_types.GetSize();
> +  if (num_dwo_types != 1)
> +    return TypeSP();
> +
> +  // We found a real definition for this type in the Clang module, so
> +  // lets use it and cache the fact that we found a complete type for
> +  // this die.
> +  TypeSP dwo_type_sp = dwo_types.GetTypeAtIndex(0);
> +  if (!dwo_type_sp)
> +    return TypeSP();
> +
> +  lldb_private::CompilerType dwo_type = dwo_type_sp->GetForwardCompilerType();
> +
> +  lldb_private::CompilerType type =
> +      GetClangASTImporter().CopyType(m_ast, dwo_type);
> +
> +  // printf ("copied_qual_type: ast = %p, clang_type = %p, name =
> +  // '%s'\n", m_ast, copied_qual_type.getAsOpaquePtr(),
> +  // external_type->GetName().GetCString());
> +  if (!type)
> +    return TypeSP();
> +
> +  SymbolFileDWARF *dwarf = die.GetDWARF();
> +  TypeSP type_sp(new Type(
> +      die.GetID(), dwarf, dwo_type_sp->GetName(), dwo_type_sp->GetByteSize(),
> +      NULL, LLDB_INVALID_UID, Type::eEncodingInvalid,
> +      &dwo_type_sp->GetDeclaration(), type, Type::eResolveStateForward));
> +
> +  dwarf->GetTypeList()->Insert(type_sp);
> +  dwarf->GetDIEToType()[die.GetDIE()] = type_sp.get();
> +  clang::TagDecl *tag_decl = ClangASTContext::GetAsTagDecl(type);
> +  if (tag_decl)
> +    LinkDeclContextToDIE(tag_decl, die);
> +  else {
> +    clang::DeclContext *defn_decl_ctx = GetCachedClangDeclContextForDIE(die);
> +    if (defn_decl_ctx)
> +      LinkDeclContextToDIE(defn_decl_ctx, die);
> +  }
> +
> +  return type_sp;
>  }
>
>  TypeSP DWARFASTParserClang::ParseTypeFromDWARF(const SymbolContext &sc,
>
> Modified: lldb/trunk/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.cpp
> URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.cpp?rev=321802&r1=321801&r2=321802&view=diff
> ==============================================================================
> --- lldb/trunk/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.cpp (original)
> +++ lldb/trunk/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.cpp Thu Jan  4 08:42:05 2018
> @@ -1562,7 +1562,7 @@ std::unique_ptr<SymbolFileDWARFDwo>
>  SymbolFileDWARF::GetDwoSymbolFileForCompileUnit(
>      DWARFCompileUnit &dwarf_cu, const DWARFDebugInfoEntry &cu_die) {
>    // If we are using a dSYM file, we never want the standard DWO files since
> -  // the -gmodule support uses the same DWO machanism to specify full debug
> +  // the -gmodules support uses the same DWO machanism to specify full debug
>    // info files for modules.
>    if (GetDebugMapSymfile())
>      return nullptr;
>
> Modified: lldb/trunk/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.h
> URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.h?rev=321802&r1=321801&r2=321802&view=diff
> ==============================================================================
> --- lldb/trunk/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.h (original)
> +++ lldb/trunk/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.h Thu Jan  4 08:42:05 2018
> @@ -293,6 +293,14 @@ public:
>
>    lldb::ModuleSP GetDWOModule(lldb_private::ConstString name);
>
> +  typedef std::map<lldb_private::ConstString, lldb::ModuleSP>
> +      ExternalTypeModuleMap;
> +
> +  /// Return the list of Clang modules imported by this SymbolFile.
> +  const ExternalTypeModuleMap& getExternalTypeModules() const {
> +      return m_external_type_modules;
> +  }
> +
>    virtual DWARFDIE GetDIE(const DIERef &die_ref);
>
>    virtual std::unique_ptr<SymbolFileDWARFDwo>
> @@ -439,9 +447,6 @@ protected:
>
>    typedef std::set<lldb_private::Type *> TypeSet;
>
> -  typedef std::map<lldb_private::ConstString, lldb::ModuleSP>
> -      ExternalTypeModuleMap;
> -
>    void GetTypes(const DWARFDIE &die, dw_offset_t min_die_offset,
>                  dw_offset_t max_die_offset, uint32_t type_mask,
>                  TypeSet &type_set);
>
>
> _______________________________________________
> lldb-commits mailing list
> lldb-commits at lists.llvm.org
> http://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits


More information about the lldb-commits mailing list