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