[Lldb-commits] [lldb] r151202 - /lldb/trunk/source/Plugins/SymbolFile/DWARF/DWARFFormValue.cpp

Greg Clayton gclayton at apple.com
Wed Feb 22 13:17:27 PST 2012


Author: gclayton
Date: Wed Feb 22 15:17:27 2012
New Revision: 151202

URL: http://llvm.org/viewvc/llvm-project?rev=151202&view=rev
Log:
Added support for the DWARF 4 DW_FORM values.


Modified:
    lldb/trunk/source/Plugins/SymbolFile/DWARF/DWARFFormValue.cpp

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=151202&r1=151201&r2=151202&view=diff
==============================================================================
--- lldb/trunk/source/Plugins/SymbolFile/DWARF/DWARFFormValue.cpp (original)
+++ lldb/trunk/source/Plugins/SymbolFile/DWARF/DWARFFormValue.cpp Wed Feb 22 15:17:27 2012
@@ -45,6 +45,17 @@
     8, // 0x14 DW_FORM_ref8
     0, // 0x15 DW_FORM_ref_udata
     0, // 0x16 DW_FORM_indirect
+    4, // 0x17 DW_FORM_sec_offset
+    0, // 0x18 DW_FORM_exprloc
+    0, // 0x19 DW_FORM_flag_present
+    0, // 0x1a
+    0, // 0x1b
+    0, // 0x1c
+    0, // 0x1d
+    0, // 0x1e
+    0, // 0x1f
+    8, // 0x20 DW_FORM_ref_sig8
+
 };
 
 static uint8_t
@@ -73,6 +84,16 @@
     8, // 0x14 DW_FORM_ref8
     0, // 0x15 DW_FORM_ref_udata
     0, // 0x16 DW_FORM_indirect
+    4, // 0x17 DW_FORM_sec_offset
+    0, // 0x18 DW_FORM_exprloc
+    0, // 0x19 DW_FORM_flag_present
+    0, // 0x1a
+    0, // 0x1b
+    0, // 0x1c
+    0, // 0x1d
+    0, // 0x1e
+    0, // 0x1f
+    8, // 0x20 DW_FORM_ref_sig8
 };
 
 const uint8_t * 
@@ -115,6 +136,7 @@
                                 // so we can tell the differnence between DW_FORM_string and DW_FORM_strp form
                                 // values;
                                 m_value.data = (uint8_t*)m_value.value.cstr;                            break;
+        case DW_FORM_exprloc:
         case DW_FORM_block:     m_value.value.uval = data.GetULEB128(offset_ptr); is_block = true;      break;
         case DW_FORM_block1:    m_value.value.uval = data.GetU8(offset_ptr); is_block = true;           break;
         case DW_FORM_data1:     m_value.value.uval = data.GetU8(offset_ptr);                            break;
@@ -134,6 +156,9 @@
             indirect = true;
             break;
 
+        case DW_FORM_sec_offset:    m_value.value.uval = data.GetU32(offset_ptr);                       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:
             return false;
             break;
