aboutsummaryrefslogtreecommitdiffstats
path: root/contrib/libs/llvm12/lib/CodeGen/AsmPrinter/DIEHash.h
blob: 93cac44d86ac0fc153efdf7b92b6cad38e9222d4 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
//===-- 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; 
 
/// 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, DwarfCompileUnit *CU = nullptr)
      : AP(A), CU(CU) {}
 
  /// 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; 
  DwarfCompileUnit *CU;
  DenseMap<const DIE *, unsigned> Numbering; 
}; 
} 
 
#endif