Fixed an issue where a DW_FORM_ref{2,4,8} might be extracted incorrectly because...
authorGreg Clayton <gclayton@apple.com>
Sat, 22 Nov 2014 01:58:59 +0000 (01:58 +0000)
committerGreg Clayton <gclayton@apple.com>
Sat, 22 Nov 2014 01:58:59 +0000 (01:58 +0000)
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>

llvm-svn: 222602

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

index e246c73..067449a 100644 (file)
@@ -772,7 +772,7 @@ DWARFCompileUnit::Index (const uint32_t cu_idx,
                     
                 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;
                 }
             }
index d78682c..6bf5b22 100644 (file)
@@ -88,9 +88,10 @@ DWARFDebugInfoEntry::Attributes::RemoveAttribute(dw_attr_t attr)
 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::FormValueAsUnsignedAtIndex(SymbolFileDWARF* dwa
 {
     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::GetDIENamesAndRanges
         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::GetDIENamesAndRanges
                     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::GetAttributeValueAsReference
 {
     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);
                 }
 
index fe3a7a2..a8c550e 100644 (file)
@@ -153,14 +153,22 @@ DWARFFormValue::GetFixedFormSizesForAddressSize (uint8_t addr_size, bool is_dwar
     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 DWARFDataExtractor& data, lldb::offset_t* off
         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 DWARFDataExtractor& data, lldb::offset_t* off
         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 DWARFDataExtractor& data, lldb::offset_t* off
             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 DWARFDataExtractor& data, lldb::offset_t* off
 }
 
 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, const DWARFDataExtractor& debug_info_d
 
     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, const DWARFDataExtractor& debug_info_d
     // 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, const DWARFDataExtractor& debug_info_d
 
 
 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 DWARFDataExtractor* debug_str_data, const
 
     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 DWARFDataExtractor* debug_str_data, const
 
     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 DWARFDataExtractor* debug_str_data_ptr) const
 }
 
 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 DWARFCompileUnit* cu) const
     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 base_offset) const
     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_t 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 DWARFFormValue& a_value, const DWARFFormValue& b_
     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)
index b82edc9..392df26 100644 (file)
@@ -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
 };
index ab0c37b..f8a8cc6 100644 (file)
@@ -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
index aee1952..21f6a22 100644 (file)
@@ -1486,7 +1486,7 @@ SymbolFileDWARF::ParseTemplateDIE (DWARFCompileUnit* dwarf_cu,
                         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 (const SymbolContext& sc,
                             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 SymbolContext& sc, DWARFCompileUnit* dwarf_cu,
                                     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 SymbolContext& sc, DWARFCompileUnit* dwarf_cu,
                                     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 SymbolContext& sc, DWARFCompileUnit* dwarf_cu,
 
                                 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 SymbolContext& sc, DWARFCompileUnit* dwarf_cu,
                                     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 SymbolContext& sc, DWARFCompileUnit* dwarf_cu,
                                     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 SymbolContext& sc, DWARFCompileUnit* dwarf_cu,
                                 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());
                                 }
                             }
                         }