@@ -169,57 +194,67 @@
         {
         // Blocks if inlined data that have a length field and the data bytes
         // inlined in the .debug_info
-        case DW_FORM_block      : { dw_uleb128_t size = debug_info_data.GetULEB128(offset_ptr); *offset_ptr += size; } return true;
-        case DW_FORM_block1     : { dw_uleb128_t size = debug_info_data.GetU8(offset_ptr);          *offset_ptr += size; } return true;
-        case DW_FORM_block2     : { dw_uleb128_t size = debug_info_data.GetU16(offset_ptr);         *offset_ptr += size; } return true;
-        case DW_FORM_block4     : { dw_uleb128_t size = debug_info_data.GetU32(offset_ptr);         *offset_ptr += size; } return true;
+        case DW_FORM_exprloc:
+        case DW_FORM_block:  { dw_uleb128_t size = debug_info_data.GetULEB128(offset_ptr); *offset_ptr += size; } return true;
+        case DW_FORM_block1: { dw_uleb128_t size = debug_info_data.GetU8(offset_ptr);      *offset_ptr += size; } return true;
+        case DW_FORM_block2: { dw_uleb128_t size = debug_info_data.GetU16(offset_ptr);     *offset_ptr += size; } return true;
+        case DW_FORM_block4: { dw_uleb128_t size = debug_info_data.GetU32(offset_ptr);     *offset_ptr += size; } return true;
 
         // Inlined NULL terminated C-strings
-        case DW_FORM_string     :
+        case DW_FORM_string:
             debug_info_data.GetCStr(offset_ptr);
             return true;
 
         // Compile unit address sized values
-        case DW_FORM_addr       :
-        case DW_FORM_ref_addr   :
+        case DW_FORM_addr:
+        case DW_FORM_ref_addr:
             *offset_ptr += DWARFCompileUnit::GetAddressByteSize(cu);
             return true;
 
+        // 0 bytes values (implied from DW_FORM)
+        case DW_FORM_flag_present:
+            return true;
+
         // 1 byte values
-        case DW_FORM_data1      :
-        case DW_FORM_flag       :
-        case DW_FORM_ref1       :
+        case DW_FORM_data1:
+        case DW_FORM_flag:
+        case DW_FORM_ref1:
             *offset_ptr += 1;
             return true;
 
         // 2 byte values
-        case DW_FORM_data2      :
-        case DW_FORM_ref2       :
+        case DW_FORM_data2:
+        case DW_FORM_ref2:
             *offset_ptr += 2;
             return true;
 
+        // 32 bit for DWARF 32, 64 for DWARF 64
+        case DW_FORM_sec_offset:
+            *offset_ptr += 4;
+            return true;
+
         // 4 byte values
-        case DW_FORM_strp       :
-        case DW_FORM_data4      :
-        case DW_FORM_ref4       :
+        case DW_FORM_strp:
+        case DW_FORM_data4:
+        case DW_FORM_ref4:
             *offset_ptr += 4;
             return true;
 
         // 8 byte values
-        case DW_FORM_data8      :
-        case DW_FORM_ref8       :
+        case DW_FORM_data8:
+        case DW_FORM_ref8:
+        case DW_FORM_ref_sig8:
             *offset_ptr += 8;
             return true;
 
         // signed or unsigned LEB 128 values
-    //  case DW_FORM_APPLE_db_str:
-        case DW_FORM_sdata      :
-        case DW_FORM_udata      :
-        case DW_FORM_ref_udata  :
+        case DW_FORM_sdata:
+        case DW_FORM_udata:
+        case DW_FORM_ref_udata:
             debug_info_data.Skip_LEB128(offset_ptr);
             return true;
 
-        case DW_FORM_indirect   :
+        case DW_FORM_indirect:
             indirect = true;
             form = debug_info_data.GetULEB128(offset_ptr);
             break;
@@ -230,124 +265,6 @@
     return true;
 }
 
