[Lldb-commits] [lldb] r222602 - Fixed an issue where a DW_FORM_ref{2, 4, 8} might be extracted incorrectly because the wrong compile unit was being used to calculate the compile unit relative offset.

Greg Clayton gclayton at apple.com
Fri Nov 21 17:58:59 PST 2014


Author: gclayton
Date: Fri Nov 21 19:58:59 2014
New Revision: 222602

URL: http://llvm.org/viewvc/llvm-project?rev=222602&view=rev
Log:
Fixed an issue where a DW_FORM_ref{2,4,8} might be extracted incorrectly because the wrong compile unit was being used to calculate the compile unit relative offset. 

This was fixed by making the DWARFFormValue contain the compile unit that it needs so it can decode its form value correctly. Any form value that requires a compile unit will now assert. If any of the assertions that were added are triggered, then code that led to the extraction of the form value without properly setting the compile unit must be fixed immediately. 

<rdar://problem/19035440>

Modified:
    lldb/trunk/source/Plugins/SymbolFile/DWARF/DWARFCompileUnit.cpp
    lldb/trunk/source/Plugins/SymbolFile/DWARF/DWARFDebugInfoEntry.cpp
    lldb/trunk/source/Plugins/SymbolFile/DWARF/DWARFFormValue.cpp
    lldb/trunk/source/Plugins/SymbolFile/DWARF/DWARFFormValue.h
    lldb/trunk/source/Plugins/SymbolFile/DWARF/HashedNameToDIE.h
    lldb/trunk/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.cpp

Modified: lldb/trunk/source/Plugins/SymbolFile/DWARF/DWARFCompileUnit.cpp
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Plugins/SymbolFile/DWARF/DWARFCompileUnit.cpp?rev=222602&r1=222601&r2=222602&view=diff
==============================================================================
--- lldb/trunk/source/Plugins/SymbolFile/DWARF/DWARFCompileUnit.cpp (original)
+++ lldb/trunk/source/Plugins/SymbolFile/DWARF/DWARFCompileUnit.cpp Fri Nov 21 19:58:59 2014
@@ -772,7 +772,7 @@ DWARFCompileUnit::Index (const uint32_t
                     
                 case DW_AT_specification:
                     if (attributes.ExtractFormValueAtIndex(m_dwarf2Data, i, form_value))
-                        specification_die_offset = form_value.Reference(this);
+                        specification_die_offset = form_value.Reference();
                     break;
                 }
             }

Modified: lldb/trunk/source/Plugins/SymbolFile/DWARF/DWARFDebugInfoEntry.cpp
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Plugins/SymbolFile/DWARF/DWARFDebugInfoEntry.cpp?rev=222602&r1=222601&r2=222602&view=diff
==============================================================================
--- lldb/trunk/source/Plugins/SymbolFile/DWARF/DWARFDebugInfoEntry.cpp (original)
+++ lldb/trunk/source/Plugins/SymbolFile/DWARF/DWARFDebugInfoEntry.cpp Fri Nov 21 19:58:59 2014
@@ -88,9 +88,10 @@ DWARFDebugInfoEntry::Attributes::RemoveA
 bool
 DWARFDebugInfoEntry::Attributes::ExtractFormValueAtIndex (SymbolFileDWARF* dwarf2Data, uint32_t i, DWARFFormValue &form_value) const
 {
+    form_value.SetCompileUnit(CompileUnitAtIndex(i));
     form_value.SetForm(FormAtIndex(i));
     lldb::offset_t offset = DIEOffsetAtIndex(i);
-    return form_value.ExtractValue(dwarf2Data->get_debug_info_data(), &offset, CompileUnitAtIndex(i));
+    return form_value.ExtractValue(dwarf2Data->get_debug_info_data(), &offset);
 }
 
 uint64_t
@@ -107,7 +108,7 @@ DWARFDebugInfoEntry::Attributes::FormVal
 {
     DWARFFormValue form_value;
     if (ExtractFormValueAtIndex(dwarf2Data, i, form_value))
-        return form_value.Reference(CompileUnitAtIndex(i));
+        return form_value.Reference();
     return fail_value;
 }
 
