LLVMContextImpl.h revision ba3ddf391f5149b8fca073adc3cbca361353929c
12f1efd639c8659582d0df2b8f927a018b057037fJeffrey Yasskin//===-- LLVMContextImpl.h - The LLVMContextImpl opaque class ----*- C++ -*-===// 22bc29dc0bcb3c1441477a062e4a5cffff175c8caOwen Anderson// 32bc29dc0bcb3c1441477a062e4a5cffff175c8caOwen Anderson// The LLVM Compiler Infrastructure 42bc29dc0bcb3c1441477a062e4a5cffff175c8caOwen Anderson// 52bc29dc0bcb3c1441477a062e4a5cffff175c8caOwen Anderson// This file is distributed under the University of Illinois Open Source 62bc29dc0bcb3c1441477a062e4a5cffff175c8caOwen Anderson// License. See LICENSE.TXT for details. 72bc29dc0bcb3c1441477a062e4a5cffff175c8caOwen Anderson// 82bc29dc0bcb3c1441477a062e4a5cffff175c8caOwen Anderson//===----------------------------------------------------------------------===// 95217007006e91fa4bbfe88fde5149f5db293b247Owen Anderson// 105217007006e91fa4bbfe88fde5149f5db293b247Owen Anderson// This file declares LLVMContextImpl, the opaque implementation 115217007006e91fa4bbfe88fde5149f5db293b247Owen Anderson// of LLVMContext. 125217007006e91fa4bbfe88fde5149f5db293b247Owen Anderson// 135217007006e91fa4bbfe88fde5149f5db293b247Owen Anderson//===----------------------------------------------------------------------===// 142bc29dc0bcb3c1441477a062e4a5cffff175c8caOwen Anderson 152bc29dc0bcb3c1441477a062e4a5cffff175c8caOwen Anderson#ifndef LLVM_LLVMCONTEXT_IMPL_H 162bc29dc0bcb3c1441477a062e4a5cffff175c8caOwen Anderson#define LLVM_LLVMCONTEXT_IMPL_H 172bc29dc0bcb3c1441477a062e4a5cffff175c8caOwen Anderson 181afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner#include "llvm/LLVMContext.h" 1948b2f3e4850cd27d54224cd42da8a160d6b95984Owen Anderson#include "ConstantsContext.h" 20c34ebf65af0139eaf5cb0969fabcd32c0b6e1710Owen Anderson#include "LeaksContext.h" 21eed707b1e6097aac2bb6b3d47271f6300ace7f2eOwen Anderson#include "llvm/Constants.h" 22f53c371983908f02678b0e12c5d18466dcc70ffdOwen Anderson#include "llvm/DerivedTypes.h" 23b4cc66d7b71357d379257930f96929e26697805dJeffrey Yasskin#include "llvm/Metadata.h" 24081134741b40b342fb2f85722c9cea5d412489a8Chris Lattner#include "llvm/Support/ValueHandle.h" 25914e50c841bbc248ab94144c11813b5785b1292dOwen Anderson#include "llvm/ADT/APFloat.h" 26001dbfebcbbded8c8e74b19e838b50da2b6c6fb5Owen Anderson#include "llvm/ADT/APInt.h" 272a4a6fecf0b8c92223f8fdf19545b564b7d3fcdeJay Foad#include "llvm/ADT/ArrayRef.h" 28001dbfebcbbded8c8e74b19e838b50da2b6c6fb5Owen Anderson#include "llvm/ADT/DenseMap.h" 29ce032b483ca96093b84f69178cdb2d047e124332Owen Anderson#include "llvm/ADT/FoldingSet.h" 30ad715f86c90b06cc4ab9e1336d1bc3bf13ecb16dJeffrey Yasskin#include "llvm/ADT/SmallPtrSet.h" 31aad3fb7362aff151e97ad457005ea3f2872fe868Owen Anderson#include "llvm/ADT/StringMap.h" 32006c77df8cc7f6a9dac575600b797b8ba32b29ebOwen Anderson#include <vector> 3316e298f98024bcff5c7219a96cac216114c30dadOwen Anderson 342bc29dc0bcb3c1441477a062e4a5cffff175c8caOwen Andersonnamespace llvm { 35eed707b1e6097aac2bb6b3d47271f6300ace7f2eOwen Anderson 36001dbfebcbbded8c8e74b19e838b50da2b6c6fb5Owen Andersonclass ConstantInt; 37914e50c841bbc248ab94144c11813b5785b1292dOwen Andersonclass ConstantFP; 3812ddd409535b52a7fa5157ded9a4cedd161fedb6Benjamin Kramerclass LLVMContext; 39001dbfebcbbded8c8e74b19e838b50da2b6c6fb5Owen Andersonclass Type; 40ce032b483ca96093b84f69178cdb2d047e124332Owen Andersonclass Value; 41001dbfebcbbded8c8e74b19e838b50da2b6c6fb5Owen Anderson 42001dbfebcbbded8c8e74b19e838b50da2b6c6fb5Owen Andersonstruct DenseMapAPIntKeyInfo { 43001dbfebcbbded8c8e74b19e838b50da2b6c6fb5Owen Anderson struct KeyTy { 44001dbfebcbbded8c8e74b19e838b50da2b6c6fb5Owen Anderson APInt val; 45001dbfebcbbded8c8e74b19e838b50da2b6c6fb5Owen Anderson const Type* type; 46001dbfebcbbded8c8e74b19e838b50da2b6c6fb5Owen Anderson KeyTy(const APInt& V, const Type* Ty) : val(V), type(Ty) {} 47001dbfebcbbded8c8e74b19e838b50da2b6c6fb5Owen Anderson KeyTy(const KeyTy& that) : val(that.val), type(that.type) {} 48001dbfebcbbded8c8e74b19e838b50da2b6c6fb5Owen Anderson bool operator==(const KeyTy& that) const { 49001dbfebcbbded8c8e74b19e838b50da2b6c6fb5Owen Anderson return type == that.type && this->val == that.val; 50001dbfebcbbded8c8e74b19e838b50da2b6c6fb5Owen Anderson } 51001dbfebcbbded8c8e74b19e838b50da2b6c6fb5Owen Anderson bool operator!=(const KeyTy& that) const { 52001dbfebcbbded8c8e74b19e838b50da2b6c6fb5Owen Anderson return !this->operator==(that); 53001dbfebcbbded8c8e74b19e838b50da2b6c6fb5Owen Anderson } 54001dbfebcbbded8c8e74b19e838b50da2b6c6fb5Owen Anderson }; 55001dbfebcbbded8c8e74b19e838b50da2b6c6fb5Owen Anderson static inline KeyTy getEmptyKey() { return KeyTy(APInt(1,0), 0); } 56001dbfebcbbded8c8e74b19e838b50da2b6c6fb5Owen Anderson static inline KeyTy getTombstoneKey() { return KeyTy(APInt(1,1), 0); } 57001dbfebcbbded8c8e74b19e838b50da2b6c6fb5Owen Anderson static unsigned getHashValue(const KeyTy &Key) { 58001dbfebcbbded8c8e74b19e838b50da2b6c6fb5Owen Anderson return DenseMapInfo<void*>::getHashValue(Key.type) ^ 59001dbfebcbbded8c8e74b19e838b50da2b6c6fb5Owen Anderson Key.val.getHashValue(); 60001dbfebcbbded8c8e74b19e838b50da2b6c6fb5Owen Anderson } 61001dbfebcbbded8c8e74b19e838b50da2b6c6fb5Owen Anderson static bool isEqual(const KeyTy &LHS, const KeyTy &RHS) { 62001dbfebcbbded8c8e74b19e838b50da2b6c6fb5Owen Anderson return LHS == RHS; 63001dbfebcbbded8c8e74b19e838b50da2b6c6fb5Owen Anderson } 64001dbfebcbbded8c8e74b19e838b50da2b6c6fb5Owen Anderson}; 65001dbfebcbbded8c8e74b19e838b50da2b6c6fb5Owen Anderson 66914e50c841bbc248ab94144c11813b5785b1292dOwen Andersonstruct DenseMapAPFloatKeyInfo { 67914e50c841bbc248ab94144c11813b5785b1292dOwen Anderson struct KeyTy { 68914e50c841bbc248ab94144c11813b5785b1292dOwen Anderson APFloat val; 69914e50c841bbc248ab94144c11813b5785b1292dOwen Anderson KeyTy(const APFloat& V) : val(V){} 70914e50c841bbc248ab94144c11813b5785b1292dOwen Anderson KeyTy(const KeyTy& that) : val(that.val) {} 71914e50c841bbc248ab94144c11813b5785b1292dOwen Anderson bool operator==(const KeyTy& that) const { 72914e50c841bbc248ab94144c11813b5785b1292dOwen Anderson return this->val.bitwiseIsEqual(that.val); 73914e50c841bbc248ab94144c11813b5785b1292dOwen Anderson } 74914e50c841bbc248ab94144c11813b5785b1292dOwen Anderson bool operator!=(const KeyTy& that) const { 75914e50c841bbc248ab94144c11813b5785b1292dOwen Anderson return !this->operator==(that); 76914e50c841bbc248ab94144c11813b5785b1292dOwen Anderson } 77914e50c841bbc248ab94144c11813b5785b1292dOwen Anderson }; 78914e50c841bbc248ab94144c11813b5785b1292dOwen Anderson static inline KeyTy getEmptyKey() { 79914e50c841bbc248ab94144c11813b5785b1292dOwen Anderson return KeyTy(APFloat(APFloat::Bogus,1)); 80914e50c841bbc248ab94144c11813b5785b1292dOwen Anderson } 81914e50c841bbc248ab94144c11813b5785b1292dOwen Anderson static inline KeyTy getTombstoneKey() { 82914e50c841bbc248ab94144c11813b5785b1292dOwen Anderson return KeyTy(APFloat(APFloat::Bogus,2)); 83914e50c841bbc248ab94144c11813b5785b1292dOwen Anderson } 84914e50c841bbc248ab94144c11813b5785b1292dOwen Anderson static unsigned getHashValue(const KeyTy &Key) { 85914e50c841bbc248ab94144c11813b5785b1292dOwen Anderson return Key.val.getHashValue(); 86914e50c841bbc248ab94144c11813b5785b1292dOwen Anderson } 87914e50c841bbc248ab94144c11813b5785b1292dOwen Anderson static bool isEqual(const KeyTy &LHS, const KeyTy &RHS) { 88914e50c841bbc248ab94144c11813b5785b1292dOwen Anderson return LHS == RHS; 89914e50c841bbc248ab94144c11813b5785b1292dOwen Anderson } 90914e50c841bbc248ab94144c11813b5785b1292dOwen Anderson}; 91914e50c841bbc248ab94144c11813b5785b1292dOwen Anderson 92b227925fa313428045f554187b0136d084d723f6Chris Lattner/// DebugRecVH - This is a CallbackVH used to keep the Scope -> index maps 93b227925fa313428045f554187b0136d084d723f6Chris Lattner/// up to date as MDNodes mutate. This class is implemented in DebugLoc.cpp. 94b227925fa313428045f554187b0136d084d723f6Chris Lattnerclass DebugRecVH : public CallbackVH { 95b227925fa313428045f554187b0136d084d723f6Chris Lattner /// Ctx - This is the LLVM Context being referenced. 96b227925fa313428045f554187b0136d084d723f6Chris Lattner LLVMContextImpl *Ctx; 97b227925fa313428045f554187b0136d084d723f6Chris Lattner 98b227925fa313428045f554187b0136d084d723f6Chris Lattner /// Idx - The index into either ScopeRecordIdx or ScopeInlinedAtRecords that 99b227925fa313428045f554187b0136d084d723f6Chris Lattner /// this reference lives in. If this is zero, then it represents a 100b227925fa313428045f554187b0136d084d723f6Chris Lattner /// non-canonical entry that has no DenseMap value. This can happen due to 101b227925fa313428045f554187b0136d084d723f6Chris Lattner /// RAUW. 102b227925fa313428045f554187b0136d084d723f6Chris Lattner int Idx; 103b227925fa313428045f554187b0136d084d723f6Chris Lattnerpublic: 104b227925fa313428045f554187b0136d084d723f6Chris Lattner DebugRecVH(MDNode *n, LLVMContextImpl *ctx, int idx) 105b227925fa313428045f554187b0136d084d723f6Chris Lattner : CallbackVH(n), Ctx(ctx), Idx(idx) {} 106b227925fa313428045f554187b0136d084d723f6Chris Lattner 107b227925fa313428045f554187b0136d084d723f6Chris Lattner MDNode *get() const { 108b227925fa313428045f554187b0136d084d723f6Chris Lattner return cast_or_null<MDNode>(getValPtr()); 109b227925fa313428045f554187b0136d084d723f6Chris Lattner } 110b227925fa313428045f554187b0136d084d723f6Chris Lattner 111b227925fa313428045f554187b0136d084d723f6Chris Lattner virtual void deleted(); 112b227925fa313428045f554187b0136d084d723f6Chris Lattner virtual void allUsesReplacedWith(Value *VNew); 113b227925fa313428045f554187b0136d084d723f6Chris Lattner}; 114b227925fa313428045f554187b0136d084d723f6Chris Lattner 11512ddd409535b52a7fa5157ded9a4cedd161fedb6Benjamin Kramerclass LLVMContextImpl { 11612ddd409535b52a7fa5157ded9a4cedd161fedb6Benjamin Kramerpublic: 11730268be89df6444f5ffb585439b3fbfec9055197Owen Anderson /// OwnedModules - The set of modules instantiated in this context, and which 11830268be89df6444f5ffb585439b3fbfec9055197Owen Anderson /// will be automatically deleted if this context is deleted. 11930268be89df6444f5ffb585439b3fbfec9055197Owen Anderson SmallPtrSet<Module*, 4> OwnedModules; 12030268be89df6444f5ffb585439b3fbfec9055197Owen Anderson 1214afa12890f679034e9741a687a6ce33f2846f129Chris Lattner LLVMContext::InlineAsmDiagHandlerTy InlineAsmDiagHandler; 1224afa12890f679034e9741a687a6ce33f2846f129Chris Lattner void *InlineAsmDiagContext; 12342a4ee0a35b4672311c1b988bd883167de9f88cdChris Lattner 124001dbfebcbbded8c8e74b19e838b50da2b6c6fb5Owen Anderson typedef DenseMap<DenseMapAPIntKeyInfo::KeyTy, ConstantInt*, 12548b2f3e4850cd27d54224cd42da8a160d6b95984Owen Anderson DenseMapAPIntKeyInfo> IntMapTy; 126001dbfebcbbded8c8e74b19e838b50da2b6c6fb5Owen Anderson IntMapTy IntConstants; 127001dbfebcbbded8c8e74b19e838b50da2b6c6fb5Owen Anderson 128914e50c841bbc248ab94144c11813b5785b1292dOwen Anderson typedef DenseMap<DenseMapAPFloatKeyInfo::KeyTy, ConstantFP*, 12948b2f3e4850cd27d54224cd42da8a160d6b95984Owen Anderson DenseMapAPFloatKeyInfo> FPMapTy; 130914e50c841bbc248ab94144c11813b5785b1292dOwen Anderson FPMapTy FPConstants; 131914e50c841bbc248ab94144c11813b5785b1292dOwen Anderson 132aad3fb7362aff151e97ad457005ea3f2872fe868Owen Anderson StringMap<MDString*> MDStringCache; 133aad3fb7362aff151e97ad457005ea3f2872fe868Owen Anderson 1345f4ac848d94b0a92e19ac7f2b3d0284d7d323173Devang Patel FoldingSet<MDNode> MDNodeSet; 1356f555ca2cd0bba50542adcbb131f541ae70d34cdJeffrey Yasskin // MDNodes may be uniqued or not uniqued. When they're not uniqued, they 1366f555ca2cd0bba50542adcbb131f541ae70d34cdJeffrey Yasskin // aren't in the MDNodeSet, but they're still shared between objects, so no 1376f555ca2cd0bba50542adcbb131f541ae70d34cdJeffrey Yasskin // one object can destroy them. This set allows us to at least destroy them 1386f555ca2cd0bba50542adcbb131f541ae70d34cdJeffrey Yasskin // on Context destruction. 1396f555ca2cd0bba50542adcbb131f541ae70d34cdJeffrey Yasskin SmallPtrSet<MDNode*, 1> NonUniquedMDNodes; 1405f4ac848d94b0a92e19ac7f2b3d0284d7d323173Devang Patel 1412a4a6fecf0b8c92223f8fdf19545b564b7d3fcdeJay Foad ConstantUniqueMap<char, char, Type, ConstantAggregateZero> AggZeroConstants; 1420631fce85050f8f633e5fd032875d9151e0db4daOwen Anderson 1432a4a6fecf0b8c92223f8fdf19545b564b7d3fcdeJay Foad typedef ConstantUniqueMap<std::vector<Constant*>, ArrayRef<Constant*>, 1442a4a6fecf0b8c92223f8fdf19545b564b7d3fcdeJay Foad ArrayType, ConstantArray, true /*largekey*/> ArrayConstantsTy; 145eed707b1e6097aac2bb6b3d47271f6300ace7f2eOwen Anderson ArrayConstantsTy ArrayConstants; 14616e298f98024bcff5c7219a96cac216114c30dadOwen Anderson 1472a4a6fecf0b8c92223f8fdf19545b564b7d3fcdeJay Foad typedef ConstantUniqueMap<std::vector<Constant*>, ArrayRef<Constant*>, 1482a4a6fecf0b8c92223f8fdf19545b564b7d3fcdeJay Foad StructType, ConstantStruct, true /*largekey*/> StructConstantsTy; 149eed707b1e6097aac2bb6b3d47271f6300ace7f2eOwen Anderson StructConstantsTy StructConstants; 150006c77df8cc7f6a9dac575600b797b8ba32b29ebOwen Anderson 1512a4a6fecf0b8c92223f8fdf19545b564b7d3fcdeJay Foad typedef ConstantUniqueMap<std::vector<Constant*>, ArrayRef<Constant*>, 1522a4a6fecf0b8c92223f8fdf19545b564b7d3fcdeJay Foad VectorType, ConstantVector> VectorConstantsTy; 153eed707b1e6097aac2bb6b3d47271f6300ace7f2eOwen Anderson VectorConstantsTy VectorConstants; 1545bd68393ed87bcedc53f5998f1af9c906f5a1b4eOwen Anderson 1552a4a6fecf0b8c92223f8fdf19545b564b7d3fcdeJay Foad ConstantUniqueMap<char, char, PointerType, ConstantPointerNull> 1562a4a6fecf0b8c92223f8fdf19545b564b7d3fcdeJay Foad NullPtrConstants; 1572a4a6fecf0b8c92223f8fdf19545b564b7d3fcdeJay Foad ConstantUniqueMap<char, char, Type, UndefValue> UndefValueConstants; 1587e3142b0126abc86dc4da350e8b84b001c3eeddeOwen Anderson 1592ee11eccdde14c95c78773be76b02bb5fd09d7eeChris Lattner DenseMap<std::pair<Function*, BasicBlock*> , BlockAddress*> BlockAddresses; 1602a4a6fecf0b8c92223f8fdf19545b564b7d3fcdeJay Foad ConstantUniqueMap<ExprMapKeyType, const ExprMapKeyType&, Type, ConstantExpr> 1612a4a6fecf0b8c92223f8fdf19545b564b7d3fcdeJay Foad ExprConstants; 162bf48a9b6db111fc14a8faef1adefbce5d807aaefJeffrey Yasskin 1632a4a6fecf0b8c92223f8fdf19545b564b7d3fcdeJay Foad ConstantUniqueMap<InlineAsmKeyType, const InlineAsmKeyType&, PointerType, 1642a4a6fecf0b8c92223f8fdf19545b564b7d3fcdeJay Foad InlineAsm> InlineAsms; 165d03eecd063a18ce0c505a87afcb04db26c035bc9Owen Anderson 166f53c371983908f02678b0e12c5d18466dcc70ffdOwen Anderson ConstantInt *TheTrueVal; 167f53c371983908f02678b0e12c5d18466dcc70ffdOwen Anderson ConstantInt *TheFalseVal; 168f53c371983908f02678b0e12c5d18466dcc70ffdOwen Anderson 169c34ebf65af0139eaf5cb0969fabcd32c0b6e1710Owen Anderson LeakDetectorImpl<Value> LLVMObjects; 170c34ebf65af0139eaf5cb0969fabcd32c0b6e1710Owen Anderson 17163a03cf58505aa839f721f212cd1518ebf133979Dan Gohman // Basic type instances. 1721afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner Type VoidTy, LabelTy, FloatTy, DoubleTy, MetadataTy; 1731afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner Type X86_FP80Ty, FP128Ty, PPC_FP128Ty, X86_MMXTy; 1741afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner IntegerType Int1Ty, Int8Ty, Int16Ty, Int32Ty, Int64Ty; 1759233b15d01ca62445bfc638f782243988c672e01Jeffrey Yasskin 176ba3ddf391f5149b8fca073adc3cbca361353929cChris Lattner 177ba3ddf391f5149b8fca073adc3cbca361353929cChris Lattner /// TypeAllocator - All dynamically allocated types are allocated from this. 178ba3ddf391f5149b8fca073adc3cbca361353929cChris Lattner /// They live forever until the context is torn down. 179ba3ddf391f5149b8fca073adc3cbca361353929cChris Lattner BumpPtrAllocator TypeAllocator; 180ba3ddf391f5149b8fca073adc3cbca361353929cChris Lattner 1811afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner DenseMap<unsigned, IntegerType*> IntegerTypes; 1821afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner 1831afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner // TODO: Optimize FunctionTypes/AnonStructTypes! 1841afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner std::map<std::vector<Type*>, FunctionType*> FunctionTypes; 1851afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner std::map<std::vector<Type*>, StructType*> AnonStructTypes; 1861afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner StringMap<StructType*> NamedStructTypes; 1871afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner unsigned NamedStructTypesUniqueID; 1881afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner 1891afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner DenseMap<std::pair<Type *, uint64_t>, ArrayType*> ArrayTypes; 1901afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner DenseMap<std::pair<Type *, unsigned>, VectorType*> VectorTypes; 1911afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner DenseMap<Type*, PointerType*> PointerTypes; // Pointers in AddrSpace = 0 1921afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner DenseMap<std::pair<Type*, unsigned>, PointerType*> ASPointerTypes; 1939233b15d01ca62445bfc638f782243988c672e01Jeffrey Yasskin 194ad715f86c90b06cc4ab9e1336d1bc3bf13ecb16dJeffrey Yasskin 1954d919438898d542850449235da7f6dc55e6ca152Owen Anderson /// ValueHandles - This map keeps track of all of the value handles that are 1964d919438898d542850449235da7f6dc55e6ca152Owen Anderson /// watching a Value*. The Value::HasValueHandle bit is used to know 1974d919438898d542850449235da7f6dc55e6ca152Owen Anderson // whether or not a value has an entry in this map. 1984d919438898d542850449235da7f6dc55e6ca152Owen Anderson typedef DenseMap<Value*, ValueHandleBase*> ValueHandlesTy; 1994d919438898d542850449235da7f6dc55e6ca152Owen Anderson ValueHandlesTy ValueHandles; 2004d919438898d542850449235da7f6dc55e6ca152Owen Anderson 201081134741b40b342fb2f85722c9cea5d412489a8Chris Lattner /// CustomMDKindNames - Map to hold the metadata string to ID mapping. 202081134741b40b342fb2f85722c9cea5d412489a8Chris Lattner StringMap<unsigned> CustomMDKindNames; 203081134741b40b342fb2f85722c9cea5d412489a8Chris Lattner 204081134741b40b342fb2f85722c9cea5d412489a8Chris Lattner typedef std::pair<unsigned, TrackingVH<MDNode> > MDPairTy; 205081134741b40b342fb2f85722c9cea5d412489a8Chris Lattner typedef SmallVector<MDPairTy, 2> MDMapTy; 206081134741b40b342fb2f85722c9cea5d412489a8Chris Lattner 207081134741b40b342fb2f85722c9cea5d412489a8Chris Lattner /// MetadataStore - Collection of per-instruction metadata used in this 208081134741b40b342fb2f85722c9cea5d412489a8Chris Lattner /// context. 209081134741b40b342fb2f85722c9cea5d412489a8Chris Lattner DenseMap<const Instruction *, MDMapTy> MetadataStore; 210081134741b40b342fb2f85722c9cea5d412489a8Chris Lattner 211b227925fa313428045f554187b0136d084d723f6Chris Lattner /// ScopeRecordIdx - This is the index in ScopeRecords for an MDNode scope 212b227925fa313428045f554187b0136d084d723f6Chris Lattner /// entry with no "inlined at" element. 213b227925fa313428045f554187b0136d084d723f6Chris Lattner DenseMap<MDNode*, int> ScopeRecordIdx; 214b227925fa313428045f554187b0136d084d723f6Chris Lattner 215b227925fa313428045f554187b0136d084d723f6Chris Lattner /// ScopeRecords - These are the actual mdnodes (in a value handle) for an 216b227925fa313428045f554187b0136d084d723f6Chris Lattner /// index. The ValueHandle ensures that ScopeRecordIdx stays up to date if 217b227925fa313428045f554187b0136d084d723f6Chris Lattner /// the MDNode is RAUW'd. 218b227925fa313428045f554187b0136d084d723f6Chris Lattner std::vector<DebugRecVH> ScopeRecords; 219b227925fa313428045f554187b0136d084d723f6Chris Lattner 220b227925fa313428045f554187b0136d084d723f6Chris Lattner /// ScopeInlinedAtIdx - This is the index in ScopeInlinedAtRecords for an 221b227925fa313428045f554187b0136d084d723f6Chris Lattner /// scope/inlined-at pair. 222b227925fa313428045f554187b0136d084d723f6Chris Lattner DenseMap<std::pair<MDNode*, MDNode*>, int> ScopeInlinedAtIdx; 223b227925fa313428045f554187b0136d084d723f6Chris Lattner 224b227925fa313428045f554187b0136d084d723f6Chris Lattner /// ScopeInlinedAtRecords - These are the actual mdnodes (in value handles) 225b227925fa313428045f554187b0136d084d723f6Chris Lattner /// for an index. The ValueHandle ensures that ScopeINlinedAtIdx stays up 226b227925fa313428045f554187b0136d084d723f6Chris Lattner /// to date. 227b227925fa313428045f554187b0136d084d723f6Chris Lattner std::vector<std::pair<DebugRecVH, DebugRecVH> > ScopeInlinedAtRecords; 228b227925fa313428045f554187b0136d084d723f6Chris Lattner 229b227925fa313428045f554187b0136d084d723f6Chris Lattner int getOrAddScopeRecordIdxEntry(MDNode *N, int ExistingIdx); 230b227925fa313428045f554187b0136d084d723f6Chris Lattner int getOrAddScopeInlinedAtIdxEntry(MDNode *Scope, MDNode *IA,int ExistingIdx); 231b227925fa313428045f554187b0136d084d723f6Chris Lattner 2322f1efd639c8659582d0df2b8f927a018b057037fJeffrey Yasskin LLVMContextImpl(LLVMContext &C); 2332f1efd639c8659582d0df2b8f927a018b057037fJeffrey Yasskin ~LLVMContextImpl(); 2342bc29dc0bcb3c1441477a062e4a5cffff175c8caOwen Anderson}; 2352bc29dc0bcb3c1441477a062e4a5cffff175c8caOwen Anderson 2362bc29dc0bcb3c1441477a062e4a5cffff175c8caOwen Anderson} 2372bc29dc0bcb3c1441477a062e4a5cffff175c8caOwen Anderson 2385217007006e91fa4bbfe88fde5149f5db293b247Owen Anderson#endif 239