LLVMContextImpl.h revision aad3fb7362aff151e97ad457005ea3f2872fe868
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
18001dbfebcbbded8c8e74b19e838b50da2b6c6fb5Owen Anderson#include "llvm/System/RWMutex.h"
19914e50c841bbc248ab94144c11813b5785b1292dOwen Anderson#include "llvm/ADT/APFloat.h"
20001dbfebcbbded8c8e74b19e838b50da2b6c6fb5Owen Anderson#include "llvm/ADT/APInt.h"
21001dbfebcbbded8c8e74b19e838b50da2b6c6fb5Owen Anderson#include "llvm/ADT/DenseMap.h"
22aad3fb7362aff151e97ad457005ea3f2872fe868Owen Anderson#include "llvm/ADT/StringMap.h"
23001dbfebcbbded8c8e74b19e838b50da2b6c6fb5Owen Anderson
242bc29dc0bcb3c1441477a062e4a5cffff175c8caOwen Andersonnamespace llvm {
252bc29dc0bcb3c1441477a062e4a5cffff175c8caOwen Anderson
26001dbfebcbbded8c8e74b19e838b50da2b6c6fb5Owen Andersonclass ConstantInt;
27914e50c841bbc248ab94144c11813b5785b1292dOwen Andersonclass ConstantFP;
28aad3fb7362aff151e97ad457005ea3f2872fe868Owen Andersonclass MDString;
29001dbfebcbbded8c8e74b19e838b50da2b6c6fb5Owen Andersonclass LLVMContext;
30001dbfebcbbded8c8e74b19e838b50da2b6c6fb5Owen Andersonclass Type;
31001dbfebcbbded8c8e74b19e838b50da2b6c6fb5Owen Anderson
32001dbfebcbbded8c8e74b19e838b50da2b6c6fb5Owen Andersonstruct DenseMapAPIntKeyInfo {
33001dbfebcbbded8c8e74b19e838b50da2b6c6fb5Owen Anderson  struct KeyTy {
34001dbfebcbbded8c8e74b19e838b50da2b6c6fb5Owen Anderson    APInt val;
35001dbfebcbbded8c8e74b19e838b50da2b6c6fb5Owen Anderson    const Type* type;
36001dbfebcbbded8c8e74b19e838b50da2b6c6fb5Owen Anderson    KeyTy(const APInt& V, const Type* Ty) : val(V), type(Ty) {}
37001dbfebcbbded8c8e74b19e838b50da2b6c6fb5Owen Anderson    KeyTy(const KeyTy& that) : val(that.val), type(that.type) {}
38001dbfebcbbded8c8e74b19e838b50da2b6c6fb5Owen Anderson    bool operator==(const KeyTy& that) const {
39001dbfebcbbded8c8e74b19e838b50da2b6c6fb5Owen Anderson      return type == that.type && this->val == that.val;
40001dbfebcbbded8c8e74b19e838b50da2b6c6fb5Owen Anderson    }
41001dbfebcbbded8c8e74b19e838b50da2b6c6fb5Owen Anderson    bool operator!=(const KeyTy& that) const {
42001dbfebcbbded8c8e74b19e838b50da2b6c6fb5Owen Anderson      return !this->operator==(that);
43001dbfebcbbded8c8e74b19e838b50da2b6c6fb5Owen Anderson    }
44001dbfebcbbded8c8e74b19e838b50da2b6c6fb5Owen Anderson  };
45001dbfebcbbded8c8e74b19e838b50da2b6c6fb5Owen Anderson  static inline KeyTy getEmptyKey() { return KeyTy(APInt(1,0), 0); }
46001dbfebcbbded8c8e74b19e838b50da2b6c6fb5Owen Anderson  static inline KeyTy getTombstoneKey() { return KeyTy(APInt(1,1), 0); }
47001dbfebcbbded8c8e74b19e838b50da2b6c6fb5Owen Anderson  static unsigned getHashValue(const KeyTy &Key) {
48001dbfebcbbded8c8e74b19e838b50da2b6c6fb5Owen Anderson    return DenseMapInfo<void*>::getHashValue(Key.type) ^
49001dbfebcbbded8c8e74b19e838b50da2b6c6fb5Owen Anderson      Key.val.getHashValue();
50001dbfebcbbded8c8e74b19e838b50da2b6c6fb5Owen Anderson  }
51001dbfebcbbded8c8e74b19e838b50da2b6c6fb5Owen Anderson  static bool isEqual(const KeyTy &LHS, const KeyTy &RHS) {
52001dbfebcbbded8c8e74b19e838b50da2b6c6fb5Owen Anderson    return LHS == RHS;
53001dbfebcbbded8c8e74b19e838b50da2b6c6fb5Owen Anderson  }
54001dbfebcbbded8c8e74b19e838b50da2b6c6fb5Owen Anderson  static bool isPod() { return false; }
55001dbfebcbbded8c8e74b19e838b50da2b6c6fb5Owen Anderson};
56001dbfebcbbded8c8e74b19e838b50da2b6c6fb5Owen Anderson
57914e50c841bbc248ab94144c11813b5785b1292dOwen Andersonstruct DenseMapAPFloatKeyInfo {
58914e50c841bbc248ab94144c11813b5785b1292dOwen Anderson  struct KeyTy {
59914e50c841bbc248ab94144c11813b5785b1292dOwen Anderson    APFloat val;
60914e50c841bbc248ab94144c11813b5785b1292dOwen Anderson    KeyTy(const APFloat& V) : val(V){}
61914e50c841bbc248ab94144c11813b5785b1292dOwen Anderson    KeyTy(const KeyTy& that) : val(that.val) {}
62914e50c841bbc248ab94144c11813b5785b1292dOwen Anderson    bool operator==(const KeyTy& that) const {
63914e50c841bbc248ab94144c11813b5785b1292dOwen Anderson      return this->val.bitwiseIsEqual(that.val);
64914e50c841bbc248ab94144c11813b5785b1292dOwen Anderson    }
65914e50c841bbc248ab94144c11813b5785b1292dOwen Anderson    bool operator!=(const KeyTy& that) const {
66914e50c841bbc248ab94144c11813b5785b1292dOwen Anderson      return !this->operator==(that);
67914e50c841bbc248ab94144c11813b5785b1292dOwen Anderson    }
68914e50c841bbc248ab94144c11813b5785b1292dOwen Anderson  };
69914e50c841bbc248ab94144c11813b5785b1292dOwen Anderson  static inline KeyTy getEmptyKey() {
70914e50c841bbc248ab94144c11813b5785b1292dOwen Anderson    return KeyTy(APFloat(APFloat::Bogus,1));
71914e50c841bbc248ab94144c11813b5785b1292dOwen Anderson  }
72914e50c841bbc248ab94144c11813b5785b1292dOwen Anderson  static inline KeyTy getTombstoneKey() {
73914e50c841bbc248ab94144c11813b5785b1292dOwen Anderson    return KeyTy(APFloat(APFloat::Bogus,2));
74914e50c841bbc248ab94144c11813b5785b1292dOwen Anderson  }
75914e50c841bbc248ab94144c11813b5785b1292dOwen Anderson  static unsigned getHashValue(const KeyTy &Key) {
76914e50c841bbc248ab94144c11813b5785b1292dOwen Anderson    return Key.val.getHashValue();
77914e50c841bbc248ab94144c11813b5785b1292dOwen Anderson  }
78914e50c841bbc248ab94144c11813b5785b1292dOwen Anderson  static bool isEqual(const KeyTy &LHS, const KeyTy &RHS) {
79914e50c841bbc248ab94144c11813b5785b1292dOwen Anderson    return LHS == RHS;
80914e50c841bbc248ab94144c11813b5785b1292dOwen Anderson  }
81914e50c841bbc248ab94144c11813b5785b1292dOwen Anderson  static bool isPod() { return false; }
82914e50c841bbc248ab94144c11813b5785b1292dOwen Anderson};
83914e50c841bbc248ab94144c11813b5785b1292dOwen Anderson
84001dbfebcbbded8c8e74b19e838b50da2b6c6fb5Owen Andersonclass LLVMContextImpl {
85001dbfebcbbded8c8e74b19e838b50da2b6c6fb5Owen Anderson  sys::SmartRWMutex<true> ConstantsLock;
86001dbfebcbbded8c8e74b19e838b50da2b6c6fb5Owen Anderson
87001dbfebcbbded8c8e74b19e838b50da2b6c6fb5Owen Anderson  typedef DenseMap<DenseMapAPIntKeyInfo::KeyTy, ConstantInt*,
88001dbfebcbbded8c8e74b19e838b50da2b6c6fb5Owen Anderson                   DenseMapAPIntKeyInfo> IntMapTy;
89001dbfebcbbded8c8e74b19e838b50da2b6c6fb5Owen Anderson  IntMapTy IntConstants;
90001dbfebcbbded8c8e74b19e838b50da2b6c6fb5Owen Anderson
91914e50c841bbc248ab94144c11813b5785b1292dOwen Anderson  typedef DenseMap<DenseMapAPFloatKeyInfo::KeyTy, ConstantFP*,
92914e50c841bbc248ab94144c11813b5785b1292dOwen Anderson                   DenseMapAPFloatKeyInfo> FPMapTy;
93914e50c841bbc248ab94144c11813b5785b1292dOwen Anderson  FPMapTy FPConstants;
94914e50c841bbc248ab94144c11813b5785b1292dOwen Anderson
95aad3fb7362aff151e97ad457005ea3f2872fe868Owen Anderson  StringMap<MDString*> MDStringCache;
96aad3fb7362aff151e97ad457005ea3f2872fe868Owen Anderson
97001dbfebcbbded8c8e74b19e838b50da2b6c6fb5Owen Anderson  LLVMContext &Context;
98001dbfebcbbded8c8e74b19e838b50da2b6c6fb5Owen Anderson  LLVMContextImpl();
99001dbfebcbbded8c8e74b19e838b50da2b6c6fb5Owen Anderson  LLVMContextImpl(const LLVMContextImpl&);
100001dbfebcbbded8c8e74b19e838b50da2b6c6fb5Owen Andersonpublic:
101001dbfebcbbded8c8e74b19e838b50da2b6c6fb5Owen Anderson  LLVMContextImpl(LLVMContext &C) : Context(C) { }
102001dbfebcbbded8c8e74b19e838b50da2b6c6fb5Owen Anderson
103001dbfebcbbded8c8e74b19e838b50da2b6c6fb5Owen Anderson  /// Return a ConstantInt with the specified value and an implied Type. The
104001dbfebcbbded8c8e74b19e838b50da2b6c6fb5Owen Anderson  /// type is the integer type that corresponds to the bit width of the value.
105914e50c841bbc248ab94144c11813b5785b1292dOwen Anderson  ConstantInt *getConstantInt(const APInt &V);
106914e50c841bbc248ab94144c11813b5785b1292dOwen Anderson
107914e50c841bbc248ab94144c11813b5785b1292dOwen Anderson  ConstantFP *getConstantFP(const APFloat &V);
108aad3fb7362aff151e97ad457005ea3f2872fe868Owen Anderson
109aad3fb7362aff151e97ad457005ea3f2872fe868Owen Anderson  MDString *getMDString(const char *StrBegin, const char *StrEnd);
110aad3fb7362aff151e97ad457005ea3f2872fe868Owen Anderson
111aad3fb7362aff151e97ad457005ea3f2872fe868Owen Anderson
112aad3fb7362aff151e97ad457005ea3f2872fe868Owen Anderson  void erase(MDString *M);
1132bc29dc0bcb3c1441477a062e4a5cffff175c8caOwen Anderson};
1142bc29dc0bcb3c1441477a062e4a5cffff175c8caOwen Anderson
1152bc29dc0bcb3c1441477a062e4a5cffff175c8caOwen Anderson}
1162bc29dc0bcb3c1441477a062e4a5cffff175c8caOwen Anderson
1175217007006e91fa4bbfe88fde5149f5db293b247Owen Anderson#endif
118