1//===-- LLVMContextImpl.h - The LLVMContextImpl opaque class ----*- 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 declares LLVMContextImpl, the opaque implementation 11// of LLVMContext. 12// 13//===----------------------------------------------------------------------===// 14 15#ifndef LLVM_LLVMCONTEXT_IMPL_H 16#define LLVM_LLVMCONTEXT_IMPL_H 17 18#include "AttributeImpl.h" 19#include "ConstantsContext.h" 20#include "LeaksContext.h" 21#include "llvm/ADT/APFloat.h" 22#include "llvm/ADT/APInt.h" 23#include "llvm/ADT/ArrayRef.h" 24#include "llvm/ADT/DenseMap.h" 25#include "llvm/ADT/FoldingSet.h" 26#include "llvm/ADT/Hashing.h" 27#include "llvm/ADT/SmallPtrSet.h" 28#include "llvm/ADT/StringMap.h" 29#include "llvm/IR/Constants.h" 30#include "llvm/IR/DerivedTypes.h" 31#include "llvm/IR/LLVMContext.h" 32#include "llvm/IR/Metadata.h" 33#include "llvm/Support/ValueHandle.h" 34#include <vector> 35 36namespace llvm { 37 38class ConstantInt; 39class ConstantFP; 40class LLVMContext; 41class Type; 42class Value; 43 44struct DenseMapAPIntKeyInfo { 45 struct KeyTy { 46 APInt val; 47 Type* type; 48 KeyTy(const APInt& V, Type* Ty) : val(V), type(Ty) {} 49 bool operator==(const KeyTy& that) const { 50 return type == that.type && this->val == that.val; 51 } 52 bool operator!=(const KeyTy& that) const { 53 return !this->operator==(that); 54 } 55 friend hash_code hash_value(const KeyTy &Key) { 56 return hash_combine(Key.type, Key.val); 57 } 58 }; 59 static inline KeyTy getEmptyKey() { return KeyTy(APInt(1,0), 0); } 60 static inline KeyTy getTombstoneKey() { return KeyTy(APInt(1,1), 0); } 61 static unsigned getHashValue(const KeyTy &Key) { 62 return static_cast<unsigned>(hash_value(Key)); 63 } 64 static bool isEqual(const KeyTy &LHS, const KeyTy &RHS) { 65 return LHS == RHS; 66 } 67}; 68 69struct DenseMapAPFloatKeyInfo { 70 struct KeyTy { 71 APFloat val; 72 KeyTy(const APFloat& V) : val(V){} 73 bool operator==(const KeyTy& that) const { 74 return this->val.bitwiseIsEqual(that.val); 75 } 76 bool operator!=(const KeyTy& that) const { 77 return !this->operator==(that); 78 } 79 friend hash_code hash_value(const KeyTy &Key) { 80 return hash_combine(Key.val); 81 } 82 }; 83 static inline KeyTy getEmptyKey() { 84 return KeyTy(APFloat(APFloat::Bogus,1)); 85 } 86 static inline KeyTy getTombstoneKey() { 87 return KeyTy(APFloat(APFloat::Bogus,2)); 88 } 89 static unsigned getHashValue(const KeyTy &Key) { 90 return static_cast<unsigned>(hash_value(Key)); 91 } 92 static bool isEqual(const KeyTy &LHS, const KeyTy &RHS) { 93 return LHS == RHS; 94 } 95}; 96 97struct AnonStructTypeKeyInfo { 98 struct KeyTy { 99 ArrayRef<Type*> ETypes; 100 bool isPacked; 101 KeyTy(const ArrayRef<Type*>& E, bool P) : 102 ETypes(E), isPacked(P) {} 103 KeyTy(const StructType* ST) : 104 ETypes(ArrayRef<Type*>(ST->element_begin(), ST->element_end())), 105 isPacked(ST->isPacked()) {} 106 bool operator==(const KeyTy& that) const { 107 if (isPacked != that.isPacked) 108 return false; 109 if (ETypes != that.ETypes) 110 return false; 111 return true; 112 } 113 bool operator!=(const KeyTy& that) const { 114 return !this->operator==(that); 115 } 116 }; 117 static inline StructType* getEmptyKey() { 118 return DenseMapInfo<StructType*>::getEmptyKey(); 119 } 120 static inline StructType* getTombstoneKey() { 121 return DenseMapInfo<StructType*>::getTombstoneKey(); 122 } 123 static unsigned getHashValue(const KeyTy& Key) { 124 return hash_combine(hash_combine_range(Key.ETypes.begin(), 125 Key.ETypes.end()), 126 Key.isPacked); 127 } 128 static unsigned getHashValue(const StructType *ST) { 129 return getHashValue(KeyTy(ST)); 130 } 131 static bool isEqual(const KeyTy& LHS, const StructType *RHS) { 132 if (RHS == getEmptyKey() || RHS == getTombstoneKey()) 133 return false; 134 return LHS == KeyTy(RHS); 135 } 136 static bool isEqual(const StructType *LHS, const StructType *RHS) { 137 return LHS == RHS; 138 } 139}; 140 141struct FunctionTypeKeyInfo { 142 struct KeyTy { 143 const Type *ReturnType; 144 ArrayRef<Type*> Params; 145 bool isVarArg; 146 KeyTy(const Type* R, const ArrayRef<Type*>& P, bool V) : 147 ReturnType(R), Params(P), isVarArg(V) {} 148 KeyTy(const FunctionType* FT) : 149 ReturnType(FT->getReturnType()), 150 Params(ArrayRef<Type*>(FT->param_begin(), FT->param_end())), 151 isVarArg(FT->isVarArg()) {} 152 bool operator==(const KeyTy& that) const { 153 if (ReturnType != that.ReturnType) 154 return false; 155 if (isVarArg != that.isVarArg) 156 return false; 157 if (Params != that.Params) 158 return false; 159 return true; 160 } 161 bool operator!=(const KeyTy& that) const { 162 return !this->operator==(that); 163 } 164 }; 165 static inline FunctionType* getEmptyKey() { 166 return DenseMapInfo<FunctionType*>::getEmptyKey(); 167 } 168 static inline FunctionType* getTombstoneKey() { 169 return DenseMapInfo<FunctionType*>::getTombstoneKey(); 170 } 171 static unsigned getHashValue(const KeyTy& Key) { 172 return hash_combine(Key.ReturnType, 173 hash_combine_range(Key.Params.begin(), 174 Key.Params.end()), 175 Key.isVarArg); 176 } 177 static unsigned getHashValue(const FunctionType *FT) { 178 return getHashValue(KeyTy(FT)); 179 } 180 static bool isEqual(const KeyTy& LHS, const FunctionType *RHS) { 181 if (RHS == getEmptyKey() || RHS == getTombstoneKey()) 182 return false; 183 return LHS == KeyTy(RHS); 184 } 185 static bool isEqual(const FunctionType *LHS, const FunctionType *RHS) { 186 return LHS == RHS; 187 } 188}; 189 190// Provide a FoldingSetTrait::Equals specialization for MDNode that can use a 191// shortcut to avoid comparing all operands. 192template<> struct FoldingSetTrait<MDNode> : DefaultFoldingSetTrait<MDNode> { 193 static bool Equals(const MDNode &X, const FoldingSetNodeID &ID, 194 unsigned IDHash, FoldingSetNodeID &TempID) { 195 assert(!X.isNotUniqued() && "Non-uniqued MDNode in FoldingSet?"); 196 // First, check if the cached hashes match. If they don't we can skip the 197 // expensive operand walk. 198 if (X.Hash != IDHash) 199 return false; 200 201 // If they match we have to compare the operands. 202 X.Profile(TempID); 203 return TempID == ID; 204 } 205 static unsigned ComputeHash(const MDNode &X, FoldingSetNodeID &) { 206 return X.Hash; // Return cached hash. 207 } 208}; 209 210/// DebugRecVH - This is a CallbackVH used to keep the Scope -> index maps 211/// up to date as MDNodes mutate. This class is implemented in DebugLoc.cpp. 212class DebugRecVH : public CallbackVH { 213 /// Ctx - This is the LLVM Context being referenced. 214 LLVMContextImpl *Ctx; 215 216 /// Idx - The index into either ScopeRecordIdx or ScopeInlinedAtRecords that 217 /// this reference lives in. If this is zero, then it represents a 218 /// non-canonical entry that has no DenseMap value. This can happen due to 219 /// RAUW. 220 int Idx; 221public: 222 DebugRecVH(MDNode *n, LLVMContextImpl *ctx, int idx) 223 : CallbackVH(n), Ctx(ctx), Idx(idx) {} 224 225 MDNode *get() const { 226 return cast_or_null<MDNode>(getValPtr()); 227 } 228 229 virtual void deleted(); 230 virtual void allUsesReplacedWith(Value *VNew); 231}; 232 233class LLVMContextImpl { 234public: 235 /// OwnedModules - The set of modules instantiated in this context, and which 236 /// will be automatically deleted if this context is deleted. 237 SmallPtrSet<Module*, 4> OwnedModules; 238 239 LLVMContext::InlineAsmDiagHandlerTy InlineAsmDiagHandler; 240 void *InlineAsmDiagContext; 241 242 typedef DenseMap<DenseMapAPIntKeyInfo::KeyTy, ConstantInt*, 243 DenseMapAPIntKeyInfo> IntMapTy; 244 IntMapTy IntConstants; 245 246 typedef DenseMap<DenseMapAPFloatKeyInfo::KeyTy, ConstantFP*, 247 DenseMapAPFloatKeyInfo> FPMapTy; 248 FPMapTy FPConstants; 249 250 FoldingSet<AttributeImpl> AttrsSet; 251 FoldingSet<AttributeSetImpl> AttrsLists; 252 FoldingSet<AttributeSetNode> AttrsSetNodes; 253 254 StringMap<Value*> MDStringCache; 255 256 FoldingSet<MDNode> MDNodeSet; 257 258 // MDNodes may be uniqued or not uniqued. When they're not uniqued, they 259 // aren't in the MDNodeSet, but they're still shared between objects, so no 260 // one object can destroy them. This set allows us to at least destroy them 261 // on Context destruction. 262 SmallPtrSet<MDNode*, 1> NonUniquedMDNodes; 263 264 DenseMap<Type*, ConstantAggregateZero*> CAZConstants; 265 266 typedef ConstantAggrUniqueMap<ArrayType, ConstantArray> ArrayConstantsTy; 267 ArrayConstantsTy ArrayConstants; 268 269 typedef ConstantAggrUniqueMap<StructType, ConstantStruct> StructConstantsTy; 270 StructConstantsTy StructConstants; 271 272 typedef ConstantAggrUniqueMap<VectorType, ConstantVector> VectorConstantsTy; 273 VectorConstantsTy VectorConstants; 274 275 DenseMap<PointerType*, ConstantPointerNull*> CPNConstants; 276 277 DenseMap<Type*, UndefValue*> UVConstants; 278 279 StringMap<ConstantDataSequential*> CDSConstants; 280 281 282 DenseMap<std::pair<Function*, BasicBlock*> , BlockAddress*> BlockAddresses; 283 ConstantUniqueMap<ExprMapKeyType, const ExprMapKeyType&, Type, ConstantExpr> 284 ExprConstants; 285 286 ConstantUniqueMap<InlineAsmKeyType, const InlineAsmKeyType&, PointerType, 287 InlineAsm> InlineAsms; 288 289 ConstantInt *TheTrueVal; 290 ConstantInt *TheFalseVal; 291 292 LeakDetectorImpl<Value> LLVMObjects; 293 294 // Basic type instances. 295 Type VoidTy, LabelTy, HalfTy, FloatTy, DoubleTy, MetadataTy; 296 Type X86_FP80Ty, FP128Ty, PPC_FP128Ty, X86_MMXTy; 297 IntegerType Int1Ty, Int8Ty, Int16Ty, Int32Ty, Int64Ty; 298 299 300 /// TypeAllocator - All dynamically allocated types are allocated from this. 301 /// They live forever until the context is torn down. 302 BumpPtrAllocator TypeAllocator; 303 304 DenseMap<unsigned, IntegerType*> IntegerTypes; 305 306 typedef DenseMap<FunctionType*, bool, FunctionTypeKeyInfo> FunctionTypeMap; 307 FunctionTypeMap FunctionTypes; 308 typedef DenseMap<StructType*, bool, AnonStructTypeKeyInfo> StructTypeMap; 309 StructTypeMap AnonStructTypes; 310 StringMap<StructType*> NamedStructTypes; 311 unsigned NamedStructTypesUniqueID; 312 313 DenseMap<std::pair<Type *, uint64_t>, ArrayType*> ArrayTypes; 314 DenseMap<std::pair<Type *, unsigned>, VectorType*> VectorTypes; 315 DenseMap<Type*, PointerType*> PointerTypes; // Pointers in AddrSpace = 0 316 DenseMap<std::pair<Type*, unsigned>, PointerType*> ASPointerTypes; 317 318 319 /// ValueHandles - This map keeps track of all of the value handles that are 320 /// watching a Value*. The Value::HasValueHandle bit is used to know 321 /// whether or not a value has an entry in this map. 322 typedef DenseMap<Value*, ValueHandleBase*> ValueHandlesTy; 323 ValueHandlesTy ValueHandles; 324 325 /// CustomMDKindNames - Map to hold the metadata string to ID mapping. 326 StringMap<unsigned> CustomMDKindNames; 327 328 typedef std::pair<unsigned, TrackingVH<MDNode> > MDPairTy; 329 typedef SmallVector<MDPairTy, 2> MDMapTy; 330 331 /// MetadataStore - Collection of per-instruction metadata used in this 332 /// context. 333 DenseMap<const Instruction *, MDMapTy> MetadataStore; 334 335 /// ScopeRecordIdx - This is the index in ScopeRecords for an MDNode scope 336 /// entry with no "inlined at" element. 337 DenseMap<MDNode*, int> ScopeRecordIdx; 338 339 /// ScopeRecords - These are the actual mdnodes (in a value handle) for an 340 /// index. The ValueHandle ensures that ScopeRecordIdx stays up to date if 341 /// the MDNode is RAUW'd. 342 std::vector<DebugRecVH> ScopeRecords; 343 344 /// ScopeInlinedAtIdx - This is the index in ScopeInlinedAtRecords for an 345 /// scope/inlined-at pair. 346 DenseMap<std::pair<MDNode*, MDNode*>, int> ScopeInlinedAtIdx; 347 348 /// ScopeInlinedAtRecords - These are the actual mdnodes (in value handles) 349 /// for an index. The ValueHandle ensures that ScopeINlinedAtIdx stays up 350 /// to date. 351 std::vector<std::pair<DebugRecVH, DebugRecVH> > ScopeInlinedAtRecords; 352 353 /// IntrinsicIDCache - Cache of intrinsic name (string) to numeric ID mappings 354 /// requested in this context 355 typedef DenseMap<const Function*, unsigned> IntrinsicIDCacheTy; 356 IntrinsicIDCacheTy IntrinsicIDCache; 357 358 int getOrAddScopeRecordIdxEntry(MDNode *N, int ExistingIdx); 359 int getOrAddScopeInlinedAtIdxEntry(MDNode *Scope, MDNode *IA,int ExistingIdx); 360 361 LLVMContextImpl(LLVMContext &C); 362 ~LLVMContextImpl(); 363}; 364 365} 366 367#endif 368