124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//===-- DWARFDebugPubnamesSet.h ---------------------------------*- 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 10d996d0c32b483c2190e1eb288cd3bbbd259c2960Greg Clayton#ifndef SymbolFileDWARF_DWARFDebugPubnamesSet_h_ 1124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#define SymbolFileDWARF_DWARFDebugPubnamesSet_h_ 1224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 1324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "SymbolFileDWARF.h" 1424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include <string> 1524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include <vector> 1691815a4770797a42816c4219d40b9f6148c03646Sean Callanan#if __cplusplus >= 201103L 1791815a4770797a42816c4219d40b9f6148c03646Sean Callanan#include <unordered_map> 1891815a4770797a42816c4219d40b9f6148c03646Sean Callanan#else 1924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include <ext/hash_map> 2091815a4770797a42816c4219d40b9f6148c03646Sean Callanan#endif 2124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 2224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerclass DWARFDebugPubnamesSet 2324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 2424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerpublic: 2524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner struct Header 2624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 2724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner uint32_t length; // length of the set of entries for this compilation unit, not including the length field itself 2824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner uint16_t version; // The DWARF version number 2924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner uint32_t die_offset; // compile unit .debug_info offset 3024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner uint32_t die_length; // compile unit .debug_info length 3124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Header() : 3224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner length(10), 3324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner version(2), 3424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner die_offset(DW_INVALID_OFFSET), 3524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner die_length(0) 3624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 3724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 3824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner }; 3924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 4024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner struct Descriptor 4124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 4224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Descriptor() : 4324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner offset(), 4424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner name() 4524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 4624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 4724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 4824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Descriptor(dw_offset_t the_offset, const char *the_name) : 4924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner offset(the_offset), 5024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner name(the_name ? the_name : "") 5124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 5224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 5324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 5424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner dw_offset_t offset; 5524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner std::string name; 5624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner }; 5724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 5824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner DWARFDebugPubnamesSet(); 5924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner DWARFDebugPubnamesSet(dw_offset_t debug_aranges_offset, dw_offset_t cu_die_offset, dw_offset_t die_length); 6024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner dw_offset_t GetOffset() const { return m_offset; } 6124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner void SetOffset(dw_offset_t offset) { m_offset = offset; } 6224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner DWARFDebugPubnamesSet::Header& GetHeader() { return m_header; } 6324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const DWARFDebugPubnamesSet::Header& GetHeader() const { return m_header; } 6424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const DWARFDebugPubnamesSet::Descriptor* GetDescriptor(uint32_t i) const 6524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 6624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (i < m_descriptors.size()) 6724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return &m_descriptors[i]; 6824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return NULL; 6924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 7024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner uint32_t NumDescriptors() const { return m_descriptors.size(); } 7124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner void AddDescriptor(dw_offset_t cu_rel_offset, const char* name); 7224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner void Clear(); 7336da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton bool Extract(const lldb_private::DataExtractor& debug_pubnames_data, lldb::offset_t *offset_ptr); 7424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner void Dump(lldb_private::Log *s) const; 7524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner void InitNameIndexes() const; 7624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner void Find(const char* name, bool ignore_case, std::vector<dw_offset_t>& die_offset_coll) const; 7724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner void Find(const lldb_private::RegularExpression& regex, std::vector<dw_offset_t>& die_offsets) const; 7824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner dw_offset_t GetOffsetOfNextEntry() const; 7924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 8024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 8124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 8224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerprotected: 8324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner typedef std::vector<Descriptor> DescriptorColl; 8424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner typedef DescriptorColl::iterator DescriptorIter; 8524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner typedef DescriptorColl::const_iterator DescriptorConstIter; 8624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 8724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 8824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner dw_offset_t m_offset; 8924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Header m_header; 9091815a4770797a42816c4219d40b9f6148c03646Sean Callanan#if __cplusplus >= 201103L 9191815a4770797a42816c4219d40b9f6148c03646Sean Callanan typedef std::unordered_multimap<const char*, uint32_t, std::hash<const char*>, CStringEqualBinaryPredicate> cstr_to_index_mmap; 9291815a4770797a42816c4219d40b9f6148c03646Sean Callanan#else 9324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner typedef __gnu_cxx::hash_multimap<const char*, uint32_t, __gnu_cxx::hash<const char*>, CStringEqualBinaryPredicate> cstr_to_index_mmap; 9491815a4770797a42816c4219d40b9f6148c03646Sean Callanan#endif 9524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner DescriptorColl m_descriptors; 9624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner mutable cstr_to_index_mmap m_name_to_descriptor_index; 9724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}; 9824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 9924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#endif // SymbolFileDWARF_DWARFDebugPubnamesSet_h_ 100