LLVMContextImpl.h revision f53c371983908f02678b0e12c5d18466dcc70ffd
1001dbfebcbbded8c8e74b19e838b50da2b6c6fb5Owen Anderson//===----------------- LLVMContextImpl.h - Implementation ------*- 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
18f53c371983908f02678b0e12c5d18466dcc70ffdOwen Anderson#include "llvm/LLVMContext.h"
19f53c371983908f02678b0e12c5d18466dcc70ffdOwen Anderson#include "llvm/DerivedTypes.h"
20001dbfebcbbded8c8e74b19e838b50da2b6c6fb5Owen Anderson#include "llvm/System/RWMutex.h"
21914e50c841bbc248ab94144c11813b5785b1292dOwen Anderson#include "llvm/ADT/APFloat.h"
22001dbfebcbbded8c8e74b19e838b50da2b6c6fb5Owen Anderson#include "llvm/ADT/APInt.h"
23001dbfebcbbded8c8e74b19e838b50da2b6c6fb5Owen Anderson#include "llvm/ADT/DenseMap.h"
24ce032b483ca96093b84f69178cdb2d047e124332Owen Anderson#include "llvm/ADT/FoldingSet.h"
25aad3fb7362aff151e97ad457005ea3f2872fe868Owen Anderson#include "llvm/ADT/StringMap.h"
26001dbfebcbbded8c8e74b19e838b50da2b6c6fb5Owen Anderson
272bc29dc0bcb3c1441477a062e4a5cffff175c8caOwen Andersonnamespace llvm {
282bc29dc0bcb3c1441477a062e4a5cffff175c8caOwen Anderson
29001dbfebcbbded8c8e74b19e838b50da2b6c6fb5Owen Andersonclass ConstantInt;
30914e50c841bbc248ab94144c11813b5785b1292dOwen Andersonclass ConstantFP;
31aad3fb7362aff151e97ad457005ea3f2872fe868Owen Andersonclass MDString;
32ce032b483ca96093b84f69178cdb2d047e124332Owen Andersonclass MDNode;
33001dbfebcbbded8c8e74b19e838b50da2b6c6fb5Owen Andersonclass LLVMContext;
34001dbfebcbbded8c8e74b19e838b50da2b6c6fb5Owen Andersonclass Type;
35ce032b483ca96093b84f69178cdb2d047e124332Owen Andersonclass Value;
36001dbfebcbbded8c8e74b19e838b50da2b6c6fb5Owen Anderson
37001dbfebcbbded8c8e74b19e838b50da2b6c6fb5Owen Andersonstruct DenseMapAPIntKeyInfo {
38001dbfebcbbded8c8e74b19e838b50da2b6c6fb5Owen Anderson  struct KeyTy {
39001dbfebcbbded8c8e74b19e838b50da2b6c6fb5Owen Anderson    APInt val;
40001dbfebcbbded8c8e74b19e838b50da2b6c6fb5Owen Anderson    const Type* type;
41001dbfebcbbded8c8e74b19e838b50da2b6c6fb5Owen Anderson    KeyTy(const APInt& V, const Type* Ty) : val(V), type(Ty) {}
42001dbfebcbbded8c8e74b19e838b50da2b6c6fb5Owen Anderson    KeyTy(const KeyTy& that) : val(that.val), type(that.type) {}
43001dbfebcbbded8c8e74b19e838b50da2b6c6fb5Owen Anderson    bool operator==(const KeyTy& that) const {
44001dbfebcbbded8c8e74b19e838b50da2b6c6fb5Owen Anderson      return type == that.type && this->val == that.val;
45001dbfebcbbded8c8e74b19e838b50da2b6c6fb5Owen Anderson    }
46001dbfebcbbded8c8e74b19e838b50da2b6c6fb5Owen Anderson    bool operator!=(const KeyTy& that) const {
47001dbfebcbbded8c8e74b19e838b50da2b6c6fb5Owen Anderson      return !this->operator==(that);
48001dbfebcbbded8c8e74b19e838b50da2b6c6fb5Owen Anderson    }
49001dbfebcbbded8c8e74b19e838b50da2b6c6fb5Owen Anderson  };
50001dbfebcbbded8c8e74b19e838b50da2b6c6fb5Owen Anderson  static inline KeyTy getEmptyKey() { return KeyTy(APInt(1,0), 0); }
51001dbfebcbbded8c8e74b19e838b50da2b6c6fb5Owen Anderson  static inline KeyTy getTombstoneKey() { return KeyTy(APInt(1,1), 0); }
52001dbfebcbbded8c8e74b19e838b50da2b6c6fb5Owen Anderson  static unsigned getHashValue(const KeyTy &Key) {
53001dbfebcbbded8c8e74b19e838b50da2b6c6fb5Owen Anderson    return DenseMapInfo<void*>::getHashValue(Key.type) ^
54001dbfebcbbded8c8e74b19e838b50da2b6c6fb5Owen Anderson      Key.val.getHashValue();
55001dbfebcbbded8c8e74b19e838b50da2b6c6fb5Owen Anderson  }
56001dbfebcbbded8c8e74b19e838b50da2b6c6fb5Owen Anderson  static bool isEqual(const KeyTy &LHS, const KeyTy &RHS) {
57001dbfebcbbded8c8e74b19e838b50da2b6c6fb5Owen Anderson    return LHS == RHS;
58001dbfebcbbded8c8e74b19e838b50da2b6c6fb5Owen Anderson  }
59001dbfebcbbded8c8e74b19e838b50da2b6c6fb5Owen Anderson  static bool isPod() { return false; }
60001dbfebcbbded8c8e74b19e838b50da2b6c6fb5Owen Anderson};
61001dbfebcbbded8c8e74b19e838b50da2b6c6fb5Owen Anderson
62914e50c841bbc248ab94144c11813b5785b1292dOwen Andersonstruct DenseMapAPFloatKeyInfo {
63914e50c841bbc248ab94144c11813b5785b1292dOwen Anderson  struct KeyTy {
64914e50c841bbc248ab94144c11813b5785b1292dOwen Anderson    APFloat val;
65914e50c841bbc248ab94144c11813b5785b1292dOwen Anderson    KeyTy(const APFloat& V) : val(V){}
66914e50c841bbc248ab94144c11813b5785b1292dOwen Anderson    KeyTy(const KeyTy& that) : val(that.val) {}
67914e50c841bbc248ab94144c11813b5785b1292dOwen Anderson    bool operator==(const KeyTy& that) const {
68914e50c841bbc248ab94144c11813b5785b1292dOwen Anderson      return this->val.bitwiseIsEqual(that.val);
69914e50c841bbc248ab94144c11813b5785b1292dOwen Anderson    }
70914e50c841bbc248ab94144c11813b5785b1292dOwen Anderson    bool operator!=(const KeyTy& that) const {
71914e50c841bbc248ab94144c11813b5785b1292dOwen Anderson      return !this->operator==(that);
72914e50c841bbc248ab94144c11813b5785b1292dOwen Anderson    }
73914e50c841bbc248ab94144c11813b5785b1292dOwen Anderson  };
74914e50c841bbc248ab94144c11813b5785b1292dOwen Anderson  static inline KeyTy getEmptyKey() {
75914e50c841bbc248ab94144c11813b5785b1292dOwen Anderson    return KeyTy(APFloat(APFloat::Bogus,1));
76914e50c841bbc248ab94144c11813b5785b1292dOwen Anderson  }
77914e50c841bbc248ab94144c11813b5785b1292dOwen Anderson  static inline KeyTy getTombstoneKey() {
78914e50c841bbc248ab94144c11813b5785b1292dOwen Anderson    return KeyTy(APFloat(APFloat::Bogus,2));
79914e50c841bbc248ab94144c11813b5785b1292dOwen Anderson  }
80914e50c841bbc248ab94144c11813b5785b1292dOwen Anderson  static unsigned getHashValue(const KeyTy &Key) {
81914e50c841bbc248ab94144c11813b5785b1292dOwen Anderson    return Key.val.getHashValue();
82914e50c841bbc248ab94144c11813b5785b1292dOwen Anderson  }
83914e50c841bbc248ab94144c11813b5785b1292dOwen Anderson  static bool isEqual(const KeyTy &LHS, const KeyTy &RHS) {
84914e50c841bbc248ab94144c11813b5785b1292dOwen Anderson    return LHS == RHS;
85914e50c841bbc248ab94144c11813b5785b1292dOwen Anderson  }
86914e50c841bbc248ab94144c11813b5785b1292dOwen Anderson  static bool isPod() { return false; }
87914e50c841bbc248ab94144c11813b5785b1292dOwen Anderson};
88914e50c841bbc248ab94144c11813b5785b1292dOwen Anderson
89001dbfebcbbded8c8e74b19e838b50da2b6c6fb5Owen Andersonclass LLVMContextImpl {
90001dbfebcbbded8c8e74b19e838b50da2b6c6fb5Owen Anderson  sys::SmartRWMutex<true> ConstantsLock;
91001dbfebcbbded8c8e74b19e838b50da2b6c6fb5Owen Anderson
92001dbfebcbbded8c8e74b19e838b50da2b6c6fb5Owen Anderson  typedef DenseMap<DenseMapAPIntKeyInfo::KeyTy, ConstantInt*,
93001dbfebcbbded8c8e74b19e838b50da2b6c6fb5Owen Anderson                   DenseMapAPIntKeyInfo> IntMapTy;
94001dbfebcbbded8c8e74b19e838b50da2b6c6fb5Owen Anderson  IntMapTy IntConstants;
95001dbfebcbbded8c8e74b19e838b50da2b6c6fb5Owen Anderson
96914e50c841bbc248ab94144c11813b5785b1292dOwen Anderson  typedef DenseMap<DenseMapAPFloatKeyInfo::KeyTy, ConstantFP*,
97914e50c841bbc248ab94144c11813b5785b1292dOwen Anderson                   DenseMapAPFloatKeyInfo> FPMapTy;
98914e50c841bbc248ab94144c11813b5785b1292dOwen Anderson  FPMapTy FPConstants;
99914e50c841bbc248ab94144c11813b5785b1292dOwen Anderson
100aad3fb7362aff151e97ad457005ea3f2872fe868Owen Anderson  StringMap<MDString*> MDStringCache;
101aad3fb7362aff151e97ad457005ea3f2872fe868Owen Anderson
102ce032b483ca96093b84f69178cdb2d047e124332Owen Anderson  FoldingSet<MDNode> MDNodeSet;
103ce032b483ca96093b84f69178cdb2d047e124332Owen Anderson
104001dbfebcbbded8c8e74b19e838b50da2b6c6fb5Owen Anderson  LLVMContext &Context;
105f53c371983908f02678b0e12c5d18466dcc70ffdOwen Anderson  ConstantInt *TheTrueVal;
106f53c371983908f02678b0e12c5d18466dcc70ffdOwen Anderson  ConstantInt *TheFalseVal;
107f53c371983908f02678b0e12c5d18466dcc70ffdOwen Anderson
108001dbfebcbbded8c8e74b19e838b50da2b6c6fb5Owen Anderson  LLVMContextImpl();
109001dbfebcbbded8c8e74b19e838b50da2b6c6fb5Owen Anderson  LLVMContextImpl(const LLVMContextImpl&);
110001dbfebcbbded8c8e74b19e838b50da2b6c6fb5Owen Andersonpublic:
111f53c371983908f02678b0e12c5d18466dcc70ffdOwen Anderson  LLVMContextImpl(LLVMContext &C) : Context(C), TheTrueVal(0), TheFalseVal(0) {}
112001dbfebcbbded8c8e74b19e838b50da2b6c6fb5Owen Anderson
113001dbfebcbbded8c8e74b19e838b50da2b6c6fb5Owen Anderson  /// Return a ConstantInt with the specified value and an implied Type. The
114001dbfebcbbded8c8e74b19e838b50da2b6c6fb5Owen Anderson  /// type is the integer type that corresponds to the bit width of the value.
115914e50c841bbc248ab94144c11813b5785b1292dOwen Anderson  ConstantInt *getConstantInt(const APInt &V);
116914e50c841bbc248ab94144c11813b5785b1292dOwen Anderson
117914e50c841bbc248ab94144c11813b5785b1292dOwen Anderson  ConstantFP *getConstantFP(const APFloat &V);
118aad3fb7362aff151e97ad457005ea3f2872fe868Owen Anderson
119aad3fb7362aff151e97ad457005ea3f2872fe868Owen Anderson  MDString *getMDString(const char *StrBegin, const char *StrEnd);
120aad3fb7362aff151e97ad457005ea3f2872fe868Owen Anderson
121ce032b483ca96093b84f69178cdb2d047e124332Owen Anderson  MDNode *getMDNode(Value*const* Vals, unsigned NumVals);
122aad3fb7362aff151e97ad457005ea3f2872fe868Owen Anderson
123f53c371983908f02678b0e12c5d18466dcc70ffdOwen Anderson  ConstantInt *getConstantIntTrue() {
124f53c371983908f02678b0e12c5d18466dcc70ffdOwen Anderson    if (TheTrueVal)
125f53c371983908f02678b0e12c5d18466dcc70ffdOwen Anderson      return TheTrueVal;
126f53c371983908f02678b0e12c5d18466dcc70ffdOwen Anderson    else
127f53c371983908f02678b0e12c5d18466dcc70ffdOwen Anderson      return (TheTrueVal = Context.getConstantInt(IntegerType::get(1), 1));
128f53c371983908f02678b0e12c5d18466dcc70ffdOwen Anderson  }
129f53c371983908f02678b0e12c5d18466dcc70ffdOwen Anderson
130f53c371983908f02678b0e12c5d18466dcc70ffdOwen Anderson  ConstantInt *getConstantIntFalse() {
131f53c371983908f02678b0e12c5d18466dcc70ffdOwen Anderson    if (TheFalseVal)
132f53c371983908f02678b0e12c5d18466dcc70ffdOwen Anderson      return TheFalseVal;
133f53c371983908f02678b0e12c5d18466dcc70ffdOwen Anderson    else
134f53c371983908f02678b0e12c5d18466dcc70ffdOwen Anderson      return (TheFalseVal = Context.getConstantInt(IntegerType::get(1), 0));
135f53c371983908f02678b0e12c5d18466dcc70ffdOwen Anderson  }
136f53c371983908f02678b0e12c5d18466dcc70ffdOwen Anderson
137aad3fb7362aff151e97ad457005ea3f2872fe868Owen Anderson  void erase(MDString *M);
138ce032b483ca96093b84f69178cdb2d047e124332Owen Anderson  void erase(MDNode *M);
1392bc29dc0bcb3c1441477a062e4a5cffff175c8caOwen Anderson};
1402bc29dc0bcb3c1441477a062e4a5cffff175c8caOwen Anderson
1412bc29dc0bcb3c1441477a062e4a5cffff175c8caOwen Anderson}
1422bc29dc0bcb3c1441477a062e4a5cffff175c8caOwen Anderson
1435217007006e91fa4bbfe88fde5149f5db293b247Owen Anderson#endif
144