LLVMContextImpl.cpp revision 288943
1169689Skan//===-- LLVMContextImpl.cpp - Implement LLVMContextImpl -------------------===// 2169689Skan// 3169689Skan// The LLVM Compiler Infrastructure 4169689Skan// 5169689Skan// This file is distributed under the University of Illinois Open Source 6169689Skan// License. See LICENSE.TXT for details. 7169689Skan// 8169689Skan//===----------------------------------------------------------------------===// 9169689Skan// 10169689Skan// This file implements the opaque LLVMContextImpl. 11169689Skan// 12169689Skan//===----------------------------------------------------------------------===// 13169689Skan 14169689Skan#include "LLVMContextImpl.h" 15169689Skan#include "llvm/ADT/STLExtras.h" 16169689Skan#include "llvm/IR/Attributes.h" 17169689Skan#include "llvm/IR/DiagnosticInfo.h" 18169689Skan#include "llvm/IR/Module.h" 19169689Skan#include <algorithm> 20169689Skanusing namespace llvm; 21169689Skan 22169689SkanLLVMContextImpl::LLVMContextImpl(LLVMContext &C) 23169689Skan : TheTrueVal(nullptr), TheFalseVal(nullptr), 24169689Skan VoidTy(C, Type::VoidTyID), 25169689Skan LabelTy(C, Type::LabelTyID), 26169689Skan HalfTy(C, Type::HalfTyID), 27169689Skan FloatTy(C, Type::FloatTyID), 28169689Skan DoubleTy(C, Type::DoubleTyID), 29169689Skan MetadataTy(C, Type::MetadataTyID), 30169689Skan X86_FP80Ty(C, Type::X86_FP80TyID), 31169689Skan FP128Ty(C, Type::FP128TyID), 32169689Skan PPC_FP128Ty(C, Type::PPC_FP128TyID), 33169689Skan X86_MMXTy(C, Type::X86_MMXTyID), 34169689Skan Int1Ty(C, 1), 35169689Skan Int8Ty(C, 8), 36169689Skan Int16Ty(C, 16), 37169689Skan Int32Ty(C, 32), 38169689Skan Int64Ty(C, 64), 39169689Skan Int128Ty(C, 128) { 40169689Skan InlineAsmDiagHandler = nullptr; 41169689Skan InlineAsmDiagContext = nullptr; 42169689Skan DiagnosticHandler = nullptr; 43169689Skan DiagnosticContext = nullptr; 44169689Skan RespectDiagnosticFilters = false; 45169689Skan YieldCallback = nullptr; 46169689Skan YieldOpaqueHandle = nullptr; 47169689Skan NamedStructTypesUniqueID = 0; 48169689Skan} 49169689Skan 50169689Skannamespace { 51169689Skanstruct DropReferences { 52169689Skan // Takes the value_type of a ConstantUniqueMap's internal map, whose 'second' 53169689Skan // is a Constant*. 54169689Skan template <typename PairT> void operator()(const PairT &P) { 55169689Skan P.second->dropAllReferences(); 56169689Skan } 57169689Skan}; 58169689Skan 59169689Skan// Temporary - drops pair.first instead of second. 60169689Skanstruct DropFirst { 61169689Skan // Takes the value_type of a ConstantUniqueMap's internal map, whose 'second' 62169689Skan // is a Constant*. 63169689Skan template<typename PairT> 64169689Skan void operator()(const PairT &P) { 65169689Skan P.first->dropAllReferences(); 66169689Skan } 67169689Skan}; 68169689Skan} 69169689Skan 70169689SkanLLVMContextImpl::~LLVMContextImpl() { 71169689Skan // NOTE: We need to delete the contents of OwnedModules, but Module's dtor 72169689Skan // will call LLVMContextImpl::removeModule, thus invalidating iterators into 73169689Skan // the container. Avoid iterators during this operation: 74169689Skan while (!OwnedModules.empty()) 75169689Skan delete *OwnedModules.begin(); 76169689Skan 77169689Skan // Drop references for MDNodes. Do this before Values get deleted to avoid 78169689Skan // unnecessary RAUW when nodes are still unresolved. 79169689Skan for (auto *I : DistinctMDNodes) 80169689Skan I->dropAllReferences(); 81169689Skan#define HANDLE_MDNODE_LEAF(CLASS) \ 82169689Skan for (auto *I : CLASS##s) \ 83169689Skan I->dropAllReferences(); 84169689Skan#include "llvm/IR/Metadata.def" 85169689Skan 86169689Skan // Also drop references that come from the Value bridges. 87169689Skan for (auto &Pair : ValuesAsMetadata) 88169689Skan Pair.second->dropUsers(); 89169689Skan for (auto &Pair : MetadataAsValues) 90169689Skan Pair.second->dropUse(); 91169689Skan 92169689Skan // Destroy MDNodes. 93169689Skan for (MDNode *I : DistinctMDNodes) 94169689Skan I->deleteAsSubclass(); 95169689Skan#define HANDLE_MDNODE_LEAF(CLASS) \ 96169689Skan for (CLASS *I : CLASS##s) \ 97169689Skan delete I; 98169689Skan#include "llvm/IR/Metadata.def" 99169689Skan 100169689Skan // Free the constants. 101169689Skan std::for_each(ExprConstants.map_begin(), ExprConstants.map_end(), 102169689Skan DropFirst()); 103169689Skan std::for_each(ArrayConstants.map_begin(), ArrayConstants.map_end(), 104169689Skan DropFirst()); 105169689Skan std::for_each(StructConstants.map_begin(), StructConstants.map_end(), 106169689Skan DropFirst()); 107169689Skan std::for_each(VectorConstants.map_begin(), VectorConstants.map_end(), 108169689Skan DropFirst()); 109169689Skan ExprConstants.freeConstants(); 110169689Skan ArrayConstants.freeConstants(); 111169689Skan StructConstants.freeConstants(); 112169689Skan VectorConstants.freeConstants(); 113169689Skan DeleteContainerSeconds(CAZConstants); 114169689Skan DeleteContainerSeconds(CPNConstants); 115169689Skan DeleteContainerSeconds(UVConstants); 116169689Skan InlineAsms.freeConstants(); 117169689Skan DeleteContainerSeconds(IntConstants); 118169689Skan DeleteContainerSeconds(FPConstants); 119169689Skan 120169689Skan for (StringMap<ConstantDataSequential*>::iterator I = CDSConstants.begin(), 121169689Skan E = CDSConstants.end(); I != E; ++I) 122169689Skan delete I->second; 123169689Skan CDSConstants.clear(); 124169689Skan 125169689Skan // Destroy attributes. 126169689Skan for (FoldingSetIterator<AttributeImpl> I = AttrsSet.begin(), 127169689Skan E = AttrsSet.end(); I != E; ) { 128169689Skan FoldingSetIterator<AttributeImpl> Elem = I++; 129169689Skan delete &*Elem; 130169689Skan } 131169689Skan 132169689Skan // Destroy attribute lists. 133169689Skan for (FoldingSetIterator<AttributeSetImpl> I = AttrsLists.begin(), 134169689Skan E = AttrsLists.end(); I != E; ) { 135169689Skan FoldingSetIterator<AttributeSetImpl> Elem = I++; 136169689Skan delete &*Elem; 137169689Skan } 138169689Skan 139169689Skan // Destroy attribute node lists. 140169689Skan for (FoldingSetIterator<AttributeSetNode> I = AttrsSetNodes.begin(), 141169689Skan E = AttrsSetNodes.end(); I != E; ) { 142169689Skan FoldingSetIterator<AttributeSetNode> Elem = I++; 143169689Skan delete &*Elem; 144169689Skan } 145169689Skan 146169689Skan // Destroy MetadataAsValues. 147169689Skan { 148169689Skan SmallVector<MetadataAsValue *, 8> MDVs; 149169689Skan MDVs.reserve(MetadataAsValues.size()); 150169689Skan for (auto &Pair : MetadataAsValues) 151169689Skan MDVs.push_back(Pair.second); 152169689Skan MetadataAsValues.clear(); 153169689Skan for (auto *V : MDVs) 154169689Skan delete V; 155169689Skan } 156169689Skan 157169689Skan // Destroy ValuesAsMetadata. 158169689Skan for (auto &Pair : ValuesAsMetadata) 159169689Skan delete Pair.second; 160169689Skan 161169689Skan // Destroy MDStrings. 162169689Skan MDStringCache.clear(); 163169689Skan} 164169689Skan 165169689Skanvoid LLVMContextImpl::dropTriviallyDeadConstantArrays() { 166169689Skan bool Changed; 167169689Skan do { 168169689Skan Changed = false; 169169689Skan 170169689Skan for (auto I = ArrayConstants.map_begin(), E = ArrayConstants.map_end(); 171169689Skan I != E; ) { 172169689Skan auto *C = I->first; 173169689Skan I++; 174169689Skan if (C->use_empty()) { 175169689Skan Changed = true; 176169689Skan C->destroyConstant(); 177169689Skan } 178169689Skan } 179169689Skan 180169689Skan } while (Changed); 181169689Skan} 182169689Skan 183169689Skanvoid Module::dropTriviallyDeadConstantArrays() { 184169689Skan Context.pImpl->dropTriviallyDeadConstantArrays(); 185169689Skan} 186169689Skan 187169689Skannamespace llvm { 188169689Skan/// \brief Make MDOperand transparent for hashing. 189169689Skan/// 190169689Skan/// This overload of an implementation detail of the hashing library makes 191169689Skan/// MDOperand hash to the same value as a \a Metadata pointer. 192169689Skan/// 193169689Skan/// Note that overloading \a hash_value() as follows: 194169689Skan/// 195169689Skan/// \code 196169689Skan/// size_t hash_value(const MDOperand &X) { return hash_value(X.get()); } 197169689Skan/// \endcode 198169689Skan/// 199169689Skan/// does not cause MDOperand to be transparent. In particular, a bare pointer 200169689Skan/// doesn't get hashed before it's combined, whereas \a MDOperand would. 201169689Skanstatic const Metadata *get_hashable_data(const MDOperand &X) { return X.get(); } 202169689Skan} 203169689Skan 204169689Skanunsigned MDNodeOpsKey::calculateHash(MDNode *N, unsigned Offset) { 205169689Skan unsigned Hash = hash_combine_range(N->op_begin() + Offset, N->op_end()); 206169689Skan#ifndef NDEBUG 207169689Skan { 208169689Skan SmallVector<Metadata *, 8> MDs(N->op_begin() + Offset, N->op_end()); 209169689Skan unsigned RawHash = calculateHash(MDs); 210169689Skan assert(Hash == RawHash && 211169689Skan "Expected hash of MDOperand to equal hash of Metadata*"); 212169689Skan } 213169689Skan#endif 214169689Skan return Hash; 215169689Skan} 216169689Skan 217169689Skanunsigned MDNodeOpsKey::calculateHash(ArrayRef<Metadata *> Ops) { 218169689Skan return hash_combine_range(Ops.begin(), Ops.end()); 219169689Skan} 220169689Skan 221169689Skan// ConstantsContext anchors 222169689Skanvoid UnaryConstantExpr::anchor() { } 223169689Skan 224169689Skanvoid BinaryConstantExpr::anchor() { } 225169689Skan 226169689Skanvoid SelectConstantExpr::anchor() { } 227169689Skan 228169689Skanvoid ExtractElementConstantExpr::anchor() { } 229169689Skan 230169689Skanvoid InsertElementConstantExpr::anchor() { } 231169689Skan 232169689Skanvoid ShuffleVectorConstantExpr::anchor() { } 233169689Skan 234169689Skanvoid ExtractValueConstantExpr::anchor() { } 235169689Skan 236169689Skanvoid InsertValueConstantExpr::anchor() { } 237169689Skan 238169689Skanvoid GetElementPtrConstantExpr::anchor() { } 239169689Skan 240169689Skanvoid CompareConstantExpr::anchor() { } 241169689Skan 242169689Skan