Mercurial > hg > CbC > CbC_llvm
comparison lib/CodeGen/AsmPrinter/DIEHash.h @ 0:95c75e76d11b LLVM3.4
LLVM 3.4
author | Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp> |
---|---|
date | Thu, 12 Dec 2013 13:56:28 +0900 |
parents | |
children | e4204d083e25 |
comparison
equal
deleted
inserted
replaced
-1:000000000000 | 0:95c75e76d11b |
---|---|
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 #include "DIE.h" | |
15 #include "llvm/ADT/DenseMap.h" | |
16 #include "llvm/Support/MD5.h" | |
17 | |
18 namespace llvm { | |
19 | |
20 class CompileUnit; | |
21 | |
22 /// \brief An object containing the capability of hashing and adding hash | |
23 /// attributes onto a DIE. | |
24 class DIEHash { | |
25 // The entry for a particular attribute. | |
26 struct AttrEntry { | |
27 const DIEValue *Val; | |
28 const DIEAbbrevData *Desc; | |
29 }; | |
30 | |
31 // Collection of all attributes used in hashing a particular DIE. | |
32 struct DIEAttrs { | |
33 AttrEntry DW_AT_name; | |
34 AttrEntry DW_AT_accessibility; | |
35 AttrEntry DW_AT_address_class; | |
36 AttrEntry DW_AT_allocated; | |
37 AttrEntry DW_AT_artificial; | |
38 AttrEntry DW_AT_associated; | |
39 AttrEntry DW_AT_binary_scale; | |
40 AttrEntry DW_AT_bit_offset; | |
41 AttrEntry DW_AT_bit_size; | |
42 AttrEntry DW_AT_bit_stride; | |
43 AttrEntry DW_AT_byte_size; | |
44 AttrEntry DW_AT_byte_stride; | |
45 AttrEntry DW_AT_const_expr; | |
46 AttrEntry DW_AT_const_value; | |
47 AttrEntry DW_AT_containing_type; | |
48 AttrEntry DW_AT_count; | |
49 AttrEntry DW_AT_data_bit_offset; | |
50 AttrEntry DW_AT_data_location; | |
51 AttrEntry DW_AT_data_member_location; | |
52 AttrEntry DW_AT_decimal_scale; | |
53 AttrEntry DW_AT_decimal_sign; | |
54 AttrEntry DW_AT_default_value; | |
55 AttrEntry DW_AT_digit_count; | |
56 AttrEntry DW_AT_discr; | |
57 AttrEntry DW_AT_discr_list; | |
58 AttrEntry DW_AT_discr_value; | |
59 AttrEntry DW_AT_encoding; | |
60 AttrEntry DW_AT_enum_class; | |
61 AttrEntry DW_AT_endianity; | |
62 AttrEntry DW_AT_explicit; | |
63 AttrEntry DW_AT_is_optional; | |
64 AttrEntry DW_AT_location; | |
65 AttrEntry DW_AT_lower_bound; | |
66 AttrEntry DW_AT_mutable; | |
67 AttrEntry DW_AT_ordering; | |
68 AttrEntry DW_AT_picture_string; | |
69 AttrEntry DW_AT_prototyped; | |
70 AttrEntry DW_AT_small; | |
71 AttrEntry DW_AT_segment; | |
72 AttrEntry DW_AT_string_length; | |
73 AttrEntry DW_AT_threads_scaled; | |
74 AttrEntry DW_AT_upper_bound; | |
75 AttrEntry DW_AT_use_location; | |
76 AttrEntry DW_AT_use_UTF8; | |
77 AttrEntry DW_AT_variable_parameter; | |
78 AttrEntry DW_AT_virtuality; | |
79 AttrEntry DW_AT_visibility; | |
80 AttrEntry DW_AT_vtable_elem_location; | |
81 AttrEntry DW_AT_type; | |
82 | |
83 // Insert any additional ones here... | |
84 }; | |
85 | |
86 public: | |
87 /// \brief Computes the ODR signature. | |
88 uint64_t computeDIEODRSignature(const DIE &Die); | |
89 | |
90 /// \brief Computes the CU signature. | |
91 uint64_t computeCUSignature(const DIE &Die); | |
92 | |
93 /// \brief Computes the type signature. | |
94 uint64_t computeTypeSignature(const DIE &Die); | |
95 | |
96 // Helper routines to process parts of a DIE. | |
97 private: | |
98 /// \brief Adds the parent context of \param Die to the hash. | |
99 void addParentContext(const DIE &Die); | |
100 | |
101 /// \brief Adds the attributes of \param Die to the hash. | |
102 void addAttributes(const DIE &Die); | |
103 | |
104 /// \brief Computes the full DWARF4 7.27 hash of the DIE. | |
105 void computeHash(const DIE &Die); | |
106 | |
107 // Routines that add DIEValues to the hash. | |
108 private: | |
109 /// \brief Encodes and adds \param Value to the hash as a ULEB128. | |
110 void addULEB128(uint64_t Value); | |
111 | |
112 /// \brief Encodes and adds \param Value to the hash as a SLEB128. | |
113 void addSLEB128(int64_t Value); | |
114 | |
115 /// \brief Adds \param Str to the hash and includes a NULL byte. | |
116 void addString(StringRef Str); | |
117 | |
118 /// \brief Collects the attributes of DIE \param Die into the \param Attrs | |
119 /// structure. | |
120 void collectAttributes(const DIE &Die, DIEAttrs &Attrs); | |
121 | |
122 /// \brief Hashes the attributes in \param Attrs in order. | |
123 void hashAttributes(const DIEAttrs &Attrs, dwarf::Tag Tag); | |
124 | |
125 /// \brief Hashes an individual attribute. | |
126 void hashAttribute(AttrEntry Attr, dwarf::Tag Tag); | |
127 | |
128 /// \brief Hashes an attribute that refers to another DIE. | |
129 void hashDIEEntry(dwarf::Attribute Attribute, dwarf::Tag Tag, | |
130 const DIE &Entry); | |
131 | |
132 /// \brief Hashes a reference to a named type in such a way that is | |
133 /// independent of whether that type is described by a declaration or a | |
134 /// definition. | |
135 void hashShallowTypeReference(dwarf::Attribute Attribute, const DIE &Entry, | |
136 StringRef Name); | |
137 | |
138 /// \brief Hashes a reference to a previously referenced type DIE. | |
139 void hashRepeatedTypeReference(dwarf::Attribute Attribute, unsigned DieNumber); | |
140 | |
141 void hashNestedType(const DIE &Die, StringRef Name); | |
142 | |
143 private: | |
144 MD5 Hash; | |
145 DenseMap<const DIE *, unsigned> Numbering; | |
146 }; | |
147 } |