DWARFFormValue.cpp revision 5f35a4be95aed0e5b2cb36f7d785bcbfc67284ae
124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//===-- DWARFFormValue.cpp --------------------------------------*- C++ -*-===// 224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// The LLVM Compiler Infrastructure 424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// This file is distributed under the University of Illinois Open Source 624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// License. See LICENSE.TXT for details. 724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//===----------------------------------------------------------------------===// 924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 1024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include <assert.h> 1124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 1224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Core/dwarf.h" 1324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Core/Stream.h" 1424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 1524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "DWARFFormValue.h" 1624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "DWARFCompileUnit.h" 1724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 1824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerclass DWARFCompileUnit; 1924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 2024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerusing namespace lldb_private; 2124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 225fcff9ac1a713d5e814b4a05edef7544be470ad0Greg Clayton 235fcff9ac1a713d5e814b4a05edef7544be470ad0Greg Claytonstatic uint8_t g_form_sizes_addr4[] = 245fcff9ac1a713d5e814b4a05edef7544be470ad0Greg Clayton{ 255fcff9ac1a713d5e814b4a05edef7544be470ad0Greg Clayton 0, // 0x00 unused 265fcff9ac1a713d5e814b4a05edef7544be470ad0Greg Clayton 4, // 0x01 DW_FORM_addr 275fcff9ac1a713d5e814b4a05edef7544be470ad0Greg Clayton 0, // 0x02 unused 285fcff9ac1a713d5e814b4a05edef7544be470ad0Greg Clayton 0, // 0x03 DW_FORM_block2 295fcff9ac1a713d5e814b4a05edef7544be470ad0Greg Clayton 0, // 0x04 DW_FORM_block4 305fcff9ac1a713d5e814b4a05edef7544be470ad0Greg Clayton 2, // 0x05 DW_FORM_data2 315fcff9ac1a713d5e814b4a05edef7544be470ad0Greg Clayton 4, // 0x06 DW_FORM_data4 325fcff9ac1a713d5e814b4a05edef7544be470ad0Greg Clayton 8, // 0x07 DW_FORM_data8 335fcff9ac1a713d5e814b4a05edef7544be470ad0Greg Clayton 0, // 0x08 DW_FORM_string 345fcff9ac1a713d5e814b4a05edef7544be470ad0Greg Clayton 0, // 0x09 DW_FORM_block 355fcff9ac1a713d5e814b4a05edef7544be470ad0Greg Clayton 0, // 0x0a DW_FORM_block1 365fcff9ac1a713d5e814b4a05edef7544be470ad0Greg Clayton 1, // 0x0b DW_FORM_data1 375fcff9ac1a713d5e814b4a05edef7544be470ad0Greg Clayton 1, // 0x0c DW_FORM_flag 385fcff9ac1a713d5e814b4a05edef7544be470ad0Greg Clayton 0, // 0x0d DW_FORM_sdata 395fcff9ac1a713d5e814b4a05edef7544be470ad0Greg Clayton 4, // 0x0e DW_FORM_strp 405fcff9ac1a713d5e814b4a05edef7544be470ad0Greg Clayton 0, // 0x0f DW_FORM_udata 415fcff9ac1a713d5e814b4a05edef7544be470ad0Greg Clayton 4, // 0x10 DW_FORM_ref_addr 425fcff9ac1a713d5e814b4a05edef7544be470ad0Greg Clayton 1, // 0x11 DW_FORM_ref1 435fcff9ac1a713d5e814b4a05edef7544be470ad0Greg Clayton 2, // 0x12 DW_FORM_ref2 445fcff9ac1a713d5e814b4a05edef7544be470ad0Greg Clayton 4, // 0x13 DW_FORM_ref4 455fcff9ac1a713d5e814b4a05edef7544be470ad0Greg Clayton 8, // 0x14 DW_FORM_ref8 465fcff9ac1a713d5e814b4a05edef7544be470ad0Greg Clayton 0, // 0x15 DW_FORM_ref_udata 475fcff9ac1a713d5e814b4a05edef7544be470ad0Greg Clayton 0, // 0x16 DW_FORM_indirect 48988be08a3fe9bb21bb1f518dcf15f2cbf61693d9Greg Clayton 4, // 0x17 DW_FORM_sec_offset 49988be08a3fe9bb21bb1f518dcf15f2cbf61693d9Greg Clayton 0, // 0x18 DW_FORM_exprloc 50988be08a3fe9bb21bb1f518dcf15f2cbf61693d9Greg Clayton 0, // 0x19 DW_FORM_flag_present 51988be08a3fe9bb21bb1f518dcf15f2cbf61693d9Greg Clayton 0, // 0x1a 52988be08a3fe9bb21bb1f518dcf15f2cbf61693d9Greg Clayton 0, // 0x1b 53988be08a3fe9bb21bb1f518dcf15f2cbf61693d9Greg Clayton 0, // 0x1c 54988be08a3fe9bb21bb1f518dcf15f2cbf61693d9Greg Clayton 0, // 0x1d 55988be08a3fe9bb21bb1f518dcf15f2cbf61693d9Greg Clayton 0, // 0x1e 56988be08a3fe9bb21bb1f518dcf15f2cbf61693d9Greg Clayton 0, // 0x1f 57988be08a3fe9bb21bb1f518dcf15f2cbf61693d9Greg Clayton 8, // 0x20 DW_FORM_ref_sig8 58988be08a3fe9bb21bb1f518dcf15f2cbf61693d9Greg Clayton 595fcff9ac1a713d5e814b4a05edef7544be470ad0Greg Clayton}; 605fcff9ac1a713d5e814b4a05edef7544be470ad0Greg Clayton 615fcff9ac1a713d5e814b4a05edef7544be470ad0Greg Claytonstatic uint8_t 625fcff9ac1a713d5e814b4a05edef7544be470ad0Greg Claytong_form_sizes_addr8[] = 635fcff9ac1a713d5e814b4a05edef7544be470ad0Greg Clayton{ 645fcff9ac1a713d5e814b4a05edef7544be470ad0Greg Clayton 0, // 0x00 unused 655fcff9ac1a713d5e814b4a05edef7544be470ad0Greg Clayton 8, // 0x01 DW_FORM_addr 665fcff9ac1a713d5e814b4a05edef7544be470ad0Greg Clayton 0, // 0x02 unused 675fcff9ac1a713d5e814b4a05edef7544be470ad0Greg Clayton 0, // 0x03 DW_FORM_block2 685fcff9ac1a713d5e814b4a05edef7544be470ad0Greg Clayton 0, // 0x04 DW_FORM_block4 695fcff9ac1a713d5e814b4a05edef7544be470ad0Greg Clayton 2, // 0x05 DW_FORM_data2 705fcff9ac1a713d5e814b4a05edef7544be470ad0Greg Clayton 4, // 0x06 DW_FORM_data4 715fcff9ac1a713d5e814b4a05edef7544be470ad0Greg Clayton 8, // 0x07 DW_FORM_data8 725fcff9ac1a713d5e814b4a05edef7544be470ad0Greg Clayton 0, // 0x08 DW_FORM_string 735fcff9ac1a713d5e814b4a05edef7544be470ad0Greg Clayton 0, // 0x09 DW_FORM_block 745fcff9ac1a713d5e814b4a05edef7544be470ad0Greg Clayton 0, // 0x0a DW_FORM_block1 755fcff9ac1a713d5e814b4a05edef7544be470ad0Greg Clayton 1, // 0x0b DW_FORM_data1 765fcff9ac1a713d5e814b4a05edef7544be470ad0Greg Clayton 1, // 0x0c DW_FORM_flag 775fcff9ac1a713d5e814b4a05edef7544be470ad0Greg Clayton 0, // 0x0d DW_FORM_sdata 785fcff9ac1a713d5e814b4a05edef7544be470ad0Greg Clayton 4, // 0x0e DW_FORM_strp 795fcff9ac1a713d5e814b4a05edef7544be470ad0Greg Clayton 0, // 0x0f DW_FORM_udata 805fcff9ac1a713d5e814b4a05edef7544be470ad0Greg Clayton 8, // 0x10 DW_FORM_ref_addr 815fcff9ac1a713d5e814b4a05edef7544be470ad0Greg Clayton 1, // 0x11 DW_FORM_ref1 825fcff9ac1a713d5e814b4a05edef7544be470ad0Greg Clayton 2, // 0x12 DW_FORM_ref2 835fcff9ac1a713d5e814b4a05edef7544be470ad0Greg Clayton 4, // 0x13 DW_FORM_ref4 845fcff9ac1a713d5e814b4a05edef7544be470ad0Greg Clayton 8, // 0x14 DW_FORM_ref8 855fcff9ac1a713d5e814b4a05edef7544be470ad0Greg Clayton 0, // 0x15 DW_FORM_ref_udata 865fcff9ac1a713d5e814b4a05edef7544be470ad0Greg Clayton 0, // 0x16 DW_FORM_indirect 87988be08a3fe9bb21bb1f518dcf15f2cbf61693d9Greg Clayton 4, // 0x17 DW_FORM_sec_offset 88988be08a3fe9bb21bb1f518dcf15f2cbf61693d9Greg Clayton 0, // 0x18 DW_FORM_exprloc 89988be08a3fe9bb21bb1f518dcf15f2cbf61693d9Greg Clayton 0, // 0x19 DW_FORM_flag_present 90988be08a3fe9bb21bb1f518dcf15f2cbf61693d9Greg Clayton 0, // 0x1a 91988be08a3fe9bb21bb1f518dcf15f2cbf61693d9Greg Clayton 0, // 0x1b 92988be08a3fe9bb21bb1f518dcf15f2cbf61693d9Greg Clayton 0, // 0x1c 93988be08a3fe9bb21bb1f518dcf15f2cbf61693d9Greg Clayton 0, // 0x1d 94988be08a3fe9bb21bb1f518dcf15f2cbf61693d9Greg Clayton 0, // 0x1e 95988be08a3fe9bb21bb1f518dcf15f2cbf61693d9Greg Clayton 0, // 0x1f 96988be08a3fe9bb21bb1f518dcf15f2cbf61693d9Greg Clayton 8, // 0x20 DW_FORM_ref_sig8 975fcff9ac1a713d5e814b4a05edef7544be470ad0Greg Clayton}; 985fcff9ac1a713d5e814b4a05edef7544be470ad0Greg Clayton 995fcff9ac1a713d5e814b4a05edef7544be470ad0Greg Claytonconst uint8_t * 1005fcff9ac1a713d5e814b4a05edef7544be470ad0Greg ClaytonDWARFFormValue::GetFixedFormSizesForAddressSize (uint8_t addr_size) 1015fcff9ac1a713d5e814b4a05edef7544be470ad0Greg Clayton{ 1025fcff9ac1a713d5e814b4a05edef7544be470ad0Greg Clayton switch (addr_size) 1035fcff9ac1a713d5e814b4a05edef7544be470ad0Greg Clayton { 1045fcff9ac1a713d5e814b4a05edef7544be470ad0Greg Clayton case 4: return g_form_sizes_addr4; 1055fcff9ac1a713d5e814b4a05edef7544be470ad0Greg Clayton case 8: return g_form_sizes_addr8; 1065fcff9ac1a713d5e814b4a05edef7544be470ad0Greg Clayton } 1075fcff9ac1a713d5e814b4a05edef7544be470ad0Greg Clayton return NULL; 1085fcff9ac1a713d5e814b4a05edef7544be470ad0Greg Clayton} 1095fcff9ac1a713d5e814b4a05edef7544be470ad0Greg Clayton 11024943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerDWARFFormValue::DWARFFormValue(dw_form_t form) : 11124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_form(form), 11224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_value() 11324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 11424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 11524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 11624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool 11724943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerDWARFFormValue::ExtractValue(const DataExtractor& data, uint32_t* offset_ptr, const DWARFCompileUnit* cu) 11824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 11924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner bool indirect = false; 12024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner bool is_block = false; 12124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_value.data = NULL; 12224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Read the value for the form into value and follow and DW_FORM_indirect instances we run into 12324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner do 12424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 12524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner indirect = false; 12624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner switch (m_form) 12724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 12824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case DW_FORM_addr: m_value.value.uval = data.GetMaxU64(offset_ptr, DWARFCompileUnit::GetAddressByteSize(cu)); break; 12924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case DW_FORM_block2: m_value.value.uval = data.GetU16(offset_ptr); is_block = true; break; 13024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case DW_FORM_block4: m_value.value.uval = data.GetU32(offset_ptr); is_block = true; break; 13124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case DW_FORM_data2: m_value.value.uval = data.GetU16(offset_ptr); break; 13224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case DW_FORM_data4: m_value.value.uval = data.GetU32(offset_ptr); break; 13324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case DW_FORM_data8: m_value.value.uval = data.GetU64(offset_ptr); break; 13424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case DW_FORM_string: m_value.value.cstr = data.GetCStr(offset_ptr); 13524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Set the string value to also be the data for inlined cstr form values only 13624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // so we can tell the differnence between DW_FORM_string and DW_FORM_strp form 13724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // values; 13824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_value.data = (uint8_t*)m_value.value.cstr; break; 139988be08a3fe9bb21bb1f518dcf15f2cbf61693d9Greg Clayton case DW_FORM_exprloc: 14024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case DW_FORM_block: m_value.value.uval = data.GetULEB128(offset_ptr); is_block = true; break; 14124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case DW_FORM_block1: m_value.value.uval = data.GetU8(offset_ptr); is_block = true; break; 14224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case DW_FORM_data1: m_value.value.uval = data.GetU8(offset_ptr); break; 14324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case DW_FORM_flag: m_value.value.uval = data.GetU8(offset_ptr); break; 14424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case DW_FORM_sdata: m_value.value.sval = data.GetSLEB128(offset_ptr); break; 14524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case DW_FORM_strp: m_value.value.uval = data.GetU32(offset_ptr); break; 14624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // case DW_FORM_APPLE_db_str: 14724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case DW_FORM_udata: m_value.value.uval = data.GetULEB128(offset_ptr); break; 14824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case DW_FORM_ref_addr: m_value.value.uval = data.GetMaxU64(offset_ptr, DWARFCompileUnit::GetAddressByteSize(cu)); break; 14924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case DW_FORM_ref1: m_value.value.uval = data.GetU8(offset_ptr); break; 15024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case DW_FORM_ref2: m_value.value.uval = data.GetU16(offset_ptr); break; 15124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case DW_FORM_ref4: m_value.value.uval = data.GetU32(offset_ptr); break; 15224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case DW_FORM_ref8: m_value.value.uval = data.GetU64(offset_ptr); break; 15324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case DW_FORM_ref_udata: m_value.value.uval = data.GetULEB128(offset_ptr); break; 15424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case DW_FORM_indirect: 15524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_form = data.GetULEB128(offset_ptr); 15624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner indirect = true; 15724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 15824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 159988be08a3fe9bb21bb1f518dcf15f2cbf61693d9Greg Clayton case DW_FORM_sec_offset: m_value.value.uval = data.GetU32(offset_ptr); break; 160988be08a3fe9bb21bb1f518dcf15f2cbf61693d9Greg Clayton case DW_FORM_flag_present: m_value.value.uval = 1; break; 161988be08a3fe9bb21bb1f518dcf15f2cbf61693d9Greg Clayton case DW_FORM_ref_sig8: m_value.value.uval = data.GetU64(offset_ptr); break; 16224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner default: 16324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return false; 16424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 16524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 16624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } while (indirect); 16724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 16824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (is_block) 16924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 17024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_value.data = data.PeekData(*offset_ptr, m_value.value.uval); 17124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (m_value.data != NULL) 17224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 17324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner *offset_ptr += m_value.value.uval; 17424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 17524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 17624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 17724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return true; 17824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 17924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 18024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool 18124943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerDWARFFormValue::SkipValue(const DataExtractor& debug_info_data, uint32_t* offset_ptr, const DWARFCompileUnit* cu) const 18224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 18324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return DWARFFormValue::SkipValue(m_form, debug_info_data, offset_ptr, cu); 18424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 18524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 18624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool 18724943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerDWARFFormValue::SkipValue(dw_form_t form, const DataExtractor& debug_info_data, uint32_t* offset_ptr, const DWARFCompileUnit* cu) 18824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 1894a379b1194f3e6b308cd6e80b45d6ca5dd0aafd7Greg Clayton switch (form) 19024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 1914a379b1194f3e6b308cd6e80b45d6ca5dd0aafd7Greg Clayton // Blocks if inlined data that have a length field and the data bytes 1924a379b1194f3e6b308cd6e80b45d6ca5dd0aafd7Greg Clayton // inlined in the .debug_info 1934a379b1194f3e6b308cd6e80b45d6ca5dd0aafd7Greg Clayton case DW_FORM_exprloc: 1944a379b1194f3e6b308cd6e80b45d6ca5dd0aafd7Greg Clayton case DW_FORM_block: { dw_uleb128_t size = debug_info_data.GetULEB128(offset_ptr); *offset_ptr += size; } return true; 1954a379b1194f3e6b308cd6e80b45d6ca5dd0aafd7Greg Clayton case DW_FORM_block1: { dw_uleb128_t size = debug_info_data.GetU8(offset_ptr); *offset_ptr += size; } return true; 1964a379b1194f3e6b308cd6e80b45d6ca5dd0aafd7Greg Clayton case DW_FORM_block2: { dw_uleb128_t size = debug_info_data.GetU16(offset_ptr); *offset_ptr += size; } return true; 1974a379b1194f3e6b308cd6e80b45d6ca5dd0aafd7Greg Clayton case DW_FORM_block4: { dw_uleb128_t size = debug_info_data.GetU32(offset_ptr); *offset_ptr += size; } return true; 19824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 1994a379b1194f3e6b308cd6e80b45d6ca5dd0aafd7Greg Clayton // Inlined NULL terminated C-strings 2004a379b1194f3e6b308cd6e80b45d6ca5dd0aafd7Greg Clayton case DW_FORM_string: 2014a379b1194f3e6b308cd6e80b45d6ca5dd0aafd7Greg Clayton debug_info_data.GetCStr(offset_ptr); 2024a379b1194f3e6b308cd6e80b45d6ca5dd0aafd7Greg Clayton return true; 2034a379b1194f3e6b308cd6e80b45d6ca5dd0aafd7Greg Clayton 2044a379b1194f3e6b308cd6e80b45d6ca5dd0aafd7Greg Clayton // Compile unit address sized values 2054a379b1194f3e6b308cd6e80b45d6ca5dd0aafd7Greg Clayton case DW_FORM_addr: 2064a379b1194f3e6b308cd6e80b45d6ca5dd0aafd7Greg Clayton case DW_FORM_ref_addr: 2074a379b1194f3e6b308cd6e80b45d6ca5dd0aafd7Greg Clayton *offset_ptr += DWARFCompileUnit::GetAddressByteSize(cu); 2084a379b1194f3e6b308cd6e80b45d6ca5dd0aafd7Greg Clayton return true; 2094a379b1194f3e6b308cd6e80b45d6ca5dd0aafd7Greg Clayton 2104a379b1194f3e6b308cd6e80b45d6ca5dd0aafd7Greg Clayton // 0 bytes values (implied from DW_FORM) 2114a379b1194f3e6b308cd6e80b45d6ca5dd0aafd7Greg Clayton case DW_FORM_flag_present: 2124a379b1194f3e6b308cd6e80b45d6ca5dd0aafd7Greg Clayton return true; 2134a379b1194f3e6b308cd6e80b45d6ca5dd0aafd7Greg Clayton 2144a379b1194f3e6b308cd6e80b45d6ca5dd0aafd7Greg Clayton // 1 byte values 2154a379b1194f3e6b308cd6e80b45d6ca5dd0aafd7Greg Clayton case DW_FORM_data1: 2164a379b1194f3e6b308cd6e80b45d6ca5dd0aafd7Greg Clayton case DW_FORM_flag: 2174a379b1194f3e6b308cd6e80b45d6ca5dd0aafd7Greg Clayton case DW_FORM_ref1: 2184a379b1194f3e6b308cd6e80b45d6ca5dd0aafd7Greg Clayton *offset_ptr += 1; 2194a379b1194f3e6b308cd6e80b45d6ca5dd0aafd7Greg Clayton return true; 2204a379b1194f3e6b308cd6e80b45d6ca5dd0aafd7Greg Clayton 2214a379b1194f3e6b308cd6e80b45d6ca5dd0aafd7Greg Clayton // 2 byte values 2224a379b1194f3e6b308cd6e80b45d6ca5dd0aafd7Greg Clayton case DW_FORM_data2: 2234a379b1194f3e6b308cd6e80b45d6ca5dd0aafd7Greg Clayton case DW_FORM_ref2: 2244a379b1194f3e6b308cd6e80b45d6ca5dd0aafd7Greg Clayton *offset_ptr += 2; 2254a379b1194f3e6b308cd6e80b45d6ca5dd0aafd7Greg Clayton return true; 2264a379b1194f3e6b308cd6e80b45d6ca5dd0aafd7Greg Clayton 2274a379b1194f3e6b308cd6e80b45d6ca5dd0aafd7Greg Clayton // 32 bit for DWARF 32, 64 for DWARF 64 2284a379b1194f3e6b308cd6e80b45d6ca5dd0aafd7Greg Clayton case DW_FORM_sec_offset: 2294a379b1194f3e6b308cd6e80b45d6ca5dd0aafd7Greg Clayton *offset_ptr += 4; 2304a379b1194f3e6b308cd6e80b45d6ca5dd0aafd7Greg Clayton return true; 2314a379b1194f3e6b308cd6e80b45d6ca5dd0aafd7Greg Clayton 2324a379b1194f3e6b308cd6e80b45d6ca5dd0aafd7Greg Clayton // 4 byte values 2334a379b1194f3e6b308cd6e80b45d6ca5dd0aafd7Greg Clayton case DW_FORM_strp: 2344a379b1194f3e6b308cd6e80b45d6ca5dd0aafd7Greg Clayton case DW_FORM_data4: 2354a379b1194f3e6b308cd6e80b45d6ca5dd0aafd7Greg Clayton case DW_FORM_ref4: 2364a379b1194f3e6b308cd6e80b45d6ca5dd0aafd7Greg Clayton *offset_ptr += 4; 2374a379b1194f3e6b308cd6e80b45d6ca5dd0aafd7Greg Clayton return true; 2384a379b1194f3e6b308cd6e80b45d6ca5dd0aafd7Greg Clayton 2394a379b1194f3e6b308cd6e80b45d6ca5dd0aafd7Greg Clayton // 8 byte values 2404a379b1194f3e6b308cd6e80b45d6ca5dd0aafd7Greg Clayton case DW_FORM_data8: 2414a379b1194f3e6b308cd6e80b45d6ca5dd0aafd7Greg Clayton case DW_FORM_ref8: 2424a379b1194f3e6b308cd6e80b45d6ca5dd0aafd7Greg Clayton case DW_FORM_ref_sig8: 2434a379b1194f3e6b308cd6e80b45d6ca5dd0aafd7Greg Clayton *offset_ptr += 8; 2444a379b1194f3e6b308cd6e80b45d6ca5dd0aafd7Greg Clayton return true; 2454a379b1194f3e6b308cd6e80b45d6ca5dd0aafd7Greg Clayton 2464a379b1194f3e6b308cd6e80b45d6ca5dd0aafd7Greg Clayton // signed or unsigned LEB 128 values 2474a379b1194f3e6b308cd6e80b45d6ca5dd0aafd7Greg Clayton case DW_FORM_sdata: 2484a379b1194f3e6b308cd6e80b45d6ca5dd0aafd7Greg Clayton case DW_FORM_udata: 2494a379b1194f3e6b308cd6e80b45d6ca5dd0aafd7Greg Clayton case DW_FORM_ref_udata: 2504a379b1194f3e6b308cd6e80b45d6ca5dd0aafd7Greg Clayton debug_info_data.Skip_LEB128(offset_ptr); 2514a379b1194f3e6b308cd6e80b45d6ca5dd0aafd7Greg Clayton return true; 2524a379b1194f3e6b308cd6e80b45d6ca5dd0aafd7Greg Clayton 2534a379b1194f3e6b308cd6e80b45d6ca5dd0aafd7Greg Clayton case DW_FORM_indirect: 2544a379b1194f3e6b308cd6e80b45d6ca5dd0aafd7Greg Clayton { 2554a379b1194f3e6b308cd6e80b45d6ca5dd0aafd7Greg Clayton dw_form_t indirect_form = debug_info_data.GetULEB128(offset_ptr); 2564a379b1194f3e6b308cd6e80b45d6ca5dd0aafd7Greg Clayton return DWARFFormValue::SkipValue (indirect_form, 2574a379b1194f3e6b308cd6e80b45d6ca5dd0aafd7Greg Clayton debug_info_data, 2584a379b1194f3e6b308cd6e80b45d6ca5dd0aafd7Greg Clayton offset_ptr, 2594a379b1194f3e6b308cd6e80b45d6ca5dd0aafd7Greg Clayton cu); 26024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 2614a379b1194f3e6b308cd6e80b45d6ca5dd0aafd7Greg Clayton 2624a379b1194f3e6b308cd6e80b45d6ca5dd0aafd7Greg Clayton default: 2634a379b1194f3e6b308cd6e80b45d6ca5dd0aafd7Greg Clayton break; 2644a379b1194f3e6b308cd6e80b45d6ca5dd0aafd7Greg Clayton } 2654a379b1194f3e6b308cd6e80b45d6ca5dd0aafd7Greg Clayton return false; 26624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 26724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 26824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 26924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid 270169c5fbc8cac8a0bd724bd18fd9d816ca3d6486aJim InghamDWARFFormValue::Dump(Stream &s, const DataExtractor* debug_str_data, const DWARFCompileUnit* cu) const 27124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 27224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner uint64_t uvalue = Unsigned(); 27324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner bool cu_relative_offset = false; 27424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 275169c5fbc8cac8a0bd724bd18fd9d816ca3d6486aJim Ingham bool verbose = s.GetVerbose(); 27624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 27724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner switch (m_form) 27824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 279169c5fbc8cac8a0bd724bd18fd9d816ca3d6486aJim Ingham case DW_FORM_addr: s.Address(uvalue, sizeof (uint64_t)); break; 28024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case DW_FORM_flag: 281169c5fbc8cac8a0bd724bd18fd9d816ca3d6486aJim Ingham case DW_FORM_data1: s.PutHex8(uvalue); break; 282169c5fbc8cac8a0bd724bd18fd9d816ca3d6486aJim Ingham case DW_FORM_data2: s.PutHex16(uvalue); break; 283988be08a3fe9bb21bb1f518dcf15f2cbf61693d9Greg Clayton case DW_FORM_sec_offset: 284169c5fbc8cac8a0bd724bd18fd9d816ca3d6486aJim Ingham case DW_FORM_data4: s.PutHex32(uvalue); break; 285988be08a3fe9bb21bb1f518dcf15f2cbf61693d9Greg Clayton case DW_FORM_ref_sig8: 286169c5fbc8cac8a0bd724bd18fd9d816ca3d6486aJim Ingham case DW_FORM_data8: s.PutHex64(uvalue); break; 287169c5fbc8cac8a0bd724bd18fd9d816ca3d6486aJim Ingham case DW_FORM_string: s.QuotedCString(AsCString(NULL)); break; 288988be08a3fe9bb21bb1f518dcf15f2cbf61693d9Greg Clayton case DW_FORM_exprloc: 28924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case DW_FORM_block: 29024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case DW_FORM_block1: 29124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case DW_FORM_block2: 29224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case DW_FORM_block4: 29324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (uvalue > 0) 29424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 29524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner switch (m_form) 29624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 297988be08a3fe9bb21bb1f518dcf15f2cbf61693d9Greg Clayton case DW_FORM_exprloc: 2985f35a4be95aed0e5b2cb36f7d785bcbfc67284aeDaniel Malea case DW_FORM_block: s.Printf("<0x%" PRIx64 "> ", uvalue); break; 299169c5fbc8cac8a0bd724bd18fd9d816ca3d6486aJim Ingham case DW_FORM_block1: s.Printf("<0x%2.2x> ", (uint8_t)uvalue); break; 300169c5fbc8cac8a0bd724bd18fd9d816ca3d6486aJim Ingham case DW_FORM_block2: s.Printf("<0x%4.4x> ", (uint16_t)uvalue); break; 301169c5fbc8cac8a0bd724bd18fd9d816ca3d6486aJim Ingham case DW_FORM_block4: s.Printf("<0x%8.8x> ", (uint32_t)uvalue); break; 30224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner default: break; 30324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 30424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 30524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const uint8_t* data_ptr = m_value.data; 30624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (data_ptr) 30724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 30824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const uint8_t* end_data_ptr = data_ptr + uvalue; // uvalue contains size of block 30924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner while (data_ptr < end_data_ptr) 31024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 311169c5fbc8cac8a0bd724bd18fd9d816ca3d6486aJim Ingham s.Printf("%2.2x ", *data_ptr); 31224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ++data_ptr; 31324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 31424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 31524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else 316169c5fbc8cac8a0bd724bd18fd9d816ca3d6486aJim Ingham s.PutCString("NULL"); 31724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 31824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 31924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 320169c5fbc8cac8a0bd724bd18fd9d816ca3d6486aJim Ingham case DW_FORM_sdata: s.PutSLEB128(uvalue); break; 321169c5fbc8cac8a0bd724bd18fd9d816ca3d6486aJim Ingham case DW_FORM_udata: s.PutULEB128(uvalue); break; 32224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case DW_FORM_strp: 32324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (debug_str_data) 32424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 32524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (verbose) 326169c5fbc8cac8a0bd724bd18fd9d816ca3d6486aJim Ingham s.Printf(" .debug_str[0x%8.8x] = ", (uint32_t)uvalue); 32724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 32824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const char* dbg_str = AsCString(debug_str_data); 32924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (dbg_str) 330169c5fbc8cac8a0bd724bd18fd9d816ca3d6486aJim Ingham s.QuotedCString(dbg_str); 33124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 33224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else 33324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 334169c5fbc8cac8a0bd724bd18fd9d816ca3d6486aJim Ingham s.PutHex32(uvalue); 33524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 33624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 33724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 33824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case DW_FORM_ref_addr: 33924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 340169c5fbc8cac8a0bd724bd18fd9d816ca3d6486aJim Ingham s.Address(uvalue, sizeof (uint64_t) * 2); 34124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 34224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 343169c5fbc8cac8a0bd724bd18fd9d816ca3d6486aJim Ingham case DW_FORM_ref1: cu_relative_offset = true; if (verbose) s.Printf("cu + 0x%2.2x", (uint8_t)uvalue); break; 344169c5fbc8cac8a0bd724bd18fd9d816ca3d6486aJim Ingham case DW_FORM_ref2: cu_relative_offset = true; if (verbose) s.Printf("cu + 0x%4.4x", (uint16_t)uvalue); break; 345169c5fbc8cac8a0bd724bd18fd9d816ca3d6486aJim Ingham case DW_FORM_ref4: cu_relative_offset = true; if (verbose) s.Printf("cu + 0x%4.4x", (uint32_t)uvalue); break; 3465f35a4be95aed0e5b2cb36f7d785bcbfc67284aeDaniel Malea case DW_FORM_ref8: cu_relative_offset = true; if (verbose) s.Printf("cu + 0x%8.8" PRIx64, uvalue); break; 3475f35a4be95aed0e5b2cb36f7d785bcbfc67284aeDaniel Malea case DW_FORM_ref_udata: cu_relative_offset = true; if (verbose) s.Printf("cu + 0x%" PRIx64, uvalue); break; 34824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 34924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // All DW_FORM_indirect attributes should be resolved prior to calling this function 350169c5fbc8cac8a0bd724bd18fd9d816ca3d6486aJim Ingham case DW_FORM_indirect: s.PutCString("DW_FORM_indirect"); break; 351988be08a3fe9bb21bb1f518dcf15f2cbf61693d9Greg Clayton case DW_FORM_flag_present: break; 35224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner default: 353169c5fbc8cac8a0bd724bd18fd9d816ca3d6486aJim Ingham s.Printf("DW_FORM(0x%4.4x)", m_form); 35424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 35524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 35624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 35724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (cu_relative_offset) 35824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 35924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (verbose) 360169c5fbc8cac8a0bd724bd18fd9d816ca3d6486aJim Ingham s.PutCString(" => "); 36124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 3625f35a4be95aed0e5b2cb36f7d785bcbfc67284aeDaniel Malea s.Printf("{0x%8.8" PRIx64 "}", (uvalue + (cu ? cu->GetOffset() : 0))); 36324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 36424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 36524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 36624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerconst char* 36724943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerDWARFFormValue::AsCString(const DataExtractor* debug_str_data_ptr) const 36824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 36924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (IsInlinedCStr()) 37024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return m_value.value.cstr; 37124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else if (debug_str_data_ptr) 37224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return debug_str_data_ptr->PeekCStr(m_value.value.uval); 37324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return NULL; 37424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 37524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 37624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattneruint64_t 37724943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerDWARFFormValue::Reference(const DWARFCompileUnit* cu) const 37824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 37924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner uint64_t die_offset = m_value.value.uval; 38024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner switch (m_form) 38124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 38224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case DW_FORM_ref1: 38324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case DW_FORM_ref2: 38424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case DW_FORM_ref4: 38524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case DW_FORM_ref8: 38624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case DW_FORM_ref_udata: 38724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner die_offset += (cu ? cu->GetOffset() : 0); 38824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 38924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 39024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner default: 39124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 39224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 39324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 39424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return die_offset; 39524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 39624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 39737bb8ddd443da172f42bb8657f15ec856a525c84Greg Claytonuint64_t 39837bb8ddd443da172f42bb8657f15ec856a525c84Greg ClaytonDWARFFormValue::Reference (dw_offset_t base_offset) const 39937bb8ddd443da172f42bb8657f15ec856a525c84Greg Clayton{ 40037bb8ddd443da172f42bb8657f15ec856a525c84Greg Clayton uint64_t die_offset = m_value.value.uval; 40137bb8ddd443da172f42bb8657f15ec856a525c84Greg Clayton switch (m_form) 40237bb8ddd443da172f42bb8657f15ec856a525c84Greg Clayton { 40337bb8ddd443da172f42bb8657f15ec856a525c84Greg Clayton case DW_FORM_ref1: 40437bb8ddd443da172f42bb8657f15ec856a525c84Greg Clayton case DW_FORM_ref2: 40537bb8ddd443da172f42bb8657f15ec856a525c84Greg Clayton case DW_FORM_ref4: 40637bb8ddd443da172f42bb8657f15ec856a525c84Greg Clayton case DW_FORM_ref8: 40737bb8ddd443da172f42bb8657f15ec856a525c84Greg Clayton case DW_FORM_ref_udata: 40837bb8ddd443da172f42bb8657f15ec856a525c84Greg Clayton die_offset += base_offset; 40937bb8ddd443da172f42bb8657f15ec856a525c84Greg Clayton break; 41037bb8ddd443da172f42bb8657f15ec856a525c84Greg Clayton 41137bb8ddd443da172f42bb8657f15ec856a525c84Greg Clayton default: 41237bb8ddd443da172f42bb8657f15ec856a525c84Greg Clayton break; 41337bb8ddd443da172f42bb8657f15ec856a525c84Greg Clayton } 41437bb8ddd443da172f42bb8657f15ec856a525c84Greg Clayton 41537bb8ddd443da172f42bb8657f15ec856a525c84Greg Clayton return die_offset; 41637bb8ddd443da172f42bb8657f15ec856a525c84Greg Clayton} 41737bb8ddd443da172f42bb8657f15ec856a525c84Greg Clayton 41824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//---------------------------------------------------------------------- 41924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Resolve any compile unit specific references so that we don't need 42024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// the compile unit at a later time in order to work with the form 42124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// value. 42224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//---------------------------------------------------------------------- 42324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool 42424943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerDWARFFormValue::ResolveCompileUnitReferences(const DWARFCompileUnit* cu) 42524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 42624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner switch (m_form) 42724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 42824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case DW_FORM_ref1: 42924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case DW_FORM_ref2: 43024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case DW_FORM_ref4: 43124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case DW_FORM_ref8: 43224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case DW_FORM_ref_udata: 43324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_value.value.uval += cu->GetOffset(); 43424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_form = DW_FORM_ref_addr; 43524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return true; 43624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 43724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 43824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner default: 43924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 44024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 44124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 44224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return false; 44324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 44424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 44524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerconst uint8_t* 44624943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerDWARFFormValue::BlockData() const 44724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 44824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (!IsInlinedCStr()) 44924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return m_value.data; 45024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return NULL; 45124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 45224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 45324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 45424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool 45524943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerDWARFFormValue::IsBlockForm(const dw_form_t form) 45624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 45724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner switch (form) 45824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 45924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case DW_FORM_block: 46024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case DW_FORM_block1: 46124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case DW_FORM_block2: 46224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case DW_FORM_block4: 46324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return true; 46424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 46524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return false; 46624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 46724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 46824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool 46924943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerDWARFFormValue::IsDataForm(const dw_form_t form) 47024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 47124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner switch (form) 47224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 47324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case DW_FORM_sdata: 47424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case DW_FORM_udata: 47524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case DW_FORM_data1: 47624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case DW_FORM_data2: 47724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case DW_FORM_data4: 47824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case DW_FORM_data8: 47924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return true; 48024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 48124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return false; 48224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 48324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 48424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerint 48524943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerDWARFFormValue::Compare (const DWARFFormValue& a_value, const DWARFFormValue& b_value, const DWARFCompileUnit* a_cu, const DWARFCompileUnit* b_cu, const DataExtractor* debug_str_data_ptr) 48624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 48724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner dw_form_t a_form = a_value.Form(); 48824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner dw_form_t b_form = b_value.Form(); 48924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (a_form < b_form) 49024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return -1; 49124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (a_form > b_form) 49224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return 1; 49324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner switch (a_form) 49424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 49524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case DW_FORM_addr: 49624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case DW_FORM_flag: 49724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case DW_FORM_data1: 49824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case DW_FORM_data2: 49924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case DW_FORM_data4: 50024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case DW_FORM_data8: 50124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case DW_FORM_udata: 50224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case DW_FORM_ref_addr: 503988be08a3fe9bb21bb1f518dcf15f2cbf61693d9Greg Clayton case DW_FORM_sec_offset: 504988be08a3fe9bb21bb1f518dcf15f2cbf61693d9Greg Clayton case DW_FORM_flag_present: 505988be08a3fe9bb21bb1f518dcf15f2cbf61693d9Greg Clayton case DW_FORM_ref_sig8: 50624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 50724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner uint64_t a = a_value.Unsigned(); 50824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner uint64_t b = b_value.Unsigned(); 50924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (a < b) 51024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return -1; 51124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (a > b) 51224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return 1; 51324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return 0; 51424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 51524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 51624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case DW_FORM_sdata: 51724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 51824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner int64_t a = a_value.Signed(); 51924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner int64_t b = b_value.Signed(); 52024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (a < b) 52124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return -1; 52224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (a > b) 52324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return 1; 52424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return 0; 52524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 52624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 52724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case DW_FORM_string: 52824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case DW_FORM_strp: 52924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 53024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const char *a_string = a_value.AsCString(debug_str_data_ptr); 53124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const char *b_string = b_value.AsCString(debug_str_data_ptr); 53224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (a_string == b_string) 53324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return 0; 53424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else if (a_string && b_string) 53524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return strcmp(a_string, b_string); 53624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else if (a_string == NULL) 53724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return -1; // A string is NULL, and B is valid 53824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else 53924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return 1; // A string valid, and B is NULL 54024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 54124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 54224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 54324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case DW_FORM_block: 54424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case DW_FORM_block1: 54524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case DW_FORM_block2: 54624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case DW_FORM_block4: 547988be08a3fe9bb21bb1f518dcf15f2cbf61693d9Greg Clayton case DW_FORM_exprloc: 54824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 54924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner uint64_t a_len = a_value.Unsigned(); 55024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner uint64_t b_len = b_value.Unsigned(); 55124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (a_len < b_len) 55224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return -1; 55324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (a_len > b_len) 55424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return 1; 55524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // The block lengths are the same 55624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return memcmp(a_value.BlockData(), b_value.BlockData(), a_value.Unsigned()); 55724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 55824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 55924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 56024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case DW_FORM_ref1: 56124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case DW_FORM_ref2: 56224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case DW_FORM_ref4: 56324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case DW_FORM_ref8: 56424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case DW_FORM_ref_udata: 56524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 56624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner uint64_t a = a_value.Reference(a_cu); 56724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner uint64_t b = b_value.Reference(b_cu); 56824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (a < b) 56924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return -1; 57024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (a > b) 57124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return 1; 57224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return 0; 57324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 57424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 57524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case DW_FORM_indirect: 57624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner assert(!"This shouldn't happen after the form has been extracted..."); 57724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 57824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 57924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner default: 58024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner assert(!"Unhandled DW_FORM"); 58124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 58224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 58324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return -1; 58424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 58524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 586