]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/blob - contrib/llvm/lib/CodeGen/AsmPrinter/DIEHash.h
Merge clang 7.0.1 and several follow-up changes
[FreeBSD/FreeBSD.git] / contrib / llvm / lib / CodeGen / AsmPrinter / DIEHash.h
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 LLVM_LIB_CODEGEN_ASMPRINTER_DIEHASH_H
15 #define LLVM_LIB_CODEGEN_ASMPRINTER_DIEHASH_H
16
17 #include "llvm/ADT/DenseMap.h"
18 #include "llvm/CodeGen/DIE.h"
19 #include "llvm/Support/MD5.h"
20
21 namespace llvm {
22
23 class AsmPrinter;
24 class CompileUnit;
25
26 /// An object containing the capability of hashing and adding hash
27 /// attributes onto a DIE.
28 class DIEHash {
29   // Collection of all attributes used in hashing a particular DIE.
30   struct DIEAttrs {
31 #define HANDLE_DIE_HASH_ATTR(NAME) DIEValue NAME;
32 #include "DIEHashAttributes.def"
33   };
34
35 public:
36   DIEHash(AsmPrinter *A = nullptr) : AP(A) {}
37
38   /// Computes the CU signature.
39   uint64_t computeCUSignature(StringRef DWOName, const DIE &Die);
40
41   /// Computes the type signature.
42   uint64_t computeTypeSignature(const DIE &Die);
43
44   // Helper routines to process parts of a DIE.
45 private:
46   /// Adds the parent context of \param Parent to the hash.
47   void addParentContext(const DIE &Parent);
48
49   /// Adds the attributes of \param Die to the hash.
50   void addAttributes(const DIE &Die);
51
52   /// Computes the full DWARF4 7.27 hash of the DIE.
53   void computeHash(const DIE &Die);
54
55   // Routines that add DIEValues to the hash.
56 public:
57   /// Adds \param Value to the hash.
58   void update(uint8_t Value) { Hash.update(Value); }
59
60   /// Encodes and adds \param Value to the hash as a ULEB128.
61   void addULEB128(uint64_t Value);
62
63   /// Encodes and adds \param Value to the hash as a SLEB128.
64   void addSLEB128(int64_t Value);
65
66 private:
67   /// Adds \param Str to the hash and includes a NULL byte.
68   void addString(StringRef Str);
69
70   /// Collects the attributes of DIE \param Die into the \param Attrs
71   /// structure.
72   void collectAttributes(const DIE &Die, DIEAttrs &Attrs);
73
74   /// Hashes the attributes in \param Attrs in order.
75   void hashAttributes(const DIEAttrs &Attrs, dwarf::Tag Tag);
76
77   /// Hashes the data in a block like DIEValue, e.g. DW_FORM_block or
78   /// DW_FORM_exprloc.
79   void hashBlockData(const DIE::const_value_range &Values);
80
81   /// Hashes the contents pointed to in the .debug_loc section.
82   void hashLocList(const DIELocList &LocList);
83
84   /// Hashes an individual attribute.
85   void hashAttribute(const DIEValue &Value, dwarf::Tag Tag);
86
87   /// Hashes an attribute that refers to another DIE.
88   void hashDIEEntry(dwarf::Attribute Attribute, dwarf::Tag Tag,
89                     const DIE &Entry);
90
91   /// Hashes a reference to a named type in such a way that is
92   /// independent of whether that type is described by a declaration or a
93   /// definition.
94   void hashShallowTypeReference(dwarf::Attribute Attribute, const DIE &Entry,
95                                 StringRef Name);
96
97   /// Hashes a reference to a previously referenced type DIE.
98   void hashRepeatedTypeReference(dwarf::Attribute Attribute,
99                                  unsigned DieNumber);
100
101   void hashNestedType(const DIE &Die, StringRef Name);
102
103 private:
104   MD5 Hash;
105   AsmPrinter *AP;
106   DenseMap<const DIE *, unsigned> Numbering;
107 };
108 }
109
110 #endif