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