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