[Lldb-commits] [lldb] r170168 - /lldb/trunk/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.cpp
Sean Callanan
scallanan at apple.com
Thu Dec 13 16:54:13 PST 2012
Author: spyffe
Date: Thu Dec 13 18:54:13 2012
New Revision: 170168
URL: http://llvm.org/viewvc/llvm-project?rev=170168&view=rev
Log:
Some incorrect debug information caused LLDB
to report a structure with an array of size 1
at the end without accounting for that array
when reporting the struct's total size to Clang.
LLDB now coerces such an array to size 0.
<rdar://problem/12822204>
Modified:
lldb/trunk/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.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=170168&r1=170167&r2=170168&view=diff
==============================================================================
--- lldb/trunk/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.cpp (original)
+++ lldb/trunk/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.cpp Thu Dec 13 18:54:13 2012
@@ -1774,6 +1774,7 @@
if (is_artificial == false)
{
Type *member_type = ResolveTypeUID(encoding_uid);
+
clang::FieldDecl *field_decl = NULL;
if (tag == DW_TAG_member)
{
@@ -1890,9 +1891,44 @@
}
}
+ clang_type_t member_clang_type = member_type->GetClangLayoutType();
+
+ {
+ // Older versions of clang emit array[0] and array[1] in the same way (<rdar://problem/12566646>).
+ // If the current field is at the end of the structure, then there is definitely no room for extra
+ // elements and we override the type to array[0].
+
+ clang_type_t member_array_element_type;
+ uint64_t member_array_size;
+ bool member_array_is_incomplete;
+
+ if (GetClangASTContext().IsArrayType(member_clang_type,
+ &member_array_element_type,
+ &member_array_size,
+ &member_array_is_incomplete) &&
+ !member_array_is_incomplete)
+ {
+ uint64_t parent_byte_size = parent_die->GetAttributeValueAsUnsigned(this, dwarf_cu, DW_AT_byte_size, UINT64_MAX);
+
+ if (member_byte_offset >= parent_byte_size)
+ {
+ if (member_array_size != 1)
+ {
+ GetObjectFile()->GetModule()->ReportError ("0x%8.8" PRIx64 ": DW_TAG_member '%s' refers to type 0x%8.8" PRIx64 " which extends beyond the bounds of 0x%8.8" PRIx64,
+ MakeUserID(die->GetOffset()),
+ name,
+ encoding_uid,
+ MakeUserID(parent_die->GetOffset()));
+ }
+
+ member_clang_type = GetClangASTContext().CreateArrayType(member_array_element_type, 0);
+ }
+ }
+ }
+
field_decl = GetClangASTContext().AddFieldToRecordType (class_clang_type,
name,
- member_type->GetClangLayoutType(),
+ member_clang_type,
accessibility,
bit_size);
More information about the lldb-commits
mailing list