Updates the DW_AT_data_member_location handlers for the LLDB DWARF plugin
authorAshok Thirumurthi <ashok.thirumurthi@intel.com>
Tue, 30 Jul 2013 14:58:39 +0000 (14:58 +0000)
committerAshok Thirumurthi <ashok.thirumurthi@intel.com>
Tue, 30 Jul 2013 14:58:39 +0000 (14:58 +0000)
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

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

index d80236c..aa79d29 100644 (file)
@@ -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*