| Dan Gohman | 947c9af | 2010-10-14 23:06:10 +0000 | [diff] [blame] | 1 | //===--- CodeGenTBAA.h - TBAA information for LLVM CodeGen ------*- C++ -*-===// | 
|  | 2 | // | 
| Chandler Carruth | 2946cd7 | 2019-01-19 08:50:56 +0000 | [diff] [blame] | 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 | 
| Dan Gohman | 947c9af | 2010-10-14 23:06:10 +0000 | [diff] [blame] | 6 | // | 
|  | 7 | //===----------------------------------------------------------------------===// | 
|  | 8 | // | 
| Dan Gohman | 5419ce6 | 2010-10-21 18:49:12 +0000 | [diff] [blame] | 9 | // This is the code that manages TBAA information and defines the TBAA policy | 
|  | 10 | // for the optimizer to use. | 
| Dan Gohman | 947c9af | 2010-10-14 23:06:10 +0000 | [diff] [blame] | 11 | // | 
|  | 12 | //===----------------------------------------------------------------------===// | 
|  | 13 |  | 
| Benjamin Kramer | 2f5db8b | 2014-08-13 16:25:19 +0000 | [diff] [blame] | 14 | #ifndef LLVM_CLANG_LIB_CODEGEN_CODEGENTBAA_H | 
|  | 15 | #define LLVM_CLANG_LIB_CODEGEN_CODEGENTBAA_H | 
| Dan Gohman | 947c9af | 2010-10-14 23:06:10 +0000 | [diff] [blame] | 16 |  | 
| Benjamin Kramer | 8fdba91 | 2016-02-02 14:24:21 +0000 | [diff] [blame] | 17 | #include "clang/AST/Type.h" | 
| Chris Lattner | 01cf8db | 2011-07-20 06:58:45 +0000 | [diff] [blame] | 18 | #include "clang/Basic/LLVM.h" | 
| Dan Gohman | 947c9af | 2010-10-14 23:06:10 +0000 | [diff] [blame] | 19 | #include "llvm/ADT/DenseMap.h" | 
| Chandler Carruth | ffd5551 | 2013-01-02 11:45:17 +0000 | [diff] [blame] | 20 | #include "llvm/IR/MDBuilder.h" | 
| Benjamin Kramer | 8fdba91 | 2016-02-02 14:24:21 +0000 | [diff] [blame] | 21 | #include "llvm/IR/Metadata.h" | 
| Dan Gohman | 947c9af | 2010-10-14 23:06:10 +0000 | [diff] [blame] | 22 |  | 
|  | 23 | namespace clang { | 
|  | 24 | class ASTContext; | 
| Kostya Serebryany | 5dd2cfc | 2012-04-24 06:57:01 +0000 | [diff] [blame] | 25 | class CodeGenOptions; | 
| Dan Gohman | 947c9af | 2010-10-14 23:06:10 +0000 | [diff] [blame] | 26 | class LangOptions; | 
| Peter Collingbourne | 0ff0b37 | 2011-01-13 18:57:25 +0000 | [diff] [blame] | 27 | class MangleContext; | 
| Dan Gohman | 947c9af | 2010-10-14 23:06:10 +0000 | [diff] [blame] | 28 | class QualType; | 
|  | 29 | class Type; | 
|  | 30 |  | 
|  | 31 | namespace CodeGen { | 
| Ivan A. Kosarev | a511ed7 | 2017-10-03 10:52:39 +0000 | [diff] [blame] | 32 | class CGRecordLayout; | 
| Dan Gohman | 947c9af | 2010-10-14 23:06:10 +0000 | [diff] [blame] | 33 |  | 
| Ivan A. Kosarev | b9c59f3 | 2017-10-31 11:05:34 +0000 | [diff] [blame] | 34 | // TBAAAccessKind - A kind of TBAA memory access descriptor. | 
|  | 35 | enum class TBAAAccessKind : unsigned { | 
| Hal Finkel | a5986b9 | 2017-12-03 03:10:13 +0000 | [diff] [blame] | 36 | Ordinary, | 
|  | 37 | MayAlias, | 
|  | 38 | Incomplete, | 
| Ivan A. Kosarev | b9c59f3 | 2017-10-31 11:05:34 +0000 | [diff] [blame] | 39 | }; | 
|  | 40 |  | 
| Ivan A. Kosarev | a511ed7 | 2017-10-03 10:52:39 +0000 | [diff] [blame] | 41 | // TBAAAccessInfo - Describes a memory access in terms of TBAA. | 
|  | 42 | struct TBAAAccessInfo { | 
| Ivan A. Kosarev | b9c59f3 | 2017-10-31 11:05:34 +0000 | [diff] [blame] | 43 | TBAAAccessInfo(TBAAAccessKind Kind, llvm::MDNode *BaseType, | 
| Ivan A. Kosarev | 4e50e70 | 2017-11-27 09:39:29 +0000 | [diff] [blame] | 44 | llvm::MDNode *AccessType, uint64_t Offset, uint64_t Size) | 
|  | 45 | : Kind(Kind), BaseType(BaseType), AccessType(AccessType), | 
|  | 46 | Offset(Offset), Size(Size) | 
| Ivan A. Kosarev | b9c59f3 | 2017-10-31 11:05:34 +0000 | [diff] [blame] | 47 | {} | 
|  | 48 |  | 
| Ivan A. Kosarev | 383890b | 2017-10-06 08:17:48 +0000 | [diff] [blame] | 49 | TBAAAccessInfo(llvm::MDNode *BaseType, llvm::MDNode *AccessType, | 
| Ivan A. Kosarev | 4e50e70 | 2017-11-27 09:39:29 +0000 | [diff] [blame] | 50 | uint64_t Offset, uint64_t Size) | 
|  | 51 | : TBAAAccessInfo(TBAAAccessKind::Ordinary, BaseType, AccessType, | 
|  | 52 | Offset, Size) | 
| Ivan A. Kosarev | a511ed7 | 2017-10-03 10:52:39 +0000 | [diff] [blame] | 53 | {} | 
|  | 54 |  | 
| Ivan A. Kosarev | 4e50e70 | 2017-11-27 09:39:29 +0000 | [diff] [blame] | 55 | explicit TBAAAccessInfo(llvm::MDNode *AccessType, uint64_t Size) | 
|  | 56 | : TBAAAccessInfo(/* BaseType= */ nullptr, AccessType, /* Offset= */ 0, Size) | 
| Ivan A. Kosarev | a511ed7 | 2017-10-03 10:52:39 +0000 | [diff] [blame] | 57 | {} | 
|  | 58 |  | 
|  | 59 | TBAAAccessInfo() | 
| Ivan A. Kosarev | 4e50e70 | 2017-11-27 09:39:29 +0000 | [diff] [blame] | 60 | : TBAAAccessInfo(/* AccessType= */ nullptr, /* Size= */ 0) | 
| Ivan A. Kosarev | a511ed7 | 2017-10-03 10:52:39 +0000 | [diff] [blame] | 61 | {} | 
|  | 62 |  | 
| Ivan A. Kosarev | b9c59f3 | 2017-10-31 11:05:34 +0000 | [diff] [blame] | 63 | static TBAAAccessInfo getMayAliasInfo() { | 
| Ivan A. Kosarev | 4e50e70 | 2017-11-27 09:39:29 +0000 | [diff] [blame] | 64 | return TBAAAccessInfo(TBAAAccessKind::MayAlias, | 
|  | 65 | /* BaseType= */ nullptr, /* AccessType= */ nullptr, | 
|  | 66 | /* Offset= */ 0, /* Size= */ 0); | 
| Ivan A. Kosarev | b9c59f3 | 2017-10-31 11:05:34 +0000 | [diff] [blame] | 67 | } | 
|  | 68 |  | 
|  | 69 | bool isMayAlias() const { return Kind == TBAAAccessKind::MayAlias; } | 
|  | 70 |  | 
| Ivan A. Kosarev | 4e50e70 | 2017-11-27 09:39:29 +0000 | [diff] [blame] | 71 | static TBAAAccessInfo getIncompleteInfo() { | 
|  | 72 | return TBAAAccessInfo(TBAAAccessKind::Incomplete, | 
|  | 73 | /* BaseType= */ nullptr, /* AccessType= */ nullptr, | 
|  | 74 | /* Offset= */ 0, /* Size= */ 0); | 
|  | 75 | } | 
|  | 76 |  | 
|  | 77 | bool isIncomplete() const { return Kind == TBAAAccessKind::Incomplete; } | 
|  | 78 |  | 
| Ivan A. Kosarev | ed141ba | 2017-10-17 09:12:13 +0000 | [diff] [blame] | 79 | bool operator==(const TBAAAccessInfo &Other) const { | 
| Ivan A. Kosarev | b9c59f3 | 2017-10-31 11:05:34 +0000 | [diff] [blame] | 80 | return Kind == Other.Kind && | 
|  | 81 | BaseType == Other.BaseType && | 
| Ivan A. Kosarev | ed141ba | 2017-10-17 09:12:13 +0000 | [diff] [blame] | 82 | AccessType == Other.AccessType && | 
| Ivan A. Kosarev | 4e50e70 | 2017-11-27 09:39:29 +0000 | [diff] [blame] | 83 | Offset == Other.Offset && | 
|  | 84 | Size == Other.Size; | 
| Ivan A. Kosarev | ed141ba | 2017-10-17 09:12:13 +0000 | [diff] [blame] | 85 | } | 
|  | 86 |  | 
| Ivan A. Kosarev | b9c59f3 | 2017-10-31 11:05:34 +0000 | [diff] [blame] | 87 | bool operator!=(const TBAAAccessInfo &Other) const { | 
|  | 88 | return !(*this == Other); | 
|  | 89 | } | 
|  | 90 |  | 
|  | 91 | explicit operator bool() const { | 
|  | 92 | return *this != TBAAAccessInfo(); | 
|  | 93 | } | 
|  | 94 |  | 
|  | 95 | /// Kind - The kind of the access descriptor. | 
|  | 96 | TBAAAccessKind Kind; | 
|  | 97 |  | 
| Ivan A. Kosarev | a511ed7 | 2017-10-03 10:52:39 +0000 | [diff] [blame] | 98 | /// BaseType - The base/leading access type. May be null if this access | 
|  | 99 | /// descriptor represents an access that is not considered to be an access | 
|  | 100 | /// to an aggregate or union member. | 
| Ivan A. Kosarev | 383890b | 2017-10-06 08:17:48 +0000 | [diff] [blame] | 101 | llvm::MDNode *BaseType; | 
| Ivan A. Kosarev | a511ed7 | 2017-10-03 10:52:39 +0000 | [diff] [blame] | 102 |  | 
|  | 103 | /// AccessType - The final access type. May be null if there is no TBAA | 
|  | 104 | /// information available about this access. | 
|  | 105 | llvm::MDNode *AccessType; | 
|  | 106 |  | 
|  | 107 | /// Offset - The byte offset of the final access within the base one. Must be | 
|  | 108 | /// zero if the base access type is not specified. | 
|  | 109 | uint64_t Offset; | 
| Ivan A. Kosarev | 4e50e70 | 2017-11-27 09:39:29 +0000 | [diff] [blame] | 110 |  | 
|  | 111 | /// Size - The size of access, in bytes. | 
|  | 112 | uint64_t Size; | 
| Ivan A. Kosarev | a511ed7 | 2017-10-03 10:52:39 +0000 | [diff] [blame] | 113 | }; | 
| Manman Ren | c451e57 | 2013-04-04 21:53:22 +0000 | [diff] [blame] | 114 |  | 
| Dan Gohman | 947c9af | 2010-10-14 23:06:10 +0000 | [diff] [blame] | 115 | /// CodeGenTBAA - This class organizes the cross-module state that is used | 
|  | 116 | /// while lowering AST types to LLVM types. | 
|  | 117 | class CodeGenTBAA { | 
|  | 118 | ASTContext &Context; | 
| Ivan A. Kosarev | 4e50e70 | 2017-11-27 09:39:29 +0000 | [diff] [blame] | 119 | llvm::Module &Module; | 
| Kostya Serebryany | 5dd2cfc | 2012-04-24 06:57:01 +0000 | [diff] [blame] | 120 | const CodeGenOptions &CodeGenOpts; | 
| Dan Gohman | 947c9af | 2010-10-14 23:06:10 +0000 | [diff] [blame] | 121 | const LangOptions &Features; | 
| Dan Gohman | 2e29eb5 | 2010-10-15 20:23:12 +0000 | [diff] [blame] | 122 | MangleContext &MContext; | 
| Dan Gohman | 947c9af | 2010-10-14 23:06:10 +0000 | [diff] [blame] | 123 |  | 
| Duncan Sands | c720e78 | 2012-04-15 18:04:54 +0000 | [diff] [blame] | 124 | // MDHelper - Helper for creating metadata. | 
|  | 125 | llvm::MDBuilder MDHelper; | 
|  | 126 |  | 
| Manman Ren | c451e57 | 2013-04-04 21:53:22 +0000 | [diff] [blame] | 127 | /// MetadataCache - This maps clang::Types to scalar llvm::MDNodes describing | 
|  | 128 | /// them. | 
| Dan Gohman | 947c9af | 2010-10-14 23:06:10 +0000 | [diff] [blame] | 129 | llvm::DenseMap<const Type *, llvm::MDNode *> MetadataCache; | 
| Ivan A. Kosarev | 383890b | 2017-10-06 08:17:48 +0000 | [diff] [blame] | 130 | /// This maps clang::Types to a base access type in the type DAG. | 
|  | 131 | llvm::DenseMap<const Type *, llvm::MDNode *> BaseTypeMetadataCache; | 
|  | 132 | /// This maps TBAA access descriptors to tag nodes. | 
|  | 133 | llvm::DenseMap<TBAAAccessInfo, llvm::MDNode *> AccessTagMetadataCache; | 
| Dan Gohman | 947c9af | 2010-10-14 23:06:10 +0000 | [diff] [blame] | 134 |  | 
| Dan Gohman | 22695fc | 2012-09-28 21:58:29 +0000 | [diff] [blame] | 135 | /// StructMetadataCache - This maps clang::Types to llvm::MDNodes describing | 
|  | 136 | /// them for struct assignments. | 
|  | 137 | llvm::DenseMap<const Type *, llvm::MDNode *> StructMetadataCache; | 
|  | 138 |  | 
| Dan Gohman | 947c9af | 2010-10-14 23:06:10 +0000 | [diff] [blame] | 139 | llvm::MDNode *Root; | 
| Dan Gohman | 947c9af | 2010-10-14 23:06:10 +0000 | [diff] [blame] | 140 | llvm::MDNode *Char; | 
|  | 141 |  | 
| Dan Gohman | 7dfd13c | 2010-10-25 21:48:30 +0000 | [diff] [blame] | 142 | /// getRoot - This is the mdnode for the root of the metadata type graph | 
|  | 143 | /// for this translation unit. | 
|  | 144 | llvm::MDNode *getRoot(); | 
|  | 145 |  | 
|  | 146 | /// getChar - This is the mdnode for "char", which is special, and any types | 
|  | 147 | /// considered to be equivalent to it. | 
|  | 148 | llvm::MDNode *getChar(); | 
|  | 149 |  | 
| Dan Gohman | 22695fc | 2012-09-28 21:58:29 +0000 | [diff] [blame] | 150 | /// CollectFields - Collect information about the fields of a type for | 
|  | 151 | /// !tbaa.struct metadata formation. Return false for an unsupported type. | 
|  | 152 | bool CollectFields(uint64_t BaseOffset, | 
|  | 153 | QualType Ty, | 
|  | 154 | SmallVectorImpl<llvm::MDBuilder::TBAAStructField> &Fields, | 
|  | 155 | bool MayAlias); | 
|  | 156 |  | 
| Ivan A. Kosarev | 4e50e70 | 2017-11-27 09:39:29 +0000 | [diff] [blame] | 157 | /// createScalarTypeNode - A wrapper function to create a metadata node | 
|  | 158 | /// describing a scalar type. | 
|  | 159 | llvm::MDNode *createScalarTypeNode(StringRef Name, llvm::MDNode *Parent, | 
|  | 160 | uint64_t Size); | 
| Manman Ren | e1ad74e | 2013-04-11 23:02:56 +0000 | [diff] [blame] | 161 |  | 
| Ivan A. Kosarev | 5d9d32e | 2017-11-21 11:18:06 +0000 | [diff] [blame] | 162 | /// getTypeInfoHelper - An internal helper function to generate metadata used | 
|  | 163 | /// to describe accesses to objects of the given type. | 
|  | 164 | llvm::MDNode *getTypeInfoHelper(const Type *Ty); | 
|  | 165 |  | 
|  | 166 | /// getBaseTypeInfoHelper - An internal helper function to generate metadata | 
|  | 167 | /// used to describe accesses to objects of the given base type. | 
|  | 168 | llvm::MDNode *getBaseTypeInfoHelper(const Type *Ty); | 
|  | 169 |  | 
| Dan Gohman | 947c9af | 2010-10-14 23:06:10 +0000 | [diff] [blame] | 170 | public: | 
| Ivan A. Kosarev | 4e50e70 | 2017-11-27 09:39:29 +0000 | [diff] [blame] | 171 | CodeGenTBAA(ASTContext &Ctx, llvm::Module &M, const CodeGenOptions &CGO, | 
|  | 172 | const LangOptions &Features, MangleContext &MContext); | 
| Dan Gohman | 947c9af | 2010-10-14 23:06:10 +0000 | [diff] [blame] | 173 | ~CodeGenTBAA(); | 
|  | 174 |  | 
| Ivan A. Kosarev | 289574e | 2017-10-02 09:54:47 +0000 | [diff] [blame] | 175 | /// getTypeInfo - Get metadata used to describe accesses to objects of the | 
|  | 176 | /// given type. | 
|  | 177 | llvm::MDNode *getTypeInfo(QualType QTy); | 
| Kostya Serebryany | 141e46f | 2012-03-26 17:03:51 +0000 | [diff] [blame] | 178 |  | 
| Ivan A. Kosarev | 124a218 | 2018-02-20 12:33:04 +0000 | [diff] [blame] | 179 | /// getAccessInfo - Get TBAA information that describes an access to | 
|  | 180 | /// an object of the given type. | 
|  | 181 | TBAAAccessInfo getAccessInfo(QualType AccessType); | 
|  | 182 |  | 
| Ivan A. Kosarev | 3d68ce9 | 2017-10-05 11:08:17 +0000 | [diff] [blame] | 183 | /// getVTablePtrAccessInfo - Get the TBAA information that describes an | 
|  | 184 | /// access to a virtual table pointer. | 
| Ivan A. Kosarev | 4e50e70 | 2017-11-27 09:39:29 +0000 | [diff] [blame] | 185 | TBAAAccessInfo getVTablePtrAccessInfo(llvm::Type *VTablePtrType); | 
| Dan Gohman | 22695fc | 2012-09-28 21:58:29 +0000 | [diff] [blame] | 186 |  | 
|  | 187 | /// getTBAAStructInfo - Get the TBAAStruct MDNode to be used for a memcpy of | 
|  | 188 | /// the given type. | 
|  | 189 | llvm::MDNode *getTBAAStructInfo(QualType QTy); | 
| Manman Ren | c451e57 | 2013-04-04 21:53:22 +0000 | [diff] [blame] | 190 |  | 
| Ivan A. Kosarev | 383890b | 2017-10-06 08:17:48 +0000 | [diff] [blame] | 191 | /// getBaseTypeInfo - Get metadata that describes the given base access type. | 
|  | 192 | /// Return null if the type is not suitable for use in TBAA access tags. | 
|  | 193 | llvm::MDNode *getBaseTypeInfo(QualType QTy); | 
| Ivan A. Kosarev | a511ed7 | 2017-10-03 10:52:39 +0000 | [diff] [blame] | 194 |  | 
| Ivan A. Kosarev | 3d68ce9 | 2017-10-05 11:08:17 +0000 | [diff] [blame] | 195 | /// getAccessTagInfo - Get TBAA tag for a given memory access. | 
|  | 196 | llvm::MDNode *getAccessTagInfo(TBAAAccessInfo Info); | 
| Manman Ren | e1ad74e | 2013-04-11 23:02:56 +0000 | [diff] [blame] | 197 |  | 
| Ivan A. Kosarev | ed141ba | 2017-10-17 09:12:13 +0000 | [diff] [blame] | 198 | /// mergeTBAAInfoForCast - Get merged TBAA information for the purpose of | 
|  | 199 | /// type casts. | 
|  | 200 | TBAAAccessInfo mergeTBAAInfoForCast(TBAAAccessInfo SourceInfo, | 
|  | 201 | TBAAAccessInfo TargetInfo); | 
| Ivan A. Kosarev | b9c59f3 | 2017-10-31 11:05:34 +0000 | [diff] [blame] | 202 |  | 
|  | 203 | /// mergeTBAAInfoForConditionalOperator - Get merged TBAA information for the | 
|  | 204 | /// purpose of conditional operator. | 
|  | 205 | TBAAAccessInfo mergeTBAAInfoForConditionalOperator(TBAAAccessInfo InfoA, | 
|  | 206 | TBAAAccessInfo InfoB); | 
| Ivan A. Kosarev | 1860b52 | 2018-01-25 14:21:55 +0000 | [diff] [blame] | 207 |  | 
|  | 208 | /// mergeTBAAInfoForMemoryTransfer - Get merged TBAA information for the | 
|  | 209 | /// purpose of memory transfer calls. | 
|  | 210 | TBAAAccessInfo mergeTBAAInfoForMemoryTransfer(TBAAAccessInfo DestInfo, | 
|  | 211 | TBAAAccessInfo SrcInfo); | 
| Dan Gohman | 947c9af | 2010-10-14 23:06:10 +0000 | [diff] [blame] | 212 | }; | 
|  | 213 |  | 
|  | 214 | }  // end namespace CodeGen | 
|  | 215 | }  // end namespace clang | 
|  | 216 |  | 
| Manman Ren | c451e57 | 2013-04-04 21:53:22 +0000 | [diff] [blame] | 217 | namespace llvm { | 
|  | 218 |  | 
| Ivan A. Kosarev | 383890b | 2017-10-06 08:17:48 +0000 | [diff] [blame] | 219 | template<> struct DenseMapInfo<clang::CodeGen::TBAAAccessInfo> { | 
|  | 220 | static clang::CodeGen::TBAAAccessInfo getEmptyKey() { | 
| Ivan A. Kosarev | b9c59f3 | 2017-10-31 11:05:34 +0000 | [diff] [blame] | 221 | unsigned UnsignedKey = DenseMapInfo<unsigned>::getEmptyKey(); | 
| Ivan A. Kosarev | 383890b | 2017-10-06 08:17:48 +0000 | [diff] [blame] | 222 | return clang::CodeGen::TBAAAccessInfo( | 
| Ivan A. Kosarev | b9c59f3 | 2017-10-31 11:05:34 +0000 | [diff] [blame] | 223 | static_cast<clang::CodeGen::TBAAAccessKind>(UnsignedKey), | 
| Ivan A. Kosarev | 383890b | 2017-10-06 08:17:48 +0000 | [diff] [blame] | 224 | DenseMapInfo<MDNode *>::getEmptyKey(), | 
|  | 225 | DenseMapInfo<MDNode *>::getEmptyKey(), | 
| Ivan A. Kosarev | 4e50e70 | 2017-11-27 09:39:29 +0000 | [diff] [blame] | 226 | DenseMapInfo<uint64_t>::getEmptyKey(), | 
| Manman Ren | c451e57 | 2013-04-04 21:53:22 +0000 | [diff] [blame] | 227 | DenseMapInfo<uint64_t>::getEmptyKey()); | 
|  | 228 | } | 
|  | 229 |  | 
| Ivan A. Kosarev | 383890b | 2017-10-06 08:17:48 +0000 | [diff] [blame] | 230 | static clang::CodeGen::TBAAAccessInfo getTombstoneKey() { | 
| Ivan A. Kosarev | b9c59f3 | 2017-10-31 11:05:34 +0000 | [diff] [blame] | 231 | unsigned UnsignedKey = DenseMapInfo<unsigned>::getTombstoneKey(); | 
| Ivan A. Kosarev | 383890b | 2017-10-06 08:17:48 +0000 | [diff] [blame] | 232 | return clang::CodeGen::TBAAAccessInfo( | 
| Ivan A. Kosarev | b9c59f3 | 2017-10-31 11:05:34 +0000 | [diff] [blame] | 233 | static_cast<clang::CodeGen::TBAAAccessKind>(UnsignedKey), | 
| Ivan A. Kosarev | 383890b | 2017-10-06 08:17:48 +0000 | [diff] [blame] | 234 | DenseMapInfo<MDNode *>::getTombstoneKey(), | 
|  | 235 | DenseMapInfo<MDNode *>::getTombstoneKey(), | 
| Ivan A. Kosarev | 4e50e70 | 2017-11-27 09:39:29 +0000 | [diff] [blame] | 236 | DenseMapInfo<uint64_t>::getTombstoneKey(), | 
| Manman Ren | c451e57 | 2013-04-04 21:53:22 +0000 | [diff] [blame] | 237 | DenseMapInfo<uint64_t>::getTombstoneKey()); | 
|  | 238 | } | 
|  | 239 |  | 
| Ivan A. Kosarev | 383890b | 2017-10-06 08:17:48 +0000 | [diff] [blame] | 240 | static unsigned getHashValue(const clang::CodeGen::TBAAAccessInfo &Val) { | 
| Ivan A. Kosarev | b9c59f3 | 2017-10-31 11:05:34 +0000 | [diff] [blame] | 241 | auto KindValue = static_cast<unsigned>(Val.Kind); | 
|  | 242 | return DenseMapInfo<unsigned>::getHashValue(KindValue) ^ | 
|  | 243 | DenseMapInfo<MDNode *>::getHashValue(Val.BaseType) ^ | 
| Ivan A. Kosarev | 383890b | 2017-10-06 08:17:48 +0000 | [diff] [blame] | 244 | DenseMapInfo<MDNode *>::getHashValue(Val.AccessType) ^ | 
| Ivan A. Kosarev | 4e50e70 | 2017-11-27 09:39:29 +0000 | [diff] [blame] | 245 | DenseMapInfo<uint64_t>::getHashValue(Val.Offset) ^ | 
|  | 246 | DenseMapInfo<uint64_t>::getHashValue(Val.Size); | 
| Manman Ren | c451e57 | 2013-04-04 21:53:22 +0000 | [diff] [blame] | 247 | } | 
|  | 248 |  | 
| Ivan A. Kosarev | 383890b | 2017-10-06 08:17:48 +0000 | [diff] [blame] | 249 | static bool isEqual(const clang::CodeGen::TBAAAccessInfo &LHS, | 
|  | 250 | const clang::CodeGen::TBAAAccessInfo &RHS) { | 
| Ivan A. Kosarev | b9c59f3 | 2017-10-31 11:05:34 +0000 | [diff] [blame] | 251 | return LHS == RHS; | 
| Manman Ren | c451e57 | 2013-04-04 21:53:22 +0000 | [diff] [blame] | 252 | } | 
|  | 253 | }; | 
|  | 254 |  | 
|  | 255 | }  // end namespace llvm | 
|  | 256 |  | 
| Dan Gohman | 947c9af | 2010-10-14 23:06:10 +0000 | [diff] [blame] | 257 | #endif |