DIEHash.cpp revision a9a8f0f432966438800ffabb1b740a4cc8cd2599
1a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch//===-- llvm/CodeGen/DIEHash.cpp - Dwarf Hashing Framework ----------------===// 2a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch// 3a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch// The LLVM Compiler Infrastructure 4a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch// 5a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch// This file is distributed under the University of Illinois Open Source 6a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch// License. See LICENSE.TXT for details. 7a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch// 8a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch//===----------------------------------------------------------------------===// 9a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch// 10a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch// This file contains support for DWARF4 hashing of DIEs. 11a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch// 12a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch//===----------------------------------------------------------------------===// 13a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch 14a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch#define DEBUG_TYPE "dwarfdebug" 15a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch 16a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch#include "DIEHash.h" 17a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch 18a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch#include "DIE.h" 19a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch#include "DwarfCompileUnit.h" 20a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch#include "llvm/ADT/ArrayRef.h" 21a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch#include "llvm/ADT/StringRef.h" 22a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch#include "llvm/Support/Debug.h" 23a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch#include "llvm/Support/Dwarf.h" 24a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch#include "llvm/Support/Endian.h" 25a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch#include "llvm/Support/MD5.h" 26a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch#include "llvm/Support/raw_ostream.h" 27a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch 28a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdochusing namespace llvm; 29a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch 30a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch/// \brief Grabs the string in whichever attribute is passed in and returns 31a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch/// a reference to it. 32a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdochstatic StringRef getDIEStringAttr(const DIE &Die, uint16_t Attr) { 33a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch const SmallVectorImpl<DIEValue *> &Values = Die.getValues(); 34a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch const DIEAbbrev &Abbrevs = Die.getAbbrev(); 35a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch 36a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch // Iterate through all the attributes until we find the one we're 375d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) // looking for, if we can't find it return an empty string. 38a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch for (size_t i = 0; i < Values.size(); ++i) { 39a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch if (Abbrevs.getData()[i].getAttribute() == Attr) { 40a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch DIEValue *V = Values[i]; 41a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch assert(isa<DIEString>(V) && "String requested. Not a string."); 42a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch DIEString *S = cast<DIEString>(V); 43a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch return S->getString(); 44c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) } 45a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch } 46a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch return StringRef(""); 47a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch} 48f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu 49f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu/// \brief Adds the string in \p Str to the hash. This also hashes 50f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu/// a trailing NULL with the string. 51f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liuvoid DIEHash::addString(StringRef Str) { 52f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu DEBUG(dbgs() << "Adding string " << Str << " to hash.\n"); 53f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu Hash.update(Str); 54f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu Hash.update(makeArrayRef((uint8_t)'\0')); 55f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu} 56f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu 57f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu// FIXME: The LEB128 routines are copied and only slightly modified out of 58f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu// LEB128.h. 59f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu 60f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu/// \brief Adds the unsigned in \p Value to the hash encoded as a ULEB128. 61f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liuvoid DIEHash::addULEB128(uint64_t Value) { 62f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu DEBUG(dbgs() << "Adding ULEB128 " << Value << " to hash.\n"); 63f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu do { 64f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu uint8_t Byte = Value & 0x7f; 65f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu Value >>= 7; 66f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu if (Value != 0) 67f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu Byte |= 0x80; // Mark this byte to show that more bytes will follow. 68f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu Hash.update(Byte); 69f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu } while (Value != 0); 70f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu} 71f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu 725d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)void DIEHash::addSLEB128(int64_t Value) { 735d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) DEBUG(dbgs() << "Adding ULEB128 " << Value << " to hash.\n"); 74197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch bool More; 75197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch do { 76197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch uint8_t Byte = Value & 0x7f; 77197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch Value >>= 7; 78197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch More = !((((Value == 0 ) && ((Byte & 0x40) == 0)) || 795d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) ((Value == -1) && ((Byte & 0x40) != 0)))); 805d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) if (More) 815d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) Byte |= 0x80; // Mark this byte to show that more bytes will follow. 825d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) Hash.update(Byte); 835d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) } while (More); 845d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)} 855d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) 865d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)/// \brief Including \p Parent adds the context of Parent to the hash.. 875d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)void DIEHash::addParentContext(const DIE &Parent) { 885d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) 895d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) DEBUG(dbgs() << "Adding parent context to hash...\n"); 90197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch 91197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch // [7.27.2] For each surrounding type or namespace beginning with the 92197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch // outermost such construct... 93197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch SmallVector<const DIE *, 1> Parents; 94197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch const DIE *Cur = &Parent; 955d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) while (Cur->getTag() != dwarf::DW_TAG_compile_unit) { 965d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) Parents.push_back(Cur); 975d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) Cur = Cur->getParent(); 985d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) } 995d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) 1005d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) // Reverse iterate over our list to go from the outermost construct to the 1015d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) // innermost. 1025d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) for (SmallVectorImpl<const DIE *>::reverse_iterator I = Parents.rbegin(), 1035d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) E = Parents.rend(); 1045d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) I != E; ++I) { 105197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch const DIE &Die = **I; 106197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch 1075d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) // ... Append the letter "C" to the sequence... 1085d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) addULEB128('C'); 1095d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) 1105d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) // ... Followed by the DWARF tag of the construct... 111a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch addULEB128(Die.getTag()); 112a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch 113a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch // ... Then the name, taken from the DW_AT_name attribute. 114a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch StringRef Name = getDIEStringAttr(Die, dwarf::DW_AT_name); 115a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch DEBUG(dbgs() << "... adding context: " << Name << "\n"); 116a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch if (!Name.empty()) 117a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch addString(Name); 118a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch } 119a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch} 120a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch 121a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch// Collect all of the attributes for a particular DIE in single structure. 122a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdochvoid DIEHash::collectAttributes(const DIE &Die, DIEAttrs &Attrs) { 123a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch const SmallVectorImpl<DIEValue *> &Values = Die.getValues(); 124a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch const DIEAbbrev &Abbrevs = Die.getAbbrev(); 125a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch 126a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch#define COLLECT_ATTR(NAME) \ 127a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch case dwarf::NAME: \ 128a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch Attrs.NAME.Val = Values[i]; \ 129a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch Attrs.NAME.Desc = &Abbrevs.getData()[i]; \ 130a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch break 131a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch 132a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch for (size_t i = 0, e = Values.size(); i != e; ++i) { 133a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch DEBUG(dbgs() << "Attribute: " 134a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch << dwarf::AttributeString(Abbrevs.getData()[i].getAttribute()) 135a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch << " added.\n"); 136a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch switch (Abbrevs.getData()[i].getAttribute()) { 137a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch COLLECT_ATTR(DW_AT_name); 138a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch COLLECT_ATTR(DW_AT_accessibility); 139a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch COLLECT_ATTR(DW_AT_address_class); 140a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch COLLECT_ATTR(DW_AT_allocated); 141a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch COLLECT_ATTR(DW_AT_artificial); 142a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch COLLECT_ATTR(DW_AT_associated); 143a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch COLLECT_ATTR(DW_AT_binary_scale); 144a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch COLLECT_ATTR(DW_AT_bit_offset); 145a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch COLLECT_ATTR(DW_AT_bit_size); 146a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch COLLECT_ATTR(DW_AT_bit_stride); 147a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch COLLECT_ATTR(DW_AT_byte_size); 148a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch COLLECT_ATTR(DW_AT_byte_stride); 149a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch COLLECT_ATTR(DW_AT_const_expr); 150a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch COLLECT_ATTR(DW_AT_const_value); 151a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch COLLECT_ATTR(DW_AT_containing_type); 152a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch COLLECT_ATTR(DW_AT_count); 153a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch COLLECT_ATTR(DW_AT_data_bit_offset); 154a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch COLLECT_ATTR(DW_AT_data_location); 155a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch COLLECT_ATTR(DW_AT_data_member_location); 156a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch COLLECT_ATTR(DW_AT_decimal_scale); 157a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch COLLECT_ATTR(DW_AT_decimal_sign); 158a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch COLLECT_ATTR(DW_AT_default_value); 159a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch COLLECT_ATTR(DW_AT_digit_count); 160a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch COLLECT_ATTR(DW_AT_discr); 161a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch COLLECT_ATTR(DW_AT_discr_list); 162a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch COLLECT_ATTR(DW_AT_discr_value); 163a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch COLLECT_ATTR(DW_AT_encoding); 164a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch COLLECT_ATTR(DW_AT_enum_class); 165a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch COLLECT_ATTR(DW_AT_endianity); 166a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch COLLECT_ATTR(DW_AT_explicit); 167a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch COLLECT_ATTR(DW_AT_is_optional); 168a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch COLLECT_ATTR(DW_AT_location); 169a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch COLLECT_ATTR(DW_AT_lower_bound); 170a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch COLLECT_ATTR(DW_AT_mutable); 171a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch COLLECT_ATTR(DW_AT_ordering); 172a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch COLLECT_ATTR(DW_AT_picture_string); 173a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch COLLECT_ATTR(DW_AT_prototyped); 174a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch COLLECT_ATTR(DW_AT_small); 175a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch COLLECT_ATTR(DW_AT_segment); 176a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch COLLECT_ATTR(DW_AT_string_length); 177a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch COLLECT_ATTR(DW_AT_threads_scaled); 178a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch COLLECT_ATTR(DW_AT_upper_bound); 179a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch COLLECT_ATTR(DW_AT_use_location); 180a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch COLLECT_ATTR(DW_AT_use_UTF8); 181a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch COLLECT_ATTR(DW_AT_variable_parameter); 182a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch COLLECT_ATTR(DW_AT_virtuality); 183a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch COLLECT_ATTR(DW_AT_visibility); 184a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch COLLECT_ATTR(DW_AT_vtable_elem_location); 185a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch COLLECT_ATTR(DW_AT_type); 186a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch default: 187a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch break; 188a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch } 189a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch } 190a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch} 191a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch 192a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdochvoid DIEHash::hashShallowTypeReference(dwarf::Attribute Attribute, 193a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch const DIE &Entry, StringRef Name) { 194a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch // append the letter 'N' 195a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch addULEB128('N'); 196a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch 197a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch // the DWARF attribute code (DW_AT_type or DW_AT_friend), 198a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch addULEB128(Attribute); 199a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch 200a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch // the context of the tag, 201a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch if (const DIE *Parent = Entry.getParent()) 202a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch addParentContext(*Parent); 203a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch 204a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch // the letter 'E', 205a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch addULEB128('E'); 206197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch 207a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch // and the name of the type. 208a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch addString(Name); 209a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch 210a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch // Currently DW_TAG_friends are not used by Clang, but if they do become so, 211a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch // here's the relevant spec text to implement: 212a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch // 213a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch // For DW_TAG_friend, if the referenced entry is the DW_TAG_subprogram, 214a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch // the context is omitted and the name to be used is the ABI-specific name 215a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch // of the subprogram (e.g., the mangled linker name). 216a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch} 217a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch 218a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdochvoid DIEHash::hashRepeatedTypeReference(dwarf::Attribute Attribute, 219197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch unsigned DieNumber) { 220a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch // a) If T is in the list of [previously hashed types], use the letter 221a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch // 'R' as the marker 222a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch addULEB128('R'); 223197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch 224197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch addULEB128(Attribute); 225197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch 226a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch // and use the unsigned LEB128 encoding of [the index of T in the 227a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch // list] as the attribute value; 228a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch addULEB128(DieNumber); 229a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch} 230a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch 231a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdochvoid DIEHash::hashDIEEntry(dwarf::Attribute Attribute, dwarf::Tag Tag, 232a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch const DIE &Entry) { 233a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch assert(Tag != dwarf::DW_TAG_friend && "No current LLVM clients emit friend " 234a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch "tags. Add support here when there's " 235a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch "a use case"); 236a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch // Step 5 237197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch // If the tag in Step 3 is one of [the below tags] 238a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch if ((Tag == dwarf::DW_TAG_pointer_type || 239a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch Tag == dwarf::DW_TAG_reference_type || 240a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch Tag == dwarf::DW_TAG_rvalue_reference_type || 241a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch Tag == dwarf::DW_TAG_ptr_to_member_type) && 242a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch // and the referenced type (via the [below attributes]) 243a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch // FIXME: This seems overly restrictive, and causes hash mismatches 244a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch // there's a decl/def difference in the containing type of a 245a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch // ptr_to_member_type, but it's what DWARF says, for some reason. 246a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch Attribute == dwarf::DW_AT_type) { 247a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch // ... has a DW_AT_name attribute, 248a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch StringRef Name = getDIEStringAttr(Entry, dwarf::DW_AT_name); 249a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch if (!Name.empty()) { 250a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch hashShallowTypeReference(Attribute, Entry, Name); 251a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch return; 252a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch } 253197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch } 254197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch 255197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch unsigned &DieNumber = Numbering[&Entry]; 256197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch if (DieNumber) { 257197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch hashRepeatedTypeReference(Attribute, DieNumber); 258197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch return; 259197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch } 260197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch 261a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch // otherwise, b) use the letter 'T' as a the marker, ... 262a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch addULEB128('T'); 263a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch 264a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch addULEB128(Attribute); 265a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch 266a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch // ... process the type T recursively by performing Steps 2 through 7, and 267a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch // use the result as the attribute value. 268a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch DieNumber = Numbering.size(); 269a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch computeHash(Entry); 270a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch} 271a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch 272a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch// Hash an individual attribute \param Attr based on the type of attribute and 273a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch// the form. 274a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdochvoid DIEHash::hashAttribute(AttrEntry Attr, dwarf::Tag Tag) { 275a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch const DIEValue *Value = Attr.Val; 276a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch const DIEAbbrevData *Desc = Attr.Desc; 277a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch dwarf::Attribute Attribute = Desc->getAttribute(); 278a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch 279197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch // 7.27 Step 3 280a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch // ... An attribute that refers to another type entry T is processed as 281a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch // follows: 282a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch if (const DIEEntry *EntryAttr = dyn_cast<DIEEntry>(Value)) { 283a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch hashDIEEntry(Attribute, Tag, *EntryAttr->getEntry()); 284a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch return; 285a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch } 286a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch 287a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch // Other attribute values use the letter 'A' as the marker, ... 288a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch addULEB128('A'); 289a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch 290a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch addULEB128(Attribute); 291a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch 292a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch // ... and the value consists of the form code (encoded as an unsigned LEB128 293a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch // value) followed by the encoding of the value according to the form code. To 294a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch // ensure reproducibility of the signature, the set of forms used in the 295a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch // signature computation is limited to the following: DW_FORM_sdata, 296a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch // DW_FORM_flag, DW_FORM_string, and DW_FORM_block. 297a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch switch (Desc->getForm()) { 298a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch case dwarf::DW_FORM_string: 299a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch llvm_unreachable( 300a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch "Add support for DW_FORM_string if we ever start emitting them again"); 301a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch case dwarf::DW_FORM_GNU_str_index: 302a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch case dwarf::DW_FORM_strp: 303a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch addULEB128(dwarf::DW_FORM_string); 304a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch addString(cast<DIEString>(Value)->getString()); 305a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch break; 306a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch case dwarf::DW_FORM_data1: 307a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch case dwarf::DW_FORM_data2: 308a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch case dwarf::DW_FORM_data4: 309a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch case dwarf::DW_FORM_data8: 310a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch case dwarf::DW_FORM_udata: 311a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch addULEB128(dwarf::DW_FORM_sdata); 312f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu addSLEB128((int64_t)cast<DIEInteger>(Value)->getValue()); 313a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch break; 314f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu default: 315a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch llvm_unreachable("Add support for additional forms"); 316a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch } 317a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch} 318a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch 3195d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)// Go through the attributes from \param Attrs in the order specified in 7.27.4 320a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch// and hash them. 321a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdochvoid DIEHash::hashAttributes(const DIEAttrs &Attrs, dwarf::Tag Tag) { 322a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch#define ADD_ATTR(ATTR) \ 323a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch { \ 324a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch if (ATTR.Val != 0) \ 3255d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) hashAttribute(ATTR, Tag); \ 326a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch } 327a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch 3285d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) ADD_ATTR(Attrs.DW_AT_name); 329a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch ADD_ATTR(Attrs.DW_AT_accessibility); 330a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch ADD_ATTR(Attrs.DW_AT_address_class); 3315d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) ADD_ATTR(Attrs.DW_AT_allocated); 332a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch ADD_ATTR(Attrs.DW_AT_artificial); 333a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch ADD_ATTR(Attrs.DW_AT_associated); 3345d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) ADD_ATTR(Attrs.DW_AT_binary_scale); 335a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch ADD_ATTR(Attrs.DW_AT_bit_offset); 336a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch ADD_ATTR(Attrs.DW_AT_bit_size); 3375d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) ADD_ATTR(Attrs.DW_AT_bit_stride); 338a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch ADD_ATTR(Attrs.DW_AT_byte_size); 339a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch ADD_ATTR(Attrs.DW_AT_byte_stride); 340a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch ADD_ATTR(Attrs.DW_AT_const_expr); 341a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch ADD_ATTR(Attrs.DW_AT_const_value); 342a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch ADD_ATTR(Attrs.DW_AT_containing_type); 3435d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) ADD_ATTR(Attrs.DW_AT_count); 344a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch ADD_ATTR(Attrs.DW_AT_data_bit_offset); 345a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch ADD_ATTR(Attrs.DW_AT_data_location); 346a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch ADD_ATTR(Attrs.DW_AT_data_member_location); 347a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch ADD_ATTR(Attrs.DW_AT_decimal_scale); 348a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch ADD_ATTR(Attrs.DW_AT_decimal_sign); 349a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch ADD_ATTR(Attrs.DW_AT_default_value); 350a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch ADD_ATTR(Attrs.DW_AT_digit_count); 351a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch ADD_ATTR(Attrs.DW_AT_discr); 352a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch ADD_ATTR(Attrs.DW_AT_discr_list); 353a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch ADD_ATTR(Attrs.DW_AT_discr_value); 354a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch ADD_ATTR(Attrs.DW_AT_encoding); 355a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch ADD_ATTR(Attrs.DW_AT_enum_class); 356a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch ADD_ATTR(Attrs.DW_AT_endianity); 357a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch ADD_ATTR(Attrs.DW_AT_explicit); 358a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch ADD_ATTR(Attrs.DW_AT_is_optional); 359a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch ADD_ATTR(Attrs.DW_AT_location); 360a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch ADD_ATTR(Attrs.DW_AT_lower_bound); 361a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch ADD_ATTR(Attrs.DW_AT_mutable); 362a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch ADD_ATTR(Attrs.DW_AT_ordering); 363a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch ADD_ATTR(Attrs.DW_AT_picture_string); 364a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch ADD_ATTR(Attrs.DW_AT_prototyped); 365a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch ADD_ATTR(Attrs.DW_AT_small); 366f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu ADD_ATTR(Attrs.DW_AT_segment); 367f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu ADD_ATTR(Attrs.DW_AT_string_length); 368f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu ADD_ATTR(Attrs.DW_AT_threads_scaled); 369e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles) ADD_ATTR(Attrs.DW_AT_upper_bound); 3705d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) ADD_ATTR(Attrs.DW_AT_use_location); 371f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu ADD_ATTR(Attrs.DW_AT_use_UTF8); 372f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu ADD_ATTR(Attrs.DW_AT_variable_parameter); 373f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu ADD_ATTR(Attrs.DW_AT_virtuality); 374a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch ADD_ATTR(Attrs.DW_AT_visibility); 375a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch ADD_ATTR(Attrs.DW_AT_vtable_elem_location); 376a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch ADD_ATTR(Attrs.DW_AT_type); 377a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch 378a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch // FIXME: Add the extended attributes. 379a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch} 380a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch 381a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch// Add all of the attributes for \param Die to the hash. 382a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdochvoid DIEHash::addAttributes(const DIE &Die) { 383a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch DIEAttrs Attrs = {}; 384a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch collectAttributes(Die, Attrs); 385a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch hashAttributes(Attrs, Die.getTag()); 386a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch} 387a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch 388a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdochvoid DIEHash::hashNestedType(const DIE &Die, StringRef Name) { 389a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch // 7.27 Step 7 390a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch // ... append the letter 'S', 391a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch addULEB128('S'); 392a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch 393a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch // the tag of C, 3945d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) addULEB128(Die.getTag()); 395a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch 396a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch // and the name. 397a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch addString(Name); 398a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch} 399a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch 400a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch// Compute the hash of a DIE. This is based on the type signature computation 401a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch// given in section 7.27 of the DWARF4 standard. It is the md5 hash of a 4025d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)// flattened description of the DIE. 403a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdochvoid DIEHash::computeHash(const DIE &Die) { 404a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch // Append the letter 'D', followed by the DWARF tag of the DIE. 405a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch addULEB128('D'); 406a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch addULEB128(Die.getTag()); 407a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch 408a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch // Add each of the attributes of the DIE. 409a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch addAttributes(Die); 4105d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) 411a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch // Then hash each of the children of the DIE. 412a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch for (std::vector<DIE *>::const_iterator I = Die.getChildren().begin(), 413a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch E = Die.getChildren().end(); 414a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch I != E; ++I) { 415a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch // 7.27 Step 7 416a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch // If C is a nested type entry or a member function entry, ... 417a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch if (isType((*I)->getTag()) || (*I)->getTag() == dwarf::DW_TAG_subprogram) { 4185d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) StringRef Name = getDIEStringAttr(**I, dwarf::DW_AT_name); 419a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch // ... and has a DW_AT_name attribute 420a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch if (!Name.empty()) { 421a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch hashNestedType(**I, Name); 422a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch continue; 423a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch } 424a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch } 425e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles) computeHash(**I); 4265d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) } 4275d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) 4285d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) // Following the last (or if there are no children), append a zero byte. 4295d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) Hash.update(makeArrayRef((uint8_t)'\0')); 4305d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)} 4315d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) 4325d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)/// This is based on the type signature computation given in section 7.27 of the 4335d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)/// DWARF4 standard. It is the md5 hash of a flattened description of the DIE 4345d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)/// with the exception that we are hashing only the context and the name of the 4355d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)/// type. 436a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdochuint64_t DIEHash::computeDIEODRSignature(const DIE &Die) { 437a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch 438a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch // Add the contexts to the hash. We won't be computing the ODR hash for 439a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch // function local types so it's safe to use the generic context hashing 440a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch // algorithm here. 441a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch // FIXME: If we figure out how to account for linkage in some way we could 442a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch // actually do this with a slight modification to the parent hash algorithm. 443a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch if (const DIE *Parent = Die.getParent()) 444a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch addParentContext(*Parent); 445a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch 446a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch // Add the current DIE information. 447a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch 448a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch // Add the DWARF tag of the DIE. 449a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch addULEB128(Die.getTag()); 450a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch 451a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch // Add the name of the type to the hash. 452a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch addString(getDIEStringAttr(Die, dwarf::DW_AT_name)); 453a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch 454a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch // Now get the result. 455a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch MD5::MD5Result Result; 456a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch Hash.final(Result); 457a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch 458f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu // ... take the least significant 8 bytes and return those. Our MD5 459f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu // implementation always returns its results in little endian, swap bytes 460f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu // appropriately. 461f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu return *reinterpret_cast<support::ulittle64_t *>(Result + 8); 462a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch} 463a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch 464a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch/// This is based on the type signature computation given in section 7.27 of the 465a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch/// DWARF4 standard. It is an md5 hash of the flattened description of the DIE 466a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch/// with the inclusion of the full CU and all top level CU entities. 467a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch// TODO: Initialize the type chain at 0 instead of 1 for CU signatures. 4685d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)uint64_t DIEHash::computeCUSignature(const DIE &Die) { 4695d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) Numbering.clear(); 470e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles) Numbering[&Die] = 1; 4715d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) 4725d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) // Hash the DIE. 4735d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) computeHash(Die); 4745d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) 475a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch // Now return the result. 476a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch MD5::MD5Result Result; 477a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch Hash.final(Result); 478a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch 479a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch // ... take the least significant 8 bytes and return those. Our MD5 480a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch // implementation always returns its results in little endian, swap bytes 481a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch // appropriately. 482a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch return *reinterpret_cast<support::ulittle64_t *>(Result + 8); 483a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch} 484a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch 485a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch/// This is based on the type signature computation given in section 7.27 of the 486a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch/// DWARF4 standard. It is an md5 hash of the flattened description of the DIE 487a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch/// with the inclusion of additional forms not specifically called out in the 488a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch/// standard. 489a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdochuint64_t DIEHash::computeTypeSignature(const DIE &Die) { 490a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch Numbering.clear(); 4916f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch Numbering[&Die] = 1; 4926f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch 4936f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch if (const DIE *Parent = Die.getParent()) 4946f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch addParentContext(*Parent); 4956f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch 4966f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch // Hash the DIE. 497323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles) computeHash(Die); 498323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles) 499323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles) // Now return the result. 500323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles) MD5::MD5Result Result; 501323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles) Hash.final(Result); 502323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles) 503f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu // ... take the least significant 8 bytes and return those. Our MD5 504f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu // implementation always returns its results in little endian, swap bytes 505f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu // appropriately. 506a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch return *reinterpret_cast<support::ulittle64_t *>(Result + 8); 507a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch} 508a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch