174124754d6d8ffda5bdaef8ac87e7faaeef3b358Greg Clayton//===-- NameToDIE.cpp -------------------------------------------*- C++ -*-===// 274124754d6d8ffda5bdaef8ac87e7faaeef3b358Greg Clayton// 374124754d6d8ffda5bdaef8ac87e7faaeef3b358Greg Clayton// The LLVM Compiler Infrastructure 474124754d6d8ffda5bdaef8ac87e7faaeef3b358Greg Clayton// 574124754d6d8ffda5bdaef8ac87e7faaeef3b358Greg Clayton// This file is distributed under the University of Illinois Open Source 674124754d6d8ffda5bdaef8ac87e7faaeef3b358Greg Clayton// License. See LICENSE.TXT for details. 774124754d6d8ffda5bdaef8ac87e7faaeef3b358Greg Clayton// 874124754d6d8ffda5bdaef8ac87e7faaeef3b358Greg Clayton//===----------------------------------------------------------------------===// 974124754d6d8ffda5bdaef8ac87e7faaeef3b358Greg Clayton 1074124754d6d8ffda5bdaef8ac87e7faaeef3b358Greg Clayton#include "NameToDIE.h" 1128f867447c71231a7376e579fba8938ec2571232Greg Clayton#include "lldb/Core/ConstString.h" 12c8cf5e234be554d4acb6ae644a8269c303c4f56eGreg Clayton#include "lldb/Core/DataExtractor.h" 1374124754d6d8ffda5bdaef8ac87e7faaeef3b358Greg Clayton#include "lldb/Core/Stream.h" 14c8cf5e234be554d4acb6ae644a8269c303c4f56eGreg Clayton#include "lldb/Core/StreamString.h" 1528f867447c71231a7376e579fba8938ec2571232Greg Clayton#include "lldb/Core/RegularExpression.h" 16c8cf5e234be554d4acb6ae644a8269c303c4f56eGreg Clayton#include "lldb/Symbol/ObjectFile.h" 17c8cf5e234be554d4acb6ae644a8269c303c4f56eGreg Clayton 18c8cf5e234be554d4acb6ae644a8269c303c4f56eGreg Clayton#include "DWARFCompileUnit.h" 19c8cf5e234be554d4acb6ae644a8269c303c4f56eGreg Clayton#include "DWARFDebugInfo.h" 20c8cf5e234be554d4acb6ae644a8269c303c4f56eGreg Clayton#include "DWARFDebugInfoEntry.h" 21c8cf5e234be554d4acb6ae644a8269c303c4f56eGreg Clayton#include "SymbolFileDWARF.h" 22c8cf5e234be554d4acb6ae644a8269c303c4f56eGreg Claytonusing namespace lldb; 23c8cf5e234be554d4acb6ae644a8269c303c4f56eGreg Claytonusing namespace lldb_private; 2428f867447c71231a7376e579fba8938ec2571232Greg Clayton 2528f867447c71231a7376e579fba8938ec2571232Greg Claytonvoid 26144188bc458a35997d2f2e52206ab69747439073Greg ClaytonNameToDIE::Finalize() 2728f867447c71231a7376e579fba8938ec2571232Greg Clayton{ 28144188bc458a35997d2f2e52206ab69747439073Greg Clayton m_map.Sort (); 29144188bc458a35997d2f2e52206ab69747439073Greg Clayton m_map.SizeToFit (); 3028f867447c71231a7376e579fba8938ec2571232Greg Clayton} 3174124754d6d8ffda5bdaef8ac87e7faaeef3b358Greg Clayton 32144188bc458a35997d2f2e52206ab69747439073Greg Claytonvoid 33144188bc458a35997d2f2e52206ab69747439073Greg ClaytonNameToDIE::Insert (const ConstString& name, uint32_t die_offset) 3474124754d6d8ffda5bdaef8ac87e7faaeef3b358Greg Clayton{ 35144188bc458a35997d2f2e52206ab69747439073Greg Clayton m_map.Append(name.GetCString(), die_offset); 3674124754d6d8ffda5bdaef8ac87e7faaeef3b358Greg Clayton} 3774124754d6d8ffda5bdaef8ac87e7faaeef3b358Greg Clayton 3874124754d6d8ffda5bdaef8ac87e7faaeef3b358Greg Claytonsize_t 39144188bc458a35997d2f2e52206ab69747439073Greg ClaytonNameToDIE::Find (const ConstString &name, DIEArray &info_array) const 4074124754d6d8ffda5bdaef8ac87e7faaeef3b358Greg Clayton{ 41144188bc458a35997d2f2e52206ab69747439073Greg Clayton return m_map.GetValues (name.GetCString(), info_array); 4274124754d6d8ffda5bdaef8ac87e7faaeef3b358Greg Clayton} 4374124754d6d8ffda5bdaef8ac87e7faaeef3b358Greg Clayton 4474124754d6d8ffda5bdaef8ac87e7faaeef3b358Greg Claytonsize_t 45144188bc458a35997d2f2e52206ab69747439073Greg ClaytonNameToDIE::Find (const RegularExpression& regex, DIEArray &info_array) const 4674124754d6d8ffda5bdaef8ac87e7faaeef3b358Greg Clayton{ 47144188bc458a35997d2f2e52206ab69747439073Greg Clayton return m_map.GetValues (regex, info_array); 4874124754d6d8ffda5bdaef8ac87e7faaeef3b358Greg Clayton} 4974124754d6d8ffda5bdaef8ac87e7faaeef3b358Greg Clayton 50144188bc458a35997d2f2e52206ab69747439073Greg Claytonsize_t 51144188bc458a35997d2f2e52206ab69747439073Greg ClaytonNameToDIE::FindAllEntriesForCompileUnit (uint32_t cu_offset, 52144188bc458a35997d2f2e52206ab69747439073Greg Clayton uint32_t cu_end_offset, 53144188bc458a35997d2f2e52206ab69747439073Greg Clayton DIEArray &info_array) const 5474124754d6d8ffda5bdaef8ac87e7faaeef3b358Greg Clayton{ 55144188bc458a35997d2f2e52206ab69747439073Greg Clayton const size_t initial_size = info_array.size(); 56144188bc458a35997d2f2e52206ab69747439073Greg Clayton const uint32_t size = m_map.GetSize(); 57144188bc458a35997d2f2e52206ab69747439073Greg Clayton for (uint32_t i=0; i<size; ++i) 5874124754d6d8ffda5bdaef8ac87e7faaeef3b358Greg Clayton { 59144188bc458a35997d2f2e52206ab69747439073Greg Clayton const uint32_t die_offset = m_map.GetValueAtIndexUnchecked(i); 60144188bc458a35997d2f2e52206ab69747439073Greg Clayton if (cu_offset < die_offset && die_offset < cu_end_offset) 61144188bc458a35997d2f2e52206ab69747439073Greg Clayton info_array.push_back (die_offset); 6274124754d6d8ffda5bdaef8ac87e7faaeef3b358Greg Clayton } 63144188bc458a35997d2f2e52206ab69747439073Greg Clayton return info_array.size() - initial_size; 6474124754d6d8ffda5bdaef8ac87e7faaeef3b358Greg Clayton} 652b1b4115afff049ff4462df3b206cbf25b8f1d3fGreg Clayton 66144188bc458a35997d2f2e52206ab69747439073Greg Claytonvoid 67144188bc458a35997d2f2e52206ab69747439073Greg ClaytonNameToDIE::Dump (Stream *s) 68c8cf5e234be554d4acb6ae644a8269c303c4f56eGreg Clayton{ 69144188bc458a35997d2f2e52206ab69747439073Greg Clayton const uint32_t size = m_map.GetSize(); 70144188bc458a35997d2f2e52206ab69747439073Greg Clayton for (uint32_t i=0; i<size; ++i) 71c8cf5e234be554d4acb6ae644a8269c303c4f56eGreg Clayton { 72144188bc458a35997d2f2e52206ab69747439073Greg Clayton const char *cstr = m_map.GetCStringAtIndex(i); 73144188bc458a35997d2f2e52206ab69747439073Greg Clayton s->Printf("%p: {0x%8.8x} \"%s\"\n", cstr, m_map.GetValueAtIndexUnchecked(i), cstr); 74c8cf5e234be554d4acb6ae644a8269c303c4f56eGreg Clayton } 752b1b4115afff049ff4462df3b206cbf25b8f1d3fGreg Clayton} 76a8b56238ce138e70433a0ce0b4218c9257beae38Greg Clayton 77a8b56238ce138e70433a0ce0b4218c9257beae38Greg Claytonvoid 78a8b56238ce138e70433a0ce0b4218c9257beae38Greg ClaytonNameToDIE::ForEach (std::function <bool(const char *name, uint32_t die_offset)> const &callback) const 79a8b56238ce138e70433a0ce0b4218c9257beae38Greg Clayton{ 80a8b56238ce138e70433a0ce0b4218c9257beae38Greg Clayton const uint32_t size = m_map.GetSize(); 81a8b56238ce138e70433a0ce0b4218c9257beae38Greg Clayton for (uint32_t i=0; i<size; ++i) 82a8b56238ce138e70433a0ce0b4218c9257beae38Greg Clayton { 83a8b56238ce138e70433a0ce0b4218c9257beae38Greg Clayton if (!callback(m_map.GetCStringAtIndexUnchecked(i), 84a8b56238ce138e70433a0ce0b4218c9257beae38Greg Clayton m_map.GetValueAtIndexUnchecked (i))) 85a8b56238ce138e70433a0ce0b4218c9257beae38Greg Clayton break; 86a8b56238ce138e70433a0ce0b4218c9257beae38Greg Clayton } 87a8b56238ce138e70433a0ce0b4218c9257beae38Greg Clayton} 88