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 <tbergham...@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@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)
> +            {
> +                std::vector<CompilerContext> die_context;
> +                die.GetDWOContext(die_context);
> +                if (die_context != context)
> +                    continue;
> +
> +                Type *matching_type = ResolveType (die, true, true);
> +                if (matching_type)
> +                {
> +                    // We found a type pointer, now find the shared pointer 
> form our type list
> +                    types.InsertUnique (matching_type->shared_from_this());
> +                    ++num_matches;
> +                }
> +            }
> +            else
> +            {
> +                if (m_using_apple_tables)
> +                {
> +                    
> GetObjectFile()->GetModule()->ReportErrorIfModifyDetected ("the DWARF debug 
> information has been modified (.apple_types accelerator table had bad die 
> 0x%8.8x for '%s')\n",
> +                                                                             
>   die_ref.die_offset, name.GetCString());
> +                }
> +            }
> +
> +        }
> +        return num_matches;
> +    }
>      return 0;
>  }
> 
> 
> 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=254476&r1=254475&r2=254476&view=diff
> ==============================================================================
> --- lldb/trunk/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.h (original)
> +++ lldb/trunk/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.h Tue Dec  1 
> 18:43:32 2015
> @@ -211,6 +211,11 @@ public:
>                 uint32_t max_matches,
>                 lldb_private::TypeMap& types) override;
> 
> +    size_t
> +    FindTypes (const std::vector<lldb_private::CompilerContext> &context,
> +               bool append,
> +               lldb_private::TypeMap& types) override;
> +
>      lldb_private::TypeList *
>      GetTypeList () override;
> 
> @@ -306,6 +311,9 @@ public:
>      virtual lldb_private::DWARFExpression::LocationListFormat
>      GetLocationListFormat() const;
> 
> +    lldb::ModuleSP
> +    GetDWOModule (lldb_private::ConstString name);
> +
>  protected:
>      typedef llvm::DenseMap<const DWARFDebugInfoEntry *, lldb_private::Type 
> *> DIEToTypePtr;
>      typedef llvm::DenseMap<const DWARFDebugInfoEntry *, lldb::VariableSP> 
> DIEToVariableSP;
> @@ -483,12 +491,7 @@ protected:
> 
>      typedef std::set<lldb_private::Type *> TypeSet;
> 
> -    typedef struct {
> -        lldb_private::ConstString   m_name;
> -        lldb::ModuleSP              m_module_sp;
> -    } ClangModuleInfo;
> -
> -    typedef std::map<uint64_t, ClangModuleInfo> ExternalTypeModuleMap;
> +    typedef std::map<lldb_private::ConstString, lldb::ModuleSP> 
> ExternalTypeModuleMap;
> 
>      void
>      GetTypes (const DWARFDIE &die,
> 
> Modified: lldb/trunk/source/Symbol/ClangASTContext.cpp
> URL: 
> http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Symbol/ClangASTContext.cpp?rev=254476&r1=254475&r2=254476&view=diff
> ==============================================================================
> --- lldb/trunk/source/Symbol/ClangASTContext.cpp (original)
> +++ lldb/trunk/source/Symbol/ClangASTContext.cpp Tue Dec  1 18:43:32 2015
> @@ -2297,9 +2297,6 @@ ClangASTContext::GetCompleteDecl (clang:
>          if (tag_decl->isCompleteDefinition())
>              return true;
> 
> -        if (!tag_decl->hasExternalLexicalStorage())
> -            return false;
> -
>          ast_source->CompleteType(tag_decl);
> 
>          return !tag_decl->getTypeForDecl()->isIncompleteType();
> @@ -2451,81 +2448,110 @@ GetCompleteQualType (clang::ASTContext *
>          case clang::Type::ConstantArray:
>          case clang::Type::IncompleteArray:
>          case clang::Type::VariableArray:
> -        {
> -            const clang::ArrayType *array_type = 
> llvm::dyn_cast<clang::ArrayType>(qual_type.getTypePtr());
> -
> -            if (array_type)
> -                return GetCompleteQualType (ast, 
> array_type->getElementType(), allow_completion);
> -        }
> +            {
> +                const clang::ArrayType *array_type = 
> llvm::dyn_cast<clang::ArrayType>(qual_type.getTypePtr());
> +
> +                if (array_type)
> +                    return GetCompleteQualType (ast, 
> array_type->getElementType(), allow_completion);
> +            }
>              break;
> 
>          case clang::Type::Record:
> -        case clang::Type::Enum:
> -        {
> -            const clang::TagType *tag_type = llvm::dyn_

_______________________________________________
lldb-commits mailing list
lldb-commits@lists.llvm.org
http://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits

Reply via email to