Home | History | Annotate | Download | only in DWARF
      1 //===-- DWARFLocationList.cpp -----------------------------------*- C++ -*-===//
      2 //
      3 //                     The LLVM Compiler Infrastructure
      4 //
      5 // This file is distributed under the University of Illinois Open Source
      6 // License. See LICENSE.TXT for details.
      7 //
      8 //===----------------------------------------------------------------------===//
      9 
     10 #include "DWARFLocationList.h"
     11 
     12 #include "lldb/Core/Stream.h"
     13 
     14 #include "DWARFCompileUnit.h"
     15 #include "DWARFDebugInfo.h"
     16 #include "DWARFLocationDescription.h"
     17 
     18 using namespace lldb_private;
     19 
     20 dw_offset_t
     21 DWARFLocationList::Dump(Stream &s, const DWARFCompileUnit* cu, const DataExtractor& debug_loc_data, lldb::offset_t offset)
     22 {
     23     uint64_t start_addr, end_addr;
     24     uint32_t addr_size = DWARFCompileUnit::GetAddressByteSize(cu);
     25     s.SetAddressByteSize(DWARFCompileUnit::GetAddressByteSize(cu));
     26     dw_addr_t base_addr = cu ? cu->GetBaseAddress() : 0;
     27     while (debug_loc_data.ValidOffset(offset))
     28     {
     29         start_addr = debug_loc_data.GetMaxU64(&offset,addr_size);
     30         end_addr = debug_loc_data.GetMaxU64(&offset,addr_size);
     31 
     32         if (start_addr == 0 && end_addr == 0)
     33             break;
     34 
     35         s.PutCString("\n            ");
     36         s.Indent();
     37         if (cu)
     38             s.AddressRange (start_addr + base_addr,
     39                             end_addr + base_addr,
     40                             cu->GetAddressByteSize(),
     41                             NULL,
     42                             ": ");
     43         uint32_t loc_length = debug_loc_data.GetU16(&offset);
     44 
     45         DataExtractor locationData(debug_loc_data, offset, loc_length);
     46     //  if ( dump_flags & DWARFDebugInfo::eDumpFlag_Verbose ) *ostrm_ptr << " ( ";
     47         print_dwarf_expression (s, locationData, addr_size, 4, false);
     48         offset += loc_length;
     49     }
     50 
     51     return offset;
     52 }
     53 
     54 bool
     55 DWARFLocationList::Extract(const DataExtractor& debug_loc_data, lldb::offset_t* offset_ptr, DataExtractor& location_list_data)
     56 {
     57     // Initialize with no data just in case we don't find anything
     58     location_list_data.Clear();
     59 
     60     size_t loc_list_length = Size(debug_loc_data, *offset_ptr);
     61     if (loc_list_length > 0)
     62     {
     63         location_list_data.SetData(debug_loc_data, *offset_ptr, loc_list_length);
     64         *offset_ptr += loc_list_length;
     65         return true;
     66     }
     67 
     68     return false;
     69 }
     70 
     71 size_t
     72 DWARFLocationList::Size(const DataExtractor& debug_loc_data, lldb::offset_t offset)
     73 {
     74     const dw_offset_t debug_loc_offset = offset;
     75 
     76     while (debug_loc_data.ValidOffset(offset))
     77     {
     78         dw_addr_t start_addr = debug_loc_data.GetAddress(&offset);
     79         dw_addr_t end_addr = debug_loc_data.GetAddress(&offset);
     80 
     81         if (start_addr == 0 && end_addr == 0)
     82             break;
     83 
     84         uint16_t loc_length = debug_loc_data.GetU16(&offset);
     85         offset += loc_length;
     86     }
     87 
     88     if (offset > debug_loc_offset)
     89         return offset - debug_loc_offset;
     90     return 0;
     91 }
     92 
     93 
     94 
     95