124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//===-- DWARFDebugPubnamesSet.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 "DWARFDebugPubnamesSet.h" 1124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 1224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Core/RegularExpression.h" 1324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Core/Log.h" 1424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 1524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "SymbolFileDWARF.h" 1624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 1724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerusing namespace lldb_private; 1824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 1924943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerDWARFDebugPubnamesSet::DWARFDebugPubnamesSet() : 2024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_offset(DW_INVALID_OFFSET), 2124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_header(), 2224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_descriptors(), 2324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_name_to_descriptor_index() 2424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 2524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 2624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 2724943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerDWARFDebugPubnamesSet::DWARFDebugPubnamesSet(dw_offset_t debug_aranges_offset, dw_offset_t cu_die_offset, dw_offset_t cu_die_length) : 2824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_offset(debug_aranges_offset), 2924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_header(), 3024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_descriptors(), 3124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_name_to_descriptor_index() 3224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 3324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_header.length = 10; // set the length to only include the header right for now 3424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_header.version = 2; // The DWARF version number 3524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_header.die_offset = cu_die_offset;// compile unit .debug_info offset 3624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_header.die_length = cu_die_length;// compile unit .debug_info length 3724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 3824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 3924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid 4024943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerDWARFDebugPubnamesSet::AddDescriptor(dw_offset_t cu_rel_offset, const char* name) 4124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 4224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (name && name[0]) 4324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 4424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Adjust our header length 4524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_header.length += strlen(name) + 1 + sizeof(dw_offset_t); 4624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Descriptor pubnameDesc(cu_rel_offset, name); 4724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_descriptors.push_back(pubnameDesc); 4824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 4924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 5024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 5124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid 5224943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerDWARFDebugPubnamesSet::Clear() 5324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 5424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_offset = DW_INVALID_OFFSET; 5524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_header.length = 10; 5624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_header.version = 2; 5724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_header.die_offset = DW_INVALID_OFFSET; 5824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_header.die_length = 0; 5924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_descriptors.clear(); 6024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 6124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 6224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 6324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//---------------------------------------------------------------------- 6424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// InitNameIndexes 6524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//---------------------------------------------------------------------- 6624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid 6724943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerDWARFDebugPubnamesSet::InitNameIndexes() const 6824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 6924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Create the name index vector to be able to quickly search by name 7024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const size_t count = m_descriptors.size(); 7124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner for (uint32_t idx = 0; idx < count; ++idx) 7224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 7324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const char* name = m_descriptors[idx].name.c_str(); 7424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (name && name[0]) 7524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_name_to_descriptor_index.insert(cstr_to_index_mmap::value_type(name, idx)); 7624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 7724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 7824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 7924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 8024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool 8136da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg ClaytonDWARFDebugPubnamesSet::Extract(const DataExtractor& data, lldb::offset_t *offset_ptr) 8224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 8324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (data.ValidOffset(*offset_ptr)) 8424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 8524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_descriptors.clear(); 8624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_offset = *offset_ptr; 8724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_header.length = data.GetU32(offset_ptr); 8824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_header.version = data.GetU16(offset_ptr); 8924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_header.die_offset = data.GetU32(offset_ptr); 9024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_header.die_length = data.GetU32(offset_ptr); 9124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 9224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Descriptor pubnameDesc; 9324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner while (data.ValidOffset(*offset_ptr)) 9424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 9524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner pubnameDesc.offset = data.GetU32(offset_ptr); 9624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 9724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (pubnameDesc.offset) 9824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 9924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const char* name = data.GetCStr(offset_ptr); 10024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (name && name[0]) 10124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 10224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner pubnameDesc.name = name; 10324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_descriptors.push_back(pubnameDesc); 10424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 10524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 10624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else 10724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; // We are done if we get a zero 4 byte offset 10824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 10924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 11024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return !m_descriptors.empty(); 11124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 11224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return false; 11324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 11424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 11524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerdw_offset_t 11624943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerDWARFDebugPubnamesSet::GetOffsetOfNextEntry() const 11724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 11824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return m_offset + m_header.length + 4; 11924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 12024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 12124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid 12224943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerDWARFDebugPubnamesSet::Dump(Log *log) const 12324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 12424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner log->Printf("Pubnames Header: length = 0x%8.8x, version = 0x%4.4x, die_offset = 0x%8.8x, die_length = 0x%8.8x", 12524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_header.length, 12624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_header.version, 12724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_header.die_offset, 12824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_header.die_length); 12924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 13024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner bool verbose = log->GetVerbose(); 13124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 13224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner DescriptorConstIter pos; 13324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner DescriptorConstIter end = m_descriptors.end(); 13424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner for (pos = m_descriptors.begin(); pos != end; ++pos) 13524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 13624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (verbose) 13724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner log->Printf("0x%8.8x + 0x%8.8x = 0x%8.8x: %s", pos->offset, m_header.die_offset, pos->offset + m_header.die_offset, pos->name.c_str()); 13824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else 13924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner log->Printf("0x%8.8x: %s", pos->offset + m_header.die_offset, pos->name.c_str()); 14024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 14124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 14224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 14324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 14424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid 14524943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerDWARFDebugPubnamesSet::Find(const char* name, bool ignore_case, std::vector<dw_offset_t>& die_offset_coll) const 14624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 14724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (!m_descriptors.empty() && m_name_to_descriptor_index.empty()) 14824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner InitNameIndexes(); 14924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 15024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner std::pair<cstr_to_index_mmap::const_iterator, cstr_to_index_mmap::const_iterator> range(m_name_to_descriptor_index.equal_range(name)); 15124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner for (cstr_to_index_mmap::const_iterator pos = range.first; pos != range.second; ++pos) 15224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner die_offset_coll.push_back(m_header.die_offset + m_descriptors[(*pos).second].offset); 15324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 15424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 15524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid 15624943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerDWARFDebugPubnamesSet::Find(const RegularExpression& regex, std::vector<dw_offset_t>& die_offset_coll) const 15724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 15824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner DescriptorConstIter pos; 15924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner DescriptorConstIter end = m_descriptors.end(); 16024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner for (pos = m_descriptors.begin(); pos != end; ++pos) 16124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 16224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if ( regex.Execute(pos->name.c_str()) ) 16324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner die_offset_coll.push_back(m_header.die_offset + pos->offset); 16424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 16524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 16624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 167