HashedNameToDIE.h revision 296417
1//===-- HashedNameToDIE.h ---------------------------------------*- C++ -*-===// 2// 3// The LLVM Compiler Infrastructure 4// 5// This file is distributed under the University of Illinois Open Source 6// License. See LICENSE.TXT for details. 7// 8//===----------------------------------------------------------------------===// 9 10#ifndef SymbolFileDWARF_HashedNameToDIE_h_ 11#define SymbolFileDWARF_HashedNameToDIE_h_ 12 13#include <vector> 14 15#include "lldb/lldb-defines.h" 16#include "lldb/Core/dwarf.h" 17#include "lldb/Core/RegularExpression.h" 18#include "lldb/Core/MappedHash.h" 19 20#include "DWARFDefines.h" 21#include "DWARFFormValue.h" 22#include "NameToDIE.h" 23 24class SymbolFileDWARF; 25class DWARFCompileUnit; 26class DWARFDebugInfoEntry; 27 28class DWARFMappedHash 29{ 30public: 31 enum AtomType : uint16_t 32 { 33 eAtomTypeNULL = 0u, 34 eAtomTypeDIEOffset = 1u, // DIE offset, check form for encoding 35 eAtomTypeCUOffset = 2u, // DIE offset of the compiler unit header that contains the item in question 36 eAtomTypeTag = 3u, // DW_TAG_xxx value, should be encoded as DW_FORM_data1 (if no tags exceed 255) or DW_FORM_data2 37 eAtomTypeNameFlags = 4u, // Flags from enum NameFlags 38 eAtomTypeTypeFlags = 5u, // Flags from enum TypeFlags, 39 eAtomTypeQualNameHash = 6u // A 32 bit hash of the full qualified name (since all hash entries are basename only) 40 // For example a type like "std::vector<int>::iterator" would have a name of "iterator" 41 // and a 32 bit hash for "std::vector<int>::iterator" to allow us to not have to pull 42 // in debug info for a type when we know the fully qualified name. 43 }; 44 45 // Bit definitions for the eAtomTypeTypeFlags flags 46 enum TypeFlags 47 { 48 // Always set for C++, only set for ObjC if this is the 49 // @implementation for class 50 eTypeFlagClassIsImplementation = ( 1u << 1 ) 51 }; 52 53 struct DIEInfo 54 { 55 dw_offset_t cu_offset; 56 dw_offset_t offset; // The DIE offset 57 dw_tag_t tag; 58 uint32_t type_flags; // Any flags for this DIEInfo 59 uint32_t qualified_name_hash; // A 32 bit hash of the fully qualified name 60 61 DIEInfo (); 62 DIEInfo (dw_offset_t c, dw_offset_t o, dw_tag_t t, uint32_t f, uint32_t h); 63 }; 64 65 struct Atom 66 { 67 AtomType type; 68 dw_form_t form; 69 }; 70 71 typedef std::vector<DIEInfo> DIEInfoArray; 72 typedef std::vector<Atom> AtomArray; 73 74 class Prologue 75 { 76 public: 77 Prologue (dw_offset_t _die_base_offset = 0); 78 79 void 80 ClearAtoms (); 81 82 bool 83 ContainsAtom (AtomType atom_type) const; 84 85 void 86 Clear (); 87 88 void 89 AppendAtom (AtomType type, dw_form_t form); 90 91 lldb::offset_t 92 Read (const lldb_private::DataExtractor &data, lldb::offset_t offset); 93 94 size_t 95 GetByteSize () const; 96 97 size_t 98 GetMinimumHashDataByteSize () const; 99 100 bool 101 HashDataHasFixedByteSize() const; 102 103 // DIE offset base so die offsets in hash_data can be CU relative 104 dw_offset_t die_base_offset; 105 AtomArray atoms; 106 uint32_t atom_mask; 107 size_t min_hash_data_byte_size; 108 bool hash_data_has_fixed_byte_size; 109 }; 110 111 class Header : public MappedHash::Header<Prologue> 112 { 113 public: 114 size_t 115 GetByteSize (const HeaderData &header_data) override; 116 117 lldb::offset_t 118 Read (lldb_private::DataExtractor &data, lldb::offset_t offset) override; 119 120 bool 121 Read (const lldb_private::DWARFDataExtractor &data, 122 lldb::offset_t *offset_ptr, 123 DIEInfo &hash_data) const; 124 125 void 126 Dump (lldb_private::Stream& strm, const DIEInfo &hash_data) const; 127 }; 128 129 // A class for reading and using a saved hash table from a block of data 130 // in memory 131 class MemoryTable : public MappedHash::MemoryTable<uint32_t, DWARFMappedHash::Header, DIEInfoArray> 132 { 133 public: 134 MemoryTable (lldb_private::DWARFDataExtractor &table_data, 135 const lldb_private::DWARFDataExtractor &string_table, 136 const char *name); 137 138 const char * 139 GetStringForKeyType (KeyType key) const override; 140 141 bool 142 ReadHashData (uint32_t hash_data_offset, HashData &hash_data) const override; 143 144 size_t 145 AppendAllDIEsThatMatchingRegex (const lldb_private::RegularExpression& regex, 146 DIEInfoArray &die_info_array) const; 147 148 size_t 149 AppendAllDIEsInRange (const uint32_t die_offset_start, 150 const uint32_t die_offset_end, 151 DIEInfoArray &die_info_array) const; 152 153 size_t 154 FindByName (const char *name, DIEArray &die_offsets); 155 156 size_t 157 FindByNameAndTag (const char *name, const dw_tag_t tag, DIEArray &die_offsets); 158 159 size_t 160 FindByNameAndTagAndQualifiedNameHash (const char *name, 161 const dw_tag_t tag, 162 const uint32_t qualified_name_hash, 163 DIEArray &die_offsets); 164 165 size_t 166 FindCompleteObjCClassByName (const char *name, 167 DIEArray &die_offsets, 168 bool must_be_implementation); 169 170 protected: 171 Result 172 AppendHashDataForRegularExpression (const lldb_private::RegularExpression& regex, 173 lldb::offset_t* hash_data_offset_ptr, 174 Pair &pair) const; 175 176 size_t 177 FindByName (const char *name, DIEInfoArray &die_info_array); 178 179 Result 180 GetHashDataForName (const char *name, 181 lldb::offset_t* hash_data_offset_ptr, 182 Pair &pair) const override; 183 184 const lldb_private::DWARFDataExtractor &m_data; 185 const lldb_private::DWARFDataExtractor &m_string_table; 186 std::string m_name; 187 }; 188 189 static void 190 ExtractDIEArray (const DIEInfoArray &die_info_array, DIEArray &die_offsets); 191 192protected: 193 static void 194 ExtractDIEArray (const DIEInfoArray &die_info_array, 195 const dw_tag_t tag, 196 DIEArray &die_offsets); 197 198 static void 199 ExtractDIEArray (const DIEInfoArray &die_info_array, 200 const dw_tag_t tag, 201 const uint32_t qualified_name_hash, 202 DIEArray &die_offsets); 203 204 static void 205 ExtractClassOrStructDIEArray (const DIEInfoArray &die_info_array, 206 bool return_implementation_only_if_available, 207 DIEArray &die_offsets); 208 209 static void 210 ExtractTypesFromDIEArray (const DIEInfoArray &die_info_array, 211 uint32_t type_flag_mask, 212 uint32_t type_flag_value, 213 DIEArray &die_offsets); 214 215 static const char * 216 GetAtomTypeName (uint16_t atom); 217}; 218 219#endif // SymbolFileDWARF_HashedNameToDIE_h_ 220