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