From a4658a5c861ef4840afbfa4127938314d52cee88 Mon Sep 17 00:00:00 2001 From: Ashok Thirumurthi Date: Tue, 30 Jul 2013 14:58:39 +0000 Subject: [PATCH] Updates the DW_AT_data_member_location handlers for the LLDB DWARF plugin to handle the case of an integer constant (DWARF 3 and later). - Fixes tests that assert in RecordLayoutBuilder::updateExternalFieldOffset because LLDB was providing an external AST source with missing member offsets. llvm-svn: 187423 --- .../SymbolFile/DWARF/SymbolFileDWARF.cpp | 25 ++++++++++++++++--- 1 file changed, 22 insertions(+), 3 deletions(-) diff --git a/lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.cpp b/lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.cpp index d80236c5f0c2..aa79d291ab81 100644 --- a/lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.cpp +++ b/lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.cpp @@ -1780,6 +1780,13 @@ SymbolFileDWARF::ParseChildMembers member_byte_offset = memberOffset.ResolveValue(NULL).UInt(); } } + else + { + // With DWARF 3 and later, if the value is an integer constant, + // this form value is the offset in bytes from the beginning + // of the containing entity. + member_byte_offset = form_value.Unsigned(); + } break; case DW_AT_accessibility: accessibility = DW_ACCESS_to_AccessType (form_value.Unsigned()); break; @@ -2164,16 +2171,28 @@ SymbolFileDWARF::ParseChildMembers member_byte_offset = memberOffset.ResolveValue(NULL).UInt(); } } + else + { + // With DWARF 3 and later, if the value is an integer constant, + // this form value is the offset in bytes from the beginning + // of the containing entity. + member_byte_offset = form_value.Unsigned(); + } break; case DW_AT_accessibility: accessibility = DW_ACCESS_to_AccessType(form_value.Unsigned()); break; - case DW_AT_virtuality: is_virtual = form_value.Boolean(); break; - default: + case DW_AT_virtuality: + is_virtual = form_value.Boolean(); + break; + case DW_AT_sibling: break; + + default: + break; } } } @@ -2620,7 +2639,7 @@ SymbolFileDWARF::ResolveClangOpaqueTypeDefinition (ClangASTType &clang_type) assert(false && "not a forward clang type decl!"); break; } - return NULL; + return false; } Type*