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