Home | History | Annotate | Download | only in AsmPrinter
      1 //===-- llvm/CodeGen/DIEHash.h - Dwarf Hashing Framework -------*- 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 // This file contains support for DWARF4 hashing of DIEs.
     11 //
     12 //===----------------------------------------------------------------------===//
     13 
     14 #ifndef CODEGEN_ASMPRINTER_DIEHASH_H__
     15 #define CODEGEN_ASMPRINTER_DIEHASH_H__
     16 
     17 #include "DIE.h"
     18 #include "llvm/ADT/DenseMap.h"
     19 #include "llvm/Support/MD5.h"
     20 
     21 namespace llvm {
     22 
     23 class AsmPrinter;
     24 class CompileUnit;
     25 
     26 /// \brief An object containing the capability of hashing and adding hash
     27 /// attributes onto a DIE.
     28 class DIEHash {
     29 
     30   // The entry for a particular attribute.
     31   struct AttrEntry {
     32     const DIEValue *Val;
     33     const DIEAbbrevData *Desc;
     34   };
     35 
     36   // Collection of all attributes used in hashing a particular DIE.
     37   struct DIEAttrs {
     38     AttrEntry DW_AT_name;
     39     AttrEntry DW_AT_accessibility;
     40     AttrEntry DW_AT_address_class;
     41     AttrEntry DW_AT_allocated;
     42     AttrEntry DW_AT_artificial;
     43     AttrEntry DW_AT_associated;
     44     AttrEntry DW_AT_binary_scale;
     45     AttrEntry DW_AT_bit_offset;
     46     AttrEntry DW_AT_bit_size;
     47     AttrEntry DW_AT_bit_stride;
     48     AttrEntry DW_AT_byte_size;
     49     AttrEntry DW_AT_byte_stride;
     50     AttrEntry DW_AT_const_expr;
     51     AttrEntry DW_AT_const_value;
     52     AttrEntry DW_AT_containing_type;
     53     AttrEntry DW_AT_count;
     54     AttrEntry DW_AT_data_bit_offset;
     55     AttrEntry DW_AT_data_location;
     56     AttrEntry DW_AT_data_member_location;
     57     AttrEntry DW_AT_decimal_scale;
     58     AttrEntry DW_AT_decimal_sign;
     59     AttrEntry DW_AT_default_value;
     60     AttrEntry DW_AT_digit_count;
     61     AttrEntry DW_AT_discr;
     62     AttrEntry DW_AT_discr_list;
     63     AttrEntry DW_AT_discr_value;
     64     AttrEntry DW_AT_encoding;
     65     AttrEntry DW_AT_enum_class;
     66     AttrEntry DW_AT_endianity;
     67     AttrEntry DW_AT_explicit;
     68     AttrEntry DW_AT_is_optional;
     69     AttrEntry DW_AT_location;
     70     AttrEntry DW_AT_lower_bound;
     71     AttrEntry DW_AT_mutable;
     72     AttrEntry DW_AT_ordering;
     73     AttrEntry DW_AT_picture_string;
     74     AttrEntry DW_AT_prototyped;
     75     AttrEntry DW_AT_small;
     76     AttrEntry DW_AT_segment;
     77     AttrEntry DW_AT_string_length;
     78     AttrEntry DW_AT_threads_scaled;
     79     AttrEntry DW_AT_upper_bound;
     80     AttrEntry DW_AT_use_location;
     81     AttrEntry DW_AT_use_UTF8;
     82     AttrEntry DW_AT_variable_parameter;
     83     AttrEntry DW_AT_virtuality;
     84     AttrEntry DW_AT_visibility;
     85     AttrEntry DW_AT_vtable_elem_location;
     86     AttrEntry DW_AT_type;
     87 
     88     // Insert any additional ones here...
     89   };
     90 
     91 public:
     92   DIEHash(AsmPrinter *A = nullptr) : AP(A) {}
     93 
     94   /// \brief Computes the ODR signature.
     95   uint64_t computeDIEODRSignature(const DIE &Die);
     96 
     97   /// \brief Computes the CU signature.
     98   uint64_t computeCUSignature(const DIE &Die);
     99 
    100   /// \brief Computes the type signature.
    101   uint64_t computeTypeSignature(const DIE &Die);
    102 
    103   // Helper routines to process parts of a DIE.
    104 private:
    105   /// \brief Adds the parent context of \param Die to the hash.
    106   void addParentContext(const DIE &Die);
    107 
    108   /// \brief Adds the attributes of \param Die to the hash.
    109   void addAttributes(const DIE &Die);
    110 
    111   /// \brief Computes the full DWARF4 7.27 hash of the DIE.
    112   void computeHash(const DIE &Die);
    113 
    114   // Routines that add DIEValues to the hash.
    115 public:
    116   /// \brief Adds \param Value to the hash.
    117   void update(uint8_t Value) { Hash.update(Value); }
    118 
    119   /// \brief Encodes and adds \param Value to the hash as a ULEB128.
    120   void addULEB128(uint64_t Value);
    121 
    122   /// \brief Encodes and adds \param Value to the hash as a SLEB128.
    123   void addSLEB128(int64_t Value);
    124 
    125 private:
    126   /// \brief Adds \param Str to the hash and includes a NULL byte.
    127   void addString(StringRef Str);
    128 
    129   /// \brief Collects the attributes of DIE \param Die into the \param Attrs
    130   /// structure.
    131   void collectAttributes(const DIE &Die, DIEAttrs &Attrs);
    132 
    133   /// \brief Hashes the attributes in \param Attrs in order.
    134   void hashAttributes(const DIEAttrs &Attrs, dwarf::Tag Tag);
    135 
    136   /// \brief Hashes the data in a block like DIEValue, e.g. DW_FORM_block or
    137   /// DW_FORM_exprloc.
    138   void hashBlockData(const SmallVectorImpl<DIEValue *> &Values);
    139 
    140   /// \brief Hashes the contents pointed to in the .debug_loc section.
    141   void hashLocList(const DIELocList &LocList);
    142 
    143   /// \brief Hashes an individual attribute.
    144   void hashAttribute(AttrEntry Attr, dwarf::Tag Tag);
    145 
    146   /// \brief Hashes an attribute that refers to another DIE.
    147   void hashDIEEntry(dwarf::Attribute Attribute, dwarf::Tag Tag,
    148                     const DIE &Entry);
    149 
    150   /// \brief Hashes a reference to a named type in such a way that is
    151   /// independent of whether that type is described by a declaration or a
    152   /// definition.
    153   void hashShallowTypeReference(dwarf::Attribute Attribute, const DIE &Entry,
    154                                 StringRef Name);
    155 
    156   /// \brief Hashes a reference to a previously referenced type DIE.
    157   void hashRepeatedTypeReference(dwarf::Attribute Attribute,
    158                                  unsigned DieNumber);
    159 
    160   void hashNestedType(const DIE &Die, StringRef Name);
    161 
    162 private:
    163   MD5 Hash;
    164   AsmPrinter *AP;
    165   DenseMap<const DIE *, unsigned> Numbering;
    166 };
    167 }
    168 
    169 #endif
    170