diff options
Diffstat (limited to 'llvm/lib/CodeGen/AsmPrinter/DIEHash.h')
| -rw-r--r-- | llvm/lib/CodeGen/AsmPrinter/DIEHash.h | 109 | 
1 files changed, 109 insertions, 0 deletions
diff --git a/llvm/lib/CodeGen/AsmPrinter/DIEHash.h b/llvm/lib/CodeGen/AsmPrinter/DIEHash.h new file mode 100644 index 000000000000..2e49514c98be --- /dev/null +++ b/llvm/lib/CodeGen/AsmPrinter/DIEHash.h @@ -0,0 +1,109 @@ +//===-- llvm/CodeGen/DIEHash.h - Dwarf Hashing Framework -------*- C++ -*--===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// +// +// This file contains support for DWARF4 hashing of DIEs. +// +//===----------------------------------------------------------------------===// + +#ifndef LLVM_LIB_CODEGEN_ASMPRINTER_DIEHASH_H +#define LLVM_LIB_CODEGEN_ASMPRINTER_DIEHASH_H + +#include "llvm/ADT/DenseMap.h" +#include "llvm/CodeGen/DIE.h" +#include "llvm/Support/MD5.h" + +namespace llvm { + +class AsmPrinter; +class CompileUnit; + +/// An object containing the capability of hashing and adding hash +/// attributes onto a DIE. +class DIEHash { +  // Collection of all attributes used in hashing a particular DIE. +  struct DIEAttrs { +#define HANDLE_DIE_HASH_ATTR(NAME) DIEValue NAME; +#include "DIEHashAttributes.def" +  }; + +public: +  DIEHash(AsmPrinter *A = nullptr) : AP(A) {} + +  /// Computes the CU signature. +  uint64_t computeCUSignature(StringRef DWOName, const DIE &Die); + +  /// Computes the type signature. +  uint64_t computeTypeSignature(const DIE &Die); + +  // Helper routines to process parts of a DIE. +private: +  /// Adds the parent context of \param Parent to the hash. +  void addParentContext(const DIE &Parent); + +  /// Adds the attributes of \param Die to the hash. +  void addAttributes(const DIE &Die); + +  /// Computes the full DWARF4 7.27 hash of the DIE. +  void computeHash(const DIE &Die); + +  // Routines that add DIEValues to the hash. +public: +  /// Adds \param Value to the hash. +  void update(uint8_t Value) { Hash.update(Value); } + +  /// Encodes and adds \param Value to the hash as a ULEB128. +  void addULEB128(uint64_t Value); + +  /// Encodes and adds \param Value to the hash as a SLEB128. +  void addSLEB128(int64_t Value); + +private: +  /// Adds \param Str to the hash and includes a NULL byte. +  void addString(StringRef Str); + +  /// Collects the attributes of DIE \param Die into the \param Attrs +  /// structure. +  void collectAttributes(const DIE &Die, DIEAttrs &Attrs); + +  /// Hashes the attributes in \param Attrs in order. +  void hashAttributes(const DIEAttrs &Attrs, dwarf::Tag Tag); + +  /// Hashes the data in a block like DIEValue, e.g. DW_FORM_block or +  /// DW_FORM_exprloc. +  void hashBlockData(const DIE::const_value_range &Values); + +  /// Hashes the contents pointed to in the .debug_loc section. +  void hashLocList(const DIELocList &LocList); + +  /// Hashes an individual attribute. +  void hashAttribute(const DIEValue &Value, dwarf::Tag Tag); + +  /// Hashes an attribute that refers to another DIE. +  void hashDIEEntry(dwarf::Attribute Attribute, dwarf::Tag Tag, +                    const DIE &Entry); + +  /// Hashes a reference to a named type in such a way that is +  /// independent of whether that type is described by a declaration or a +  /// definition. +  void hashShallowTypeReference(dwarf::Attribute Attribute, const DIE &Entry, +                                StringRef Name); + +  /// Hashes a reference to a previously referenced type DIE. +  void hashRepeatedTypeReference(dwarf::Attribute Attribute, +                                 unsigned DieNumber); + +  void hashNestedType(const DIE &Die, StringRef Name); + +private: +  MD5 Hash; +  AsmPrinter *AP; +  DenseMap<const DIE *, unsigned> Numbering; +}; +} + +#endif  | 
