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