Anders Carlsson patch for member pointers. Thanks Anders.
git-svn-id: https://llvm.org/svn/llvm-project/llvdb/trunk@105868 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.cpp b/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.cpp
index ffee695..2841e82 100644
--- a/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.cpp
+++ b/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.cpp
@@ -3123,7 +3123,49 @@
}
break;
+ case DW_TAG_ptr_to_member_type:
+ {
+ dw_offset_t type_die_offset = DW_INVALID_OFFSET;
+ dw_offset_t containing_type_die_offset = DW_INVALID_OFFSET;
+
+ const size_t num_attributes = die->GetAttributes(this, dwarf_cu, attributes);
+
+ if (num_attributes > 0) {
+ uint32_t i;
+ for (i=0; i<num_attributes; ++i)
+ {
+ attr = attributes.AttributeAtIndex(i);
+ DWARFFormValue form_value;
+ if (attributes.ExtractFormValueAtIndex(this, i, form_value))
+ {
+ switch (attr)
+ {
+ case DW_AT_type:
+ type_die_offset = form_value.Reference(dwarf_cu); break;
+ case DW_AT_containing_type:
+ containing_type_die_offset = form_value.Reference(dwarf_cu); break;
+ }
+ }
+ }
+
+ Type *pointee_type = ResolveTypeUID(type_die_offset);
+ Type *class_type = ResolveTypeUID(containing_type_die_offset);
+
+ void *pointee_clang_type = pointee_type->GetOpaqueClangQualType();
+ void *class_clang_type = pointee_type->GetOpaqueClangQualType();
+
+ void *clang_type = type_list->GetClangASTContext().CreateMemberPointerType(pointee_clang_type, class_clang_type);
+
+ size_t byte_size = ClangASTContext::GetTypeBitSize(type_list->GetClangASTContext().getASTContext(), clang_type) / 8;
+
+ type_sp.reset( new Type(die->GetOffset(), this, type_name_dbstr, byte_size, NULL, LLDB_INVALID_UID, Type::eIsTypeWithUID, NULL, clang_type));
+ const_cast<DWARFDebugInfoEntry*>(die)->SetUserData(type_sp.get());
+ }
+
+ break;
+ }
default:
+ assert(false && "Unhandled type tag!");
break;
}
diff --git a/source/Symbol/ClangASTContext.cpp b/source/Symbol/ClangASTContext.cpp
index be63de2..d2ebd41 100644
--- a/source/Symbol/ClangASTContext.cpp
+++ b/source/Symbol/ClangASTContext.cpp
@@ -2165,6 +2165,15 @@
return NULL;
}
+void *
+ClangASTContext::CreateMemberPointerType (void * clang_pointee_type, void * clang_class_type)
+{
+ if (clang_pointee_type && clang_pointee_type)
+ return getASTContext()->getMemberPointerType(QualType::getFromOpaquePtr(clang_pointee_type),
+ QualType::getFromOpaquePtr(clang_class_type).getTypePtr()).getAsOpaquePtr();
+ return NULL;
+}
+
size_t
ClangASTContext::GetPointerBitSize ()
{