[Lldb-commits] [lldb] r254476 - Added support for -gmodule debugging when debug info is left in the .o files on Darwin.

Tamas Berghammer via lldb-commits lldb-commits at lists.llvm.org
Wed Dec 2 11:20:08 PST 2015


The source code is the inferior for TestDataFormatterSynthVal (
https://github.com/llvm-mirror/lldb/blob/fc6c6b9f1aa893b7fd1bd04ae9f05ff3f82d63c2/packages/Python/lldbsuite/test/functionalities/data-formatter/data-formatter-synthval/main.cpp)
what doesn't refer to anything in the std namespace and have no using
directives either.

On Wed, Dec 2, 2015 at 7:01 PM Greg Clayton <gclayton at apple.com> wrote:

> So the question is why is "S" being found in "std" when we are essentially
> looking for "::S"?? Do we have a "using namespace std;" in the source? We
> recently added support for using all of the using directives in the user
> code so it might be doing a  "using namespace std;" into the expression due
> to the source file having it...
>
> > On Dec 2, 2015, at 3:52 AM, Tamas Berghammer <tberghammer at google.com>
> wrote:
> >
> > Hi Greg,
> >
> > I reverted this CL as it regressed TestDataFormatterSynthVal.py on the
> Linux buildbot.
> >
> > The problem is that when we evaluate the "expression struct S { myInt
> theInt{12}; }; S()" command then the return type is displayed as "std::S"
> instead of displaying it as the type defined on the command line.
> >
> > The definition for the conflicting type ("target modul lookup -t S -A"):
> > /usr/lib/x86_64-linux-gnu/libstdc++.so.6:
> > id = {0x0021550c}, name = "std::S", byte-size = 8, decl =
> string-inst.cc:43, compiler_type = "typedef std::S"
> >      typedef 'std::S': id = {0x00213434}, name = "basic_string<char,
> std::char_traits<char>, std::allocator<char> >", qualified =
> "std::basic_string<char, std::char_traits<char>, std::allocator<char> >",
> byte-size = 8, decl = basic_string.h:112, compiler_type = "class
> basic_string {
> > <Members omitted, I can send it to you if you need them>
> > }
> >
> > If I change the name of the type we define in the expression to
> something not conflicting with a type name in the std namespace then it
> works fine but it should work even in case of conflicting types as they are
> leave in different namespaces and it also worked before your change.
> >
> > Currently I don't fully understand your change but please let me know if
> I can help you to figure out why the test is failing on Linux.
> >
> > Thanks,
> > Tamas
> >
> > On Wed, Dec 2, 2015 at 12:46 AM Greg Clayton via lldb-commits <
> lldb-commits at lists.llvm.org> wrote:
> > Author: gclayton
> > Date: Tue Dec  1 18:43:32 2015
> > New Revision: 254476
> >
> > URL: http://llvm.org/viewvc/llvm-project?rev=254476&view=rev
> > Log:
> > Added support for -gmodule debugging when debug info is left in the .o
> files on Darwin.
> >
> > This is done by finding the types that are forward declarations that
> come from a module, and loading that module's debug info in a separate
> lldb_private::Module, and copying the type over into the current module
> using a ClangASTImporter object. ClangASTImporter objects are already used
> to copy types from on clang::ASTContext to another for expressions so the
> type copying code has been around for a while.
> >
> > A new FindTypes variant was added to SymbolVendor and SymbolFile:
> >
> > size_t
> > SymbolVendor::FindTypes (const std::vector<CompilerContext> &context,
> bool append, TypeMap& types);
> >
> > size_t
> > SymbolVendor::FindTypes (const std::vector<CompilerContext> &context,
> bool append, TypeMap& types);
> >
> > The CompilerContext is a way to represent the exact context of a type
> and pass it through an agnostic API boundary so that we can find that exact
> context elsewhere in another file. This was required here because we can
> have a module that has submodules, both of which have a "foo" type.
> >
> > I am not able to add tests for this yet as we currently don't build our
> C/C++/ObjC binaries with the clang binary that we build. There are some
> driver issues where it can't find the header files for the C and C++
> standard library which makes compiling these tests hard. We can't also
> guarantee that if we are building with clang that it supporst the exact
> format of -gmodule debugging that we are trying to test. We have had other
> versions of clang that had a different implementation of -gmodule debugging
> that we are no longer supporting, so we can't enable tests if we are
> building with clang without compiling something and looking at the
> structure of the DWARF that was generated to ensure that it is the format
> we can actually use.
> >
> >
> > Modified:
> >     lldb/trunk/include/lldb/Symbol/ClangASTContext.h
> >     lldb/trunk/include/lldb/Symbol/ClangASTImporter.h
> >     lldb/trunk/include/lldb/Symbol/ClangExternalASTSourceCallbacks.h
> >     lldb/trunk/include/lldb/Symbol/SymbolFile.h
> >     lldb/trunk/include/lldb/Symbol/SymbolVendor.h
> >     lldb/trunk/include/lldb/Symbol/Type.h
> >     lldb/trunk/include/lldb/lldb-forward.h
> >     lldb/trunk/include/lldb/lldb-private-enumerations.h
> >
>  lldb/trunk/packages/Python/lldbsuite/test/lang/cpp/incomplete-types/TestCppIncompleteTypes.py
> >     lldb/trunk/source/Plugins/SymbolFile/DWARF/DWARFASTParser.h
> >     lldb/trunk/source/Plugins/SymbolFile/DWARF/DWARFASTParserClang.cpp
> >     lldb/trunk/source/Plugins/SymbolFile/DWARF/DWARFASTParserClang.h
> >     lldb/trunk/source/Plugins/SymbolFile/DWARF/DWARFDIE.cpp
> >     lldb/trunk/source/Plugins/SymbolFile/DWARF/DWARFDIE.h
> >     lldb/trunk/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.cpp
> >     lldb/trunk/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.h
> >     lldb/trunk/source/Symbol/ClangASTContext.cpp
> >     lldb/trunk/source/Symbol/ClangASTImporter.cpp
> >     lldb/trunk/source/Symbol/ClangExternalASTSourceCallbacks.cpp
> >     lldb/trunk/source/Symbol/SymbolFile.cpp
> >     lldb/trunk/source/Symbol/SymbolVendor.cpp
> >     lldb/trunk/source/Symbol/Type.cpp
> >
> > Modified: lldb/trunk/include/lldb/Symbol/ClangASTContext.h
> > URL:
> http://llvm.org/viewvc/llvm-project/lldb/trunk/include/lldb/Symbol/ClangASTContext.h?rev=254476&r1=254475&r2=254476&view=diff
> >
> ==============================================================================
> > --- lldb/trunk/include/lldb/Symbol/ClangASTContext.h (original)
> > +++ lldb/trunk/include/lldb/Symbol/ClangASTContext.h Tue Dec  1 18:43:32
> 2015
> > @@ -1006,10 +1006,18 @@ public:
> >                                 lldb::AccessType access,
> >                                 bool is_artificial);
> >
> > -    bool
> > +    static bool
> >      SetHasExternalStorage (lldb::opaque_compiler_type_t type, bool
> has_extern);
> >
> > -
> > +
> > +    static bool
> > +    CanImport (const CompilerType &type, lldb_private::ClangASTImporter
> &importer);
> > +
> > +    static bool
> > +    Import (const CompilerType &type, lldb_private::ClangASTImporter
> &importer);
> > +
> > +    static bool
> > +    GetHasExternalStorage (const CompilerType &type);
> >      //------------------------------------------------------------------
> >      // Tag Declarations
> >      //------------------------------------------------------------------
> > @@ -1092,13 +1100,19 @@ public:
> >
> >      void
> >      DumpTypeDescription (lldb::opaque_compiler_type_t type, Stream *s)
> override;
> > -
> > +
> > +    static void
> > +    DumpTypeName (const CompilerType &type);
> > +
> >      static clang::EnumDecl *
> >      GetAsEnumDecl (const CompilerType& type);
> >
> >      static clang::RecordDecl *
> >      GetAsRecordDecl (const CompilerType& type);
> > -
> > +
> > +    static clang::TagDecl *
> > +    GetAsTagDecl (const CompilerType& type);
> > +
> >      clang::CXXRecordDecl *
> >      GetAsCXXRecordDecl (lldb::opaque_compiler_type_t type);
> >
> > @@ -1109,9 +1123,12 @@ public:
> >      GetQualType (const CompilerType& type)
> >      {
> >          // Make sure we have a clang type before making a
> clang::QualType
> > -        ClangASTContext *ast =
> llvm::dyn_cast_or_null<ClangASTContext>(type.GetTypeSystem());
> > -        if (ast)
> > -            return
> clang::QualType::getFromOpaquePtr(type.GetOpaqueQualType());
> > +        if (type.GetOpaqueQualType())
> > +        {
> > +            ClangASTContext *ast =
> llvm::dyn_cast_or_null<ClangASTContext>(type.GetTypeSystem());
> > +            if (ast)
> > +                return
> clang::QualType::getFromOpaquePtr(type.GetOpaqueQualType());
> > +        }
> >          return clang::QualType();
> >      }
> >
> >
> > Modified: lldb/trunk/include/lldb/Symbol/ClangASTImporter.h
> > URL:
> http://llvm.org/viewvc/llvm-project/lldb/trunk/include/lldb/Symbol/ClangASTImporter.h?rev=254476&r1=254475&r2=254476&view=diff
> >
> ==============================================================================
> > --- lldb/trunk/include/lldb/Symbol/ClangASTImporter.h (original)
> > +++ lldb/trunk/include/lldb/Symbol/ClangASTImporter.h Tue Dec  1
> 18:43:32 2015
> > @@ -107,7 +107,11 @@ public:
> >      CopyType (clang::ASTContext *dst_ctx,
> >                clang::ASTContext *src_ctx,
> >                lldb::opaque_compiler_type_t type);
> > -
> > +
> > +    CompilerType
> > +    CopyType (ClangASTContext &dst,
> > +              const CompilerType &src_type);
> > +
> >      clang::Decl *
> >      CopyDecl (clang::ASTContext *dst_ctx,
> >                clang::ASTContext *src_ctx,
> > @@ -134,7 +138,10 @@ public:
> >
> >      bool
> >      CompleteObjCInterfaceDecl (clang::ObjCInterfaceDecl
> *interface_decl);
> > -
> > +
> > +    bool
> > +    CompleteAndFetchChildren (clang::QualType type);
> > +
> >      bool
> >      RequireCompleteType (clang::QualType type);
> >
> >
> > Modified:
> lldb/trunk/include/lldb/Symbol/ClangExternalASTSourceCallbacks.h
> > URL:
> http://llvm.org/viewvc/llvm-project/lldb/trunk/include/lldb/Symbol/ClangExternalASTSourceCallbacks.h?rev=254476&r1=254475&r2=254476&view=diff
> >
> ==============================================================================
> > --- lldb/trunk/include/lldb/Symbol/ClangExternalASTSourceCallbacks.h
> (original)
> > +++ lldb/trunk/include/lldb/Symbol/ClangExternalASTSourceCallbacks.h Tue
> Dec  1 18:43:32 2015
> > @@ -97,6 +97,11 @@ public:
> >      {
> >      }
> >
> > +    void
> > +    FindExternalLexicalDecls(const clang::DeclContext *DC,
> > +
>  llvm::function_ref<bool(clang::Decl::Kind)> IsKindWeWant,
> > +                             llvm::SmallVectorImpl<clang::Decl *>
> &Result) override;
> > +
> >      bool FindExternalVisibleDeclsByName(const clang::DeclContext
> *decl_ctx, clang::DeclarationName decl_name) override;
> >
> >      void CompleteType(clang::TagDecl *tag_decl) override;
> >
> > Modified: lldb/trunk/include/lldb/Symbol/SymbolFile.h
> > URL:
> http://llvm.org/viewvc/llvm-project/lldb/trunk/include/lldb/Symbol/SymbolFile.h?rev=254476&r1=254475&r2=254476&view=diff
> >
> ==============================================================================
> > --- lldb/trunk/include/lldb/Symbol/SymbolFile.h (original)
> > +++ lldb/trunk/include/lldb/Symbol/SymbolFile.h Tue Dec  1 18:43:32 2015
> > @@ -15,7 +15,6 @@
> >  #include "lldb/Symbol/CompilerType.h"
> >  #include "lldb/Symbol/CompilerDecl.h"
> >  #include "lldb/Symbol/CompilerDeclContext.h"
> > -
> >  #include "lldb/Symbol/Type.h"
> >
> >  namespace lldb_private {
> > @@ -142,6 +141,8 @@ public:
> >      virtual uint32_t        FindFunctions (const ConstString &name,
> const CompilerDeclContext *parent_decl_ctx, uint32_t name_type_mask, bool
> include_inlines, bool append, SymbolContextList& sc_list);
> >      virtual uint32_t        FindFunctions (const RegularExpression&
> regex, bool include_inlines, bool append, SymbolContextList& sc_list);
> >      virtual uint32_t        FindTypes (const SymbolContext& sc, const
> ConstString &name, const CompilerDeclContext *parent_decl_ctx, bool append,
> uint32_t max_matches, TypeMap& types);
> > +    virtual size_t          FindTypes (const
> std::vector<CompilerContext> &context, bool append, TypeMap& types);
> > +
> >  //  virtual uint32_t        FindTypes (const SymbolContext& sc, const
> RegularExpression& regex, bool append, uint32_t max_matches, TypeList&
> types) = 0;
> >      virtual TypeList *      GetTypeList ();
> >      virtual size_t          GetTypes (lldb_private::SymbolContextScope
> *sc_scope,
> >
> > Modified: lldb/trunk/include/lldb/Symbol/SymbolVendor.h
> > URL:
> http://llvm.org/viewvc/llvm-project/lldb/trunk/include/lldb/Symbol/SymbolVendor.h?rev=254476&r1=254475&r2=254476&view=diff
> >
> ==============================================================================
> > --- lldb/trunk/include/lldb/Symbol/SymbolVendor.h (original)
> > +++ lldb/trunk/include/lldb/Symbol/SymbolVendor.h Tue Dec  1 18:43:32
> 2015
> > @@ -128,6 +128,9 @@ public:
> >                 size_t max_matches,
> >                 TypeMap& types);
> >
> > +    virtual size_t
> > +    FindTypes (const std::vector<CompilerContext> &context, bool
> append, TypeMap& types);
> > +
> >      virtual CompilerDeclContext
> >      FindNamespace (const SymbolContext& sc,
> >                     const ConstString &name,
> >
> > Modified: lldb/trunk/include/lldb/Symbol/Type.h
> > URL:
> http://llvm.org/viewvc/llvm-project/lldb/trunk/include/lldb/Symbol/Type.h?rev=254476&r1=254475&r2=254476&view=diff
> >
> ==============================================================================
> > --- lldb/trunk/include/lldb/Symbol/Type.h (original)
> > +++ lldb/trunk/include/lldb/Symbol/Type.h Tue Dec  1 18:43:32 2015
> > @@ -24,6 +24,31 @@
> >
> >  namespace lldb_private {
> >
> > +//----------------------------------------------------------------------
> > +// CompilerContext allows an array of these items to be passed to
> > +// perform detailed lookups in SymbolVendor and SymbolFile functions.
> > +//----------------------------------------------------------------------
> > +struct CompilerContext
> > +{
> > +    CompilerContext (CompilerContextKind t, const ConstString &n) :
> > +        type(t),
> > +        name(n)
> > +    {
> > +    }
> > +
> > +    bool
> > +    operator == (const CompilerContext &rhs) const
> > +    {
> > +        return type == rhs.type && name == rhs.name;
> > +    }
> > +
> > +    void
> > +    Dump () const;
> > +
> > +    CompilerContextKind type;
> > +    ConstString name;
> > +};
> > +
> >  class SymbolFileType :
> >      public std::enable_shared_from_this<SymbolFileType>,
> >      public UserID
> > @@ -35,6 +60,9 @@ class SymbolFileType :
> >          {
> >          }
> >
> > +        SymbolFileType (SymbolFile &symbol_file, const lldb::TypeSP
> &type_sp);
> > +
> > +
> >          ~SymbolFileType ()
> >          {
> >          }
> >
> > Modified: lldb/trunk/include/lldb/lldb-forward.h
> > URL:
> http://llvm.org/viewvc/llvm-project/lldb/trunk/include/lldb/lldb-forward.h?rev=254476&r1=254475&r2=254476&view=diff
> >
> ==============================================================================
> > --- lldb/trunk/include/lldb/lldb-forward.h (original)
> > +++ lldb/trunk/include/lldb/lldb-forward.h Tue Dec  1 18:43:32 2015
> > @@ -62,6 +62,7 @@ class   CommandObject;
> >  class   CommandReturnObject;
> >  class   Communication;
> >  class   CompactUnwindInfo;
> > +struct  CompilerContext;
> >  class   CompilerDecl;
> >  class   CompilerDeclContext;
> >  class   CompilerType;
> >
> > Modified: lldb/trunk/include/lldb/lldb-private-enumerations.h
> > URL:
> http://llvm.org/viewvc/llvm-project/lldb/trunk/include/lldb/lldb-private-enumerations.h?rev=254476&r1=254475&r2=254476&view=diff
> >
> ==============================================================================
> > --- lldb/trunk/include/lldb/lldb-private-enumerations.h (original)
> > +++ lldb/trunk/include/lldb/lldb-private-enumerations.h Tue Dec  1
> 18:43:32 2015
> > @@ -241,6 +241,25 @@ enum class TypeValidatorResult : bool {
> >      Success = true,
> >      Failure = false
> >  };
> > +
> > +//----------------------------------------------------------------------
> > +// Enumerations that can be used to specify scopes types when looking up
> > +// types.
> > +//----------------------------------------------------------------------
> > +enum class CompilerContextKind
> > +{
> > +    Invalid = 0,
> > +    TranslationUnit,
> > +    Module,
> > +    Namespace,
> > +    Class,
> > +    Structure,
> > +    Union,
> > +    Function,
> > +    Variable,
> > +    Enumeration,
> > +    Typedef
> > +};
> >
> >  } // namespace lldb_private
> >
> >
> > Modified:
> lldb/trunk/packages/Python/lldbsuite/test/lang/cpp/incomplete-types/TestCppIncompleteTypes.py
> > URL:
> http://llvm.org/viewvc/llvm-project/lldb/trunk/packages/Python/lldbsuite/test/lang/cpp/incomplete-types/TestCppIncompleteTypes.py?rev=254476&r1=254475&r2=254476&view=diff
> >
> ==============================================================================
> > ---
> lldb/trunk/packages/Python/lldbsuite/test/lang/cpp/incomplete-types/TestCppIncompleteTypes.py
> (original)
> > +++
> lldb/trunk/packages/Python/lldbsuite/test/lang/cpp/incomplete-types/TestCppIncompleteTypes.py
> Tue Dec  1 18:43:32 2015
> > @@ -14,11 +14,11 @@ class TestCppIncompleteTypes(TestBase):
> >
> >          value_f = frame.EvaluateExpression("f")
> >          self.assertTrue(value_f.IsValid(), "'expr f' results in a valid
> SBValue object")
> > -        self.assertFalse(value_f.GetError().Success(), "'expr f'
> results in an error, but LLDB does not crash")
> > +        self.assertTrue(value_f.GetError().Success(), "'expr f' is
> successful")
> >
> >          value_a = frame.EvaluateExpression("a")
> >          self.assertTrue(value_a.IsValid(), "'expr a' results in a valid
> SBValue object")
> > -        self.assertFalse(value_a.GetError().Success(), "'expr a'
> results in an error, but LLDB does not crash")
> > +        self.assertTrue(value_a.GetError().Success(), "'expr a' is
> successful")
> >
> >      @skipIfGcc
> >      @skipIfWindows # Clang on Windows asserts in external record layout
> in this case.
> >
> > Modified: lldb/trunk/source/Plugins/SymbolFile/DWARF/DWARFASTParser.h
> > URL:
> http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Plugins/SymbolFile/DWARF/DWARFASTParser.h?rev=254476&r1=254475&r2=254476&view=diff
> >
> ==============================================================================
> > --- lldb/trunk/source/Plugins/SymbolFile/DWARF/DWARFASTParser.h
> (original)
> > +++ lldb/trunk/source/Plugins/SymbolFile/DWARF/DWARFASTParser.h Tue Dec
> 1 18:43:32 2015
> > @@ -33,6 +33,18 @@ public:
> >                              const DWARFDIE &die) = 0;
> >
> >      virtual bool
> > +    CanCompleteType (const lldb_private::CompilerType &compiler_type)
> > +    {
> > +        return false;
> > +    }
> > +
> > +    virtual bool
> > +    CompleteType (const lldb_private::CompilerType &compiler_type)
> > +    {
> > +        return false;
> > +    }
> > +
> > +    virtual bool
> >      CompleteTypeFromDWARF (const DWARFDIE &die,
> >                             lldb_private::Type *type,
> >                             lldb_private::CompilerType &compiler_type) =
> 0;
> >
> > 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=254476&r1=254475&r2=254476&view=diff
> >
> ==============================================================================
> > --- lldb/trunk/source/Plugins/SymbolFile/DWARF/DWARFASTParserClang.cpp
> (original)
> > +++ lldb/trunk/source/Plugins/SymbolFile/DWARF/DWARFASTParserClang.cpp
> Tue Dec  1 18:43:32 2015
> > @@ -24,11 +24,14 @@
> >  #include "lldb/Core/StreamString.h"
> >  #include "lldb/Core/Value.h"
> >  #include "lldb/Host/Host.h"
> > +#include "lldb/Symbol/ClangASTImporter.h"
> >  #include "lldb/Symbol/ClangExternalASTSourceCommon.h"
> >  #include "lldb/Symbol/CompileUnit.h"
> >  #include "lldb/Symbol/Function.h"
> >  #include "lldb/Symbol/ObjectFile.h"
> > +#include "lldb/Symbol/SymbolVendor.h"
> >  #include "lldb/Symbol/TypeList.h"
> > +#include "lldb/Symbol/TypeMap.h"
> >  #include "lldb/Target/Language.h"
> >  #include "Plugins/Language/ObjC/ObjCLanguage.h"
> >
> > @@ -114,6 +117,78 @@ struct BitfieldInfo
> >      }
> >  };
> >
> > +
> > +ClangASTImporter &
> > +DWARFASTParserClang::GetClangASTImporter()
> > +{
> > +    if (!m_clang_ast_importer_ap)
> > +    {
> > +        m_clang_ast_importer_ap.reset (new ClangASTImporter);
> > +    }
> > +    return *m_clang_ast_importer_ap;
> > +}
> > +
> > +
> > +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;
> > +                    }
> > +                }
> > +            }
> > +        }
> > +    }
> > +    return TypeSP();
> > +}
> > +
> >  TypeSP
> >  DWARFASTParserClang::ParseTypeFromDWARF (const SymbolContext& sc,
> >                                           const DWARFDIE &die,
> > @@ -487,15 +562,15 @@ DWARFASTParserClang::ParseTypeFromDWARF
> >                              if
> (dwarf->GetUniqueDWARFASTTypeMap().Find(type_name_const_str, die, decl,
> >
>  byte_size_valid ? byte_size : -1,
> >
>  *unique_ast_entry_ap))
> > -                        {
> > -                            type_sp = unique_ast_entry_ap->m_type_sp;
> > -                            if (type_sp)
> >                              {
> > -                            dwarf->GetDIEToType()[die.GetDIE()] =
> type_sp.get();
> > -                            return type_sp;
> > +                                type_sp =
> unique_ast_entry_ap->m_type_sp;
> > +                                if (type_sp)
> > +                                {
> > +                                    dwarf->GetDIEToType()[die.GetDIE()]
> = type_sp.get();
> > +                                    return type_sp;
> > +                                }
> >                              }
> >                          }
> > -                        }
> >                      }
> >
> >                      DEBUG_PRINTF ("0x%8.8" PRIx64 ": %s (\"%s\")\n",
> die.GetID(), DW_TAG_value_to_name(tag), type_name_cstr);
> > @@ -600,6 +675,11 @@ DWARFASTParserClang::ParseTypeFromDWARF
> >
>      type_name_cstr);
> >                          }
> >
> > +                        // See if the type comes from a DWO module and
> if so, track down that type.
> > +                        type_sp = ParseTypeFromDWO(die, log);
> > +                        if (type_sp)
> > +                            return type_sp;
> > +
> >                          DWARFDeclContext die_decl_ctx;
> >                          die.GetDWARFDeclContext(die_decl_ctx);
> >
> > @@ -833,7 +913,7 @@ DWARFASTParserClang::ParseTypeFromDWARF
> >                                      case DW_AT_type:
> encoding_form = form_value; break;
> >                                      case DW_AT_byte_size:
>  byte_size = form_value.Unsigned(); break;
> >                                      case DW_AT_accessibility:   break;
> //accessibility = DW_ACCESS_to_AccessType(form_value.Unsigned()); break;
> > -                                    case DW_AT_declaration:     break;
> //is_forward_declaration = form_value.Boolean(); break;
> > +                                    case DW_AT_declaration:
>  is_forward_declaration = form_value.Boolean(); break;
> >                                      case DW_AT_allocated:
> >                                      case DW_AT_associated:
> >                                      case DW_AT_bit_stride:
> > @@ -850,6 +930,54 @@ DWARFASTParserClang::ParseTypeFromDWARF
> >                              }
> >                          }
> >
> > +                        if (is_forward_declaration)
> > +                        {
> > +                            type_sp = ParseTypeFromDWO(die, log);
> > +                            if (type_sp)
> > +                                return type_sp;
> > +
> > +                            DWARFDeclContext die_decl_ctx;
> > +                            die.GetDWARFDeclContext(die_decl_ctx);
> > +
> > +                            type_sp =
> dwarf->FindDefinitionTypeForDWARFDeclContext (die_decl_ctx);
> > +
> > +                            if (!type_sp)
> > +                            {
> > +                                SymbolFileDWARFDebugMap
> *debug_map_symfile = dwarf->GetDebugMapSymfile();
> > +                                if (debug_map_symfile)
> > +                                {
> > +                                    // We weren't able to find a full
> declaration in
> > +                                    // this DWARF, see if we have a
> declaration anywhere
> > +                                    // else...
> > +                                    type_sp =
> debug_map_symfile->FindDefinitionTypeForDWARFDeclContext (die_decl_ctx);
> > +                                }
> > +                            }
> > +
> > +                            if (type_sp)
> > +                            {
> > +                                if (log)
> > +                                {
> > +
> dwarf->GetObjectFile()->GetModule()->LogMessage (log,
> > +
>              "SymbolFileDWARF(%p) - 0x%8.8x: %s type \"%s\" is a forward
> declaration, complete type is 0x%8.8" PRIx64,
> > +
>              static_cast<void*>(this),
> > +
>              die.GetOffset(),
> > +
>              DW_TAG_value_to_name(tag),
> > +
>              type_name_cstr,
> > +
>              type_sp->GetID());
> > +                                }
> > +
> > +                                // 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
> > +                                dwarf->GetDIEToType()[die.GetDIE()] =
> type_sp.get();
> > +                                clang::DeclContext *defn_decl_ctx =
> GetCachedClangDeclContextForDIE(
> > +
>
> dwarf->DebugInfo()->GetDIE(DIERef(type_sp->GetID())));
> > +                                if (defn_decl_ctx)
> > +                                    LinkDeclContextToDIE(defn_decl_ctx,
> die);
> > +                                return type_sp;
> > +                            }
> > +
> > +                        }
> >                          DEBUG_PRINTF ("0x%8.8" PRIx64 ": %s
> (\"%s\")\n", die.GetID(), DW_TAG_value_to_name(tag), type_name_cstr);
> >
> >                          CompilerType enumerator_clang_type;
> > @@ -1130,7 +1258,7 @@ DWARFASTParserClang::ParseTypeFromDWARF
> >                                  if (class_type)
> >                                  {
> >                                      bool alternate_defn = false;
> > -                                    if (class_type->GetID() !=
> decl_ctx_die.GetID())
> > +                                    if (class_type->GetID() !=
> decl_ctx_die.GetID() || decl_ctx_die.GetContainingDWOModuleDIE())
> >                                      {
> >                                          alternate_defn = true;
> >
> > @@ -1798,6 +1926,33 @@ DWARFASTParserClang::ParseTemplateParame
> >  }
> >
> >  bool
> > +DWARFASTParserClang::CanCompleteType (const lldb_private::CompilerType
> &compiler_type)
> > +{
> > +    if (m_clang_ast_importer_ap)
> > +        return ClangASTContext::CanImport(compiler_type,
> GetClangASTImporter());
> > +    else
> > +        return false;
> > +}
> > +
> > +bool
> > +DWARFASTParserClang::CompleteType (const lldb_private::CompilerType
> &compiler_type)
> > +{
> > +    if (CanCompleteType(compiler_type))
> > +    {
> > +        if (ClangASTContext::Import(compiler_type,
> GetClangASTImporter()))
> > +        {
> > +
> ClangASTContext::CompleteTagDeclarationDefinition(compiler_type);
> > +            return true;
> > +        }
> > +        else
> > +        {
> > +            ClangASTContext::SetHasExternalStorage
> (compiler_type.GetOpaqueQualType(), false);
> > +        }
> > +    }
> > +    return false;
> > +}
> > +
> > +bool
> >  DWARFASTParserClang::CompleteTypeFromDWARF (const DWARFDIE &die,
> >                                              lldb_private::Type *type,
> >                                              CompilerType &clang_type)
> > @@ -1868,25 +2023,17 @@ DWARFASTParserClang::CompleteTypeFromDWA
> >                      DWARFDIECollection member_function_dies;
> >
> >                      DelayedPropertyList delayed_properties;
> > -                    if (!ParseChildMembers (sc,
> > -                                            die,
> > -                                            clang_type,
> > -                                            class_language,
> > -                                            base_classes,
> > -                                            member_accessibilities,
> > -                                            member_function_dies,
> > -                                            delayed_properties,
> > -                                            default_accessibility,
> > -                                            is_a_class,
> > -                                            layout_info))
> > -                    {
> > -                        auto module =
> dwarf->GetObjectFile()->GetModule();
> > -                        module->ReportError (":: Class %s has members
> with incomplete type.", die.GetName());
> > -                        if (die.GetCU()->GetProducer() ==
> DWARFCompileUnit::eProducerClang)
> > -                            module->ReportError(":: Try compiling the
> source file with -fno-limit-debug-info.");
> > -
> > -                        return false;
> > -                    }
> > +                    ParseChildMembers (sc,
> > +                                       die,
> > +                                       clang_type,
> > +                                       class_language,
> > +                                       base_classes,
> > +                                       member_accessibilities,
> > +                                       member_function_dies,
> > +                                       delayed_properties,
> > +                                       default_accessibility,
> > +                                       is_a_class,
> > +                                       layout_info);
> >
> >                      // Now parse any methods if there were any...
> >                      size_t num_functions = member_function_dies.Size();
> > @@ -1977,7 +2124,14 @@ DWARFASTParserClang::CompleteTypeFromDWA
> >                                      if (die.GetCU()->GetProducer() ==
> DWARFCompileUnit::eProducerClang)
> >                                           module->ReportError (":: Try
> compiling the source file with -fno-limit-debug-info.");
> >
> > -                                    return false;
> > +                                    // We have no choice other than to
> pretend that the base class
> > +                                    // is complete. If we don't do
> this, clang will crash when we
> > +                                    // call setBases() inside of
> "clang_type.SetBaseClassesForClassType()"
> > +                                    // below. Since we provide layout
> assistance, all ivars in this
> > +                                    // class and other classes will be
> fine, this is the best we can do
> > +                                    // short of crashing.
> > +
> ClangASTContext::StartTagDeclarationDefinition (base_class_type);
> > +
> ClangASTContext::CompleteTagDeclarationDefinition (base_class_type);
> >                                  }
> >                              }
> >                          }
> > @@ -2420,7 +2574,6 @@ DWARFASTParserClang::ParseChildMembers (
> >      if (!parent_die)
> >          return 0;
> >
> > -    uint32_t incomplete_member_info_count = 0;
> >      uint32_t member_idx = 0;
> >      BitfieldInfo last_field_info;
> >
> > @@ -2754,8 +2907,8 @@ DWARFASTParserClang::ParseChildMembers (
> >                                  }
> >
> >                                  CompilerType member_clang_type =
> member_type->GetLayoutCompilerType ();
> > -                                if (!member_clang_type.IsCompleteType()
> && !member_clang_type.GetCompleteType())
> > -                                    incomplete_member_info_count += 1;
> > +                                if (!member_clang_type.IsCompleteType())
> > +                                    member_clang_type.GetCompleteType();
> >
> >                                  {
> >                                      // Older versions of clang emit
> array[0] and array[1] in the same way (<rdar://problem/12566646>).
> > @@ -2789,6 +2942,30 @@ DWARFASTParserClang::ParseChildMembers (
> >                                      }
> >                                  }
> >
> > +                                if
> (ClangASTContext::IsCXXClassType(member_clang_type) &&
> member_clang_type.GetCompleteType() == false)
> > +                                {
> > +                                    if (die.GetCU()->GetProducer() ==
> DWARFCompileUnit::eProducerClang)
> > +                                        module_sp->ReportError ("DWARF
> DIE at 0x%8.8x (class %s) has a member variable 0x%8.8x (%s) whose type is
> a forward declaration, not a complete definition.\nTry compiling the source
> file with -fno-limit-debug-info",
> > +
> parent_die.GetOffset(),
> > +
> parent_die.GetName(),
> > +
> die.GetOffset(),
> > +                                                                name);
> > +                                    else
> > +                                        module_sp->ReportError ("DWARF
> DIE at 0x%8.8x (class %s) has a member variable 0x%8.8x (%s) whose type is
> a forward declaration, not a complete definition.\nPlease file a bug
> against the compiler and include the preprocessed output for %s",
> > +
> parent_die.GetOffset(),
> > +
> parent_die.GetName(),
> > +
> die.GetOffset(),
> > +                                                                name,
> > +
> sc.comp_unit ? sc.comp_unit->GetPath().c_str() : "the source file");
> > +                                    // We have no choice other than to
> pretend that the member class
> > +                                    // is complete. If we don't do
> this, clang will crash when trying
> > +                                    // to layout the class. Since we
> provide layout assistance, all
> > +                                    // ivars in this class and other
> classes will be fine, this is
> > +                                    // the best we can do short of
> crashing.
> > +
> ClangASTContext::StartTagDeclarationDefinition(member_clang_type);
> > +
> ClangASTContext::CompleteTagDeclarationDefinition(member_clang_type);
> > +                                }
> > +
> >                                  field_decl =
> ClangASTContext::AddFieldToRecordType (class_clang_type,
> >
>             name,
> >
>             member_clang_type,
> > @@ -2978,7 +3155,7 @@ DWARFASTParserClang::ParseChildMembers (
> >          }
> >      }
> >
> > -    return incomplete_member_info_count == 0;
> > +    return true;
> >  }
> >
> >
> >
> > Modified:
> lldb/trunk/source/Plugins/SymbolFile/DWARF/DWARFASTParserClang.h
> > URL:
> http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Plugins/SymbolFile/DWARF/DWARFASTParserClang.h?rev=254476&r1=254475&r2=254476&view=diff
> >
> ==============================================================================
> > --- lldb/trunk/source/Plugins/SymbolFile/DWARF/DWARFASTParserClang.h
> (original)
> > +++ lldb/trunk/source/Plugins/SymbolFile/DWARF/DWARFASTParserClang.h Tue
> Dec  1 18:43:32 2015
> > @@ -47,6 +47,12 @@ public:
> >                              const DWARFDIE &die) override;
> >
> >      bool
> > +    CanCompleteType (const lldb_private::CompilerType &compiler_type)
> override;
> > +
> > +    bool
> > +    CompleteType (const lldb_private::CompilerType &compiler_type)
> override;
> > +
> > +    bool
> >      CompleteTypeFromDWARF (const DWARFDIE &die,
> >                             lldb_private::Type *type,
> >                             lldb_private::CompilerType &compiler_type)
> override;
> > @@ -175,6 +181,19 @@ protected:
> >      void
> >      LinkDeclToDIE (clang::Decl *decl, const DWARFDIE &die);
> >
> > +    lldb_private::ClangASTImporter &
> > +    GetClangASTImporter();
> > +
> > +    lldb::TypeSP
> > +    ParseTypeFromDWO (const DWARFDIE &die, lldb_private::Log *log);
> > +
> > +
> //----------------------------------------------------------------------
> > +    // Return true if this type is a declaration to a type in an
> external
> > +    // module.
> > +
> //----------------------------------------------------------------------
> > +    lldb::ModuleSP
> > +    GetModuleForType (const DWARFDIE &die);
> > +
> >      typedef llvm::SmallPtrSet<const DWARFDebugInfoEntry *, 4>
> DIEPointerSet;
> >      typedef llvm::DenseMap<const DWARFDebugInfoEntry *,
> clang::DeclContext *> DIEToDeclContextMap;
> >      //typedef llvm::DenseMap<const clang::DeclContext *, DIEPointerSet>
> DeclContextToDIEMap;
> > @@ -188,6 +207,7 @@ protected:
> >      DIEToDeclContextMap m_die_to_decl_ctx;
> >      DeclContextToDIEMap m_decl_ctx_to_die;
> >      RecordDeclToLayoutMap m_record_decl_to_layout_map;
> > +    std::unique_ptr<lldb_private::ClangASTImporter>
> m_clang_ast_importer_ap;
> >  };
> >
> >  #endif // SymbolFileDWARF_DWARFASTParserClang_h_
> >
> > Modified: lldb/trunk/source/Plugins/SymbolFile/DWARF/DWARFDIE.cpp
> > URL:
> http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Plugins/SymbolFile/DWARF/DWARFDIE.cpp?rev=254476&r1=254475&r2=254476&view=diff
> >
> ==============================================================================
> > --- lldb/trunk/source/Plugins/SymbolFile/DWARF/DWARFDIE.cpp (original)
> > +++ lldb/trunk/source/Plugins/SymbolFile/DWARF/DWARFDIE.cpp Tue Dec  1
> 18:43:32 2015
> > @@ -22,8 +22,11 @@
> >
> >  #include "lldb/Core/Module.h"
> >  #include "lldb/Symbol/ObjectFile.h"
> > +#include "lldb/Symbol/Type.h"
> >  #include "lldb/Symbol/TypeSystem.h"
> >
> > +using namespace lldb_private;
> > +
> >  DIERef
> >  DWARFDIE::GetDIERef() const
> >  {
> > @@ -307,6 +310,51 @@ DWARFDIE::GetDWARFDeclContext (DWARFDecl
> >      }
> >  }
> >
> > +void
> > +DWARFDIE::GetDWOContext (std::vector<CompilerContext> &context) const
> > +{
> > +    const dw_tag_t tag = Tag();
> > +    if (tag == DW_TAG_compile_unit)
> > +        return;
> > +    DWARFDIE parent = GetParent();
> > +    if (parent)
> > +        parent.GetDWOContext(context);
> > +    switch (tag)
> > +    {
> > +        case DW_TAG_module:
> > +
> context.push_back(CompilerContext(CompilerContextKind::Module,
> ConstString(GetName())));
> > +            break;
> > +        case DW_TAG_namespace:
> > +
> context.push_back(CompilerContext(CompilerContextKind::Namespace,
> ConstString(GetName())));
> > +            break;
> > +        case DW_TAG_structure_type:
> > +
> context.push_back(CompilerContext(CompilerContextKind::Structure,
> ConstString(GetName())));
> > +            break;
> > +        case DW_TAG_union_type:
> > +
> context.push_back(CompilerContext(CompilerContextKind::Union,
> ConstString(GetName())));
> > +            break;
> > +        case DW_TAG_class_type:
> > +
> context.push_back(CompilerContext(CompilerContextKind::Class,
> ConstString(GetName())));
> > +            break;
> > +        case DW_TAG_enumeration_type:
> > +
> context.push_back(CompilerContext(CompilerContextKind::Enumeration,
> ConstString(GetName())));
> > +            break;
> > +        case DW_TAG_subprogram:
> > +
> context.push_back(CompilerContext(CompilerContextKind::Function,
> ConstString(GetPubname())));
> > +            break;
> > +        case DW_TAG_variable:
> > +
> context.push_back(CompilerContext(CompilerContextKind::Variable,
> ConstString(GetPubname())));
> > +            break;
> > +        case DW_TAG_typedef:
> > +
> context.push_back(CompilerContext(CompilerContextKind::Typedef,
> ConstString(GetName())));
> > +            break;
> > +        default:
> > +            assert(!"remove this prior to checkin");
> > +            break;
> > +    }
> > +}
> > +
> > +
> >
> >  DWARFDIE
> >  DWARFDIE::GetParentDeclContextDIE () const
> > @@ -371,6 +419,45 @@ DWARFDIE::IsStructOrClass () const
> >      return tag == DW_TAG_class_type || tag == DW_TAG_structure_type;
> >  }
> >
> > +
> > +DWARFDIE
> > +DWARFDIE::GetContainingDWOModuleDIE () const
> > +{
> > +    if (IsValid())
> > +    {
> > +        DWARFDIE top_module_die;
> > +        // Now make sure this DIE is scoped in a DW_TAG_module tag and
> return true if so
> > +        for (DWARFDIE parent = GetParent(); parent.IsValid(); parent =
> parent.GetParent())
> > +        {
> > +            const dw_tag_t tag = parent.Tag();
> > +            if (tag == DW_TAG_module)
> > +                top_module_die = parent;
> > +            else if (tag == DW_TAG_compile_unit)
> > +                break;
> > +        }
> > +
> > +        return top_module_die;
> > +    }
> > +    return DWARFDIE();
> > +}
> > +
> > +lldb::ModuleSP
> > +DWARFDIE::GetContainingDWOModule () const
> > +{
> > +    if (IsValid())
> > +    {
> > +        DWARFDIE dwo_module_die = GetContainingDWOModuleDIE();
> > +
> > +        if (dwo_module_die)
> > +        {
> > +            const char *module_name = dwo_module_die.GetName();
> > +            if (module_name)
> > +                return GetDWARF()->GetDWOModule
> (lldb_private::ConstString(module_name));
> > +        }
> > +    }
> > +    return lldb::ModuleSP();
> > +}
> > +
> >  bool
> >  DWARFDIE::HasChildren () const
> >  {
> >
> > Modified: lldb/trunk/source/Plugins/SymbolFile/DWARF/DWARFDIE.h
> > URL:
> http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Plugins/SymbolFile/DWARF/DWARFDIE.h?rev=254476&r1=254475&r2=254476&view=diff
> >
> ==============================================================================
> > --- lldb/trunk/source/Plugins/SymbolFile/DWARF/DWARFDIE.h (original)
> > +++ lldb/trunk/source/Plugins/SymbolFile/DWARF/DWARFDIE.h Tue Dec  1
> 18:43:32 2015
> > @@ -126,6 +126,12 @@ public:
> >          m_die = nullptr;
> >      }
> >
> > +    lldb::ModuleSP
> > +    GetContainingDWOModule () const;
> > +
> > +    DWARFDIE
> > +    GetContainingDWOModuleDIE () const;
> > +
> >
> //----------------------------------------------------------------------
> >      // Accessing information about a DIE
> >
> //----------------------------------------------------------------------
> > @@ -217,6 +223,9 @@ public:
> >      void
> >      GetDWARFDeclContext (DWARFDeclContext &dwarf_decl_ctx) const;
> >
> > +    void
> > +    GetDWOContext (std::vector<lldb_private::CompilerContext> &context)
> const;
> > +
> >
> //----------------------------------------------------------------------
> >      // Getting attribute values from the DIE.
> >      //
> >
> > 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=254476&r1=254475&r2=254476&view=diff
> >
> ==============================================================================
> > --- lldb/trunk/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.cpp
> (original)
> > +++ lldb/trunk/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.cpp Tue
> Dec  1 18:43:32 2015
> > @@ -1077,9 +1077,9 @@ SymbolFileDWARF::ParseImportedModules (c
> >          if
> (ClangModulesDeclVendor::LanguageSupportsClangModules(sc.comp_unit->GetLanguage()))
> >          {
> >              UpdateExternalModuleListIfNeeded();
> > -            for (const std::pair<uint64_t, const ClangModuleInfo>
> &external_type_module : m_external_type_modules)
> > +            for (const auto &pair : m_external_type_modules)
> >              {
> > -
> imported_modules.push_back(external_type_module.second.m_name);
> > +                imported_modules.push_back(pair.first);
> >              }
> >          }
> >      }
> > @@ -1515,13 +1515,32 @@ bool
> >  SymbolFileDWARF::HasForwardDeclForClangType (const CompilerType
> &compiler_type)
> >  {
> >      CompilerType compiler_type_no_qualifiers =
> ClangASTContext::RemoveFastQualifiers(compiler_type);
> > -    return GetForwardDeclClangTypeToDie().count
> (compiler_type_no_qualifiers.GetOpaqueQualType());
> > +    if (GetForwardDeclClangTypeToDie().count
> (compiler_type_no_qualifiers.GetOpaqueQualType()))
> > +    {
> > +        return true;
> > +    }
> > +    TypeSystem *type_system = compiler_type.GetTypeSystem();
> > +    if (type_system)
> > +    {
> > +        DWARFASTParser *dwarf_ast = type_system->GetDWARFParser();
> > +        if (dwarf_ast)
> > +            return dwarf_ast->CanCompleteType(compiler_type);
> > +    }
> > +    return false;
> >  }
> >
> >
> >  bool
> >  SymbolFileDWARF::CompleteType (CompilerType &compiler_type)
> >  {
> > +    TypeSystem *type_system = compiler_type.GetTypeSystem();
> > +    if (type_system)
> > +    {
> > +        DWARFASTParser *dwarf_ast = type_system->GetDWARFParser();
> > +        if (dwarf_ast && dwarf_ast->CanCompleteType(compiler_type))
> > +            return dwarf_ast->CompleteType(compiler_type);
> > +    }
> > +
> >      // We have a struct/union/class/enum that needs to be fully
> resolved.
> >      CompilerType compiler_type_no_qualifiers =
> ClangASTContext::RemoveFastQualifiers(compiler_type);
> >      auto die_it = GetForwardDeclClangTypeToDie().find
> (compiler_type_no_qualifiers.GetOpaqueQualType());
> > @@ -1641,6 +1660,17 @@ SymbolFileDWARF::GetFunction (const DWAR
> >      return false;
> >  }
> >
> > +lldb::ModuleSP
> > +SymbolFileDWARF::GetDWOModule (ConstString name)
> > +{
> > +    UpdateExternalModuleListIfNeeded();
> > +    const auto &pos = m_external_type_modules.find(name);
> > +    if (pos != m_external_type_modules.end())
> > +        return pos->second;
> > +    else
> > +        return lldb::ModuleSP();
> > +}
> > +
> >  void
> >  SymbolFileDWARF::UpdateExternalModuleListIfNeeded()
> >  {
> > @@ -1658,37 +1688,24 @@ SymbolFileDWARF::UpdateExternalModuleLis
> >          const DWARFDIE die = dwarf_cu->GetCompileUnitDIEOnly();
> >          if (die && die.HasChildren() == false)
> >          {
> > -            const uint64_t name_strp = die.GetAttributeValueAsUnsigned
> (DW_AT_name, UINT64_MAX);
> > -            const uint64_t dwo_path_strp =
> die.GetAttributeValueAsUnsigned (DW_AT_GNU_dwo_name, UINT64_MAX);
> > -
> > -            if (name_strp != UINT64_MAX)
> > +            const char *name =
> die.GetAttributeValueAsString(DW_AT_name, nullptr);
> > +
> > +            if (name)
> >              {
> > -                if (m_external_type_modules.find(dwo_path_strp) ==
> m_external_type_modules.end())
> > +                ConstString const_name(name);
> > +                if (m_external_type_modules.find(const_name) ==
> m_external_type_modules.end())
> >                  {
> > -                    const char *name =
> get_debug_str_data().PeekCStr(name_strp);
> > -                    const char *dwo_path =
> get_debug_str_data().PeekCStr(dwo_path_strp);
> > -                    if (name || dwo_path)
> > +                    ModuleSP module_sp;
> > +                    const char *dwo_path =
> die.GetAttributeValueAsString(DW_AT_GNU_dwo_name, nullptr);
> > +                    if (dwo_path)
> >                      {
> > -                        ModuleSP module_sp;
> > -                        if (dwo_path)
> > -                        {
> > -                            ModuleSpec dwo_module_spec;
> > -
> dwo_module_spec.GetFileSpec().SetFile(dwo_path, false);
> > -                            dwo_module_spec.GetArchitecture() =
> m_obj_file->GetModule()->GetArchitecture();
> > -                            //printf ("Loading dwo = '%s'\n", dwo_path);
> > -                            Error error = ModuleList::GetSharedModule
> (dwo_module_spec, module_sp, NULL, NULL, NULL);
> > -                        }
> > -
> > -                        if (dwo_path_strp != LLDB_INVALID_UID)
> > -                        {
> > -                            m_external_type_modules[dwo_path_strp] =
> ClangModuleInfo { ConstString(name), module_sp };
> > -                        }
> > -                        else
> > -                        {
> > -                            // This hack should be removed promptly
> once clang emits both.
> > -                            m_external_type_modules[name_strp] =
> ClangModuleInfo { ConstString(name), module_sp };
> > -                        }
> > +                        ModuleSpec dwo_module_spec;
> > +                        dwo_module_spec.GetFileSpec().SetFile(dwo_path,
> false);
> > +                        dwo_module_spec.GetArchitecture() =
> m_obj_file->GetModule()->GetArchitecture();
> > +                        //printf ("Loading dwo = '%s'\n", dwo_path);
> > +                        Error error = ModuleList::GetSharedModule
> (dwo_module_spec, module_sp, NULL, NULL, NULL);
> >                      }
> > +                    m_external_type_modules[const_name] = module_sp;
> >                  }
> >              }
> >          }
> > @@ -2970,6 +2987,104 @@ SymbolFileDWARF::FindTypes (const Symbol
> >          }
> >          return num_matches;
> >      }
> > +    else
> > +    {
> > +        UpdateExternalModuleListIfNeeded();
> > +
> > +        for (const auto &pair : m_external_type_modules)
> > +        {
> > +            ModuleSP external_module_sp = pair.second;
> > +            if (external_module_sp)
> > +            {
> > +                SymbolVendor *sym_vendor =
> external_module_sp->GetSymbolVendor();
> > +                if (sym_vendor)
> > +                {
> > +                    const uint32_t num_external_matches =
> sym_vendor->FindTypes (sc,
> > +
>          name,
> > +
>          parent_decl_ctx,
> > +
>          append,
> > +
>          max_matches,
> > +
>          types);
> > +                    if (num_external_matches)
> > +                        return num_external_matches;
> > +                }
> > +            }
> > +        }
> > +    }
> > +
> > +    return 0;
> > +}
> > +
> > +
> > +size_t
> > +SymbolFileDWARF::FindTypes (const std::vector<CompilerContext> &context,
> > +                            bool append,
> > +                            TypeMap& types)
> > +{
> > +    if (!append)
> > +        types.Clear();
> > +
> > +    if (context.empty())
> > +        return 0;
> > +
> > +    DIEArray die_offsets;
> > +
> > +    ConstString name = context.back().name;
> > +
> > +    if (m_using_apple_tables)
> > +    {
> > +        if (m_apple_types_ap.get())
> > +        {
> > +            const char *name_cstr = name.GetCString();
> > +            m_apple_types_ap->FindByName (name_cstr, die_offsets);
> > +        }
> > +    }
> > +    else
> > +    {
> > +        if (!m_indexed)
> > +            Index ();
> > +
> > +        m_type_index.Find (name, die_offsets);
> > +    }
> > +
> > +    const size_t num_die_matches = die_offsets.size();
> > +
> > +    if (num_die_matches)
> > +    {
> > +        size_t num_matches = 0;
> > +        DWARFDebugInfo* debug_info = DebugInfo();
> > +        for (size_t i=0; i<num_die_matches; ++i)
> > +        {
> > +            const DIERef& die_ref = die_offsets[i];
> > +            DWARFDIE die = debug_info->GetDIE (die_ref);
> > +
> > +            if (die)
> > +            {
> > +
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/lldb-commits/attachments/20151202/c4250db2/attachment-0001.html>


More information about the lldb-commits mailing list