@@ -318,8 +319,8 @@ DWARFDebugInfoEntry::Extract
 
                     if (isCompileUnitTag && ((attr == DW_AT_entry_pc) || (attr == DW_AT_low_pc)))
                     {
-                        DWARFFormValue form_value(form);
-                        if (form_value.ExtractValue(debug_info_data, &offset, cu))
+                        DWARFFormValue form_value(cu, form);
+                        if (form_value.ExtractValue(debug_info_data, &offset))
                         {
                             if (attr == DW_AT_low_pc || attr == DW_AT_entry_pc)
                                 ((DWARFCompileUnit*)cu)->SetBaseAddress(form_value.Unsigned());
@@ -777,8 +778,8 @@ DWARFDebugInfoEntry::GetDIENamesAndRange
         for (i=0; i<numAttributes; ++i)
         {
             abbrevDecl->GetAttrAndFormByIndexUnchecked(i, attr, form);
-            DWARFFormValue form_value(form);
-            if (form_value.ExtractValue(debug_info_data, &offset, cu))
+            DWARFFormValue form_value(cu, form);
+            if (form_value.ExtractValue(debug_info_data, &offset))
             {
                 switch (attr)
                 {
@@ -828,11 +829,11 @@ DWARFDebugInfoEntry::GetDIENamesAndRange
                     break;
 
                 case DW_AT_abstract_origin:
-                    die_offsets.push_back(form_value.Reference(cu));
+                    die_offsets.push_back(form_value.Reference());
                     break;
 
                 case DW_AT_specification:
-                    die_offsets.push_back(form_value.Reference(cu));
+                    die_offsets.push_back(form_value.Reference());
                     break;
 
                 case DW_AT_decl_file:
@@ -1073,9 +1074,9 @@ DWARFDebugInfoEntry::DumpAttribute
         s.Printf( "[%s", DW_FORM_value_to_name(form));
     }
 
-    DWARFFormValue form_value(form);
+    DWARFFormValue form_value(cu, form);
 
-    if (!form_value.ExtractValue(debug_info_data, offset_ptr, cu))
+    if (!form_value.ExtractValue(debug_info_data, offset_ptr))
         return;
 
     if (show_form)
@@ -1093,7 +1094,7 @@ DWARFDebugInfoEntry::DumpAttribute
     // Always dump form value if verbose is enabled
     if (verbose)
     {
-        form_value.Dump(s, debug_str_data, cu);
+        form_value.Dump(s, debug_str_data);
     }
 
 
@@ -1126,7 +1127,7 @@ DWARFDebugInfoEntry::DumpAttribute
             if (blockData)
             {
                 if (!verbose)
-                    form_value.Dump(s, debug_str_data, cu);
+                    form_value.Dump(s, debug_str_data);
 
                 // Location description is inlined in data in the form value
                 DWARFDataExtractor locationData(debug_info_data, (*offset_ptr) - form_value.Unsigned(), form_value.Unsigned());
@@ -1143,13 +1144,13 @@ DWARFDebugInfoEntry::DumpAttribute
                 if (dwarf2Data)
                 {
                     if ( !verbose )
-                        form_value.Dump(s, debug_str_data, cu);
+                        form_value.Dump(s, debug_str_data);
                     DWARFLocationList::Dump(s, cu, dwarf2Data->get_debug_loc_data(), debug_loc_offset);
                 }
                 else
                 {
                     if ( !verbose )
-                        form_value.Dump(s, NULL, cu);
+                        form_value.Dump(s, NULL);
                 }
             }
         }
@@ -1158,8 +1159,8 @@ DWARFDebugInfoEntry::DumpAttribute
     case DW_AT_abstract_origin:
     case DW_AT_specification:
         {
-            uint64_t abstract_die_offset = form_value.Reference(cu);
-            form_value.Dump(s, debug_str_data, cu);
+            uint64_t abstract_die_offset = form_value.Reference();
+            form_value.Dump(s, debug_str_data);
         //  *ostrm_ptr << HEX32 << abstract_die_offset << " ( ";
             if ( verbose ) s.PutCString(" ( ");
             GetName(dwarf2Data, cu, abstract_die_offset, s);
@@ -1169,9 +1170,9 @@ DWARFDebugInfoEntry::DumpAttribute
 
     case DW_AT_type:
         {
-            uint64_t type_die_offset = form_value.Reference(cu);
+            uint64_t type_die_offset = form_value.Reference();
             if (!verbose)
-                form_value.Dump(s, debug_str_data, cu);
+                form_value.Dump(s, debug_str_data);
             s.PutCString(" ( ");
             AppendTypeName(dwarf2Data, cu, type_die_offset, s);
             s.PutCString(" )");
@@ -1181,7 +1182,7 @@ DWARFDebugInfoEntry::DumpAttribute
     case DW_AT_ranges:
         {
             if ( !verbose )
-                form_value.Dump(s, debug_str_data, cu);
+                form_value.Dump(s, debug_str_data);
             lldb::offset_t ranges_offset = form_value.Unsigned();
             dw_addr_t base_addr = cu ? cu->GetBaseAddress() : 0;
             if (dwarf2Data)
@@ -1191,7 +1192,7 @@ DWARFDebugInfoEntry::DumpAttribute
 
     default:
         if ( !verbose )
-            form_value.Dump(s, debug_str_data, cu);
+            form_value.Dump(s, debug_str_data);
         break;
     }
 
@@ -1228,7 +1229,6 @@ DWARFDebugInfoEntry::GetAttributes
         uint32_t i;
         dw_attr_t attr;
         dw_form_t form;
-        DWARFFormValue form_value;
         for (i=0; i<num_attributes; ++i)
         {
             abbrevDecl->GetAttrAndFormByIndexUnchecked (i, attr, form);
@@ -1255,11 +1255,11 @@ DWARFDebugInfoEntry::GetAttributes
 
             if ((attr == DW_AT_specification) || (attr == DW_AT_abstract_origin))
             {
-                form_value.SetForm(form);
-                if (form_value.ExtractValue(debug_info_data, &offset, cu))
+                DWARFFormValue form_value (cu, form);
+                if (form_value.ExtractValue(debug_info_data, &offset))
                 {
                     const DWARFDebugInfoEntry* die = NULL;
-                    dw_offset_t die_offset = form_value.Reference(cu);
+                    dw_offset_t die_offset = form_value.Reference();
                     if (cu->ContainsDIEOffset(die_offset))
                     {
                         die = const_cast<DWARFCompileUnit*>(cu)->GetDIEPtr(die_offset);
@@ -1327,8 +1327,9 @@ DWARFDebugInfoEntry::GetAttributeValue
                 DWARFFormValue::SkipValue(abbrevDecl->GetFormByIndex(idx++), debug_info_data, &offset, cu);
 
             const dw_offset_t attr_offset = offset;
+            form_value.SetCompileUnit(cu);
             form_value.SetForm(abbrevDecl->GetFormByIndex(idx));
-            if (form_value.ExtractValue(debug_info_data, &offset, cu))
+            if (form_value.ExtractValue(debug_info_data, &offset))
             {
                 if (end_attr_offset_ptr)
                     *end_attr_offset_ptr = offset;
@@ -1419,7 +1420,7 @@ DWARFDebugInfoEntry::GetAttributeValueAs
 {
     DWARFFormValue form_value;
     if (GetAttributeValue(dwarf2Data, cu, attr, form_value))
-        return form_value.Reference(cu);
+        return form_value.Reference();
     return fail_value;
 }
 
@@ -1586,7 +1587,7 @@ DWARFDebugInfoEntry::GetName
         if (GetAttributeValue(dwarf2Data, cu, DW_AT_specification, form_value))
         {
             DWARFCompileUnitSP cu_sp_ptr;
-            const DWARFDebugInfoEntry* die = const_cast<SymbolFileDWARF*>(dwarf2Data)->DebugInfo()->GetDIEPtr(form_value.Reference(cu), &cu_sp_ptr);
+            const DWARFDebugInfoEntry* die = const_cast<SymbolFileDWARF*>(dwarf2Data)->DebugInfo()->GetDIEPtr(form_value.Reference(), &cu_sp_ptr);
             if (die)
                 return die->GetName(dwarf2Data, cu_sp_ptr.get());
         }
@@ -1657,7 +1658,7 @@ DWARFDebugInfoEntry::GetPubname
         // The specification DIE may be in another compile unit so we need
         // to get a die and its compile unit.
         DWARFCompileUnitSP cu_sp_ptr;
-        const DWARFDebugInfoEntry* die = const_cast<SymbolFileDWARF*>(dwarf2Data)->DebugInfo()->GetDIEPtr(form_value.Reference(cu), &cu_sp_ptr);
+        const DWARFDebugInfoEntry* die = const_cast<SymbolFileDWARF*>(dwarf2Data)->DebugInfo()->GetDIEPtr(form_value.Reference(), &cu_sp_ptr);
         if (die)
             return die->GetPubname(dwarf2Data, cu_sp_ptr.get());
     }
@@ -1794,7 +1795,7 @@ DWARFDebugInfoEntry::AppendTypeName
                 DWARFFormValue form_value;
                 if (die.GetAttributeValue(dwarf2Data, cu, DW_AT_type, form_value))
                 {
-                    uint64_t next_die_offset = form_value.Reference(cu);
+                    uint64_t next_die_offset = form_value.Reference();
                     result = AppendTypeName(dwarf2Data, cu, next_die_offset, s);
                 }
 

Modified: lldb/trunk/source/Plugins/SymbolFile/DWARF/DWARFFormValue.cpp
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Plugins/SymbolFile/DWARF/DWARFFormValue.cpp?rev=222602&r1=222601&r2=222602&view=diff
==============================================================================
--- lldb/trunk/source/Plugins/SymbolFile/DWARF/DWARFFormValue.cpp (original)
+++ lldb/trunk/source/Plugins/SymbolFile/DWARF/DWARFFormValue.cpp Fri Nov 21 19:58:59 2014
@@ -153,14 +153,22 @@ DWARFFormValue::GetFixedFormSizesForAddr
     return NULL;
 }
 
-DWARFFormValue::DWARFFormValue(dw_form_t form) :
+DWARFFormValue::DWARFFormValue() :
+    m_cu (NULL),
+    m_form(0),
+    m_value()
+{
+}
+
+DWARFFormValue::DWARFFormValue(const DWARFCompileUnit* cu, dw_form_t form) :
+    m_cu (cu),
     m_form(form),
     m_value()
 {
 }
 
 bool
-DWARFFormValue::ExtractValue(const DWARFDataExtractor& data, lldb::offset_t* offset_ptr, const DWARFCompileUnit* cu)
+DWARFFormValue::ExtractValue(const DWARFDataExtractor& data, lldb::offset_t* offset_ptr)
 {
     bool indirect = false;
     bool is_block = false;
@@ -172,7 +180,8 @@ DWARFFormValue::ExtractValue(const DWARF
         indirect = false;
         switch (m_form)
         {
-        case DW_FORM_addr:      m_value.value.uval = data.GetMaxU64(offset_ptr, DWARFCompileUnit::GetAddressByteSize(cu));  break;
+        case DW_FORM_addr:      assert(m_cu);
+                                m_value.value.uval = data.GetMaxU64(offset_ptr, DWARFCompileUnit::GetAddressByteSize(m_cu));  break;
         case DW_FORM_block2:    m_value.value.uval = data.GetU16(offset_ptr); is_block = true;          break;
         case DW_FORM_block4:    m_value.value.uval = data.GetU32(offset_ptr); is_block = true;          break;
         case DW_FORM_data2:     m_value.value.uval = data.GetU16(offset_ptr);                           break;
@@ -189,16 +198,16 @@ DWARFFormValue::ExtractValue(const DWARF
         case DW_FORM_data1:     m_value.value.uval = data.GetU8(offset_ptr);                            break;
         case DW_FORM_flag:      m_value.value.uval = data.GetU8(offset_ptr);                            break;
         case DW_FORM_sdata:     m_value.value.sval = data.GetSLEB128(offset_ptr);                       break;
-        case DW_FORM_strp:      m_value.value.uval = data.GetMaxU64(offset_ptr, DWARFCompileUnit::IsDWARF64(cu) ? 8 : 4);  break;
+        case DW_FORM_strp:      assert(m_cu);
+                                m_value.value.uval = data.GetMaxU64(offset_ptr, DWARFCompileUnit::IsDWARF64(m_cu) ? 8 : 4);  break;
     //  case DW_FORM_APPLE_db_str:
         case DW_FORM_udata:     m_value.value.uval = data.GetULEB128(offset_ptr);                       break;
-        case DW_FORM_ref_addr:  ref_addr_size = 4;
-                                if (cu) {
-                                    if (cu->GetVersion() <= 2)
-                                        ref_addr_size = cu->GetAddressByteSize();
-                                    else
-                                        ref_addr_size = cu->IsDWARF64() ? 8 : 4;
-                                }
+        case DW_FORM_ref_addr:  assert(m_cu);
+                                ref_addr_size = 4;
+                                if (m_cu->GetVersion() <= 2)
+                                    ref_addr_size = m_cu->GetAddressByteSize();
+                                else
+                                    ref_addr_size = m_cu->IsDWARF64() ? 8 : 4;
                                 m_value.value.uval = data.GetMaxU64(offset_ptr, ref_addr_size);         break;
         case DW_FORM_ref1:      m_value.value.uval = data.GetU8(offset_ptr);                            break;
         case DW_FORM_ref2:      m_value.value.uval = data.GetU16(offset_ptr);                           break;
@@ -210,7 +219,8 @@ DWARFFormValue::ExtractValue(const DWARF
             indirect = true;
             break;
 
-        case DW_FORM_sec_offset:    m_value.value.uval = data.GetMaxU64(offset_ptr, DWARFCompileUnit::IsDWARF64(cu) ? 8 : 4);  break;
+        case DW_FORM_sec_offset:    assert(m_cu);
+                                    m_value.value.uval = data.GetMaxU64(offset_ptr, DWARFCompileUnit::IsDWARF64(m_cu) ? 8 : 4);  break;
         case DW_FORM_flag_present:  m_value.value.uval = 1;                                             break;
         case DW_FORM_ref_sig8:      m_value.value.uval = data.GetU64(offset_ptr);                       break;
         default:
@@ -232,9 +242,9 @@ DWARFFormValue::ExtractValue(const DWARF
 }
 
 bool
-DWARFFormValue::SkipValue(const DWARFDataExtractor& debug_info_data, lldb::offset_t *offset_ptr, const DWARFCompileUnit* cu) const
+DWARFFormValue::SkipValue(const DWARFDataExtractor& debug_info_data, lldb::offset_t *offset_ptr) const
 {
-    return DWARFFormValue::SkipValue(m_form, debug_info_data, offset_ptr, cu);
+    return DWARFFormValue::SkipValue(m_form, debug_info_data, offset_ptr, m_cu);
 }
 
 bool
@@ -263,12 +273,11 @@ DWARFFormValue::SkipValue(dw_form_t form
 
     case DW_FORM_ref_addr:
         ref_addr_size = 4;
-        if (cu) {
-            if (cu->GetVersion() <= 2)
-                ref_addr_size = cu->GetAddressByteSize();
-            else
-                ref_addr_size = cu->IsDWARF64() ? 8 : 4;
-        }
+        assert (cu); // CU must be valid for DW_FORM_ref_addr objects or we will get this wrong
+        if (cu->GetVersion() <= 2)
+            ref_addr_size = cu->GetAddressByteSize();
+        else
+            ref_addr_size = cu->IsDWARF64() ? 8 : 4;
         *offset_ptr += ref_addr_size;
         return true;
 
@@ -292,6 +301,7 @@ DWARFFormValue::SkipValue(dw_form_t form
     // 32 bit for DWARF 32, 64 for DWARF 64
     case DW_FORM_sec_offset:
     case DW_FORM_strp:
+        assert(cu);
         *offset_ptr += (cu->IsDWARF64() ? 8 : 4);
         return true;
 
@@ -332,7 +342,7 @@ DWARFFormValue::SkipValue(dw_form_t form
 
 
 void
-DWARFFormValue::Dump(Stream &s, const DWARFDataExtractor* debug_str_data, const DWARFCompileUnit* cu) const
+DWARFFormValue::Dump(Stream &s, const DWARFDataExtractor* debug_str_data) const
 {
     uint64_t uvalue = Unsigned();
     bool cu_relative_offset = false;
@@ -402,7 +412,8 @@ DWARFFormValue::Dump(Stream &s, const DW
 
     case DW_FORM_ref_addr:
     {
-        if (cu->GetVersion() <= 2)
+        assert (m_cu); // CU must be valid for DW_FORM_ref_addr objects or we will get this wrong
+        if (m_cu->GetVersion() <= 2)
             s.Address(uvalue, sizeof (uint64_t) * 2);
         else
             s.Address(uvalue, 4 * 2);// 4 for DWARF32, 8 for DWARF64, but we don't support DWARF64 yet
@@ -424,10 +435,11 @@ DWARFFormValue::Dump(Stream &s, const DW
 
     if (cu_relative_offset)
     {
+        assert (m_cu); // CU must be valid for DW_FORM_ref forms that are compile unit relative or we will get this wrong
         if (verbose)
             s.PutCString(" => ");
 
-        s.Printf("{0x%8.8" PRIx64 "}", (uvalue + (cu ? cu->GetOffset() : 0)));
+        s.Printf("{0x%8.8" PRIx64 "}", uvalue + m_cu->GetOffset());
     }
 }
 
@@ -442,7 +454,7 @@ DWARFFormValue::AsCString(const DWARFDat
 }
 
 uint64_t
-DWARFFormValue::Reference(const DWARFCompileUnit* cu) const
+DWARFFormValue::Reference() const
 {
     uint64_t die_offset = m_value.value.uval;
     switch (m_form)
@@ -452,7 +464,8 @@ DWARFFormValue::Reference(const DWARFCom
     case DW_FORM_ref4:
     case DW_FORM_ref8:
     case DW_FORM_ref_udata:
-        die_offset += (cu ? cu->GetOffset() : 0);
+        assert (m_cu); // CU must be valid for DW_FORM_ref forms that are compile unit relative or we will get this wrong
+        die_offset += m_cu->GetOffset();
         break;
 
     default:
@@ -483,32 +496,6 @@ DWARFFormValue::Reference (dw_offset_t b
     return die_offset;
 }
 
-//----------------------------------------------------------------------
-// Resolve any compile unit specific references so that we don't need
-// the compile unit at a later time in order to work with the form
-// value.
-//----------------------------------------------------------------------
-bool
-DWARFFormValue::ResolveCompileUnitReferences(const DWARFCompileUnit* cu)
-{
-    switch (m_form)
-    {
-    case DW_FORM_ref1:
-    case DW_FORM_ref2:
-    case DW_FORM_ref4:
-    case DW_FORM_ref8:
-    case DW_FORM_ref_udata:
-        m_value.value.uval += cu->GetOffset();
-        m_form = DW_FORM_ref_addr;
-        return true;
-        break;
-
-    default:
-        break;
-    }
-
-    return false;
-}
 
 const uint8_t*
 DWARFFormValue::BlockData() const
@@ -550,7 +537,7 @@ DWARFFormValue::IsDataForm(const dw_form
 }
 
 int
-DWARFFormValue::Compare (const DWARFFormValue& a_value, const DWARFFormValue& b_value, const DWARFCompileUnit* a_cu, const DWARFCompileUnit* b_cu, const DWARFDataExtractor* debug_str_data_ptr)
+DWARFFormValue::Compare (const DWARFFormValue& a_value, const DWARFFormValue& b_value, const DWARFDataExtractor* debug_str_data_ptr)
 {
     dw_form_t a_form = a_value.Form();
     dw_form_t b_form = b_value.Form();
@@ -631,8 +618,8 @@ DWARFFormValue::Compare (const DWARFForm
     case DW_FORM_ref8:
     case DW_FORM_ref_udata:
         {
-            uint64_t a = a_value.Reference(a_cu);
-            uint64_t b = b_value.Reference(b_cu);
+            uint64_t a = a_value.Reference();
+            uint64_t b = b_value.Reference();
             if (a < b)
                 return -1;
             if (a > b)

Modified: lldb/trunk/source/Plugins/SymbolFile/DWARF/DWARFFormValue.h
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Plugins/SymbolFile/DWARF/DWARFFormValue.h?rev=222602&r1=222601&r2=222602&view=diff
==============================================================================
--- lldb/trunk/source/Plugins/SymbolFile/DWARF/DWARFFormValue.h (original)
+++ lldb/trunk/source/Plugins/SymbolFile/DWARF/DWARFFormValue.h Fri Nov 21 19:58:59 2014
@@ -45,35 +45,34 @@ public:
         eValueTypeBlock
     };
 
-    DWARFFormValue(dw_form_t form = 0);
+    DWARFFormValue();
+    DWARFFormValue(const DWARFCompileUnit* cu, dw_form_t form);
+    const DWARFCompileUnit* GetCompileUnit () const { return m_cu; }
+    void                SetCompileUnit (const DWARFCompileUnit* cu) { m_cu = cu; }
     dw_form_t           Form()  const { return m_form; }
     void                SetForm(dw_form_t form) { m_form = form; }
     const ValueType&    Value() const { return m_value; }
-    void                Dump(lldb_private::Stream &s, const lldb_private::DWARFDataExtractor* debug_str_data, const DWARFCompileUnit* cu) const;
+    void                Dump(lldb_private::Stream &s, const lldb_private::DWARFDataExtractor* debug_str_data) const;
     bool                ExtractValue(const lldb_private::DWARFDataExtractor& data,
-                                     lldb::offset_t* offset_ptr,
-                                     const DWARFCompileUnit* cu);
+                                     lldb::offset_t* offset_ptr);
     bool                IsInlinedCStr() const { return (m_value.data != NULL) && m_value.data == (const uint8_t*)m_value.value.cstr; }
     const uint8_t*      BlockData() const;
-    uint64_t            Reference(const DWARFCompileUnit* cu) const;
+    uint64_t            Reference() const;
     uint64_t            Reference (dw_offset_t offset) const;
-    bool                ResolveCompileUnitReferences(const DWARFCompileUnit* cu);
     bool                Boolean() const { return m_value.value.uval != 0; }
     uint64_t            Unsigned() const { return m_value.value.uval; }
     void                SetUnsigned(uint64_t uval) { m_value.value.uval = uval; }
     int64_t             Signed() const { return m_value.value.sval; }
     void                SetSigned(int64_t sval) { m_value.value.sval = sval; }
     const char*         AsCString(const lldb_private::DWARFDataExtractor* debug_str_data_ptr) const;
-    bool                SkipValue(const lldb_private::DWARFDataExtractor& debug_info_data, lldb::offset_t *offset_ptr, const DWARFCompileUnit* cu) const;
+    bool                SkipValue(const lldb_private::DWARFDataExtractor& debug_info_data, lldb::offset_t *offset_ptr) const;
     static bool         SkipValue(const dw_form_t form, const lldb_private::DWARFDataExtractor& debug_info_data, lldb::offset_t *offset_ptr, const DWARFCompileUnit* cu);
-//  static bool         TransferValue(dw_form_t form, const lldb_private::DWARFDataExtractor& debug_info_data, lldb::offset_t *offset_ptr, const DWARFCompileUnit* cu, BinaryStreamBuf& out_buff);
-//  static bool         TransferValue(const DWARFFormValue& formValue, const DWARFCompileUnit* cu, BinaryStreamBuf& out_buff);
-//  static bool         PutUnsigned(dw_form_t form, dw_offset_t offset, uint64_t value, BinaryStreamBuf& out_buff, const DWARFCompileUnit* cu, bool fixup_cu_relative_refs);
     static bool         IsBlockForm(const dw_form_t form);
     static bool         IsDataForm(const dw_form_t form);
     static const uint8_t * GetFixedFormSizesForAddressSize (uint8_t addr_size, bool is_dwarf64);
-    static int          Compare (const DWARFFormValue& a, const DWARFFormValue& b, const DWARFCompileUnit* a_cu, const DWARFCompileUnit* b_cu, const lldb_private::DWARFDataExtractor* debug_str_data_ptr);
+    static int          Compare (const DWARFFormValue& a, const DWARFFormValue& b, const lldb_private::DWARFDataExtractor* debug_str_data_ptr);
 protected:
+    const DWARFCompileUnit* m_cu; // Compile unit for this form
     dw_form_t   m_form;     // Form for this value
     ValueType   m_value;    // Contains all data for the form
 };

Modified: lldb/trunk/source/Plugins/SymbolFile/DWARF/HashedNameToDIE.h
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Plugins/SymbolFile/DWARF/HashedNameToDIE.h?rev=222602&r1=222601&r2=222602&view=diff
==============================================================================
--- lldb/trunk/source/Plugins/SymbolFile/DWARF/HashedNameToDIE.h (original)
+++ lldb/trunk/source/Plugins/SymbolFile/DWARF/HashedNameToDIE.h Fri Nov 21 19:58:59 2014
@@ -442,9 +442,9 @@ struct DWARFMappedHash
             
             for (size_t i=0; i<num_atoms; ++i)
             {
-                DWARFFormValue form_value (header_data.atoms[i].form);
+                DWARFFormValue form_value (NULL, header_data.atoms[i].form);
                 
-                if (!form_value.ExtractValue(data, offset_ptr, NULL))
+                if (!form_value.ExtractValue(data, offset_ptr))
                     return false;
                 
                 switch (header_data.atoms[i].type)
@@ -481,7 +481,7 @@ struct DWARFMappedHash
                 if (i > 0)
                     strm.PutCString (", ");
                 
-                DWARFFormValue form_value (header_data.atoms[i].form);
+                DWARFFormValue form_value (NULL, header_data.atoms[i].form);
                 switch (header_data.atoms[i].type)
                 {
                     case eAtomTypeDIEOffset:    // DIE offset, check form for encoding

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=222602&r1=222601&r2=222602&view=diff
==============================================================================
--- lldb/trunk/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.cpp (original)
+++ lldb/trunk/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.cpp Fri Nov 21 19:58:59 2014
@@ -1486,7 +1486,7 @@ SymbolFileDWARF::ParseTemplateDIE (DWARF
                         case DW_AT_type:
                             if (attributes.ExtractFormValueAtIndex(this, i, form_value))
                             {
-                                const dw_offset_t type_die_offset = form_value.Reference(dwarf_cu);
+                                const dw_offset_t type_die_offset = form_value.Reference();
                                 lldb_type = ResolveTypeUID(type_die_offset);
                                 if (lldb_type)
                                     clang_type = lldb_type->GetClangForwardType();
@@ -1803,7 +1803,7 @@ SymbolFileDWARF::ParseChildMembers
                             case DW_AT_decl_line:   decl.SetLine(form_value.Unsigned()); break;
                             case DW_AT_decl_column: decl.SetColumn(form_value.Unsigned()); break;
                             case DW_AT_name:        name = form_value.AsCString(&get_debug_str_data()); break;
-                            case DW_AT_type:        encoding_uid = form_value.Reference(dwarf_cu); break;
+                            case DW_AT_type:        encoding_uid = form_value.Reference(); break;
                             case DW_AT_bit_offset:  bit_offset = form_value.Unsigned(); break;
                             case DW_AT_bit_size:    bit_size = form_value.Unsigned(); break;
                             case DW_AT_byte_size:   byte_size = form_value.Unsigned(); break;
@@ -2201,7 +2201,7 @@ SymbolFileDWARF::ParseChildMembers
                             case DW_AT_decl_file:   decl.SetFile(sc.comp_unit->GetSupportFiles().GetFileSpecAtIndex(form_value.Unsigned())); break;
                             case DW_AT_decl_line:   decl.SetLine(form_value.Unsigned()); break;
                             case DW_AT_decl_column: decl.SetColumn(form_value.Unsigned()); break;
-                            case DW_AT_type:        encoding_uid = form_value.Reference(dwarf_cu); break;
+                            case DW_AT_type:        encoding_uid = form_value.Reference(); break;
                             case DW_AT_data_member_location:
                                 if (form_value.BlockData())
                                 {
@@ -4266,7 +4266,7 @@ SymbolFileDWARF::ParseChildParameters (c
                             case DW_AT_decl_line:   decl.SetLine(form_value.Unsigned()); break;
                             case DW_AT_decl_column: decl.SetColumn(form_value.Unsigned()); break;
                             case DW_AT_name:        name = form_value.AsCString(&get_debug_str_data()); break;
-                            case DW_AT_type:        param_type_die_offset = form_value.Reference(dwarf_cu); break;
+                            case DW_AT_type:        param_type_die_offset = form_value.Reference(); break;
                             case DW_AT_artificial:  is_artificial = form_value.Boolean(); break;
                             case DW_AT_location:
     //                          if (form_value.BlockData())
@@ -5828,7 +5828,7 @@ SymbolFileDWARF::ParseType (const Symbol
                                     break;
                                 case DW_AT_byte_size:   byte_size = form_value.Unsigned(); break;
                                 case DW_AT_encoding:    encoding = form_value.Unsigned(); break;
-                                case DW_AT_type:        encoding_uid = form_value.Reference(dwarf_cu); break;
+                                case DW_AT_type:        encoding_uid = form_value.Reference(); break;
                                 default:
                                 case DW_AT_sibling:
                                     break;
@@ -6403,7 +6403,7 @@ SymbolFileDWARF::ParseType (const Symbol
                                     type_name_cstr = form_value.AsCString(&get_debug_str_data());
                                     type_name_const_str.SetCString(type_name_cstr);
                                     break;
-                                case DW_AT_type:            encoding_uid = form_value.Reference(dwarf_cu); break;
+                                case DW_AT_type:            encoding_uid = form_value.Reference(); break;
                                 case DW_AT_byte_size:       byte_size = form_value.Unsigned(); break;
                                 case DW_AT_accessibility:   break; //accessibility = DW_ACCESS_to_AccessType(form_value.Unsigned()); break;
                                 case DW_AT_declaration:     break; //is_forward_declaration = form_value.Boolean(); break;
@@ -6521,7 +6521,7 @@ SymbolFileDWARF::ParseType (const Symbol
 
                                 case DW_AT_linkage_name:
                                 case DW_AT_MIPS_linkage_name:   break; // mangled = form_value.AsCString(&get_debug_str_data()); break;
-                                case DW_AT_type:                type_die_offset = form_value.Reference(dwarf_cu); break;
+                                case DW_AT_type:                type_die_offset = form_value.Reference(); break;
                                 case DW_AT_accessibility:       accessibility = DW_ACCESS_to_AccessType(form_value.Unsigned()); break;
                                 case DW_AT_declaration:         break; // is_forward_declaration = form_value.Boolean(); break;
                                 case DW_AT_inline:              is_inline = form_value.Boolean(); break;
@@ -6541,15 +6541,15 @@ SymbolFileDWARF::ParseType (const Symbol
                                     break;
 
                                 case DW_AT_specification:
-                                    specification_die_offset = form_value.Reference(dwarf_cu);
+                                    specification_die_offset = form_value.Reference();
                                     break;
 
                                 case DW_AT_abstract_origin:
-                                    abstract_origin_die_offset = form_value.Reference(dwarf_cu);
+                                    abstract_origin_die_offset = form_value.Reference();
                                     break;
 
                                 case DW_AT_object_pointer:
-                                    object_pointer_die_offset = form_value.Reference(dwarf_cu);
+                                    object_pointer_die_offset = form_value.Reference();
                                     break;
 
                                 case DW_AT_allocated:
@@ -6985,7 +6985,7 @@ SymbolFileDWARF::ParseType (const Symbol
                                     type_name_const_str.SetCString(type_name_cstr);
                                     break;
 
-                                case DW_AT_type:            type_die_offset = form_value.Reference(dwarf_cu); break;
+                                case DW_AT_type:            type_die_offset = form_value.Reference(); break;
                                 case DW_AT_byte_size:       break; // byte_size = form_value.Unsigned(); break;
                                 case DW_AT_byte_stride:     byte_stride = form_value.Unsigned(); break;
                                 case DW_AT_bit_stride:      bit_stride = form_value.Unsigned(); break;
@@ -7065,9 +7065,9 @@ SymbolFileDWARF::ParseType (const Symbol
                                 switch (attr)
                                 {
                                     case DW_AT_type:
-                                        type_die_offset = form_value.Reference(dwarf_cu); break;
+                                        type_die_offset = form_value.Reference(); break;
                                     case DW_AT_containing_type:
-                                        containing_type_die_offset = form_value.Reference(dwarf_cu); break;
+                                        containing_type_die_offset = form_value.Reference(); break;
                                 }
                             }
                         }
@@ -7347,7 +7347,6 @@ SymbolFileDWARF::ParseVariableDIE
     const lldb::addr_t func_low_pc
 )
 {
-
     VariableSP var_sp (m_die_to_variable_sp[die]);
     if (var_sp)
         return var_sp;  // Already been parsed!
@@ -7380,6 +7379,7 @@ SymbolFileDWARF::ParseVariableDIE
             {
                 dw_attr_t attr = attributes.AttributeAtIndex(i);
                 DWARFFormValue form_value;
+                
                 if (attributes.ExtractFormValueAtIndex(this, i, form_value))
                 {
                     switch (attr)
@@ -7390,7 +7390,7 @@ SymbolFileDWARF::ParseVariableDIE
                     case DW_AT_name:        name = form_value.AsCString(&get_debug_str_data()); break;
                     case DW_AT_linkage_name:
                     case DW_AT_MIPS_linkage_name: mangled = form_value.AsCString(&get_debug_str_data()); break;
-                    case DW_AT_type:        type_uid = form_value.Reference(dwarf_cu); break;
+                    case DW_AT_type:        type_uid = form_value.Reference(); break;
                     case DW_AT_external:    is_external = form_value.Boolean(); break;
                     case DW_AT_const_value:
                         // If we have already found a DW_AT_location attribute, ignore this attribute.
@@ -7409,7 +7409,7 @@ SymbolFileDWARF::ParseVariableDIE
                             else if (DWARFFormValue::IsDataForm(form_value.Form()))
                             {
                                 // Retrieve the value as a data expression.
-                                const uint8_t *fixed_form_sizes = DWARFFormValue::GetFixedFormSizesForAddressSize (dwarf_cu->GetAddressByteSize(), dwarf_cu->IsDWARF64());
+                                const uint8_t *fixed_form_sizes = DWARFFormValue::GetFixedFormSizesForAddressSize (attributes.CompileUnitAtIndex(i)->GetAddressByteSize(), attributes.CompileUnitAtIndex(i)->IsDWARF64());
                                 uint32_t data_offset = attributes.DIEOffsetAtIndex(i);
                                 uint32_t data_length = fixed_form_sizes[form_value.Form()];
                                 if (data_length == 0)
@@ -7433,7 +7433,7 @@ SymbolFileDWARF::ParseVariableDIE
                                 // Retrieve the value as a string expression.
                                 if (form_value.Form() == DW_FORM_strp)
                                 {
-                                    const uint8_t *fixed_form_sizes = DWARFFormValue::GetFixedFormSizesForAddressSize (dwarf_cu->GetAddressByteSize(), dwarf_cu->IsDWARF64());
+                                    const uint8_t *fixed_form_sizes = DWARFFormValue::GetFixedFormSizesForAddressSize (attributes.CompileUnitAtIndex(i)->GetAddressByteSize(), attributes.CompileUnitAtIndex(i)->IsDWARF64());
                                     uint32_t data_offset = attributes.DIEOffsetAtIndex(i);
                                     uint32_t data_length = fixed_form_sizes[form_value.Form()];
                                     location.CopyOpcodeData(module, debug_info_data, data_offset, data_length);
@@ -7470,7 +7470,7 @@ SymbolFileDWARF::ParseVariableDIE
                                 {
                                     location.CopyOpcodeData(module, debug_loc_data, debug_loc_offset, loc_list_length);
                                     assert (func_low_pc != LLDB_INVALID_ADDRESS);
-                                    location.SetLocationListSlide (func_low_pc - dwarf_cu->GetBaseAddress());
+                                    location.SetLocationListSlide (func_low_pc - attributes.CompileUnitAtIndex(i)->GetBaseAddress());
                                 }
                             }
                         }





More information about the lldb-commits mailing list