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
413f8c60656ba14750deff97961eb032f20a7c408aGreg Clayton    0, // 0x10 DW_FORM_ref_addr (addr size for DWARF2 and earlier, 4 bytes for DWARF32, 8 bytes for DWARF32 in DWARF 3 and later
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
803f8c60656ba14750deff97961eb032f20a7c408aGreg Clayton    0, // 0x10 DW_FORM_ref_addr (addr size for DWARF2 and earlier, 4 bytes for DWARF32, 8 bytes for DWARF32 in DWARF 3 and later
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
11736da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg ClaytonDWARFFormValue::ExtractValue(const DataExtractor& data, lldb::offset_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;
1483f8c60656ba14750deff97961eb032f20a7c408aGreg Clayton        case DW_FORM_ref_addr:
1493f8c60656ba14750deff97961eb032f20a7c408aGreg Clayton            if (cu->GetVersion() <= 2)
1503f8c60656ba14750deff97961eb032f20a7c408aGreg Clayton                m_value.value.uval = data.GetMaxU64(offset_ptr, DWARFCompileUnit::GetAddressByteSize(cu));
1513f8c60656ba14750deff97961eb032f20a7c408aGreg Clayton            else
1523f8c60656ba14750deff97961eb032f20a7c408aGreg Clayton                m_value.value.uval = data.GetU32(offset_ptr); // 4 for DWARF32, 8 for DWARF64, but we don't support DWARF64 yet
1533f8c60656ba14750deff97961eb032f20a7c408aGreg Clayton            break;
15424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case DW_FORM_ref1:      m_value.value.uval = data.GetU8(offset_ptr);                            break;
15524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case DW_FORM_ref2:      m_value.value.uval = data.GetU16(offset_ptr);                           break;
15624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case DW_FORM_ref4:      m_value.value.uval = data.GetU32(offset_ptr);                           break;
15724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case DW_FORM_ref8:      m_value.value.uval = data.GetU64(offset_ptr);                           break;
15824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case DW_FORM_ref_udata: m_value.value.uval = data.GetULEB128(offset_ptr);                       break;
15924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case DW_FORM_indirect:
16024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            m_form = data.GetULEB128(offset_ptr);
16124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            indirect = true;
16224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            break;
16324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
164988be08a3fe9bb21bb1f518dcf15f2cbf61693d9Greg Clayton        case DW_FORM_sec_offset:    m_value.value.uval = data.GetU32(offset_ptr);                       break;
165988be08a3fe9bb21bb1f518dcf15f2cbf61693d9Greg Clayton        case DW_FORM_flag_present:  m_value.value.uval = 1;                                             break;
166988be08a3fe9bb21bb1f518dcf15f2cbf61693d9Greg Clayton        case DW_FORM_ref_sig8:      m_value.value.uval = data.GetU64(offset_ptr);                       break;
16724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        default:
16824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            return false;
16924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            break;
17024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
17124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    } while (indirect);
17224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
17324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (is_block)
17424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
17524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        m_value.data = data.PeekData(*offset_ptr, m_value.value.uval);
17624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (m_value.data != NULL)
17724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
17824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            *offset_ptr += m_value.value.uval;
17924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
18024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
18124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
18224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return true;
18324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
18424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
18524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool
18636da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg ClaytonDWARFFormValue::SkipValue(const DataExtractor& debug_info_data, lldb::offset_t *offset_ptr, const DWARFCompileUnit* cu) const
18724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
18824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return DWARFFormValue::SkipValue(m_form, debug_info_data, offset_ptr, cu);
18924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
19024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
19124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool
19236da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg ClaytonDWARFFormValue::SkipValue(dw_form_t form, const DataExtractor& debug_info_data, lldb::offset_t *offset_ptr, const DWARFCompileUnit* cu)
19324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
1944a379b1194f3e6b308cd6e80b45d6ca5dd0aafd7Greg Clayton    switch (form)
19524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
1964a379b1194f3e6b308cd6e80b45d6ca5dd0aafd7Greg Clayton    // Blocks if inlined data that have a length field and the data bytes
1974a379b1194f3e6b308cd6e80b45d6ca5dd0aafd7Greg Clayton    // inlined in the .debug_info
1984a379b1194f3e6b308cd6e80b45d6ca5dd0aafd7Greg Clayton    case DW_FORM_exprloc:
1994a379b1194f3e6b308cd6e80b45d6ca5dd0aafd7Greg Clayton    case DW_FORM_block:  { dw_uleb128_t size = debug_info_data.GetULEB128(offset_ptr); *offset_ptr += size; } return true;
2004a379b1194f3e6b308cd6e80b45d6ca5dd0aafd7Greg Clayton    case DW_FORM_block1: { dw_uleb128_t size = debug_info_data.GetU8(offset_ptr);      *offset_ptr += size; } return true;
2014a379b1194f3e6b308cd6e80b45d6ca5dd0aafd7Greg Clayton    case DW_FORM_block2: { dw_uleb128_t size = debug_info_data.GetU16(offset_ptr);     *offset_ptr += size; } return true;
2024a379b1194f3e6b308cd6e80b45d6ca5dd0aafd7Greg Clayton    case DW_FORM_block4: { dw_uleb128_t size = debug_info_data.GetU32(offset_ptr);     *offset_ptr += size; } return true;
20324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
2044a379b1194f3e6b308cd6e80b45d6ca5dd0aafd7Greg Clayton    // Inlined NULL terminated C-strings
2054a379b1194f3e6b308cd6e80b45d6ca5dd0aafd7Greg Clayton    case DW_FORM_string:
2064a379b1194f3e6b308cd6e80b45d6ca5dd0aafd7Greg Clayton        debug_info_data.GetCStr(offset_ptr);
2074a379b1194f3e6b308cd6e80b45d6ca5dd0aafd7Greg Clayton        return true;
2084a379b1194f3e6b308cd6e80b45d6ca5dd0aafd7Greg Clayton
2094a379b1194f3e6b308cd6e80b45d6ca5dd0aafd7Greg Clayton    // Compile unit address sized values
2104a379b1194f3e6b308cd6e80b45d6ca5dd0aafd7Greg Clayton    case DW_FORM_addr:
2114a379b1194f3e6b308cd6e80b45d6ca5dd0aafd7Greg Clayton        *offset_ptr += DWARFCompileUnit::GetAddressByteSize(cu);
2124a379b1194f3e6b308cd6e80b45d6ca5dd0aafd7Greg Clayton        return true;
2134a379b1194f3e6b308cd6e80b45d6ca5dd0aafd7Greg Clayton
2143f8c60656ba14750deff97961eb032f20a7c408aGreg Clayton    case DW_FORM_ref_addr:
2153f8c60656ba14750deff97961eb032f20a7c408aGreg Clayton        if (cu->GetVersion() <= 2)
2163f8c60656ba14750deff97961eb032f20a7c408aGreg Clayton            *offset_ptr += DWARFCompileUnit::GetAddressByteSize(cu);
2173f8c60656ba14750deff97961eb032f20a7c408aGreg Clayton        else
2183f8c60656ba14750deff97961eb032f20a7c408aGreg Clayton            *offset_ptr += 4;// 4 for DWARF32, 8 for DWARF64, but we don't support DWARF64 yet
2193f8c60656ba14750deff97961eb032f20a7c408aGreg Clayton        return true;
2203f8c60656ba14750deff97961eb032f20a7c408aGreg Clayton
2214a379b1194f3e6b308cd6e80b45d6ca5dd0aafd7Greg Clayton    // 0 bytes values (implied from DW_FORM)
2224a379b1194f3e6b308cd6e80b45d6ca5dd0aafd7Greg Clayton    case DW_FORM_flag_present:
2234a379b1194f3e6b308cd6e80b45d6ca5dd0aafd7Greg Clayton        return true;
2244a379b1194f3e6b308cd6e80b45d6ca5dd0aafd7Greg Clayton
2254a379b1194f3e6b308cd6e80b45d6ca5dd0aafd7Greg Clayton    // 1 byte values
2264a379b1194f3e6b308cd6e80b45d6ca5dd0aafd7Greg Clayton    case DW_FORM_data1:
2274a379b1194f3e6b308cd6e80b45d6ca5dd0aafd7Greg Clayton    case DW_FORM_flag:
2284a379b1194f3e6b308cd6e80b45d6ca5dd0aafd7Greg Clayton    case DW_FORM_ref1:
2294a379b1194f3e6b308cd6e80b45d6ca5dd0aafd7Greg Clayton        *offset_ptr += 1;
2304a379b1194f3e6b308cd6e80b45d6ca5dd0aafd7Greg Clayton        return true;
2314a379b1194f3e6b308cd6e80b45d6ca5dd0aafd7Greg Clayton
2324a379b1194f3e6b308cd6e80b45d6ca5dd0aafd7Greg Clayton    // 2 byte values
2334a379b1194f3e6b308cd6e80b45d6ca5dd0aafd7Greg Clayton    case DW_FORM_data2:
2344a379b1194f3e6b308cd6e80b45d6ca5dd0aafd7Greg Clayton    case DW_FORM_ref2:
2354a379b1194f3e6b308cd6e80b45d6ca5dd0aafd7Greg Clayton        *offset_ptr += 2;
2364a379b1194f3e6b308cd6e80b45d6ca5dd0aafd7Greg Clayton        return true;
2374a379b1194f3e6b308cd6e80b45d6ca5dd0aafd7Greg Clayton
2384a379b1194f3e6b308cd6e80b45d6ca5dd0aafd7Greg Clayton    // 32 bit for DWARF 32, 64 for DWARF 64
2394a379b1194f3e6b308cd6e80b45d6ca5dd0aafd7Greg Clayton    case DW_FORM_sec_offset:
2404a379b1194f3e6b308cd6e80b45d6ca5dd0aafd7Greg Clayton        *offset_ptr += 4;
2414a379b1194f3e6b308cd6e80b45d6ca5dd0aafd7Greg Clayton        return true;
2424a379b1194f3e6b308cd6e80b45d6ca5dd0aafd7Greg Clayton
2434a379b1194f3e6b308cd6e80b45d6ca5dd0aafd7Greg Clayton    // 4 byte values
2444a379b1194f3e6b308cd6e80b45d6ca5dd0aafd7Greg Clayton    case DW_FORM_strp:
2454a379b1194f3e6b308cd6e80b45d6ca5dd0aafd7Greg Clayton    case DW_FORM_data4:
2464a379b1194f3e6b308cd6e80b45d6ca5dd0aafd7Greg Clayton    case DW_FORM_ref4:
2474a379b1194f3e6b308cd6e80b45d6ca5dd0aafd7Greg Clayton        *offset_ptr += 4;
2484a379b1194f3e6b308cd6e80b45d6ca5dd0aafd7Greg Clayton        return true;
2494a379b1194f3e6b308cd6e80b45d6ca5dd0aafd7Greg Clayton
2504a379b1194f3e6b308cd6e80b45d6ca5dd0aafd7Greg Clayton    // 8 byte values
2514a379b1194f3e6b308cd6e80b45d6ca5dd0aafd7Greg Clayton    case DW_FORM_data8:
2524a379b1194f3e6b308cd6e80b45d6ca5dd0aafd7Greg Clayton    case DW_FORM_ref8:
2534a379b1194f3e6b308cd6e80b45d6ca5dd0aafd7Greg Clayton    case DW_FORM_ref_sig8:
2544a379b1194f3e6b308cd6e80b45d6ca5dd0aafd7Greg Clayton        *offset_ptr += 8;
2554a379b1194f3e6b308cd6e80b45d6ca5dd0aafd7Greg Clayton        return true;
2564a379b1194f3e6b308cd6e80b45d6ca5dd0aafd7Greg Clayton
2574a379b1194f3e6b308cd6e80b45d6ca5dd0aafd7Greg Clayton    // signed or unsigned LEB 128 values
2584a379b1194f3e6b308cd6e80b45d6ca5dd0aafd7Greg Clayton    case DW_FORM_sdata:
2594a379b1194f3e6b308cd6e80b45d6ca5dd0aafd7Greg Clayton    case DW_FORM_udata:
2604a379b1194f3e6b308cd6e80b45d6ca5dd0aafd7Greg Clayton    case DW_FORM_ref_udata:
2614a379b1194f3e6b308cd6e80b45d6ca5dd0aafd7Greg Clayton        debug_info_data.Skip_LEB128(offset_ptr);
2624a379b1194f3e6b308cd6e80b45d6ca5dd0aafd7Greg Clayton        return true;
2634a379b1194f3e6b308cd6e80b45d6ca5dd0aafd7Greg Clayton
2644a379b1194f3e6b308cd6e80b45d6ca5dd0aafd7Greg Clayton    case DW_FORM_indirect:
2654a379b1194f3e6b308cd6e80b45d6ca5dd0aafd7Greg Clayton        {
2664a379b1194f3e6b308cd6e80b45d6ca5dd0aafd7Greg Clayton            dw_form_t indirect_form = debug_info_data.GetULEB128(offset_ptr);
2674a379b1194f3e6b308cd6e80b45d6ca5dd0aafd7Greg Clayton            return DWARFFormValue::SkipValue (indirect_form,
2684a379b1194f3e6b308cd6e80b45d6ca5dd0aafd7Greg Clayton                                              debug_info_data,
2694a379b1194f3e6b308cd6e80b45d6ca5dd0aafd7Greg Clayton                                              offset_ptr,
2704a379b1194f3e6b308cd6e80b45d6ca5dd0aafd7Greg Clayton                                              cu);
27124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
2724a379b1194f3e6b308cd6e80b45d6ca5dd0aafd7Greg Clayton
2734a379b1194f3e6b308cd6e80b45d6ca5dd0aafd7Greg Clayton    default:
2744a379b1194f3e6b308cd6e80b45d6ca5dd0aafd7Greg Clayton        break;
2754a379b1194f3e6b308cd6e80b45d6ca5dd0aafd7Greg Clayton    }
2764a379b1194f3e6b308cd6e80b45d6ca5dd0aafd7Greg Clayton    return false;
27724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
27824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
27924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
28024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid
281169c5fbc8cac8a0bd724bd18fd9d816ca3d6486aJim InghamDWARFFormValue::Dump(Stream &s, const DataExtractor* debug_str_data, const DWARFCompileUnit* cu) const
28224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
28324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    uint64_t uvalue = Unsigned();
28424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    bool cu_relative_offset = false;
28524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
286169c5fbc8cac8a0bd724bd18fd9d816ca3d6486aJim Ingham    bool verbose = s.GetVerbose();
28724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
28824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    switch (m_form)
28924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
290169c5fbc8cac8a0bd724bd18fd9d816ca3d6486aJim Ingham    case DW_FORM_addr:      s.Address(uvalue, sizeof (uint64_t)); break;
29124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    case DW_FORM_flag:
292169c5fbc8cac8a0bd724bd18fd9d816ca3d6486aJim Ingham    case DW_FORM_data1:     s.PutHex8(uvalue);     break;
293169c5fbc8cac8a0bd724bd18fd9d816ca3d6486aJim Ingham    case DW_FORM_data2:     s.PutHex16(uvalue);        break;
294988be08a3fe9bb21bb1f518dcf15f2cbf61693d9Greg Clayton    case DW_FORM_sec_offset:
295169c5fbc8cac8a0bd724bd18fd9d816ca3d6486aJim Ingham    case DW_FORM_data4:     s.PutHex32(uvalue);        break;
296988be08a3fe9bb21bb1f518dcf15f2cbf61693d9Greg Clayton    case DW_FORM_ref_sig8:
297169c5fbc8cac8a0bd724bd18fd9d816ca3d6486aJim Ingham    case DW_FORM_data8:     s.PutHex64(uvalue);        break;
298169c5fbc8cac8a0bd724bd18fd9d816ca3d6486aJim Ingham    case DW_FORM_string:    s.QuotedCString(AsCString(NULL));          break;
299988be08a3fe9bb21bb1f518dcf15f2cbf61693d9Greg Clayton    case DW_FORM_exprloc:
30024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    case DW_FORM_block:
30124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    case DW_FORM_block1:
30224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    case DW_FORM_block2:
30324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    case DW_FORM_block4:
30424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (uvalue > 0)
30524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
30624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            switch (m_form)
30724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
308988be08a3fe9bb21bb1f518dcf15f2cbf61693d9Greg Clayton            case DW_FORM_exprloc:
3095f35a4be95aed0e5b2cb36f7d785bcbfc67284aeDaniel Malea            case DW_FORM_block:  s.Printf("<0x%" PRIx64 "> ", uvalue);                break;
310169c5fbc8cac8a0bd724bd18fd9d816ca3d6486aJim Ingham            case DW_FORM_block1: s.Printf("<0x%2.2x> ", (uint8_t)uvalue);      break;
311169c5fbc8cac8a0bd724bd18fd9d816ca3d6486aJim Ingham            case DW_FORM_block2: s.Printf("<0x%4.4x> ", (uint16_t)uvalue);     break;
312169c5fbc8cac8a0bd724bd18fd9d816ca3d6486aJim Ingham            case DW_FORM_block4: s.Printf("<0x%8.8x> ", (uint32_t)uvalue);     break;
31324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            default:                                                            break;
31424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
31524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
31624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            const uint8_t* data_ptr = m_value.data;
31724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (data_ptr)
31824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
31924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                const uint8_t* end_data_ptr = data_ptr + uvalue;    // uvalue contains size of block
32024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                while (data_ptr < end_data_ptr)
32124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                {
322169c5fbc8cac8a0bd724bd18fd9d816ca3d6486aJim Ingham                    s.Printf("%2.2x ", *data_ptr);
32324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    ++data_ptr;
32424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                }
32524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
32624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            else
327169c5fbc8cac8a0bd724bd18fd9d816ca3d6486aJim Ingham                s.PutCString("NULL");
32824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
32924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        break;
33024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
331169c5fbc8cac8a0bd724bd18fd9d816ca3d6486aJim Ingham    case DW_FORM_sdata:     s.PutSLEB128(uvalue); break;
332169c5fbc8cac8a0bd724bd18fd9d816ca3d6486aJim Ingham    case DW_FORM_udata:     s.PutULEB128(uvalue); break;
33324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    case DW_FORM_strp:
33424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (debug_str_data)
33524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
33624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (verbose)
337169c5fbc8cac8a0bd724bd18fd9d816ca3d6486aJim Ingham                s.Printf(" .debug_str[0x%8.8x] = ", (uint32_t)uvalue);
33824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
33924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            const char* dbg_str = AsCString(debug_str_data);
34024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (dbg_str)
341169c5fbc8cac8a0bd724bd18fd9d816ca3d6486aJim Ingham                s.QuotedCString(dbg_str);
34224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
34324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        else
34424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
345169c5fbc8cac8a0bd724bd18fd9d816ca3d6486aJim Ingham            s.PutHex32(uvalue);
34624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
34724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        break;
34824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
34924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    case DW_FORM_ref_addr:
35024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
3513f8c60656ba14750deff97961eb032f20a7c408aGreg Clayton        if (cu->GetVersion() <= 2)
3523f8c60656ba14750deff97961eb032f20a7c408aGreg Clayton            s.Address(uvalue, sizeof (uint64_t) * 2);
3533f8c60656ba14750deff97961eb032f20a7c408aGreg Clayton        else
3543f8c60656ba14750deff97961eb032f20a7c408aGreg Clayton            s.Address(uvalue, 4 * 2);// 4 for DWARF32, 8 for DWARF64, but we don't support DWARF64 yet
35524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        break;
35624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
357169c5fbc8cac8a0bd724bd18fd9d816ca3d6486aJim Ingham    case DW_FORM_ref1:      cu_relative_offset = true;  if (verbose) s.Printf("cu + 0x%2.2x", (uint8_t)uvalue); break;
358169c5fbc8cac8a0bd724bd18fd9d816ca3d6486aJim Ingham    case DW_FORM_ref2:      cu_relative_offset = true;  if (verbose) s.Printf("cu + 0x%4.4x", (uint16_t)uvalue); break;
359169c5fbc8cac8a0bd724bd18fd9d816ca3d6486aJim Ingham    case DW_FORM_ref4:      cu_relative_offset = true;  if (verbose) s.Printf("cu + 0x%4.4x", (uint32_t)uvalue); break;
3605f35a4be95aed0e5b2cb36f7d785bcbfc67284aeDaniel Malea    case DW_FORM_ref8:      cu_relative_offset = true;  if (verbose) s.Printf("cu + 0x%8.8" PRIx64, uvalue); break;
3615f35a4be95aed0e5b2cb36f7d785bcbfc67284aeDaniel Malea    case DW_FORM_ref_udata: cu_relative_offset = true;  if (verbose) s.Printf("cu + 0x%" PRIx64, uvalue); break;
36224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
36324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // All DW_FORM_indirect attributes should be resolved prior to calling this function
364169c5fbc8cac8a0bd724bd18fd9d816ca3d6486aJim Ingham    case DW_FORM_indirect:  s.PutCString("DW_FORM_indirect"); break;
365988be08a3fe9bb21bb1f518dcf15f2cbf61693d9Greg Clayton    case DW_FORM_flag_present: break;
36624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    default:
367169c5fbc8cac8a0bd724bd18fd9d816ca3d6486aJim Ingham        s.Printf("DW_FORM(0x%4.4x)", m_form);
36824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        break;
36924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
37024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
37124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (cu_relative_offset)
37224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
37324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (verbose)
374169c5fbc8cac8a0bd724bd18fd9d816ca3d6486aJim Ingham            s.PutCString(" => ");
37524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
3765f35a4be95aed0e5b2cb36f7d785bcbfc67284aeDaniel Malea        s.Printf("{0x%8.8" PRIx64 "}", (uvalue + (cu ? cu->GetOffset() : 0)));
37724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
37824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
37924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
38024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerconst char*
38124943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerDWARFFormValue::AsCString(const DataExtractor* debug_str_data_ptr) const
38224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
38324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (IsInlinedCStr())
38424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return m_value.value.cstr;
38524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    else if (debug_str_data_ptr)
38624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return debug_str_data_ptr->PeekCStr(m_value.value.uval);
38724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return NULL;
38824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
38924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
39024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattneruint64_t
39124943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerDWARFFormValue::Reference(const DWARFCompileUnit* cu) const
39224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
39324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    uint64_t die_offset = m_value.value.uval;
39424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    switch (m_form)
39524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
39624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    case DW_FORM_ref1:
39724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    case DW_FORM_ref2:
39824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    case DW_FORM_ref4:
39924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    case DW_FORM_ref8:
40024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    case DW_FORM_ref_udata:
40124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        die_offset += (cu ? cu->GetOffset() : 0);
40224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        break;
40324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
40424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    default:
40524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        break;
40624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
40724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
40824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return die_offset;
40924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
41024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
41137bb8ddd443da172f42bb8657f15ec856a525c84Greg Claytonuint64_t
41237bb8ddd443da172f42bb8657f15ec856a525c84Greg ClaytonDWARFFormValue::Reference (dw_offset_t base_offset) const
41337bb8ddd443da172f42bb8657f15ec856a525c84Greg Clayton{
41437bb8ddd443da172f42bb8657f15ec856a525c84Greg Clayton    uint64_t die_offset = m_value.value.uval;
41537bb8ddd443da172f42bb8657f15ec856a525c84Greg Clayton    switch (m_form)
41637bb8ddd443da172f42bb8657f15ec856a525c84Greg Clayton    {
41737bb8ddd443da172f42bb8657f15ec856a525c84Greg Clayton        case DW_FORM_ref1:
41837bb8ddd443da172f42bb8657f15ec856a525c84Greg Clayton        case DW_FORM_ref2:
41937bb8ddd443da172f42bb8657f15ec856a525c84Greg Clayton        case DW_FORM_ref4:
42037bb8ddd443da172f42bb8657f15ec856a525c84Greg Clayton        case DW_FORM_ref8:
42137bb8ddd443da172f42bb8657f15ec856a525c84Greg Clayton        case DW_FORM_ref_udata:
42237bb8ddd443da172f42bb8657f15ec856a525c84Greg Clayton            die_offset += base_offset;
42337bb8ddd443da172f42bb8657f15ec856a525c84Greg Clayton            break;
42437bb8ddd443da172f42bb8657f15ec856a525c84Greg Clayton
42537bb8ddd443da172f42bb8657f15ec856a525c84Greg Clayton        default:
42637bb8ddd443da172f42bb8657f15ec856a525c84Greg Clayton            break;
42737bb8ddd443da172f42bb8657f15ec856a525c84Greg Clayton    }
42837bb8ddd443da172f42bb8657f15ec856a525c84Greg Clayton
42937bb8ddd443da172f42bb8657f15ec856a525c84Greg Clayton    return die_offset;
43037bb8ddd443da172f42bb8657f15ec856a525c84Greg Clayton}
43137bb8ddd443da172f42bb8657f15ec856a525c84Greg Clayton
43224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//----------------------------------------------------------------------
43324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Resolve any compile unit specific references so that we don't need
43424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// the compile unit at a later time in order to work with the form
43524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// value.
43624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//----------------------------------------------------------------------
43724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool
43824943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerDWARFFormValue::ResolveCompileUnitReferences(const DWARFCompileUnit* cu)
43924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
44024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    switch (m_form)
44124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
44224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    case DW_FORM_ref1:
44324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    case DW_FORM_ref2:
44424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    case DW_FORM_ref4:
44524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    case DW_FORM_ref8:
44624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    case DW_FORM_ref_udata:
44724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        m_value.value.uval += cu->GetOffset();
44824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        m_form = DW_FORM_ref_addr;
44924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return true;
45024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        break;
45124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
45224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    default:
45324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        break;
45424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
45524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
45624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return false;
45724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
45824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
45924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerconst uint8_t*
46024943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerDWARFFormValue::BlockData() const
46124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
46224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (!IsInlinedCStr())
46324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return m_value.data;
46424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return NULL;
46524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
46624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
46724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
46824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool
46924943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerDWARFFormValue::IsBlockForm(const dw_form_t form)
47024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
47124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    switch (form)
47224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
47324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    case DW_FORM_block:
47424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    case DW_FORM_block1:
47524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    case DW_FORM_block2:
47624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    case DW_FORM_block4:
47724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return true;
47824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
47924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return false;
48024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
48124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
48224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool
48324943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerDWARFFormValue::IsDataForm(const dw_form_t form)
48424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
48524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    switch (form)
48624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
48724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    case DW_FORM_sdata:
48824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    case DW_FORM_udata:
48924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    case DW_FORM_data1:
49024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    case DW_FORM_data2:
49124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    case DW_FORM_data4:
49224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    case DW_FORM_data8:
49324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return true;
49424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
49524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return false;
49624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
49724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
49824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerint
49924943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerDWARFFormValue::Compare (const DWARFFormValue& a_value, const DWARFFormValue& b_value, const DWARFCompileUnit* a_cu, const DWARFCompileUnit* b_cu, const DataExtractor* debug_str_data_ptr)
50024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
50124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    dw_form_t a_form = a_value.Form();
50224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    dw_form_t b_form = b_value.Form();
50324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (a_form < b_form)
50424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return -1;
50524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (a_form > b_form)
50624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return 1;
50724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    switch (a_form)
50824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
50924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    case DW_FORM_addr:
51024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    case DW_FORM_flag:
51124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    case DW_FORM_data1:
51224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    case DW_FORM_data2:
51324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    case DW_FORM_data4:
51424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    case DW_FORM_data8:
51524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    case DW_FORM_udata:
51624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    case DW_FORM_ref_addr:
517988be08a3fe9bb21bb1f518dcf15f2cbf61693d9Greg Clayton    case DW_FORM_sec_offset:
518988be08a3fe9bb21bb1f518dcf15f2cbf61693d9Greg Clayton    case DW_FORM_flag_present:
519988be08a3fe9bb21bb1f518dcf15f2cbf61693d9Greg Clayton    case DW_FORM_ref_sig8:
52024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
52124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            uint64_t a = a_value.Unsigned();
52224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            uint64_t b = b_value.Unsigned();
52324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (a < b)
52424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                return -1;
52524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (a > b)
52624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                return 1;
52724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            return 0;
52824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
52924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
53024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    case DW_FORM_sdata:
53124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
53224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            int64_t a = a_value.Signed();
53324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            int64_t b = b_value.Signed();
53424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (a < b)
53524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                return -1;
53624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (a > b)
53724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                return 1;
53824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            return 0;
53924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
54024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
54124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    case DW_FORM_string:
54224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    case DW_FORM_strp:
54324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
54424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            const char *a_string = a_value.AsCString(debug_str_data_ptr);
54524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            const char *b_string = b_value.AsCString(debug_str_data_ptr);
54624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (a_string == b_string)
54724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                return 0;
54824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            else if (a_string && b_string)
54924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                return strcmp(a_string, b_string);
55024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            else if (a_string == NULL)
55124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                return -1;  // A string is NULL, and B is valid
55224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            else
55324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                return 1;   // A string valid, and B is NULL
55424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
55524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
55624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
55724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    case DW_FORM_block:
55824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    case DW_FORM_block1:
55924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    case DW_FORM_block2:
56024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    case DW_FORM_block4:
561988be08a3fe9bb21bb1f518dcf15f2cbf61693d9Greg Clayton    case DW_FORM_exprloc:
56224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
56324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            uint64_t a_len = a_value.Unsigned();
56424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            uint64_t b_len = b_value.Unsigned();
56524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (a_len < b_len)
56624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                return -1;
56724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (a_len > b_len)
56824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                return 1;
56924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            // The block lengths are the same
57024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            return memcmp(a_value.BlockData(), b_value.BlockData(), a_value.Unsigned());
57124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
57224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        break;
57324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
57424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    case DW_FORM_ref1:
57524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    case DW_FORM_ref2:
57624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    case DW_FORM_ref4:
57724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    case DW_FORM_ref8:
57824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    case DW_FORM_ref_udata:
57924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
58024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            uint64_t a = a_value.Reference(a_cu);
58124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            uint64_t b = b_value.Reference(b_cu);
58224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (a < b)
58324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                return -1;
58424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (a > b)
58524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                return 1;
58624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            return 0;
58724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
58824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
58924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    case DW_FORM_indirect:
59024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        assert(!"This shouldn't happen after the form has been extracted...");
59124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        break;
59224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
59324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    default:
59424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        assert(!"Unhandled DW_FORM");
59524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        break;
59624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
59724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return -1;
59824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
59924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
600