15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//===-- DWARFDebugPubnames.cpp ----------------------------------*- C++ -*-===//
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//                     The LLVM Compiler Infrastructure
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This file is distributed under the University of Illinois Open Source
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// License. See LICENSE.TXT for details.
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//===----------------------------------------------------------------------===//
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "DWARFDebugPubnames.h"
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "lldb/Core/Stream.h"
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "lldb/Core/Timer.h"
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "DWARFDebugInfo.h"
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "DWARFDIECollection.h"
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "DWARFFormValue.h"
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "DWARFCompileUnit.h"
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "LogChannelDWARF.h"
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "SymbolFileDWARF.h"
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using namespace lldb;
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using namespace lldb_private;
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)DWARFDebugPubnames::DWARFDebugPubnames() :
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    m_sets()
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)DWARFDebugPubnames::Extract(const DataExtractor& data)
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Timer scoped_timer (__PRETTY_FUNCTION__,
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        "DWARFDebugPubnames::Extract (byte_size = %" PRIu64 ")",
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        (uint64_t)data.GetByteSize());
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Log *log (LogChannelDWARF::GetLogIfAll(DWARF_LOG_DEBUG_PUBNAMES));
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (log)
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        log->Printf("DWARFDebugPubnames::Extract (byte_size = %" PRIu64 ")", (uint64_t)data.GetByteSize());
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (data.ValidOffset(0))
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    {
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        lldb::offset_t offset = 0;
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        DWARFDebugPubnamesSet set;
46ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch        while (data.ValidOffset(offset))
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        {
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            if (set.Extract(data, &offset))
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            {
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                m_sets.push_back(set);
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                offset = set.GetOffsetOfNextEntry();
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            }
53ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch            else
54ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch                break;
55ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch        }
56ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch        if (log)
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            Dump (log);
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return true;
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return false;
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)DWARFDebugPubnames::GeneratePubnames(SymbolFileDWARF* dwarf2Data)
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Timer scoped_timer (__PRETTY_FUNCTION__,
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        "DWARFDebugPubnames::GeneratePubnames (data = %p)",
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        dwarf2Data);
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Log *log (LogChannelDWARF::GetLogIfAll(DWARF_LOG_DEBUG_PUBNAMES));
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (log)
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        log->Printf("DWARFDebugPubnames::GeneratePubnames (data = %p)", dwarf2Data);
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    m_sets.clear();
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DWARFDebugInfo* debug_info = dwarf2Data->DebugInfo();
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (debug_info)
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    {
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        const DataExtractor* debug_str = &dwarf2Data->get_debug_str_data();
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        uint32_t cu_idx = 0;
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        const uint32_t num_compile_units = dwarf2Data->GetNumCompileUnits();
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        for (cu_idx = 0; cu_idx < num_compile_units; ++cu_idx)
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        {
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            DWARFCompileUnit* cu = debug_info->GetCompileUnitAtIndex(cu_idx);
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            const uint8_t *fixed_form_sizes = DWARFFormValue::GetFixedFormSizesForAddressSize (cu->GetAddressByteSize());
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            bool clear_dies = cu->ExtractDIEsIfNeeded (false) > 1;
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            DWARFDIECollection dies;
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            const size_t die_count = cu->AppendDIEsWithTag (DW_TAG_subprogram, dies) +
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                     cu->AppendDIEsWithTag (DW_TAG_variable, dies);
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            dw_offset_t cu_offset = cu->GetOffset();
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            DWARFDebugPubnamesSet pubnames_set(DW_INVALID_OFFSET, cu_offset, cu->GetNextCompileUnitOffset() - cu_offset);
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            size_t die_idx;
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            for (die_idx = 0; die_idx < die_count; ++die_idx)
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            {
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                const DWARFDebugInfoEntry *die = dies.GetDIEPtrAtIndex(die_idx);
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                DWARFDebugInfoEntry::Attributes attributes;
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                const char *name = NULL;
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                const char *mangled = NULL;
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                bool add_die = false;
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                const size_t num_attributes = die->GetAttributes(dwarf2Data, cu, fixed_form_sizes, attributes);
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                if (num_attributes > 0)
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                {
111ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch                    uint32_t i;
112ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
113ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch                    dw_tag_t tag = die->Tag();
114ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    for (i=0; i<num_attributes; ++i)
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    {
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        dw_attr_t attr = attributes.AttributeAtIndex(i);
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        DWARFFormValue form_value;
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        switch (attr)
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        {
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        case DW_AT_name:
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                            if (attributes.ExtractFormValueAtIndex(dwarf2Data, i, form_value))
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                name = form_value.AsCString(debug_str);
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                            break;
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        case DW_AT_MIPS_linkage_name:
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        case DW_AT_linkage_name:
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                            if (attributes.ExtractFormValueAtIndex(dwarf2Data, i, form_value))
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                mangled = form_value.AsCString(debug_str);
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                            break;
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        case DW_AT_low_pc:
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        case DW_AT_ranges:
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        case DW_AT_entry_pc:
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                            if (tag == DW_TAG_subprogram)
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                add_die = true;
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                            break;
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        case DW_AT_location:
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                            if (tag == DW_TAG_variable)
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                            {
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                const DWARFDebugInfoEntry* parent_die = die->GetParent();
143ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch                                while ( parent_die != NULL )
144ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch                                {
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                    switch (parent_die->Tag())
1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                    {
147ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch                                    case DW_TAG_subprogram:
148ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch                                    case DW_TAG_lexical_block:
149ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch                                    case DW_TAG_inlined_subroutine:
150ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch                                        // Even if this is a function level static, we don't add it. We could theoretically
151ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch                                        // add these if we wanted to by introspecting into the DW_AT_location and seeing
152ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch                                        // if the location describes a hard coded address, but we don't want the performance
153ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch                                        // penalty of that right now.
154ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch                                        add_die = false;
1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//                                      if (attributes.ExtractFormValueAtIndex(dwarf2Data, i, form_value))
1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//                                      {
1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//                                          // If we have valid block data, then we have location expression bytes
1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//                                          // that are fixed (not a location list).
1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//                                          const uint8_t *block_data = form_value.BlockData();
1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//                                          if (block_data)
1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//                                          {
1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//                                              uint32_t block_length = form_value.Unsigned();
1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//                                              if (block_length == 1 + attributes.CompileUnitAtIndex(i)->GetAddressByteSize())
1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//                                              {
165ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch//                                                  if (block_data[0] == DW_OP_addr)
1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//                                                      add_die = true;
1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//                                              }
1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//                                          }
1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//                                      }
1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                        parent_die = NULL;  // Terminate the while loop.
1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                        break;
1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                    case DW_TAG_compile_unit:
1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                        add_die = true;
1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                        parent_die = NULL;  // Terminate the while loop.
1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                        break;
1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                    default:
1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                        parent_die = parent_die->GetParent();   // Keep going in the while loop.
1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                        break;
1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                    }
1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                }
1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                            }
1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                            break;
1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        }
1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    }
1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                }
1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                if (add_die && (name || mangled))
1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                {
1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    pubnames_set.AddDescriptor(die->GetOffset() - cu_offset, mangled ? mangled : name);
1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                }
1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            }
194
195            if (pubnames_set.NumDescriptors() > 0)
196            {
197                m_sets.push_back(pubnames_set);
198            }
199
200            // Keep memory down by clearing DIEs if this generate function
201            // caused them to be parsed
202            if (clear_dies)
203                cu->ClearDIEs (true);
204        }
205    }
206    if (m_sets.empty())
207        return false;
208    if (log)
209        Dump (log);
210    return true;
211}
212
213bool
214DWARFDebugPubnames::GeneratePubBaseTypes(SymbolFileDWARF* dwarf2Data)
215{
216    m_sets.clear();
217    DWARFDebugInfo* debug_info = dwarf2Data->DebugInfo();
218    if (debug_info)
219    {
220        uint32_t cu_idx = 0;
221        const uint32_t num_compile_units = dwarf2Data->GetNumCompileUnits();
222        for (cu_idx = 0; cu_idx < num_compile_units; ++cu_idx)
223        {
224            DWARFCompileUnit* cu = debug_info->GetCompileUnitAtIndex(cu_idx);
225            DWARFDIECollection dies;
226            const size_t die_count = cu->AppendDIEsWithTag (DW_TAG_base_type, dies);
227            dw_offset_t cu_offset = cu->GetOffset();
228            DWARFDebugPubnamesSet pubnames_set(DW_INVALID_OFFSET, cu_offset, cu->GetNextCompileUnitOffset() - cu_offset);
229
230            size_t die_idx;
231            for (die_idx = 0; die_idx < die_count; ++die_idx)
232            {
233                const DWARFDebugInfoEntry *die = dies.GetDIEPtrAtIndex(die_idx);
234                const char *name = die->GetAttributeValueAsString(dwarf2Data, cu, DW_AT_name, NULL);
235
236                if (name)
237                {
238                    pubnames_set.AddDescriptor(die->GetOffset() - cu_offset, name);
239                }
240            }
241
242            if (pubnames_set.NumDescriptors() > 0)
243            {
244                m_sets.push_back(pubnames_set);
245            }
246        }
247    }
248    return !m_sets.empty();
249}
250
251void
252DWARFDebugPubnames::Dump(Log *s) const
253{
254    if (m_sets.empty())
255        s->PutCString("< EMPTY >\n");
256    else
257    {
258        const_iterator pos;
259        const_iterator end = m_sets.end();
260
261        for (pos = m_sets.begin(); pos != end; ++pos)
262            (*pos).Dump(s);
263    }
264}
265
266bool
267DWARFDebugPubnames::Find(const char* name, bool ignore_case, std::vector<dw_offset_t>& die_offsets) const
268{
269    const_iterator pos;
270    const_iterator end = m_sets.end();
271
272    die_offsets.clear();
273
274    for (pos = m_sets.begin(); pos != end; ++pos)
275    {
276        (*pos).Find(name, ignore_case, die_offsets);
277    }
278
279    return !die_offsets.empty();
280}
281
282bool
283DWARFDebugPubnames::Find(const RegularExpression& regex, std::vector<dw_offset_t>& die_offsets) const
284{
285    const_iterator pos;
286    const_iterator end = m_sets.end();
287
288    die_offsets.clear();
289
290    for (pos = m_sets.begin(); pos != end; ++pos)
291    {
292        (*pos).Find(regex, die_offsets);
293    }
294
295    return !die_offsets.empty();
296}
297