[Lldb-commits] [lldb] r153675 - in /lldb/trunk/source: Plugins/SymbolFile/DWARF/SymbolFileDWARF.cpp Symbol/ClangASTContext.cpp
Sean Callanan
scallanan at apple.com
Thu Mar 29 12:07:06 PDT 2012
Author: spyffe
Date: Thu Mar 29 14:07:06 2012
New Revision: 153675
URL: http://llvm.org/viewvc/llvm-project?rev=153675&view=rev
Log:
Added support for the DW_AT_APPLE_Property tag
for unbacked properties. We support two variants:
one in which the getter/setter are provided by
selector ("mySetter:") and one in which the
getter/setter are provided by signature
("-[MyClass mySetter:]").
Modified:
lldb/trunk/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.cpp
lldb/trunk/source/Symbol/ClangASTContext.cpp
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=153675&r1=153674&r2=153675&view=diff
==============================================================================
--- lldb/trunk/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.cpp (original)
+++ lldb/trunk/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.cpp Thu Mar 29 14:07:06 2012
@@ -1462,6 +1462,7 @@
switch (tag)
{
case DW_TAG_member:
+ case DW_TAG_APPLE_Property:
{
DWARFDebugInfoEntry::Attributes attributes;
const size_t num_attributes = die->GetAttributes (this,
@@ -1547,7 +1548,30 @@
}
}
- // Clang has a DWARF generation bug where sometimes it
+ ConstString fixed_getter;
+ ConstString fixed_setter;
+
+ if (prop_getter_name && prop_getter_name[0] == '-')
+ {
+ ObjCLanguageRuntime::ParseMethodName (prop_getter_name,
+ NULL,
+ &fixed_getter,
+ NULL,
+ NULL);
+ prop_getter_name = fixed_getter.GetCString();
+ }
+
+ if (prop_setter_name && prop_setter_name[0] == '-')
+ {
+ ObjCLanguageRuntime::ParseMethodName (prop_setter_name,
+ NULL,
+ &fixed_setter,
+ NULL,
+ NULL);
+ prop_setter_name = fixed_setter.GetCString();
+ }
+
+ // Clang has a DWARF generation bug where sometimes it
// represents fields that are references with bad byte size
// and bit size/offset information such as:
//
@@ -1587,77 +1611,84 @@
{
Type *member_type = ResolveTypeUID(encoding_uid);
clang::FieldDecl *field_decl = NULL;
- if (member_type)
+ if (tag == DW_TAG_member)
{
- if (accessibility == eAccessNone)
- accessibility = default_accessibility;
- member_accessibilities.push_back(accessibility);
-
- field_decl = GetClangASTContext().AddFieldToRecordType (class_clang_type,
- name,
- member_type->GetClangLayoutType(),
- accessibility,
- bit_size);
- }
- else
- {
- if (name)
- GetObjectFile()->GetModule()->ReportError ("0x%8.8llx: DW_TAG_member '%s' refers to type 0x%8.8llx which was unable to be parsed",
- MakeUserID(die->GetOffset()),
- name,
- encoding_uid);
- else
- GetObjectFile()->GetModule()->ReportError ("0x%8.8llx: DW_TAG_member refers to type 0x%8.8llx which was unable to be parsed",
- MakeUserID(die->GetOffset()),
- encoding_uid);
- }
-
- if (member_byte_offset != UINT32_MAX || bit_size != 0)
- {
- /////////////////////////////////////////////////////////////
- // How to locate a field given the DWARF debug information
- //
- // AT_byte_size indicates the size of the word in which the
- // bit offset must be interpreted.
- //
- // AT_data_member_location indicates the byte offset of the
- // word from the base address of the structure.
- //
- // AT_bit_offset indicates how many bits into the word
- // (according to the host endianness) the low-order bit of
- // the field starts. AT_bit_offset can be negative.
- //
- // AT_bit_size indicates the size of the field in bits.
- /////////////////////////////////////////////////////////////
-
- ByteOrder object_endian = GetObjectFile()->GetModule()->GetArchitecture().GetDefaultEndian();
-
- uint64_t total_bit_offset = 0;
-
- total_bit_offset += (member_byte_offset == UINT32_MAX ? 0 : (member_byte_offset * 8));
-
- if (object_endian == eByteOrderLittle)
- {
- total_bit_offset += byte_size * 8;
- total_bit_offset -= (bit_offset + bit_size);
+ if (member_type)
+ {
+ if (accessibility == eAccessNone)
+ accessibility = default_accessibility;
+ member_accessibilities.push_back(accessibility);
+
+ field_decl = GetClangASTContext().AddFieldToRecordType (class_clang_type,
+ name,
+ member_type->GetClangLayoutType(),
+ accessibility,
+ bit_size);
}
else
{
- total_bit_offset += bit_offset;
+ if (name)
+ GetObjectFile()->GetModule()->ReportError ("0x%8.8llx: DW_TAG_member '%s' refers to type 0x%8.8llx which was unable to be parsed",
+ MakeUserID(die->GetOffset()),
+ name,
+ encoding_uid);
+ else
+ GetObjectFile()->GetModule()->ReportError ("0x%8.8llx: DW_TAG_member refers to type 0x%8.8llx which was unable to be parsed",
+ MakeUserID(die->GetOffset()),
+ encoding_uid);
}
+
+ if (member_byte_offset != UINT32_MAX || bit_size != 0)
+ {
+ /////////////////////////////////////////////////////////////
+ // How to locate a field given the DWARF debug information
+ //
+ // AT_byte_size indicates the size of the word in which the
+ // bit offset must be interpreted.
+ //
+ // AT_data_member_location indicates the byte offset of the
+ // word from the base address of the structure.
+ //
+ // AT_bit_offset indicates how many bits into the word
+ // (according to the host endianness) the low-order bit of
+ // the field starts. AT_bit_offset can be negative.
+ //
+ // AT_bit_size indicates the size of the field in bits.
+ /////////////////////////////////////////////////////////////
- layout_info.field_offsets.insert(std::make_pair(field_decl, total_bit_offset));
+ ByteOrder object_endian = GetObjectFile()->GetModule()->GetArchitecture().GetDefaultEndian();
+
+ uint64_t total_bit_offset = 0;
+
+ total_bit_offset += (member_byte_offset == UINT32_MAX ? 0 : (member_byte_offset * 8));
+
+ if (object_endian == eByteOrderLittle)
+ {
+ total_bit_offset += byte_size * 8;
+ total_bit_offset -= (bit_offset + bit_size);
+ }
+ else
+ {
+ total_bit_offset += bit_offset;
+ }
+
+ layout_info.field_offsets.insert(std::make_pair(field_decl, total_bit_offset));
+ }
}
+
if (prop_name != NULL)
{
+ clang::ObjCIvarDecl *ivar_decl = NULL;
- clang::ObjCIvarDecl *ivar_decl = clang::dyn_cast<clang::ObjCIvarDecl>(field_decl);
- assert (ivar_decl != NULL);
+ if (field_decl)
+ {
+ ivar_decl = clang::dyn_cast<clang::ObjCIvarDecl>(field_decl);
+ assert (ivar_decl != NULL);
+ }
-
GetClangASTContext().AddObjCClassProperty (class_clang_type,
prop_name,
- 0,
+ member_type->GetClangLayoutType(),
ivar_decl,
prop_setter_name,
prop_getter_name,
Modified: lldb/trunk/source/Symbol/ClangASTContext.cpp
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Symbol/ClangASTContext.cpp?rev=153675&r1=153674&r2=153675&view=diff
==============================================================================
--- lldb/trunk/source/Symbol/ClangASTContext.cpp (original)
+++ lldb/trunk/source/Symbol/ClangASTContext.cpp Thu Mar 29 14:07:06 2012
@@ -2407,7 +2407,6 @@
else if (ivar_decl)
property_opaque_type_to_access = ivar_decl->getType().getAsOpaquePtr();
- // FIXME: For now, we don't know how to add properties if we don't have their associated ivar.
if (class_interface_decl && property_opaque_type_to_access)
{
clang::TypeSourceInfo *prop_type_source;
More information about the lldb-commits
mailing list