DWARFFormValue.cpp revision 988be08a3fe9bb21bb1f518dcf15f2cbf61693d9
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
48988be08a3fe9bb21bb1f518dcf15f2cbf61693d9Greg Clayton    4, // 0x17 DW_FORM_sec_offset
49988be08a3fe9bb21bb1f518dcf15f2cbf61693d9Greg Clayton    0, // 0x18 DW_FORM_exprloc
50988be08a3fe9bb21bb1f518dcf15f2cbf61693d9Greg Clayton    0, // 0x19 DW_FORM_flag_present
51988be08a3fe9bb21bb1f518dcf15f2cbf61693d9Greg Clayton    0, // 0x1a
52988be08a3fe9bb21bb1f518dcf15f2cbf61693d9Greg Clayton    0, // 0x1b
53988be08a3fe9bb21bb1f518dcf15f2cbf61693d9Greg Clayton    0, // 0x1c
54988be08a3fe9bb21bb1f518dcf15f2cbf61693d9Greg Clayton    0, // 0x1d
55988be08a3fe9bb21bb1f518dcf15f2cbf61693d9Greg Clayton    0, // 0x1e
56988be08a3fe9bb21bb1f518dcf15f2cbf61693d9Greg Clayton    0, // 0x1f
57988be08a3fe9bb21bb1f518dcf15f2cbf61693d9Greg Clayton    8, // 0x20 DW_FORM_ref_sig8
58988be08a3fe9bb21bb1f518dcf15f2cbf61693d9Greg Clayton
595fcff9ac1a713d5e814b4a05edef7544be470ad0Greg Clayton};
605fcff9ac1a713d5e814b4a05edef7544be470ad0Greg Clayton
615fcff9ac1a713d5e814b4a05edef7544be470ad0Greg Claytonstatic uint8_t
625fcff9ac1a713d5e814b4a05edef7544be470ad0Greg Claytong_form_sizes_addr8[] =
635fcff9ac1a713d5e814b4a05edef7544be470ad0Greg Clayton{
645fcff9ac1a713d5e814b4a05edef7544be470ad0Greg Clayton    0, // 0x00 unused
655fcff9ac1a713d5e814b4a05edef7544be470ad0Greg Clayton    8, // 0x01 DW_FORM_addr
665fcff9ac1a713d5e814b4a05edef7544be470ad0Greg Clayton    0, // 0x02 unused
675fcff9ac1a713d5e814b4a05edef7544be470ad0Greg Clayton    0, // 0x03 DW_FORM_block2
685fcff9ac1a713d5e814b4a05edef7544be470ad0Greg Clayton    0, // 0x04 DW_FORM_block4
695fcff9ac1a713d5e814b4a05edef7544be470ad0Greg Clayton    2, // 0x05 DW_FORM_data2
705fcff9ac1a713d5e814b4a05edef7544be470ad0Greg Clayton    4, // 0x06 DW_FORM_data4
715fcff9ac1a713d5e814b4a05edef7544be470ad0Greg Clayton    8, // 0x07 DW_FORM_data8
725fcff9ac1a713d5e814b4a05edef7544be470ad0Greg Clayton    0, // 0x08 DW_FORM_string
735fcff9ac1a713d5e814b4a05edef7544be470ad0Greg Clayton    0, // 0x09 DW_FORM_block
745fcff9ac1a713d5e814b4a05edef7544be470ad0Greg Clayton    0, // 0x0a DW_FORM_block1
755fcff9ac1a713d5e814b4a05edef7544be470ad0Greg Clayton    1, // 0x0b DW_FORM_data1
765fcff9ac1a713d5e814b4a05edef7544be470ad0Greg Clayton    1, // 0x0c DW_FORM_flag
775fcff9ac1a713d5e814b4a05edef7544be470ad0Greg Clayton    0, // 0x0d DW_FORM_sdata
785fcff9ac1a713d5e814b4a05edef7544be470ad0Greg Clayton    4, // 0x0e DW_FORM_strp
795fcff9ac1a713d5e814b4a05edef7544be470ad0Greg Clayton    0, // 0x0f DW_FORM_udata
805fcff9ac1a713d5e814b4a05edef7544be470ad0Greg Clayton    8, // 0x10 DW_FORM_ref_addr
815fcff9ac1a713d5e814b4a05edef7544be470ad0Greg Clayton    1, // 0x11 DW_FORM_ref1
825fcff9ac1a713d5e814b4a05edef7544be470ad0Greg Clayton    2, // 0x12 DW_FORM_ref2
835fcff9ac1a713d5e814b4a05edef7544be470ad0Greg Clayton    4, // 0x13 DW_FORM_ref4
845fcff9ac1a713d5e814b4a05edef7544be470ad0Greg Clayton    8, // 0x14 DW_FORM_ref8
855fcff9ac1a713d5e814b4a05edef7544be470ad0Greg Clayton    0, // 0x15 DW_FORM_ref_udata
865fcff9ac1a713d5e814b4a05edef7544be470ad0Greg Clayton    0, // 0x16 DW_FORM_indirect
87988be08a3fe9bb21bb1f518dcf15f2cbf61693d9Greg Clayton    4, // 0x17 DW_FORM_sec_offset
88988be08a3fe9bb21bb1f518dcf15f2cbf61693d9Greg Clayton    0, // 0x18 DW_FORM_exprloc
89988be08a3fe9bb21bb1f518dcf15f2cbf61693d9Greg Clayton    0, // 0x19 DW_FORM_flag_present
90988be08a3fe9bb21bb1f518dcf15f2cbf61693d9Greg Clayton    0, // 0x1a
91988be08a3fe9bb21bb1f518dcf15f2cbf61693d9Greg Clayton    0, // 0x1b
92988be08a3fe9bb21bb1f518dcf15f2cbf61693d9Greg Clayton    0, // 0x1c
93988be08a3fe9bb21bb1f518dcf15f2cbf61693d9Greg Clayton    0, // 0x1d
94988be08a3fe9bb21bb1f518dcf15f2cbf61693d9Greg Clayton    0, // 0x1e
95988be08a3fe9bb21bb1f518dcf15f2cbf61693d9Greg Clayton    0, // 0x1f
96988be08a3fe9bb21bb1f518dcf15f2cbf61693d9Greg Clayton    8, // 0x20 DW_FORM_ref_sig8
975fcff9ac1a713d5e814b4a05edef7544be470ad0Greg Clayton};
985fcff9ac1a713d5e814b4a05edef7544be470ad0Greg Clayton
995fcff9ac1a713d5e814b4a05edef7544be470ad0Greg Claytonconst uint8_t *
1005fcff9ac1a713d5e814b4a05edef7544be470ad0Greg ClaytonDWARFFormValue::GetFixedFormSizesForAddressSize (uint8_t addr_size)
1015fcff9ac1a713d5e814b4a05edef7544be470ad0Greg Clayton{
1025fcff9ac1a713d5e814b4a05edef7544be470ad0Greg Clayton    switch (addr_size)
1035fcff9ac1a713d5e814b4a05edef7544be470ad0Greg Clayton    {
1045fcff9ac1a713d5e814b4a05edef7544be470ad0Greg Clayton    case 4: return g_form_sizes_addr4;
1055fcff9ac1a713d5e814b4a05edef7544be470ad0Greg Clayton    case 8: return g_form_sizes_addr8;
1065fcff9ac1a713d5e814b4a05edef7544be470ad0Greg Clayton    }
1075fcff9ac1a713d5e814b4a05edef7544be470ad0Greg Clayton    return NULL;
1085fcff9ac1a713d5e814b4a05edef7544be470ad0Greg Clayton}
1095fcff9ac1a713d5e814b4a05edef7544be470ad0Greg Clayton
11024943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerDWARFFormValue::DWARFFormValue(dw_form_t form) :
11124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_form(form),
11224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_value()
11324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
11424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
11524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
11624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool
11724943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerDWARFFormValue::ExtractValue(const DataExtractor& data, uint32_t* offset_ptr, const DWARFCompileUnit* cu)
11824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
11924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    bool indirect = false;
12024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    bool is_block = false;
12124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_value.data = NULL;
12224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // Read the value for the form into value and follow and DW_FORM_indirect instances we run into
12324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    do
12424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
12524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        indirect = false;
12624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        switch (m_form)
12724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
12824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case DW_FORM_addr:      m_value.value.uval = data.GetMaxU64(offset_ptr, DWARFCompileUnit::GetAddressByteSize(cu));  break;
12924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case DW_FORM_block2:    m_value.value.uval = data.GetU16(offset_ptr); is_block = true;          break;
13024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case DW_FORM_block4:    m_value.value.uval = data.GetU32(offset_ptr); is_block = true;          break;
13124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case DW_FORM_data2:     m_value.value.uval = data.GetU16(offset_ptr);                           break;
13224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case DW_FORM_data4:     m_value.value.uval = data.GetU32(offset_ptr);                           break;
13324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case DW_FORM_data8:     m_value.value.uval = data.GetU64(offset_ptr);                           break;
13424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case DW_FORM_string:    m_value.value.cstr = data.GetCStr(offset_ptr);
13524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                // Set the string value to also be the data for inlined cstr form values only
13624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                // so we can tell the differnence between DW_FORM_string and DW_FORM_strp form
13724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                // values;
13824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                m_value.data = (uint8_t*)m_value.value.cstr;                            break;
139988be08a3fe9bb21bb1f518dcf15f2cbf61693d9Greg Clayton        case DW_FORM_exprloc:
14024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case DW_FORM_block:     m_value.value.uval = data.GetULEB128(offset_ptr); is_block = true;      break;
14124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case DW_FORM_block1:    m_value.value.uval = data.GetU8(offset_ptr); is_block = true;           break;
14224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case DW_FORM_data1:     m_value.value.uval = data.GetU8(offset_ptr);                            break;
14324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case DW_FORM_flag:      m_value.value.uval = data.GetU8(offset_ptr);                            break;
14424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case DW_FORM_sdata:     m_value.value.sval = data.GetSLEB128(offset_ptr);                       break;
14524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case DW_FORM_strp:      m_value.value.uval = data.GetU32(offset_ptr);                           break;
14624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //  case DW_FORM_APPLE_db_str:
14724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case DW_FORM_udata:     m_value.value.uval = data.GetULEB128(offset_ptr);                       break;
14824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case DW_FORM_ref_addr:  m_value.value.uval = data.GetMaxU64(offset_ptr, DWARFCompileUnit::GetAddressByteSize(cu));  break;
14924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case DW_FORM_ref1:      m_value.value.uval = data.GetU8(offset_ptr);                            break;
15024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case DW_FORM_ref2:      m_value.value.uval = data.GetU16(offset_ptr);                           break;
15124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case DW_FORM_ref4:      m_value.value.uval = data.GetU32(offset_ptr);                           break;
15224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case DW_FORM_ref8:      m_value.value.uval = data.GetU64(offset_ptr);                           break;
15324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case DW_FORM_ref_udata: m_value.value.uval = data.GetULEB128(offset_ptr);                       break;
15424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case DW_FORM_indirect:
15524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            m_form = data.GetULEB128(offset_ptr);
15624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            indirect = true;
15724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            break;
15824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
159988be08a3fe9bb21bb1f518dcf15f2cbf61693d9Greg Clayton        case DW_FORM_sec_offset:    m_value.value.uval = data.GetU32(offset_ptr);                       break;
160988be08a3fe9bb21bb1f518dcf15f2cbf61693d9Greg Clayton        case DW_FORM_flag_present:  m_value.value.uval = 1;                                             break;
161988be08a3fe9bb21bb1f518dcf15f2cbf61693d9Greg Clayton        case DW_FORM_ref_sig8:      m_value.value.uval = data.GetU64(offset_ptr);                       break;
16224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        default:
16324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            return false;
16424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            break;
16524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
16624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    } while (indirect);
16724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
16824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (is_block)
16924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
17024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        m_value.data = data.PeekData(*offset_ptr, m_value.value.uval);
17124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (m_value.data != NULL)
17224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
17324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            *offset_ptr += m_value.value.uval;
17424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
17524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
17624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
17724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return true;
17824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
17924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
18024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool
18124943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerDWARFFormValue::SkipValue(const DataExtractor& debug_info_data, uint32_t* offset_ptr, const DWARFCompileUnit* cu) const
18224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
18324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return DWARFFormValue::SkipValue(m_form, debug_info_data, offset_ptr, cu);
18424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
18524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
18624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool
18724943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerDWARFFormValue::SkipValue(dw_form_t form, const DataExtractor& debug_info_data, uint32_t* offset_ptr, const DWARFCompileUnit* cu)
18824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
18924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    bool indirect = false;
19024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    do
19124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
19224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        indirect = false;
19324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        switch (form)
19424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
19524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        // Blocks if inlined data that have a length field and the data bytes
19624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        // inlined in the .debug_info
197988be08a3fe9bb21bb1f518dcf15f2cbf61693d9Greg Clayton        case DW_FORM_exprloc:
198988be08a3fe9bb21bb1f518dcf15f2cbf61693d9Greg Clayton        case DW_FORM_block:  { dw_uleb128_t size = debug_info_data.GetULEB128(offset_ptr); *offset_ptr += size; } return true;
199988be08a3fe9bb21bb1f518dcf15f2cbf61693d9Greg Clayton        case DW_FORM_block1: { dw_uleb128_t size = debug_info_data.GetU8(offset_ptr);      *offset_ptr += size; } return true;
200988be08a3fe9bb21bb1f518dcf15f2cbf61693d9Greg Clayton        case DW_FORM_block2: { dw_uleb128_t size = debug_info_data.GetU16(offset_ptr);     *offset_ptr += size; } return true;
201988be08a3fe9bb21bb1f518dcf15f2cbf61693d9Greg Clayton        case DW_FORM_block4: { dw_uleb128_t size = debug_info_data.GetU32(offset_ptr);     *offset_ptr += size; } return true;
20224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
20324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        // Inlined NULL terminated C-strings
204988be08a3fe9bb21bb1f518dcf15f2cbf61693d9Greg Clayton        case DW_FORM_string:
20524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            debug_info_data.GetCStr(offset_ptr);
20624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            return true;
20724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
20824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        // Compile unit address sized values
209988be08a3fe9bb21bb1f518dcf15f2cbf61693d9Greg Clayton        case DW_FORM_addr:
210988be08a3fe9bb21bb1f518dcf15f2cbf61693d9Greg Clayton        case DW_FORM_ref_addr:
21124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            *offset_ptr += DWARFCompileUnit::GetAddressByteSize(cu);
21224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            return true;
21324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
214988be08a3fe9bb21bb1f518dcf15f2cbf61693d9Greg Clayton        // 0 bytes values (implied from DW_FORM)
215988be08a3fe9bb21bb1f518dcf15f2cbf61693d9Greg Clayton        case DW_FORM_flag_present:
216988be08a3fe9bb21bb1f518dcf15f2cbf61693d9Greg Clayton            return true;
217988be08a3fe9bb21bb1f518dcf15f2cbf61693d9Greg Clayton
21824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        // 1 byte values
219988be08a3fe9bb21bb1f518dcf15f2cbf61693d9Greg Clayton        case DW_FORM_data1:
220988be08a3fe9bb21bb1f518dcf15f2cbf61693d9Greg Clayton        case DW_FORM_flag:
221988be08a3fe9bb21bb1f518dcf15f2cbf61693d9Greg Clayton        case DW_FORM_ref1:
22224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            *offset_ptr += 1;
22324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            return true;
22424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
22524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        // 2 byte values
226988be08a3fe9bb21bb1f518dcf15f2cbf61693d9Greg Clayton        case DW_FORM_data2:
227988be08a3fe9bb21bb1f518dcf15f2cbf61693d9Greg Clayton        case DW_FORM_ref2:
22824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            *offset_ptr += 2;
22924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            return true;
23024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
231988be08a3fe9bb21bb1f518dcf15f2cbf61693d9Greg Clayton        // 32 bit for DWARF 32, 64 for DWARF 64
232988be08a3fe9bb21bb1f518dcf15f2cbf61693d9Greg Clayton        case DW_FORM_sec_offset:
233988be08a3fe9bb21bb1f518dcf15f2cbf61693d9Greg Clayton            *offset_ptr += 4;
234988be08a3fe9bb21bb1f518dcf15f2cbf61693d9Greg Clayton            return true;
235988be08a3fe9bb21bb1f518dcf15f2cbf61693d9Greg Clayton
23624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        // 4 byte values
237988be08a3fe9bb21bb1f518dcf15f2cbf61693d9Greg Clayton        case DW_FORM_strp:
238988be08a3fe9bb21bb1f518dcf15f2cbf61693d9Greg Clayton        case DW_FORM_data4:
239988be08a3fe9bb21bb1f518dcf15f2cbf61693d9Greg Clayton        case DW_FORM_ref4:
24024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            *offset_ptr += 4;
24124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            return true;
24224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
24324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        // 8 byte values
244988be08a3fe9bb21bb1f518dcf15f2cbf61693d9Greg Clayton        case DW_FORM_data8:
245988be08a3fe9bb21bb1f518dcf15f2cbf61693d9Greg Clayton        case DW_FORM_ref8:
246988be08a3fe9bb21bb1f518dcf15f2cbf61693d9Greg Clayton        case DW_FORM_ref_sig8:
24724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            *offset_ptr += 8;
24824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            return true;
24924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
25024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        // signed or unsigned LEB 128 values
251988be08a3fe9bb21bb1f518dcf15f2cbf61693d9Greg Clayton        case DW_FORM_sdata:
252988be08a3fe9bb21bb1f518dcf15f2cbf61693d9Greg Clayton        case DW_FORM_udata:
253988be08a3fe9bb21bb1f518dcf15f2cbf61693d9Greg Clayton        case DW_FORM_ref_udata:
25424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            debug_info_data.Skip_LEB128(offset_ptr);
25524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            return true;
25624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
257988be08a3fe9bb21bb1f518dcf15f2cbf61693d9Greg Clayton        case DW_FORM_indirect:
25824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            indirect = true;
25924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            form = debug_info_data.GetULEB128(offset_ptr);
26024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            break;
26124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        default:
26224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            return false;
26324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
26424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    } while (indirect);
26524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return true;
26624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
26724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
26824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
26924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid
270169c5fbc8cac8a0bd724bd18fd9d816ca3d6486aJim InghamDWARFFormValue::Dump(Stream &s, const DataExtractor* debug_str_data, const DWARFCompileUnit* cu) const
27124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
27224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    uint64_t uvalue = Unsigned();
27324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    bool cu_relative_offset = false;
27424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
275169c5fbc8cac8a0bd724bd18fd9d816ca3d6486aJim Ingham    bool verbose = s.GetVerbose();
27624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
27724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    switch (m_form)
27824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
279169c5fbc8cac8a0bd724bd18fd9d816ca3d6486aJim Ingham    case DW_FORM_addr:      s.Address(uvalue, sizeof (uint64_t)); break;
28024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    case DW_FORM_flag:
281169c5fbc8cac8a0bd724bd18fd9d816ca3d6486aJim Ingham    case DW_FORM_data1:     s.PutHex8(uvalue);     break;
282169c5fbc8cac8a0bd724bd18fd9d816ca3d6486aJim Ingham    case DW_FORM_data2:     s.PutHex16(uvalue);        break;
283988be08a3fe9bb21bb1f518dcf15f2cbf61693d9Greg Clayton    case DW_FORM_sec_offset:
284169c5fbc8cac8a0bd724bd18fd9d816ca3d6486aJim Ingham    case DW_FORM_data4:     s.PutHex32(uvalue);        break;
285988be08a3fe9bb21bb1f518dcf15f2cbf61693d9Greg Clayton    case DW_FORM_ref_sig8:
286169c5fbc8cac8a0bd724bd18fd9d816ca3d6486aJim Ingham    case DW_FORM_data8:     s.PutHex64(uvalue);        break;
287169c5fbc8cac8a0bd724bd18fd9d816ca3d6486aJim Ingham    case DW_FORM_string:    s.QuotedCString(AsCString(NULL));          break;
288988be08a3fe9bb21bb1f518dcf15f2cbf61693d9Greg Clayton    case DW_FORM_exprloc:
28924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    case DW_FORM_block:
29024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    case DW_FORM_block1:
29124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    case DW_FORM_block2:
29224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    case DW_FORM_block4:
29324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (uvalue > 0)
29424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
29524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            switch (m_form)
29624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
297988be08a3fe9bb21bb1f518dcf15f2cbf61693d9Greg Clayton            case DW_FORM_exprloc:
298169c5fbc8cac8a0bd724bd18fd9d816ca3d6486aJim Ingham            case DW_FORM_block:  s.Printf("<0x%llx> ", uvalue);                break;
299169c5fbc8cac8a0bd724bd18fd9d816ca3d6486aJim Ingham            case DW_FORM_block1: s.Printf("<0x%2.2x> ", (uint8_t)uvalue);      break;
300169c5fbc8cac8a0bd724bd18fd9d816ca3d6486aJim Ingham            case DW_FORM_block2: s.Printf("<0x%4.4x> ", (uint16_t)uvalue);     break;
301169c5fbc8cac8a0bd724bd18fd9d816ca3d6486aJim Ingham            case DW_FORM_block4: s.Printf("<0x%8.8x> ", (uint32_t)uvalue);     break;
30224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            default:                                                            break;
30324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
30424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
30524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            const uint8_t* data_ptr = m_value.data;
30624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (data_ptr)
30724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
30824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                const uint8_t* end_data_ptr = data_ptr + uvalue;    // uvalue contains size of block
30924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                while (data_ptr < end_data_ptr)
31024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                {
311169c5fbc8cac8a0bd724bd18fd9d816ca3d6486aJim Ingham                    s.Printf("%2.2x ", *data_ptr);
31224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    ++data_ptr;
31324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                }
31424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
31524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            else
316169c5fbc8cac8a0bd724bd18fd9d816ca3d6486aJim Ingham                s.PutCString("NULL");
31724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
31824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        break;
31924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
320169c5fbc8cac8a0bd724bd18fd9d816ca3d6486aJim Ingham    case DW_FORM_sdata:     s.PutSLEB128(uvalue); break;
321169c5fbc8cac8a0bd724bd18fd9d816ca3d6486aJim Ingham    case DW_FORM_udata:     s.PutULEB128(uvalue); break;
32224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    case DW_FORM_strp:
32324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (debug_str_data)
32424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
32524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (verbose)
326169c5fbc8cac8a0bd724bd18fd9d816ca3d6486aJim Ingham                s.Printf(" .debug_str[0x%8.8x] = ", (uint32_t)uvalue);
32724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
32824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            const char* dbg_str = AsCString(debug_str_data);
32924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (dbg_str)
330169c5fbc8cac8a0bd724bd18fd9d816ca3d6486aJim Ingham                s.QuotedCString(dbg_str);
33124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
33224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        else
33324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
334169c5fbc8cac8a0bd724bd18fd9d816ca3d6486aJim Ingham            s.PutHex32(uvalue);
33524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
33624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        break;
33724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
33824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    case DW_FORM_ref_addr:
33924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
340169c5fbc8cac8a0bd724bd18fd9d816ca3d6486aJim Ingham        s.Address(uvalue, sizeof (uint64_t) * 2);
34124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        break;
34224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
343169c5fbc8cac8a0bd724bd18fd9d816ca3d6486aJim Ingham    case DW_FORM_ref1:      cu_relative_offset = true;  if (verbose) s.Printf("cu + 0x%2.2x", (uint8_t)uvalue); break;
344169c5fbc8cac8a0bd724bd18fd9d816ca3d6486aJim Ingham    case DW_FORM_ref2:      cu_relative_offset = true;  if (verbose) s.Printf("cu + 0x%4.4x", (uint16_t)uvalue); break;
345169c5fbc8cac8a0bd724bd18fd9d816ca3d6486aJim Ingham    case DW_FORM_ref4:      cu_relative_offset = true;  if (verbose) s.Printf("cu + 0x%4.4x", (uint32_t)uvalue); break;
346169c5fbc8cac8a0bd724bd18fd9d816ca3d6486aJim Ingham    case DW_FORM_ref8:      cu_relative_offset = true;  if (verbose) s.Printf("cu + 0x%8.8llx", uvalue); break;
347169c5fbc8cac8a0bd724bd18fd9d816ca3d6486aJim Ingham    case DW_FORM_ref_udata: cu_relative_offset = true;  if (verbose) s.Printf("cu + 0x%llx", uvalue); break;
34824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
34924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // All DW_FORM_indirect attributes should be resolved prior to calling this function
350169c5fbc8cac8a0bd724bd18fd9d816ca3d6486aJim Ingham    case DW_FORM_indirect:  s.PutCString("DW_FORM_indirect"); break;
351988be08a3fe9bb21bb1f518dcf15f2cbf61693d9Greg Clayton    case DW_FORM_flag_present: break;
35224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    default:
353169c5fbc8cac8a0bd724bd18fd9d816ca3d6486aJim Ingham        s.Printf("DW_FORM(0x%4.4x)", m_form);
35424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        break;
35524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
35624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
35724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (cu_relative_offset)
35824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
35924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (verbose)
360169c5fbc8cac8a0bd724bd18fd9d816ca3d6486aJim Ingham            s.PutCString(" => ");
36124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
3627e5fa7fc1f8efd24c078e063b2c4b5e13ba5be20Jason Molenda        s.Printf("{0x%8.8llx}", (uvalue + (cu ? cu->GetOffset() : 0)));
36324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
36424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
36524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
36624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerconst char*
36724943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerDWARFFormValue::AsCString(const DataExtractor* debug_str_data_ptr) const
36824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
36924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (IsInlinedCStr())
37024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return m_value.value.cstr;
37124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    else if (debug_str_data_ptr)
37224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return debug_str_data_ptr->PeekCStr(m_value.value.uval);
37324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return NULL;
37424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
37524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
37624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattneruint64_t
37724943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerDWARFFormValue::Reference(const DWARFCompileUnit* cu) const
37824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
37924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    uint64_t die_offset = m_value.value.uval;
38024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    switch (m_form)
38124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
38224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    case DW_FORM_ref1:
38324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    case DW_FORM_ref2:
38424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    case DW_FORM_ref4:
38524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    case DW_FORM_ref8:
38624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    case DW_FORM_ref_udata:
38724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        die_offset += (cu ? cu->GetOffset() : 0);
38824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        break;
38924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
39024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    default:
39124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        break;
39224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
39324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
39424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return die_offset;
39524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
39624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
39737bb8ddd443da172f42bb8657f15ec856a525c84Greg Claytonuint64_t
39837bb8ddd443da172f42bb8657f15ec856a525c84Greg ClaytonDWARFFormValue::Reference (dw_offset_t base_offset) const
39937bb8ddd443da172f42bb8657f15ec856a525c84Greg Clayton{
40037bb8ddd443da172f42bb8657f15ec856a525c84Greg Clayton    uint64_t die_offset = m_value.value.uval;
40137bb8ddd443da172f42bb8657f15ec856a525c84Greg Clayton    switch (m_form)
40237bb8ddd443da172f42bb8657f15ec856a525c84Greg Clayton    {
40337bb8ddd443da172f42bb8657f15ec856a525c84Greg Clayton        case DW_FORM_ref1:
40437bb8ddd443da172f42bb8657f15ec856a525c84Greg Clayton        case DW_FORM_ref2:
40537bb8ddd443da172f42bb8657f15ec856a525c84Greg Clayton        case DW_FORM_ref4:
40637bb8ddd443da172f42bb8657f15ec856a525c84Greg Clayton        case DW_FORM_ref8:
40737bb8ddd443da172f42bb8657f15ec856a525c84Greg Clayton        case DW_FORM_ref_udata:
40837bb8ddd443da172f42bb8657f15ec856a525c84Greg Clayton            die_offset += base_offset;
40937bb8ddd443da172f42bb8657f15ec856a525c84Greg Clayton            break;
41037bb8ddd443da172f42bb8657f15ec856a525c84Greg Clayton
41137bb8ddd443da172f42bb8657f15ec856a525c84Greg Clayton        default:
41237bb8ddd443da172f42bb8657f15ec856a525c84Greg Clayton            break;
41337bb8ddd443da172f42bb8657f15ec856a525c84Greg Clayton    }
41437bb8ddd443da172f42bb8657f15ec856a525c84Greg Clayton
41537bb8ddd443da172f42bb8657f15ec856a525c84Greg Clayton    return die_offset;
41637bb8ddd443da172f42bb8657f15ec856a525c84Greg Clayton}
41737bb8ddd443da172f42bb8657f15ec856a525c84Greg Clayton
41824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//----------------------------------------------------------------------
41924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Resolve any compile unit specific references so that we don't need
42024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// the compile unit at a later time in order to work with the form
42124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// value.
42224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//----------------------------------------------------------------------
42324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool
42424943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerDWARFFormValue::ResolveCompileUnitReferences(const DWARFCompileUnit* cu)
42524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
42624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    switch (m_form)
42724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
42824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    case DW_FORM_ref1:
42924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    case DW_FORM_ref2:
43024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    case DW_FORM_ref4:
43124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    case DW_FORM_ref8:
43224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    case DW_FORM_ref_udata:
43324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        m_value.value.uval += cu->GetOffset();
43424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        m_form = DW_FORM_ref_addr;
43524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return true;
43624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        break;
43724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
43824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    default:
43924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        break;
44024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
44124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
44224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return false;
44324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
44424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
44524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerconst uint8_t*
44624943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerDWARFFormValue::BlockData() const
44724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
44824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (!IsInlinedCStr())
44924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return m_value.data;
45024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return NULL;
45124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
45224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
45324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
45424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool
45524943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerDWARFFormValue::IsBlockForm(const dw_form_t form)
45624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
45724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    switch (form)
45824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
45924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    case DW_FORM_block:
46024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    case DW_FORM_block1:
46124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    case DW_FORM_block2:
46224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    case DW_FORM_block4:
46324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return true;
46424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
46524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return false;
46624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
46724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
46824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool
46924943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerDWARFFormValue::IsDataForm(const dw_form_t form)
47024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
47124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    switch (form)
47224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
47324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    case DW_FORM_sdata:
47424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    case DW_FORM_udata:
47524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    case DW_FORM_data1:
47624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    case DW_FORM_data2:
47724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    case DW_FORM_data4:
47824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    case DW_FORM_data8:
47924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return true;
48024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
48124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return false;
48224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
48324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
48424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerint
48524943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerDWARFFormValue::Compare (const DWARFFormValue& a_value, const DWARFFormValue& b_value, const DWARFCompileUnit* a_cu, const DWARFCompileUnit* b_cu, const DataExtractor* debug_str_data_ptr)
48624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
48724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    dw_form_t a_form = a_value.Form();
48824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    dw_form_t b_form = b_value.Form();
48924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (a_form < b_form)
49024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return -1;
49124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (a_form > b_form)
49224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return 1;
49324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    switch (a_form)
49424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
49524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    case DW_FORM_addr:
49624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    case DW_FORM_flag:
49724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    case DW_FORM_data1:
49824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    case DW_FORM_data2:
49924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    case DW_FORM_data4:
50024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    case DW_FORM_data8:
50124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    case DW_FORM_udata:
50224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    case DW_FORM_ref_addr:
503988be08a3fe9bb21bb1f518dcf15f2cbf61693d9Greg Clayton    case DW_FORM_sec_offset:
504988be08a3fe9bb21bb1f518dcf15f2cbf61693d9Greg Clayton    case DW_FORM_flag_present:
505988be08a3fe9bb21bb1f518dcf15f2cbf61693d9Greg Clayton    case DW_FORM_ref_sig8:
50624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
50724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            uint64_t a = a_value.Unsigned();
50824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            uint64_t b = b_value.Unsigned();
50924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (a < b)
51024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                return -1;
51124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (a > b)
51224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                return 1;
51324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            return 0;
51424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
51524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
51624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    case DW_FORM_sdata:
51724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
51824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            int64_t a = a_value.Signed();
51924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            int64_t b = b_value.Signed();
52024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (a < b)
52124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                return -1;
52224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (a > b)
52324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                return 1;
52424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            return 0;
52524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
52624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
52724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    case DW_FORM_string:
52824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    case DW_FORM_strp:
52924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
53024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            const char *a_string = a_value.AsCString(debug_str_data_ptr);
53124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            const char *b_string = b_value.AsCString(debug_str_data_ptr);
53224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (a_string == b_string)
53324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                return 0;
53424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            else if (a_string && b_string)
53524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                return strcmp(a_string, b_string);
53624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            else if (a_string == NULL)
53724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                return -1;  // A string is NULL, and B is valid
53824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            else
53924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                return 1;   // A string valid, and B is NULL
54024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
54124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
54224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
54324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    case DW_FORM_block:
54424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    case DW_FORM_block1:
54524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    case DW_FORM_block2:
54624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    case DW_FORM_block4:
547988be08a3fe9bb21bb1f518dcf15f2cbf61693d9Greg Clayton    case DW_FORM_exprloc:
54824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
54924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            uint64_t a_len = a_value.Unsigned();
55024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            uint64_t b_len = b_value.Unsigned();
55124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (a_len < b_len)
55224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                return -1;
55324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (a_len > b_len)
55424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                return 1;
55524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            // The block lengths are the same
55624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            return memcmp(a_value.BlockData(), b_value.BlockData(), a_value.Unsigned());
55724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
55824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        break;
55924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
56024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    case DW_FORM_ref1:
56124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    case DW_FORM_ref2:
56224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    case DW_FORM_ref4:
56324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    case DW_FORM_ref8:
56424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    case DW_FORM_ref_udata:
56524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
56624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            uint64_t a = a_value.Reference(a_cu);
56724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            uint64_t b = b_value.Reference(b_cu);
56824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (a < b)
56924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                return -1;
57024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (a > b)
57124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                return 1;
57224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            return 0;
57324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
57424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
57524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    case DW_FORM_indirect:
57624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        assert(!"This shouldn't happen after the form has been extracted...");
57724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        break;
57824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
57924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    default:
58024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        assert(!"Unhandled DW_FORM");
58124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        break;
58224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
58324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return -1;
58424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
58524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
586