-//bool
-//DWARFFormValue::PutUnsigned(dw_form_t form, dw_offset_t offset, uint64_t value, BinaryStreamBuf& out_buff, const DWARFCompileUnit* cu, bool fixup_cu_relative_refs)
-//{
-//  assert(offset != DW_INVALID_OFFSET);
-////    printf("PutUnsigned(%s, 0x%8.8x, 0x%16.16llx, %d)\n", DW_FORM_value_to_name(form), offset, value, fixup_cu_relative_refs);
-//  // Read the value for the form into value and follow and DW_FORM_indirect instances we run into
-//  switch (form)
-//  {
-//  case DW_FORM_addr:      offset = out_buff.PutMax64(offset, value, DWARFCompileUnit::GetAddressByteSize(cu));    break;
-//
-//  case DW_FORM_flag:
-//  case DW_FORM_data1:     offset = out_buff.Put8(offset, value);                  break;
-//  case DW_FORM_data2:     offset = out_buff.Put16(offset, value);                 break;
-//  case DW_FORM_data4:     offset = out_buff.Put32(offset, value);                 break;
-//  case DW_FORM_data8:     offset = out_buff.Put64(offset, value);                 break;
-////    case DW_FORM_udata:     offset = out_buff.Put32_as_ULEB128(offset, value);      break;
-////    case DW_FORM_sdata:     offset = out_buff.Put32_as_SLEB128(offset, value);      break;
-//  case DW_FORM_strp:      offset = out_buff.Put32(offset, value);                 break;
-////    case DW_FORM_APPLE_db_str:
-////                            offset = out_buff.Put32_as_ULEB128(offset, value);      break;
-//
-//  case DW_FORM_ref1:
-//      if (fixup_cu_relative_refs) value -= cu->GetOffset();
-//      offset = out_buff.Put8(offset, value);
-//      break;
-//  case DW_FORM_ref2:
-//      if (fixup_cu_relative_refs) value -= cu->GetOffset();
-//      offset = out_buff.Put16(offset, value);
-//      break;
-//  case DW_FORM_ref4:
-//      if (fixup_cu_relative_refs) value -= cu->GetOffset();
-//      offset = out_buff.Put32(offset, value);
-//      break;
-//  case DW_FORM_ref8:
-//      if (fixup_cu_relative_refs) value -= cu->GetOffset();
-//      offset = out_buff.Put64(offset, value);
-//      break;
-////    case DW_FORM_ref_udata:
-////        if (fixup_cu_relative_refs) value -= cu->GetOffset();
-////        offset = out_buff.Put32_as_ULEB128(offset, value);
-////        break;
-//  case DW_FORM_ref_addr:
-//      // TODO: Add support for DWARF3 if we ever start emitting DWARF3. The DW_FORM_ref_addr
-//      // is always the same size as an address prior to DWARF3, and with DWARF3 or later it
-//      // is 4 hard coded to bytes.
-//      offset = out_buff.PutMax64(offset, value, DWARFCompileUnit::GetAddressByteSize(cu));
-//      break;
-//
-//  default:
-//      return false;
-//  }
-//
-//  return true;
-//}
-
-//bool
-//DWARFFormValue::TransferValue(dw_form_t form, const DataExtractor& data, uint32_t* offset_ptr, const DWARFCompileUnit* cu, BinaryStreamBuf& out_buff)
-//{
-//  DWARFFormValue formValue(form);
-//  if (formValue.ExtractValue(data, offset_ptr,cu))
-//      return TransferValue(formValue, cu, out_buff);
-//  return false;
-//}
-
-//bool
-//DWARFFormValue::TransferValue(const DWARFFormValue& formValue, const DWARFCompileUnit* cu, BinaryStreamBuf& out_buff)
-//{
-//  // Read the value for the form into value and follow and DW_FORM_indirect instances we run into
-//  dw_form_t form = formValue.Form();
-//  switch (form)
-//  {
-//  case DW_FORM_addr:
-//  case DW_FORM_ref_addr:
-//      {
-//          uint8_t addr_size = DWARFCompileUnit::GetAddressByteSize(cu);
-//          out_buff.AppendMax64(formValue.Unsigned(), addr_size);
-//      }
-//      break;
-//
-//  case DW_FORM_block:     out_buff.Append32_as_ULEB128(formValue.Unsigned()); break;
-//  case DW_FORM_block1:    out_buff.Append8(formValue.Unsigned());             break;
-//  case DW_FORM_block2:    out_buff.Append16(formValue.Unsigned());            break;
-//  case DW_FORM_block4:    out_buff.Append32(formValue.Unsigned());            break;
-//
-//  case DW_FORM_flag:
-//  case DW_FORM_data1:     out_buff.Append8(formValue.Unsigned());             break;
-//  case DW_FORM_data2:     out_buff.Append16(formValue.Unsigned());            break;
-//  case DW_FORM_data4:     out_buff.Append32(formValue.Unsigned());            break;
-//  case DW_FORM_data8:     out_buff.Append64(formValue.Unsigned());            break;
-//  case DW_FORM_udata:     out_buff.Append32_as_ULEB128(formValue.Unsigned()); break;
-//  case DW_FORM_sdata:     out_buff.Append32_as_SLEB128(formValue.Signed());   break;
-//
-//  case DW_FORM_string:    out_buff.AppendCStr(formValue.m_value.value.cstr);      break;
-//  case DW_FORM_strp:      out_buff.Append32(formValue.Unsigned());            break;
-////    case DW_FORM_APPLE_db_str:
-////                            out_buff.Append32_as_ULEB128(formValue.Unsigned()); break;
-//
-//  case DW_FORM_ref1:      out_buff.Append8(formValue.Unsigned());             break;
-//  case DW_FORM_ref2:      out_buff.Append16(formValue.Unsigned());            break;
-//  case DW_FORM_ref4:      out_buff.Append32(formValue.Unsigned());            break;
-//  case DW_FORM_ref8:      out_buff.Append64(formValue.Unsigned());            break;
-//  case DW_FORM_ref_udata: out_buff.Append32_as_ULEB128(formValue.Unsigned()); break;
-//
-//  case DW_FORM_indirect:
-//      assert(!"DW_FORM_indirect found in DWARFFormValue::TransferValue() for an extracted form...");
-//      break;
-//
-//  default:
-//      Log::Error("DWARFFormValue::TransferValue() Unrecognized form: 0x%4.4x", form);
-//      return false;
-//      break;
-//  }
-//
-//  const uint8_t* block_data = formValue.BlockData();
-//  if (block_data)
-//      out_buff.AppendData(block_data, formValue.Unsigned());
-//  return true;
-//}
 
 void
 DWARFFormValue::Dump(Stream &s, const DataExtractor* debug_str_data, const DWARFCompileUnit* cu) const
