[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