Skip to content

Commit fa3ab45

Browse files
committed
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> llvm-svn: 170168
1 parent dc3f4f9 commit fa3ab45

File tree

1 file changed

+37
-1
lines changed

1 file changed

+37
-1
lines changed

lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.cpp

Lines changed: 37 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1774,6 +1774,7 @@ SymbolFileDWARF::ParseChildMembers
17741774
if (is_artificial == false)
17751775
{
17761776
Type *member_type = ResolveTypeUID(encoding_uid);
1777+
17771778
clang::FieldDecl *field_decl = NULL;
17781779
if (tag == DW_TAG_member)
17791780
{
@@ -1890,9 +1891,44 @@ SymbolFileDWARF::ParseChildMembers
18901891
}
18911892
}
18921893

1894+
clang_type_t member_clang_type = member_type->GetClangLayoutType();
1895+
1896+
{
1897+
// Older versions of clang emit array[0] and array[1] in the same way (<rdar://problem/12566646>).
1898+
// If the current field is at the end of the structure, then there is definitely no room for extra
1899+
// elements and we override the type to array[0].
1900+
1901+
clang_type_t member_array_element_type;
1902+
uint64_t member_array_size;
1903+
bool member_array_is_incomplete;
1904+
1905+
if (GetClangASTContext().IsArrayType(member_clang_type,
1906+
&member_array_element_type,
1907+
&member_array_size,
1908+
&member_array_is_incomplete) &&
1909+
!member_array_is_incomplete)
1910+
{
1911+
uint64_t parent_byte_size = parent_die->GetAttributeValueAsUnsigned(this, dwarf_cu, DW_AT_byte_size, UINT64_MAX);
1912+
1913+
if (member_byte_offset >= parent_byte_size)
1914+
{
1915+
if (member_array_size != 1)
1916+
{
1917+
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,
1918+
MakeUserID(die->GetOffset()),
1919+
name,
1920+
encoding_uid,
1921+
MakeUserID(parent_die->GetOffset()));
1922+
}
1923+
1924+
member_clang_type = GetClangASTContext().CreateArrayType(member_array_element_type, 0);
1925+
}
1926+
}
1927+
}
1928+
18931929
field_decl = GetClangASTContext().AddFieldToRecordType (class_clang_type,
18941930
name,
1895-
member_type->GetClangLayoutType(),
1931+
member_clang_type,
18961932
accessibility,
18971933
bit_size);
18981934

0 commit comments

Comments
 (0)