DWARFFormValue.cpp revision 37bb8ddd443da172f42bb8657f15ec856a525c84
124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//===-- DWARFFormValue.cpp --------------------------------------*- C++ -*-===//
224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//
324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                     The LLVM Compiler Infrastructure
424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//
524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// This file is distributed under the University of Illinois Open Source
624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// License. See LICENSE.TXT for details.
724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//
824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//===----------------------------------------------------------------------===//
924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
1024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include <assert.h>
1124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
1224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Core/dwarf.h"
1324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Core/Stream.h"
1424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
1524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "DWARFFormValue.h"
1624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "DWARFCompileUnit.h"
1724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
1824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerclass DWARFCompileUnit;
1924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
2024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerusing namespace lldb_private;
2124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
225fcff9ac1a713d5e814b4a05edef7544be470ad0Greg Clayton
235fcff9ac1a713d5e814b4a05edef7544be470ad0Greg Claytonstatic uint8_t g_form_sizes_addr4[] =
245fcff9ac1a713d5e814b4a05edef7544be470ad0Greg Clayton{
255fcff9ac1a713d5e814b4a05edef7544be470ad0Greg Clayton    0, // 0x00 unused
265fcff9ac1a713d5e814b4a05edef7544be470ad0Greg Clayton    4, // 0x01 DW_FORM_addr
275fcff9ac1a713d5e814b4a05edef7544be470ad0Greg Clayton    0, // 0x02 unused
285fcff9ac1a713d5e814b4a05edef7544be470ad0Greg Clayton    0, // 0x03 DW_FORM_block2
295fcff9ac1a713d5e814b4a05edef7544be470ad0Greg Clayton    0, // 0x04 DW_FORM_block4
305fcff9ac1a713d5e814b4a05edef7544be470ad0Greg Clayton    2, // 0x05 DW_FORM_data2
315fcff9ac1a713d5e814b4a05edef7544be470ad0Greg Clayton    4, // 0x06 DW_FORM_data4
325fcff9ac1a713d5e814b4a05edef7544be470ad0Greg Clayton    8, // 0x07 DW_FORM_data8
335fcff9ac1a713d5e814b4a05edef7544be470ad0Greg Clayton    0, // 0x08 DW_FORM_string
345fcff9ac1a713d5e814b4a05edef7544be470ad0Greg Clayton    0, // 0x09 DW_FORM_block
355fcff9ac1a713d5e814b4a05edef7544be470ad0Greg Clayton    0, // 0x0a DW_FORM_block1
365fcff9ac1a713d5e814b4a05edef7544be470ad0Greg Clayton    1, // 0x0b DW_FORM_data1
375fcff9ac1a713d5e814b4a05edef7544be470ad0Greg Clayton    1, // 0x0c DW_FORM_flag
385fcff9ac1a713d5e814b4a05edef7544be470ad0Greg Clayton    0, // 0x0d DW_FORM_sdata
395fcff9ac1a713d5e814b4a05edef7544be470ad0Greg Clayton    4, // 0x0e DW_FORM_strp
405fcff9ac1a713d5e814b4a05edef7544be470ad0Greg Clayton    0, // 0x0f DW_FORM_udata
415fcff9ac1a713d5e814b4a05edef7544be470ad0Greg Clayton    4, // 0x10 DW_FORM_ref_addr
425fcff9ac1a713d5e814b4a05edef7544be470ad0Greg Clayton    1, // 0x11 DW_FORM_ref1
435fcff9ac1a713d5e814b4a05edef7544be470ad0Greg Clayton    2, // 0x12 DW_FORM_ref2
445fcff9ac1a713d5e814b4a05edef7544be470ad0Greg Clayton    4, // 0x13 DW_FORM_ref4
455fcff9ac1a713d5e814b4a05edef7544be470ad0Greg Clayton    8, // 0x14 DW_FORM_ref8
465fcff9ac1a713d5e814b4a05edef7544be470ad0Greg Clayton    0, // 0x15 DW_FORM_ref_udata
475fcff9ac1a713d5e814b4a05edef7544be470ad0Greg Clayton    0, // 0x16 DW_FORM_indirect
485fcff9ac1a713d5e814b4a05edef7544be470ad0Greg Clayton};
495fcff9ac1a713d5e814b4a05edef7544be470ad0Greg Clayton
505fcff9ac1a713d5e814b4a05edef7544be470ad0Greg Claytonstatic uint8_t
515fcff9ac1a713d5e814b4a05edef7544be470ad0Greg Claytong_form_sizes_addr8[] =
525fcff9ac1a713d5e814b4a05edef7544be470ad0Greg Clayton{
535fcff9ac1a713d5e814b4a05edef7544be470ad0Greg Clayton    0, // 0x00 unused
545fcff9ac1a713d5e814b4a05edef7544be470ad0Greg Clayton    8, // 0x01 DW_FORM_addr
555fcff9ac1a713d5e814b4a05edef7544be470ad0Greg Clayton    0, // 0x02 unused
565fcff9ac1a713d5e814b4a05edef7544be470ad0Greg Clayton    0, // 0x03 DW_FORM_block2
575fcff9ac1a713d5e814b4a05edef7544be470ad0Greg Clayton    0, // 0x04 DW_FORM_block4
585fcff9ac1a713d5e814b4a05edef7544be470ad0Greg Clayton    2, // 0x05 DW_FORM_data2
595fcff9ac1a713d5e814b4a05edef7544be470ad0Greg Clayton    4, // 0x06 DW_FORM_data4
605fcff9ac1a713d5e814b4a05edef7544be470ad0Greg Clayton    8, // 0x07 DW_FORM_data8
615fcff9ac1a713d5e814b4a05edef7544be470ad0Greg Clayton    0, // 0x08 DW_FORM_string
625fcff9ac1a713d5e814b4a05edef7544be470ad0Greg Clayton    0, // 0x09 DW_FORM_block
635fcff9ac1a713d5e814b4a05edef7544be470ad0Greg Clayton    0, // 0x0a DW_FORM_block1
645fcff9ac1a713d5e814b4a05edef7544be470ad0Greg Clayton    1, // 0x0b DW_FORM_data1
655fcff9ac1a713d5e814b4a05edef7544be470ad0Greg Clayton    1, // 0x0c DW_FORM_flag
665fcff9ac1a713d5e814b4a05edef7544be470ad0Greg Clayton    0, // 0x0d DW_FORM_sdata
675fcff9ac1a713d5e814b4a05edef7544be470ad0Greg Clayton    4, // 0x0e DW_FORM_strp
685fcff9ac1a713d5e814b4a05edef7544be470ad0Greg Clayton    0, // 0x0f DW_FORM_udata
695fcff9ac1a713d5e814b4a05edef7544be470ad0Greg Clayton    8, // 0x10 DW_FORM_ref_addr
705fcff9ac1a713d5e814b4a05edef7544be470ad0Greg Clayton    1, // 0x11 DW_FORM_ref1
715fcff9ac1a713d5e814b4a05edef7544be470ad0Greg Clayton    2, // 0x12 DW_FORM_ref2
725fcff9ac1a713d5e814b4a05edef7544be470ad0Greg Clayton    4, // 0x13 DW_FORM_ref4
735fcff9ac1a713d5e814b4a05edef7544be470ad0Greg Clayton    8, // 0x14 DW_FORM_ref8
745fcff9ac1a713d5e814b4a05edef7544be470ad0Greg Clayton    0, // 0x15 DW_FORM_ref_udata
755fcff9ac1a713d5e814b4a05edef7544be470ad0Greg Clayton    0, // 0x16 DW_FORM_indirect
765fcff9ac1a713d5e814b4a05edef7544be470ad0Greg Clayton};
775fcff9ac1a713d5e814b4a05edef7544be470ad0Greg Clayton
785fcff9ac1a713d5e814b4a05edef7544be470ad0Greg Claytonconst uint8_t *
795fcff9ac1a713d5e814b4a05edef7544be470ad0Greg ClaytonDWARFFormValue::GetFixedFormSizesForAddressSize (uint8_t addr_size)
805fcff9ac1a713d5e814b4a05edef7544be470ad0Greg Clayton{
815fcff9ac1a713d5e814b4a05edef7544be470ad0Greg Clayton    switch (addr_size)
825fcff9ac1a713d5e814b4a05edef7544be470ad0Greg Clayton    {
835fcff9ac1a713d5e814b4a05edef7544be470ad0Greg Clayton    case 4: return g_form_sizes_addr4;
845fcff9ac1a713d5e814b4a05edef7544be470ad0Greg Clayton    case 8: return g_form_sizes_addr8;
855fcff9ac1a713d5e814b4a05edef7544be470ad0Greg Clayton    }
865fcff9ac1a713d5e814b4a05edef7544be470ad0Greg Clayton    return NULL;
875fcff9ac1a713d5e814b4a05edef7544be470ad0Greg Clayton}
885fcff9ac1a713d5e814b4a05edef7544be470ad0Greg Clayton
8924943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerDWARFFormValue::DWARFFormValue(dw_form_t form) :
9024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_form(form),
9124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_value()
9224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
9324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
9424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
9524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool
9624943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerDWARFFormValue::ExtractValue(const DataExtractor& data, uint32_t* offset_ptr, const DWARFCompileUnit* cu)
9724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
9824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    bool indirect = false;
9924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    bool is_block = false;
10024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_value.data = NULL;
10124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // Read the value for the form into value and follow and DW_FORM_indirect instances we run into
10224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    do
10324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
10424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        indirect = false;
10524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        switch (m_form)
10624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
10724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case DW_FORM_addr:      m_value.value.uval = data.GetMaxU64(offset_ptr, DWARFCompileUnit::GetAddressByteSize(cu));  break;
10824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case DW_FORM_block2:    m_value.value.uval = data.GetU16(offset_ptr); is_block = true;          break;
10924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case DW_FORM_block4:    m_value.value.uval = data.GetU32(offset_ptr); is_block = true;          break;
11024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case DW_FORM_data2:     m_value.value.uval = data.GetU16(offset_ptr);                           break;
11124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case DW_FORM_data4:     m_value.value.uval = data.GetU32(offset_ptr);                           break;
11224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case DW_FORM_data8:     m_value.value.uval = data.GetU64(offset_ptr);                           break;
11324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case DW_FORM_string:    m_value.value.cstr = data.GetCStr(offset_ptr);
11424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                // Set the string value to also be the data for inlined cstr form values only
11524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                // so we can tell the differnence between DW_FORM_string and DW_FORM_strp form
11624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                // values;
11724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                m_value.data = (uint8_t*)m_value.value.cstr;                            break;
11824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case DW_FORM_block:     m_value.value.uval = data.GetULEB128(offset_ptr); is_block = true;      break;
11924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case DW_FORM_block1:    m_value.value.uval = data.GetU8(offset_ptr); is_block = true;           break;
12024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case DW_FORM_data1:     m_value.value.uval = data.GetU8(offset_ptr);                            break;
12124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case DW_FORM_flag:      m_value.value.uval = data.GetU8(offset_ptr);                            break;
12224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case DW_FORM_sdata:     m_value.value.sval = data.GetSLEB128(offset_ptr);                       break;
12324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case DW_FORM_strp:      m_value.value.uval = data.GetU32(offset_ptr);                           break;
12424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //  case DW_FORM_APPLE_db_str:
12524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case DW_FORM_udata:     m_value.value.uval = data.GetULEB128(offset_ptr);                       break;
12624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case DW_FORM_ref_addr:  m_value.value.uval = data.GetMaxU64(offset_ptr, DWARFCompileUnit::GetAddressByteSize(cu));  break;
12724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case DW_FORM_ref1:      m_value.value.uval = data.GetU8(offset_ptr);                            break;
12824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case DW_FORM_ref2:      m_value.value.uval = data.GetU16(offset_ptr);                           break;
12924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case DW_FORM_ref4:      m_value.value.uval = data.GetU32(offset_ptr);                           break;
13024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case DW_FORM_ref8:      m_value.value.uval = data.GetU64(offset_ptr);                           break;
13124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case DW_FORM_ref_udata: m_value.value.uval = data.GetULEB128(offset_ptr);                       break;
13224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case DW_FORM_indirect:
13324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            m_form = data.GetULEB128(offset_ptr);
13424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            indirect = true;
13524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            break;
13624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
13724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        default:
13824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            return false;
13924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            break;
14024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
14124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    } while (indirect);
14224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
14324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (is_block)
14424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
14524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        m_value.data = data.PeekData(*offset_ptr, m_value.value.uval);
14624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (m_value.data != NULL)
14724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
14824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            *offset_ptr += m_value.value.uval;
14924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
15024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
15124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
15224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return true;
15324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
15424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
15524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool
15624943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerDWARFFormValue::SkipValue(const DataExtractor& debug_info_data, uint32_t* offset_ptr, const DWARFCompileUnit* cu) const
15724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
15824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return DWARFFormValue::SkipValue(m_form, debug_info_data, offset_ptr, cu);
15924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
16024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
16124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool
16224943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerDWARFFormValue::SkipValue(dw_form_t form, const DataExtractor& debug_info_data, uint32_t* offset_ptr, const DWARFCompileUnit* cu)
16324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
16424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    bool indirect = false;
16524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    do
16624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
16724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        indirect = false;
16824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        switch (form)
16924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
17024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        // Blocks if inlined data that have a length field and the data bytes
17124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        // inlined in the .debug_info
17224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case DW_FORM_block      : { dw_uleb128_t size = debug_info_data.GetULEB128(offset_ptr); *offset_ptr += size; } return true;
17324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case DW_FORM_block1     : { dw_uleb128_t size = debug_info_data.GetU8(offset_ptr);          *offset_ptr += size; } return true;
17424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case DW_FORM_block2     : { dw_uleb128_t size = debug_info_data.GetU16(offset_ptr);         *offset_ptr += size; } return true;
17524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case DW_FORM_block4     : { dw_uleb128_t size = debug_info_data.GetU32(offset_ptr);         *offset_ptr += size; } return true;
17624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
17724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        // Inlined NULL terminated C-strings
17824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case DW_FORM_string     :
17924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            debug_info_data.GetCStr(offset_ptr);
18024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            return true;
18124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
18224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        // Compile unit address sized values
18324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case DW_FORM_addr       :
18424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case DW_FORM_ref_addr   :
18524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            *offset_ptr += DWARFCompileUnit::GetAddressByteSize(cu);
18624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            return true;
18724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
18824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        // 1 byte values
18924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case DW_FORM_data1      :
19024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case DW_FORM_flag       :
19124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case DW_FORM_ref1       :
19224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            *offset_ptr += 1;
19324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            return true;
19424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
19524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        // 2 byte values
19624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case DW_FORM_data2      :
19724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case DW_FORM_ref2       :
19824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            *offset_ptr += 2;
19924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            return true;
20024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
20124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        // 4 byte values
20224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case DW_FORM_strp       :
20324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case DW_FORM_data4      :
20424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case DW_FORM_ref4       :
20524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            *offset_ptr += 4;
20624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            return true;
20724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
20824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        // 8 byte values
20924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case DW_FORM_data8      :
21024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case DW_FORM_ref8       :
21124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            *offset_ptr += 8;
21224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            return true;
21324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
21424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        // signed or unsigned LEB 128 values
21524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //  case DW_FORM_APPLE_db_str:
21624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case DW_FORM_sdata      :
21724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case DW_FORM_udata      :
21824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case DW_FORM_ref_udata  :
21924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            debug_info_data.Skip_LEB128(offset_ptr);
22024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            return true;
22124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
22224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case DW_FORM_indirect   :
22324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            indirect = true;
22424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            form = debug_info_data.GetULEB128(offset_ptr);
22524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            break;
22624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        default:
22724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            return false;
22824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
22924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    } while (indirect);
23024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return true;
23124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
23224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
23324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//bool
23424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//DWARFFormValue::PutUnsigned(dw_form_t form, dw_offset_t offset, uint64_t value, BinaryStreamBuf& out_buff, const DWARFCompileUnit* cu, bool fixup_cu_relative_refs)
23524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//{
23624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//  assert(offset != DW_INVALID_OFFSET);
23724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner////    printf("PutUnsigned(%s, 0x%8.8x, 0x%16.16llx, %d)\n", DW_FORM_value_to_name(form), offset, value, fixup_cu_relative_refs);
23824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//  // Read the value for the form into value and follow and DW_FORM_indirect instances we run into
23924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//  switch (form)
24024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//  {
24124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//  case DW_FORM_addr:      offset = out_buff.PutMax64(offset, value, DWARFCompileUnit::GetAddressByteSize(cu));    break;
24224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//
24324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//  case DW_FORM_flag:
24424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//  case DW_FORM_data1:     offset = out_buff.Put8(offset, value);                  break;
24524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//  case DW_FORM_data2:     offset = out_buff.Put16(offset, value);                 break;
24624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//  case DW_FORM_data4:     offset = out_buff.Put32(offset, value);                 break;
24724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//  case DW_FORM_data8:     offset = out_buff.Put64(offset, value);                 break;
24824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner////    case DW_FORM_udata:     offset = out_buff.Put32_as_ULEB128(offset, value);      break;
24924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner////    case DW_FORM_sdata:     offset = out_buff.Put32_as_SLEB128(offset, value);      break;
25024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//  case DW_FORM_strp:      offset = out_buff.Put32(offset, value);                 break;
25124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner////    case DW_FORM_APPLE_db_str:
25224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner////                            offset = out_buff.Put32_as_ULEB128(offset, value);      break;
25324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//
25424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//  case DW_FORM_ref1:
25524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//      if (fixup_cu_relative_refs) value -= cu->GetOffset();
25624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//      offset = out_buff.Put8(offset, value);
25724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//      break;
25824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//  case DW_FORM_ref2:
25924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//      if (fixup_cu_relative_refs) value -= cu->GetOffset();
26024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//      offset = out_buff.Put16(offset, value);
26124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//      break;
26224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//  case DW_FORM_ref4:
26324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//      if (fixup_cu_relative_refs) value -= cu->GetOffset();
26424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//      offset = out_buff.Put32(offset, value);
26524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//      break;
26624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//  case DW_FORM_ref8:
26724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//      if (fixup_cu_relative_refs) value -= cu->GetOffset();
26824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//      offset = out_buff.Put64(offset, value);
26924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//      break;
27024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner////    case DW_FORM_ref_udata:
27124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner////        if (fixup_cu_relative_refs) value -= cu->GetOffset();
27224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner////        offset = out_buff.Put32_as_ULEB128(offset, value);
27324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner////        break;
27424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//  case DW_FORM_ref_addr:
27524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//      // TODO: Add support for DWARF3 if we ever start emitting DWARF3. The DW_FORM_ref_addr
27624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//      // is always the same size as an address prior to DWARF3, and with DWARF3 or later it
27724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//      // is 4 hard coded to bytes.
27824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//      offset = out_buff.PutMax64(offset, value, DWARFCompileUnit::GetAddressByteSize(cu));
27924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//      break;
28024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//
28124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//  default:
28224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//      return false;
28324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//  }
28424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//
28524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//  return true;
28624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//}
28724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
28824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//bool
28924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//DWARFFormValue::TransferValue(dw_form_t form, const DataExtractor& data, uint32_t* offset_ptr, const DWARFCompileUnit* cu, BinaryStreamBuf& out_buff)
29024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//{
29124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//  DWARFFormValue formValue(form);
29224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//  if (formValue.ExtractValue(data, offset_ptr,cu))
29324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//      return TransferValue(formValue, cu, out_buff);
29424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//  return false;
29524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//}
29624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
29724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//bool
29824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//DWARFFormValue::TransferValue(const DWARFFormValue& formValue, const DWARFCompileUnit* cu, BinaryStreamBuf& out_buff)
29924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//{
30024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//  // Read the value for the form into value and follow and DW_FORM_indirect instances we run into
30124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//  dw_form_t form = formValue.Form();
30224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//  switch (form)
30324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//  {
30424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//  case DW_FORM_addr:
30524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//  case DW_FORM_ref_addr:
30624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//      {
30724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//          uint8_t addr_size = DWARFCompileUnit::GetAddressByteSize(cu);
30824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//          out_buff.AppendMax64(formValue.Unsigned(), addr_size);
30924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//      }
31024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//      break;
31124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//
31224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//  case DW_FORM_block:     out_buff.Append32_as_ULEB128(formValue.Unsigned()); break;
31324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//  case DW_FORM_block1:    out_buff.Append8(formValue.Unsigned());             break;
31424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//  case DW_FORM_block2:    out_buff.Append16(formValue.Unsigned());            break;
31524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//  case DW_FORM_block4:    out_buff.Append32(formValue.Unsigned());            break;
31624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//
31724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//  case DW_FORM_flag:
31824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//  case DW_FORM_data1:     out_buff.Append8(formValue.Unsigned());             break;
31924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//  case DW_FORM_data2:     out_buff.Append16(formValue.Unsigned());            break;
32024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//  case DW_FORM_data4:     out_buff.Append32(formValue.Unsigned());            break;
32124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//  case DW_FORM_data8:     out_buff.Append64(formValue.Unsigned());            break;
32224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//  case DW_FORM_udata:     out_buff.Append32_as_ULEB128(formValue.Unsigned()); break;
32324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//  case DW_FORM_sdata:     out_buff.Append32_as_SLEB128(formValue.Signed());   break;
32424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//
32524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//  case DW_FORM_string:    out_buff.AppendCStr(formValue.m_value.value.cstr);      break;
32624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//  case DW_FORM_strp:      out_buff.Append32(formValue.Unsigned());            break;
32724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner////    case DW_FORM_APPLE_db_str:
32824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner////                            out_buff.Append32_as_ULEB128(formValue.Unsigned()); break;
32924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//
33024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//  case DW_FORM_ref1:      out_buff.Append8(formValue.Unsigned());             break;
33124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//  case DW_FORM_ref2:      out_buff.Append16(formValue.Unsigned());            break;
33224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//  case DW_FORM_ref4:      out_buff.Append32(formValue.Unsigned());            break;
33324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//  case DW_FORM_ref8:      out_buff.Append64(formValue.Unsigned());            break;
33424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//  case DW_FORM_ref_udata: out_buff.Append32_as_ULEB128(formValue.Unsigned()); break;
33524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//
33624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//  case DW_FORM_indirect:
33724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//      assert(!"DW_FORM_indirect found in DWARFFormValue::TransferValue() for an extracted form...");
33824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//      break;
33924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//
34024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//  default:
34124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//      Log::Error("DWARFFormValue::TransferValue() Unrecognized form: 0x%4.4x", form);
34224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//      return false;
34324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//      break;
34424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//  }
34524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//
34624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//  const uint8_t* block_data = formValue.BlockData();
34724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//  if (block_data)
34824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//      out_buff.AppendData(block_data, formValue.Unsigned());
34924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//  return true;
35024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//}
35124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
35224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid
353169c5fbc8cac8a0bd724bd18fd9d816ca3d6486aJim InghamDWARFFormValue::Dump(Stream &s, const DataExtractor* debug_str_data, const DWARFCompileUnit* cu) const
35424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
35524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    uint64_t uvalue = Unsigned();
35624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    bool cu_relative_offset = false;
35724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
358169c5fbc8cac8a0bd724bd18fd9d816ca3d6486aJim Ingham    bool verbose = s.GetVerbose();
35924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
36024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    switch (m_form)
36124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
362169c5fbc8cac8a0bd724bd18fd9d816ca3d6486aJim Ingham    case DW_FORM_addr:      s.Address(uvalue, sizeof (uint64_t)); break;
36324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    case DW_FORM_flag:
364169c5fbc8cac8a0bd724bd18fd9d816ca3d6486aJim Ingham    case DW_FORM_data1:     s.PutHex8(uvalue);     break;
365169c5fbc8cac8a0bd724bd18fd9d816ca3d6486aJim Ingham    case DW_FORM_data2:     s.PutHex16(uvalue);        break;
366169c5fbc8cac8a0bd724bd18fd9d816ca3d6486aJim Ingham    case DW_FORM_data4:     s.PutHex32(uvalue);        break;
367169c5fbc8cac8a0bd724bd18fd9d816ca3d6486aJim Ingham    case DW_FORM_data8:     s.PutHex64(uvalue);        break;
368169c5fbc8cac8a0bd724bd18fd9d816ca3d6486aJim Ingham    case DW_FORM_string:    s.QuotedCString(AsCString(NULL));          break;
36924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    case DW_FORM_block:
37024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    case DW_FORM_block1:
37124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    case DW_FORM_block2:
37224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    case DW_FORM_block4:
37324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (uvalue > 0)
37424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
37524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            switch (m_form)
37624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
377169c5fbc8cac8a0bd724bd18fd9d816ca3d6486aJim Ingham            case DW_FORM_block:  s.Printf("<0x%llx> ", uvalue);                break;
378169c5fbc8cac8a0bd724bd18fd9d816ca3d6486aJim Ingham            case DW_FORM_block1: s.Printf("<0x%2.2x> ", (uint8_t)uvalue);      break;
379169c5fbc8cac8a0bd724bd18fd9d816ca3d6486aJim Ingham            case DW_FORM_block2: s.Printf("<0x%4.4x> ", (uint16_t)uvalue);     break;
380169c5fbc8cac8a0bd724bd18fd9d816ca3d6486aJim Ingham            case DW_FORM_block4: s.Printf("<0x%8.8x> ", (uint32_t)uvalue);     break;
38124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            default:                                                            break;
38224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
38324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
38424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            const uint8_t* data_ptr = m_value.data;
38524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (data_ptr)
38624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
38724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                const uint8_t* end_data_ptr = data_ptr + uvalue;    // uvalue contains size of block
38824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                while (data_ptr < end_data_ptr)
38924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                {
390169c5fbc8cac8a0bd724bd18fd9d816ca3d6486aJim Ingham                    s.Printf("%2.2x ", *data_ptr);
39124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    ++data_ptr;
39224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                }
39324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
39424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            else
395169c5fbc8cac8a0bd724bd18fd9d816ca3d6486aJim Ingham                s.PutCString("NULL");
39624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
39724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        break;
39824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
399169c5fbc8cac8a0bd724bd18fd9d816ca3d6486aJim Ingham    case DW_FORM_sdata:     s.PutSLEB128(uvalue); break;
400169c5fbc8cac8a0bd724bd18fd9d816ca3d6486aJim Ingham    case DW_FORM_udata:     s.PutULEB128(uvalue); break;
40124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    case DW_FORM_strp:
40224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (debug_str_data)
40324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
40424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (verbose)
405169c5fbc8cac8a0bd724bd18fd9d816ca3d6486aJim Ingham                s.Printf(" .debug_str[0x%8.8x] = ", (uint32_t)uvalue);
40624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
40724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            const char* dbg_str = AsCString(debug_str_data);
40824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (dbg_str)
409169c5fbc8cac8a0bd724bd18fd9d816ca3d6486aJim Ingham                s.QuotedCString(dbg_str);
41024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
41124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        else
41224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
413169c5fbc8cac8a0bd724bd18fd9d816ca3d6486aJim Ingham            s.PutHex32(uvalue);
41424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
41524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        break;
41624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
41724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    case DW_FORM_ref_addr:
41824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
419169c5fbc8cac8a0bd724bd18fd9d816ca3d6486aJim Ingham        s.Address(uvalue, sizeof (uint64_t) * 2);
42024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        break;
42124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
422169c5fbc8cac8a0bd724bd18fd9d816ca3d6486aJim Ingham    case DW_FORM_ref1:      cu_relative_offset = true;  if (verbose) s.Printf("cu + 0x%2.2x", (uint8_t)uvalue); break;
423169c5fbc8cac8a0bd724bd18fd9d816ca3d6486aJim Ingham    case DW_FORM_ref2:      cu_relative_offset = true;  if (verbose) s.Printf("cu + 0x%4.4x", (uint16_t)uvalue); break;
424169c5fbc8cac8a0bd724bd18fd9d816ca3d6486aJim Ingham    case DW_FORM_ref4:      cu_relative_offset = true;  if (verbose) s.Printf("cu + 0x%4.4x", (uint32_t)uvalue); break;
425169c5fbc8cac8a0bd724bd18fd9d816ca3d6486aJim Ingham    case DW_FORM_ref8:      cu_relative_offset = true;  if (verbose) s.Printf("cu + 0x%8.8llx", uvalue); break;
426169c5fbc8cac8a0bd724bd18fd9d816ca3d6486aJim Ingham    case DW_FORM_ref_udata: cu_relative_offset = true;  if (verbose) s.Printf("cu + 0x%llx", uvalue); break;
42724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
42824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // All DW_FORM_indirect attributes should be resolved prior to calling this function
429169c5fbc8cac8a0bd724bd18fd9d816ca3d6486aJim Ingham    case DW_FORM_indirect:  s.PutCString("DW_FORM_indirect"); break;
43024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    default:
431169c5fbc8cac8a0bd724bd18fd9d816ca3d6486aJim Ingham        s.Printf("DW_FORM(0x%4.4x)", m_form);
43224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        break;
43324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
43424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
43524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (cu_relative_offset)
43624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
43724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (verbose)
438169c5fbc8cac8a0bd724bd18fd9d816ca3d6486aJim Ingham            s.PutCString(" => ");
43924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
4407e5fa7fc1f8efd24c078e063b2c4b5e13ba5be20Jason Molenda        s.Printf("{0x%8.8llx}", (uvalue + (cu ? cu->GetOffset() : 0)));
44124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
44224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
44324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
44424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerconst char*
44524943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerDWARFFormValue::AsCString(const DataExtractor* debug_str_data_ptr) const
44624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
44724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (IsInlinedCStr())
44824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return m_value.value.cstr;
44924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    else if (debug_str_data_ptr)
45024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return debug_str_data_ptr->PeekCStr(m_value.value.uval);
45124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return NULL;
45224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
45324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
45424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattneruint64_t
45524943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerDWARFFormValue::Reference(const DWARFCompileUnit* cu) const
45624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
45724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    uint64_t die_offset = m_value.value.uval;
45824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    switch (m_form)
45924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
46024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    case DW_FORM_ref1:
46124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    case DW_FORM_ref2:
46224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    case DW_FORM_ref4:
46324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    case DW_FORM_ref8:
46424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    case DW_FORM_ref_udata:
46524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        die_offset += (cu ? cu->GetOffset() : 0);
46624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        break;
46724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
46824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    default:
46924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        break;
47024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
47124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
47224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return die_offset;
47324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
47424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
47537bb8ddd443da172f42bb8657f15ec856a525c84Greg Claytonuint64_t
47637bb8ddd443da172f42bb8657f15ec856a525c84Greg ClaytonDWARFFormValue::Reference (dw_offset_t base_offset) const
47737bb8ddd443da172f42bb8657f15ec856a525c84Greg Clayton{
47837bb8ddd443da172f42bb8657f15ec856a525c84Greg Clayton    uint64_t die_offset = m_value.value.uval;
47937bb8ddd443da172f42bb8657f15ec856a525c84Greg Clayton    switch (m_form)
48037bb8ddd443da172f42bb8657f15ec856a525c84Greg Clayton    {
48137bb8ddd443da172f42bb8657f15ec856a525c84Greg Clayton        case DW_FORM_ref1:
48237bb8ddd443da172f42bb8657f15ec856a525c84Greg Clayton        case DW_FORM_ref2:
48337bb8ddd443da172f42bb8657f15ec856a525c84Greg Clayton        case DW_FORM_ref4:
48437bb8ddd443da172f42bb8657f15ec856a525c84Greg Clayton        case DW_FORM_ref8:
48537bb8ddd443da172f42bb8657f15ec856a525c84Greg Clayton        case DW_FORM_ref_udata:
48637bb8ddd443da172f42bb8657f15ec856a525c84Greg Clayton            die_offset += base_offset;
48737bb8ddd443da172f42bb8657f15ec856a525c84Greg Clayton            break;
48837bb8ddd443da172f42bb8657f15ec856a525c84Greg Clayton
48937bb8ddd443da172f42bb8657f15ec856a525c84Greg Clayton        default:
49037bb8ddd443da172f42bb8657f15ec856a525c84Greg Clayton            break;
49137bb8ddd443da172f42bb8657f15ec856a525c84Greg Clayton    }
49237bb8ddd443da172f42bb8657f15ec856a525c84Greg Clayton
49337bb8ddd443da172f42bb8657f15ec856a525c84Greg Clayton    return die_offset;
49437bb8ddd443da172f42bb8657f15ec856a525c84Greg Clayton}
49537bb8ddd443da172f42bb8657f15ec856a525c84Greg Clayton
49624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//----------------------------------------------------------------------
49724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Resolve any compile unit specific references so that we don't need
49824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// the compile unit at a later time in order to work with the form
49924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// value.
50024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//----------------------------------------------------------------------
50124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool
50224943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerDWARFFormValue::ResolveCompileUnitReferences(const DWARFCompileUnit* cu)
50324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
50424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    switch (m_form)
50524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
50624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    case DW_FORM_ref1:
50724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    case DW_FORM_ref2:
50824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    case DW_FORM_ref4:
50924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    case DW_FORM_ref8:
51024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    case DW_FORM_ref_udata:
51124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        m_value.value.uval += cu->GetOffset();
51224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        m_form = DW_FORM_ref_addr;
51324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return true;
51424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        break;
51524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
51624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    default:
51724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        break;
51824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
51924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
52024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return false;
52124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
52224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
52324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerconst uint8_t*
52424943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerDWARFFormValue::BlockData() const
52524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
52624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (!IsInlinedCStr())
52724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return m_value.data;
52824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return NULL;
52924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
53024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
53124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
53224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool
53324943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerDWARFFormValue::IsBlockForm(const dw_form_t form)
53424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
53524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    switch (form)
53624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
53724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    case DW_FORM_block:
53824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    case DW_FORM_block1:
53924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    case DW_FORM_block2:
54024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    case DW_FORM_block4:
54124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return true;
54224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
54324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return false;
54424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
54524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
54624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool
54724943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerDWARFFormValue::IsDataForm(const dw_form_t form)
54824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
54924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    switch (form)
55024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
55124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    case DW_FORM_sdata:
55224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    case DW_FORM_udata:
55324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    case DW_FORM_data1:
55424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    case DW_FORM_data2:
55524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    case DW_FORM_data4:
55624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    case DW_FORM_data8:
55724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return true;
55824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
55924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return false;
56024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
56124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
56224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerint
56324943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerDWARFFormValue::Compare (const DWARFFormValue& a_value, const DWARFFormValue& b_value, const DWARFCompileUnit* a_cu, const DWARFCompileUnit* b_cu, const DataExtractor* debug_str_data_ptr)
56424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
56524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    dw_form_t a_form = a_value.Form();
56624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    dw_form_t b_form = b_value.Form();
56724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (a_form < b_form)
56824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return -1;
56924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (a_form > b_form)
57024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return 1;
57124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    switch (a_form)
57224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
57324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    case DW_FORM_addr:
57424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    case DW_FORM_flag:
57524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    case DW_FORM_data1:
57624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    case DW_FORM_data2:
57724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    case DW_FORM_data4:
57824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    case DW_FORM_data8:
57924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    case DW_FORM_udata:
58024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    case DW_FORM_ref_addr:
58124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
58224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            uint64_t a = a_value.Unsigned();
58324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            uint64_t b = b_value.Unsigned();
58424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (a < b)
58524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                return -1;
58624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (a > b)
58724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                return 1;
58824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            return 0;
58924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
59024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
59124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    case DW_FORM_sdata:
59224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
59324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            int64_t a = a_value.Signed();
59424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            int64_t b = b_value.Signed();
59524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (a < b)
59624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                return -1;
59724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (a > b)
59824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                return 1;
59924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            return 0;
60024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
60124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
60224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    case DW_FORM_string:
60324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    case DW_FORM_strp:
60424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
60524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            const char *a_string = a_value.AsCString(debug_str_data_ptr);
60624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            const char *b_string = b_value.AsCString(debug_str_data_ptr);
60724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (a_string == b_string)
60824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                return 0;
60924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            else if (a_string && b_string)
61024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                return strcmp(a_string, b_string);
61124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            else if (a_string == NULL)
61224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                return -1;  // A string is NULL, and B is valid
61324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            else
61424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                return 1;   // A string valid, and B is NULL
61524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
61624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
61724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
61824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    case DW_FORM_block:
61924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    case DW_FORM_block1:
62024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    case DW_FORM_block2:
62124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    case DW_FORM_block4:
62224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
62324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            uint64_t a_len = a_value.Unsigned();
62424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            uint64_t b_len = b_value.Unsigned();
62524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (a_len < b_len)
62624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                return -1;
62724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (a_len > b_len)
62824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                return 1;
62924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            // The block lengths are the same
63024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            return memcmp(a_value.BlockData(), b_value.BlockData(), a_value.Unsigned());
63124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
63224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        break;
63324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
63424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    case DW_FORM_ref1:
63524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    case DW_FORM_ref2:
63624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    case DW_FORM_ref4:
63724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    case DW_FORM_ref8:
63824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    case DW_FORM_ref_udata:
63924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
64024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            uint64_t a = a_value.Reference(a_cu);
64124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            uint64_t b = b_value.Reference(b_cu);
64224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (a < b)
64324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                return -1;
64424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (a > b)
64524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                return 1;
64624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            return 0;
64724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
64824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
64924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    case DW_FORM_indirect:
65024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        assert(!"This shouldn't happen after the form has been extracted...");
65124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        break;
65224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
65324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    default:
65424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        assert(!"Unhandled DW_FORM");
65524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        break;
65624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
65724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return -1;
65824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
65924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
660