@@ -363,9 +280,12 @@
     case DW_FORM_flag:
     case DW_FORM_data1:     s.PutHex8(uvalue);     break;
     case DW_FORM_data2:     s.PutHex16(uvalue);        break;
+    case DW_FORM_sec_offset:
     case DW_FORM_data4:     s.PutHex32(uvalue);        break;
+    case DW_FORM_ref_sig8:
     case DW_FORM_data8:     s.PutHex64(uvalue);        break;
     case DW_FORM_string:    s.QuotedCString(AsCString(NULL));          break;
+    case DW_FORM_exprloc:
     case DW_FORM_block:
     case DW_FORM_block1:
     case DW_FORM_block2:
@@ -374,6 +294,7 @@
         {
             switch (m_form)
             {
+            case DW_FORM_exprloc:
             case DW_FORM_block:  s.Printf("<0x%llx> ", uvalue);                break;
             case DW_FORM_block1: s.Printf("<0x%2.2x> ", (uint8_t)uvalue);      break;
             case DW_FORM_block2: s.Printf("<0x%4.4x> ", (uint16_t)uvalue);     break;
@@ -427,6 +348,7 @@
 
     // All DW_FORM_indirect attributes should be resolved prior to calling this function
     case DW_FORM_indirect:  s.PutCString("DW_FORM_indirect"); break;
+    case DW_FORM_flag_present: break;
     default:
         s.Printf("DW_FORM(0x%4.4x)", m_form);
         break;
@@ -578,6 +500,9 @@
     case DW_FORM_data8:
     case DW_FORM_udata:
     case DW_FORM_ref_addr:
+    case DW_FORM_sec_offset:
+    case DW_FORM_flag_present:
+    case DW_FORM_ref_sig8:
         {
             uint64_t a = a_value.Unsigned();
             uint64_t b = b_value.Unsigned();
@@ -619,6 +544,7 @@
     case DW_FORM_block1:
     case DW_FORM_block2:
     case DW_FORM_block4:
+    case DW_FORM_exprloc:
         {
             uint64_t a_len = a_value.Unsigned();
             uint64_t b_len = b_value.Unsigned();





More information about the lldb-commits mailing list