1254721Semaste//===-- DWARFLocationList.cpp -----------------------------------*- C++ -*-===// 2254721Semaste// 3254721Semaste// The LLVM Compiler Infrastructure 4254721Semaste// 5254721Semaste// This file is distributed under the University of Illinois Open Source 6254721Semaste// License. See LICENSE.TXT for details. 7254721Semaste// 8254721Semaste//===----------------------------------------------------------------------===// 9254721Semaste 10254721Semaste#include "DWARFLocationList.h" 11254721Semaste 12254721Semaste#include "lldb/Core/Stream.h" 13254721Semaste 14254721Semaste#include "DWARFCompileUnit.h" 15254721Semaste#include "DWARFDebugInfo.h" 16254721Semaste#include "DWARFLocationDescription.h" 17254721Semaste 18254721Semasteusing namespace lldb_private; 19254721Semaste 20254721Semastedw_offset_t 21254721SemasteDWARFLocationList::Dump(Stream &s, const DWARFCompileUnit* cu, const DataExtractor& debug_loc_data, lldb::offset_t offset) 22254721Semaste{ 23254721Semaste uint64_t start_addr, end_addr; 24254721Semaste uint32_t addr_size = DWARFCompileUnit::GetAddressByteSize(cu); 25254721Semaste s.SetAddressByteSize(DWARFCompileUnit::GetAddressByteSize(cu)); 26254721Semaste dw_addr_t base_addr = cu ? cu->GetBaseAddress() : 0; 27254721Semaste while (debug_loc_data.ValidOffset(offset)) 28254721Semaste { 29254721Semaste start_addr = debug_loc_data.GetMaxU64(&offset,addr_size); 30254721Semaste end_addr = debug_loc_data.GetMaxU64(&offset,addr_size); 31254721Semaste 32254721Semaste if (start_addr == 0 && end_addr == 0) 33254721Semaste break; 34254721Semaste 35254721Semaste s.PutCString("\n "); 36254721Semaste s.Indent(); 37254721Semaste if (cu) 38254721Semaste s.AddressRange (start_addr + base_addr, 39254721Semaste end_addr + base_addr, 40254721Semaste cu->GetAddressByteSize(), 41254721Semaste NULL, 42254721Semaste ": "); 43254721Semaste uint32_t loc_length = debug_loc_data.GetU16(&offset); 44254721Semaste 45254721Semaste DataExtractor locationData(debug_loc_data, offset, loc_length); 46254721Semaste // if ( dump_flags & DWARFDebugInfo::eDumpFlag_Verbose ) *ostrm_ptr << " ( "; 47254721Semaste print_dwarf_expression (s, locationData, addr_size, 4, false); 48254721Semaste offset += loc_length; 49254721Semaste } 50254721Semaste 51254721Semaste return offset; 52254721Semaste} 53254721Semaste 54254721Semastebool 55254721SemasteDWARFLocationList::Extract(const DataExtractor& debug_loc_data, lldb::offset_t* offset_ptr, DataExtractor& location_list_data) 56254721Semaste{ 57254721Semaste // Initialize with no data just in case we don't find anything 58254721Semaste location_list_data.Clear(); 59254721Semaste 60254721Semaste size_t loc_list_length = Size(debug_loc_data, *offset_ptr); 61254721Semaste if (loc_list_length > 0) 62254721Semaste { 63254721Semaste location_list_data.SetData(debug_loc_data, *offset_ptr, loc_list_length); 64254721Semaste *offset_ptr += loc_list_length; 65254721Semaste return true; 66254721Semaste } 67254721Semaste 68254721Semaste return false; 69254721Semaste} 70254721Semaste 71254721Semastesize_t 72254721SemasteDWARFLocationList::Size(const DataExtractor& debug_loc_data, lldb::offset_t offset) 73254721Semaste{ 74254721Semaste const dw_offset_t debug_loc_offset = offset; 75254721Semaste 76254721Semaste while (debug_loc_data.ValidOffset(offset)) 77254721Semaste { 78254721Semaste dw_addr_t start_addr = debug_loc_data.GetAddress(&offset); 79254721Semaste dw_addr_t end_addr = debug_loc_data.GetAddress(&offset); 80254721Semaste 81254721Semaste if (start_addr == 0 && end_addr == 0) 82254721Semaste break; 83254721Semaste 84254721Semaste uint16_t loc_length = debug_loc_data.GetU16(&offset); 85254721Semaste offset += loc_length; 86254721Semaste } 87254721Semaste 88254721Semaste if (offset > debug_loc_offset) 89254721Semaste return offset - debug_loc_offset; 90254721Semaste return 0; 91254721Semaste} 92254721Semaste 93254721Semaste 94254721Semaste 95