1 | //===-- llvm/CodeGen/DIEHash.h - Dwarf Hashing Framework -------*- C++ -*--===// |
2 | // |
3 | // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. |
4 | // See https://llvm.org/LICENSE.txt for license information. |
5 | // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception |
6 | // |
7 | //===----------------------------------------------------------------------===// |
8 | // |
9 | // This file contains support for DWARF4 hashing of DIEs. |
10 | // |
11 | //===----------------------------------------------------------------------===// |
12 | |
13 | #ifndef LLVM_LIB_CODEGEN_ASMPRINTER_DIEHASH_H |
14 | #define LLVM_LIB_CODEGEN_ASMPRINTER_DIEHASH_H |
15 | |
16 | #include "llvm/ADT/DenseMap.h" |
17 | #include "llvm/CodeGen/DIE.h" |
18 | #include "llvm/Support/MD5.h" |
19 | |
20 | namespace llvm { |
21 | |
22 | class AsmPrinter; |
23 | |
24 | /// An object containing the capability of hashing and adding hash |
25 | /// attributes onto a DIE. |
26 | class DIEHash { |
27 | // Collection of all attributes used in hashing a particular DIE. |
28 | struct DIEAttrs { |
29 | #define HANDLE_DIE_HASH_ATTR(NAME) DIEValue NAME; |
30 | #include "DIEHashAttributes.def" |
31 | }; |
32 | |
33 | public: |
34 | DIEHash(AsmPrinter *A = nullptr, DwarfCompileUnit *CU = nullptr) |
35 | : AP(A), CU(CU) {} |
36 | |
37 | /// Computes the CU signature. |
38 | uint64_t computeCUSignature(StringRef DWOName, const DIE &Die); |
39 | |
40 | /// Computes the type signature. |
41 | uint64_t computeTypeSignature(const DIE &Die); |
42 | |
43 | // Helper routines to process parts of a DIE. |
44 | private: |
45 | /// Adds the parent context of \param Parent to the hash. |
46 | void addParentContext(const DIE &Parent); |
47 | |
48 | /// Adds the attributes of \param Die to the hash. |
49 | void addAttributes(const DIE &Die); |
50 | |
51 | /// Computes the full DWARF4 7.27 hash of the DIE. |
52 | void computeHash(const DIE &Die); |
53 | |
54 | // Routines that add DIEValues to the hash. |
55 | public: |
56 | /// Adds \param Value to the hash. |
57 | void update(uint8_t Value) { Hash.update(Data: Value); } |
58 | |
59 | /// Encodes and adds \param Value to the hash as a ULEB128. |
60 | void addULEB128(uint64_t Value); |
61 | |
62 | /// Encodes and adds \param Value to the hash as a SLEB128. |
63 | void addSLEB128(int64_t Value); |
64 | |
65 | void hashRawTypeReference(const DIE &Entry); |
66 | |
67 | private: |
68 | /// Adds \param Str to the hash and includes a NULL byte. |
69 | void addString(StringRef Str); |
70 | |
71 | /// Collects the attributes of DIE \param Die into the \param Attrs |
72 | /// structure. |
73 | void collectAttributes(const DIE &Die, DIEAttrs &Attrs); |
74 | |
75 | /// Hashes the attributes in \param Attrs in order. |
76 | void hashAttributes(const DIEAttrs &Attrs, dwarf::Tag Tag); |
77 | |
78 | /// Hashes the data in a block like DIEValue, e.g. DW_FORM_block or |
79 | /// DW_FORM_exprloc. |
80 | void hashBlockData(const DIE::const_value_range &Values); |
81 | |
82 | /// Hashes the contents pointed to in the .debug_loc section. |
83 | void hashLocList(const DIELocList &LocList); |
84 | |
85 | /// Hashes an individual attribute. |
86 | void hashAttribute(const DIEValue &Value, dwarf::Tag Tag); |
87 | |
88 | /// Hashes an attribute that refers to another DIE. |
89 | void hashDIEEntry(dwarf::Attribute Attribute, dwarf::Tag Tag, |
90 | const DIE &Entry); |
91 | |
92 | /// Hashes a reference to a named type in such a way that is |
93 | /// independent of whether that type is described by a declaration or a |
94 | /// definition. |
95 | void hashShallowTypeReference(dwarf::Attribute Attribute, const DIE &Entry, |
96 | StringRef Name); |
97 | |
98 | /// Hashes a reference to a previously referenced type DIE. |
99 | void hashRepeatedTypeReference(dwarf::Attribute Attribute, |
100 | unsigned DieNumber); |
101 | |
102 | void hashNestedType(const DIE &Die, StringRef Name); |
103 | |
104 | private: |
105 | MD5 Hash; |
106 | AsmPrinter *AP; |
107 | DwarfCompileUnit *CU; |
108 | DenseMap<const DIE *, unsigned> Numbering; |
109 | }; |
110 | } |
111 | |
112 | #endif |
113 | |