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