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