124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//===-- DWARFDebugPubnames.cpp ----------------------------------*- C++ -*-===// 224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// The LLVM Compiler Infrastructure 424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// This file is distributed under the University of Illinois Open Source 624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// License. See LICENSE.TXT for details. 724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//===----------------------------------------------------------------------===// 924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 1024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "DWARFDebugPubnames.h" 1124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 1224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Core/Stream.h" 1324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Core/Timer.h" 1424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 1524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "DWARFDebugInfo.h" 1624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "DWARFDIECollection.h" 1724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "DWARFFormValue.h" 1824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "DWARFCompileUnit.h" 1924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "LogChannelDWARF.h" 2024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "SymbolFileDWARF.h" 2124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 2224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 23c7bbd271fba425130f82dfa028d68c92282e4fdcGreg Claytonusing namespace lldb; 2424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerusing namespace lldb_private; 2524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 2624943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerDWARFDebugPubnames::DWARFDebugPubnames() : 2724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_sets() 2824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 2924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 3024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 3124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool 3224943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerDWARFDebugPubnames::Extract(const DataExtractor& data) 3324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 3424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Timer scoped_timer (__PRETTY_FUNCTION__, 355f35a4be95aed0e5b2cb36f7d785bcbfc67284aeDaniel Malea "DWARFDebugPubnames::Extract (byte_size = %" PRIu64 ")", 36851e30ec6a1b1d2c154bb7d69ed0d05b5fd14705Greg Clayton (uint64_t)data.GetByteSize()); 37952e9dc874944fcdbbb224f3ec4fc2c859376f64Greg Clayton Log *log (LogChannelDWARF::GetLogIfAll(DWARF_LOG_DEBUG_PUBNAMES)); 3824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (log) 395f35a4be95aed0e5b2cb36f7d785bcbfc67284aeDaniel Malea log->Printf("DWARFDebugPubnames::Extract (byte_size = %" PRIu64 ")", (uint64_t)data.GetByteSize()); 4024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 4124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (data.ValidOffset(0)) 4224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 4336da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton lldb::offset_t offset = 0; 4424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 4524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner DWARFDebugPubnamesSet set; 4624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner while (data.ValidOffset(offset)) 4724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 4824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (set.Extract(data, &offset)) 4924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 5024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_sets.push_back(set); 5124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner offset = set.GetOffsetOfNextEntry(); 5224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 5324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else 5424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 5524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 5624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (log) 57952e9dc874944fcdbbb224f3ec4fc2c859376f64Greg Clayton Dump (log); 5824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return true; 5924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 6024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return false; 6124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 6224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 6324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 6424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool 6524943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerDWARFDebugPubnames::GeneratePubnames(SymbolFileDWARF* dwarf2Data) 6624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 6724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Timer scoped_timer (__PRETTY_FUNCTION__, 6824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner "DWARFDebugPubnames::GeneratePubnames (data = %p)", 6924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner dwarf2Data); 7024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 71952e9dc874944fcdbbb224f3ec4fc2c859376f64Greg Clayton Log *log (LogChannelDWARF::GetLogIfAll(DWARF_LOG_DEBUG_PUBNAMES)); 7224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (log) 7324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner log->Printf("DWARFDebugPubnames::GeneratePubnames (data = %p)", dwarf2Data); 7424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 7524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_sets.clear(); 7624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner DWARFDebugInfo* debug_info = dwarf2Data->DebugInfo(); 7724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (debug_info) 7824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 7924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 8024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const DataExtractor* debug_str = &dwarf2Data->get_debug_str_data(); 8124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 8224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner uint32_t cu_idx = 0; 8324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const uint32_t num_compile_units = dwarf2Data->GetNumCompileUnits(); 8424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner for (cu_idx = 0; cu_idx < num_compile_units; ++cu_idx) 8524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 8624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 8724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner DWARFCompileUnit* cu = debug_info->GetCompileUnitAtIndex(cu_idx); 8824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 895fcff9ac1a713d5e814b4a05edef7544be470ad0Greg Clayton const uint8_t *fixed_form_sizes = DWARFFormValue::GetFixedFormSizesForAddressSize (cu->GetAddressByteSize()); 905fcff9ac1a713d5e814b4a05edef7544be470ad0Greg Clayton 9124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner bool clear_dies = cu->ExtractDIEsIfNeeded (false) > 1; 9224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 9324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner DWARFDIECollection dies; 9424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const size_t die_count = cu->AppendDIEsWithTag (DW_TAG_subprogram, dies) + 9524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner cu->AppendDIEsWithTag (DW_TAG_variable, dies); 9624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 9724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner dw_offset_t cu_offset = cu->GetOffset(); 9824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner DWARFDebugPubnamesSet pubnames_set(DW_INVALID_OFFSET, cu_offset, cu->GetNextCompileUnitOffset() - cu_offset); 9924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 10024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner size_t die_idx; 10124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner for (die_idx = 0; die_idx < die_count; ++die_idx) 10224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 10324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const DWARFDebugInfoEntry *die = dies.GetDIEPtrAtIndex(die_idx); 10424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner DWARFDebugInfoEntry::Attributes attributes; 10524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const char *name = NULL; 10624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const char *mangled = NULL; 10724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner bool add_die = false; 1085fcff9ac1a713d5e814b4a05edef7544be470ad0Greg Clayton const size_t num_attributes = die->GetAttributes(dwarf2Data, cu, fixed_form_sizes, attributes); 10924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (num_attributes > 0) 11024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 11124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner uint32_t i; 11224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 11324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner dw_tag_t tag = die->Tag(); 11424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 11524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner for (i=0; i<num_attributes; ++i) 11624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 11724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner dw_attr_t attr = attributes.AttributeAtIndex(i); 11824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner DWARFFormValue form_value; 11924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner switch (attr) 12024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 12124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case DW_AT_name: 12224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (attributes.ExtractFormValueAtIndex(dwarf2Data, i, form_value)) 12324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner name = form_value.AsCString(debug_str); 12424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 12524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 12624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case DW_AT_MIPS_linkage_name: 1276f3a711edcfaeca1efbb998cdea5d0a0782ddfa3Greg Clayton case DW_AT_linkage_name: 12824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (attributes.ExtractFormValueAtIndex(dwarf2Data, i, form_value)) 12924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner mangled = form_value.AsCString(debug_str); 13024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 13124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 13224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case DW_AT_low_pc: 13324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case DW_AT_ranges: 13424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case DW_AT_entry_pc: 13524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (tag == DW_TAG_subprogram) 13624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner add_die = true; 13724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 13824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 13924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case DW_AT_location: 14024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (tag == DW_TAG_variable) 14124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 14224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const DWARFDebugInfoEntry* parent_die = die->GetParent(); 14324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner while ( parent_die != NULL ) 14424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 14524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner switch (parent_die->Tag()) 14624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 14724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case DW_TAG_subprogram: 14824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case DW_TAG_lexical_block: 14924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case DW_TAG_inlined_subroutine: 15024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Even if this is a function level static, we don't add it. We could theoretically 15124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // add these if we wanted to by introspecting into the DW_AT_location and seeing 1525d187e5495ee17f6763337a6ae28c2a7b07e4945Greg Clayton // if the location describes a hard coded address, but we don't want the performance 15324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // penalty of that right now. 15424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner add_die = false; 15524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// if (attributes.ExtractFormValueAtIndex(dwarf2Data, i, form_value)) 15624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// { 15724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// // If we have valid block data, then we have location expression bytes 15824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// // that are fixed (not a location list). 15924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// const uint8_t *block_data = form_value.BlockData(); 16024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// if (block_data) 16124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// { 16224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// uint32_t block_length = form_value.Unsigned(); 16324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// if (block_length == 1 + attributes.CompileUnitAtIndex(i)->GetAddressByteSize()) 16424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// { 16524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// if (block_data[0] == DW_OP_addr) 16624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// add_die = true; 16724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// } 16824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// } 16924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// } 17024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner parent_die = NULL; // Terminate the while loop. 17124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 17224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 17324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case DW_TAG_compile_unit: 17424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner add_die = true; 17524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner parent_die = NULL; // Terminate the while loop. 17624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 17724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 17824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner default: 17924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner parent_die = parent_die->GetParent(); // Keep going in the while loop. 18024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 18124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 18224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 18324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 18424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 18524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 18624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 18724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 18824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 18924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (add_die && (name || mangled)) 19024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 19124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner pubnames_set.AddDescriptor(die->GetOffset() - cu_offset, mangled ? mangled : name); 19224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 19324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 19424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 19524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (pubnames_set.NumDescriptors() > 0) 19624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 19724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_sets.push_back(pubnames_set); 19824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 19924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 20024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Keep memory down by clearing DIEs if this generate function 20124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // caused them to be parsed 20224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (clear_dies) 20324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner cu->ClearDIEs (true); 20424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 20524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 20624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (m_sets.empty()) 20724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return false; 20824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (log) 209952e9dc874944fcdbbb224f3ec4fc2c859376f64Greg Clayton Dump (log); 21024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return true; 21124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 21224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 21324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool 21424943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerDWARFDebugPubnames::GeneratePubBaseTypes(SymbolFileDWARF* dwarf2Data) 21524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 21624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_sets.clear(); 21724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner DWARFDebugInfo* debug_info = dwarf2Data->DebugInfo(); 21824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (debug_info) 21924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 22024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner uint32_t cu_idx = 0; 22124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const uint32_t num_compile_units = dwarf2Data->GetNumCompileUnits(); 22224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner for (cu_idx = 0; cu_idx < num_compile_units; ++cu_idx) 22324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 22424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner DWARFCompileUnit* cu = debug_info->GetCompileUnitAtIndex(cu_idx); 22524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner DWARFDIECollection dies; 22624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const size_t die_count = cu->AppendDIEsWithTag (DW_TAG_base_type, dies); 22724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner dw_offset_t cu_offset = cu->GetOffset(); 22824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner DWARFDebugPubnamesSet pubnames_set(DW_INVALID_OFFSET, cu_offset, cu->GetNextCompileUnitOffset() - cu_offset); 22924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 23024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner size_t die_idx; 23124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner for (die_idx = 0; die_idx < die_count; ++die_idx) 23224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 23324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const DWARFDebugInfoEntry *die = dies.GetDIEPtrAtIndex(die_idx); 23424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const char *name = die->GetAttributeValueAsString(dwarf2Data, cu, DW_AT_name, NULL); 23524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 23624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (name) 23724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 23824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner pubnames_set.AddDescriptor(die->GetOffset() - cu_offset, name); 23924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 24024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 24124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 24224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (pubnames_set.NumDescriptors() > 0) 24324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 24424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_sets.push_back(pubnames_set); 24524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 24624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 24724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 24824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return !m_sets.empty(); 24924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 25024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 25124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid 25224943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerDWARFDebugPubnames::Dump(Log *s) const 25324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 25424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (m_sets.empty()) 25524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner s->PutCString("< EMPTY >\n"); 25624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else 25724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 25824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const_iterator pos; 25924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const_iterator end = m_sets.end(); 26024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 26124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner for (pos = m_sets.begin(); pos != end; ++pos) 26224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner (*pos).Dump(s); 26324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 26424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 26524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 26624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool 26724943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerDWARFDebugPubnames::Find(const char* name, bool ignore_case, std::vector<dw_offset_t>& die_offsets) const 26824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 26924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const_iterator pos; 27024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const_iterator end = m_sets.end(); 27124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 27224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner die_offsets.clear(); 27324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 27424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner for (pos = m_sets.begin(); pos != end; ++pos) 27524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 27624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner (*pos).Find(name, ignore_case, die_offsets); 27724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 27824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 27924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return !die_offsets.empty(); 28024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 28124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 28224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool 28324943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerDWARFDebugPubnames::Find(const RegularExpression& regex, std::vector<dw_offset_t>& die_offsets) const 28424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 28524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const_iterator pos; 28624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const_iterator end = m_sets.end(); 28724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 28824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner die_offsets.clear(); 28924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 29024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner for (pos = m_sets.begin(); pos != end; ++pos) 29124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 29224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner (*pos).Find(regex, die_offsets); 29324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 29424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 29524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return !die_offsets.empty(); 29624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 297