12f1efd639c8659582d0df2b8f927a018b057037fJeffrey Yasskin//===-- LLVMContextImpl.cpp - Implement LLVMContextImpl -------------------===//
22f1efd639c8659582d0df2b8f927a018b057037fJeffrey Yasskin//
32f1efd639c8659582d0df2b8f927a018b057037fJeffrey Yasskin//                     The LLVM Compiler Infrastructure
42f1efd639c8659582d0df2b8f927a018b057037fJeffrey Yasskin//
52f1efd639c8659582d0df2b8f927a018b057037fJeffrey Yasskin// This file is distributed under the University of Illinois Open Source
62f1efd639c8659582d0df2b8f927a018b057037fJeffrey Yasskin// License. See LICENSE.TXT for details.
72f1efd639c8659582d0df2b8f927a018b057037fJeffrey Yasskin//
82f1efd639c8659582d0df2b8f927a018b057037fJeffrey Yasskin//===----------------------------------------------------------------------===//
92f1efd639c8659582d0df2b8f927a018b057037fJeffrey Yasskin//
102f1efd639c8659582d0df2b8f927a018b057037fJeffrey Yasskin//  This file implements the opaque LLVMContextImpl.
112f1efd639c8659582d0df2b8f927a018b057037fJeffrey Yasskin//
122f1efd639c8659582d0df2b8f927a018b057037fJeffrey Yasskin//===----------------------------------------------------------------------===//
132f1efd639c8659582d0df2b8f927a018b057037fJeffrey Yasskin
142f1efd639c8659582d0df2b8f927a018b057037fJeffrey Yasskin#include "LLVMContextImpl.h"
15d04a8d4b33ff316ca4cf961e06c9e312eff8e64fChandler Carruth#include "llvm/ADT/STLExtras.h"
160b8c9a80f20772c3793201ab5b251d3520b9cea3Chandler Carruth#include "llvm/IR/Attributes.h"
170b8c9a80f20772c3793201ab5b251d3520b9cea3Chandler Carruth#include "llvm/IR/Module.h"
18c1dc0679706f7538cd17169b920967c54661e5b6Jeffrey Yasskin#include <algorithm>
19b35798347ea87b8b6d36155b211016a7769f01abDan Gohmanusing namespace llvm;
202f1efd639c8659582d0df2b8f927a018b057037fJeffrey Yasskin
212f1efd639c8659582d0df2b8f927a018b057037fJeffrey YasskinLLVMContextImpl::LLVMContextImpl(LLVMContext &C)
222f1efd639c8659582d0df2b8f927a018b057037fJeffrey Yasskin  : TheTrueVal(0), TheFalseVal(0),
232f1efd639c8659582d0df2b8f927a018b057037fJeffrey Yasskin    VoidTy(C, Type::VoidTyID),
242f1efd639c8659582d0df2b8f927a018b057037fJeffrey Yasskin    LabelTy(C, Type::LabelTyID),
25ce16339930a2b03e53b4e6399ef59c092a7f2cfaDan Gohman    HalfTy(C, Type::HalfTyID),
262f1efd639c8659582d0df2b8f927a018b057037fJeffrey Yasskin    FloatTy(C, Type::FloatTyID),
272f1efd639c8659582d0df2b8f927a018b057037fJeffrey Yasskin    DoubleTy(C, Type::DoubleTyID),
282f1efd639c8659582d0df2b8f927a018b057037fJeffrey Yasskin    MetadataTy(C, Type::MetadataTyID),
292f1efd639c8659582d0df2b8f927a018b057037fJeffrey Yasskin    X86_FP80Ty(C, Type::X86_FP80TyID),
302f1efd639c8659582d0df2b8f927a018b057037fJeffrey Yasskin    FP128Ty(C, Type::FP128TyID),
312f1efd639c8659582d0df2b8f927a018b057037fJeffrey Yasskin    PPC_FP128Ty(C, Type::PPC_FP128TyID),
32bb811a244567aa8a1522203f15588f4d001b7353Dale Johannesen    X86_MMXTy(C, Type::X86_MMXTyID),
332f1efd639c8659582d0df2b8f927a018b057037fJeffrey Yasskin    Int1Ty(C, 1),
342f1efd639c8659582d0df2b8f927a018b057037fJeffrey Yasskin    Int8Ty(C, 8),
352f1efd639c8659582d0df2b8f927a018b057037fJeffrey Yasskin    Int16Ty(C, 16),
362f1efd639c8659582d0df2b8f927a018b057037fJeffrey Yasskin    Int32Ty(C, 32),
371afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner    Int64Ty(C, 64) {
38f64c889cc94417322b0ff8ad1c61939183bf3c38Bob Wilson  InlineAsmDiagHandler = 0;
39f64c889cc94417322b0ff8ad1c61939183bf3c38Bob Wilson  InlineAsmDiagContext = 0;
401afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner  NamedStructTypesUniqueID = 0;
412f1efd639c8659582d0df2b8f927a018b057037fJeffrey Yasskin}
422f1efd639c8659582d0df2b8f927a018b057037fJeffrey Yasskin
43c1dc0679706f7538cd17169b920967c54661e5b6Jeffrey Yasskinnamespace {
44c1dc0679706f7538cd17169b920967c54661e5b6Jeffrey Yasskinstruct DropReferences {
45c1dc0679706f7538cd17169b920967c54661e5b6Jeffrey Yasskin  // Takes the value_type of a ConstantUniqueMap's internal map, whose 'second'
46c1dc0679706f7538cd17169b920967c54661e5b6Jeffrey Yasskin  // is a Constant*.
47c1dc0679706f7538cd17169b920967c54661e5b6Jeffrey Yasskin  template<typename PairT>
48c1dc0679706f7538cd17169b920967c54661e5b6Jeffrey Yasskin  void operator()(const PairT &P) {
49c1dc0679706f7538cd17169b920967c54661e5b6Jeffrey Yasskin    P.second->dropAllReferences();
50c1dc0679706f7538cd17169b920967c54661e5b6Jeffrey Yasskin  }
51c1dc0679706f7538cd17169b920967c54661e5b6Jeffrey Yasskin};
522cb395eae71dacda49ca3fe758618fc3e0701659Talin
532cb395eae71dacda49ca3fe758618fc3e0701659Talin// Temporary - drops pair.first instead of second.
542cb395eae71dacda49ca3fe758618fc3e0701659Talinstruct DropFirst {
552cb395eae71dacda49ca3fe758618fc3e0701659Talin  // Takes the value_type of a ConstantUniqueMap's internal map, whose 'second'
562cb395eae71dacda49ca3fe758618fc3e0701659Talin  // is a Constant*.
572cb395eae71dacda49ca3fe758618fc3e0701659Talin  template<typename PairT>
582cb395eae71dacda49ca3fe758618fc3e0701659Talin  void operator()(const PairT &P) {
592cb395eae71dacda49ca3fe758618fc3e0701659Talin    P.first->dropAllReferences();
602cb395eae71dacda49ca3fe758618fc3e0701659Talin  }
612cb395eae71dacda49ca3fe758618fc3e0701659Talin};
62c1dc0679706f7538cd17169b920967c54661e5b6Jeffrey Yasskin}
63c1dc0679706f7538cd17169b920967c54661e5b6Jeffrey Yasskin
642f1efd639c8659582d0df2b8f927a018b057037fJeffrey YasskinLLVMContextImpl::~LLVMContextImpl() {
6530268be89df6444f5ffb585439b3fbfec9055197Owen Anderson  // NOTE: We need to delete the contents of OwnedModules, but we have to
6630268be89df6444f5ffb585439b3fbfec9055197Owen Anderson  // duplicate it into a temporary vector, because the destructor of Module
6730268be89df6444f5ffb585439b3fbfec9055197Owen Anderson  // will try to remove itself from OwnedModules set.  This would cause
6830268be89df6444f5ffb585439b3fbfec9055197Owen Anderson  // iterator invalidation if we iterated on the set directly.
6930268be89df6444f5ffb585439b3fbfec9055197Owen Anderson  std::vector<Module*> Modules(OwnedModules.begin(), OwnedModules.end());
701852e217019507c6329ee3af227dc05c6e517878Nick Lewycky  DeleteContainerPointers(Modules);
7130268be89df6444f5ffb585439b3fbfec9055197Owen Anderson
729df0fb4e8176325d713ba4eb67791e36cb833432Chris Lattner  // Free the constants.  This is important to do here to ensure that they are
739df0fb4e8176325d713ba4eb67791e36cb833432Chris Lattner  // freed before the LeakDetector is torn down.
74c1dc0679706f7538cd17169b920967c54661e5b6Jeffrey Yasskin  std::for_each(ExprConstants.map_begin(), ExprConstants.map_end(),
75c1dc0679706f7538cd17169b920967c54661e5b6Jeffrey Yasskin                DropReferences());
76c1dc0679706f7538cd17169b920967c54661e5b6Jeffrey Yasskin  std::for_each(ArrayConstants.map_begin(), ArrayConstants.map_end(),
772cb395eae71dacda49ca3fe758618fc3e0701659Talin                DropFirst());
78c1dc0679706f7538cd17169b920967c54661e5b6Jeffrey Yasskin  std::for_each(StructConstants.map_begin(), StructConstants.map_end(),
792cb395eae71dacda49ca3fe758618fc3e0701659Talin                DropFirst());
80c1dc0679706f7538cd17169b920967c54661e5b6Jeffrey Yasskin  std::for_each(VectorConstants.map_begin(), VectorConstants.map_end(),
812cb395eae71dacda49ca3fe758618fc3e0701659Talin                DropFirst());
822f1efd639c8659582d0df2b8f927a018b057037fJeffrey Yasskin  ExprConstants.freeConstants();
832f1efd639c8659582d0df2b8f927a018b057037fJeffrey Yasskin  ArrayConstants.freeConstants();
842f1efd639c8659582d0df2b8f927a018b057037fJeffrey Yasskin  StructConstants.freeConstants();
852f1efd639c8659582d0df2b8f927a018b057037fJeffrey Yasskin  VectorConstants.freeConstants();
869df0fb4e8176325d713ba4eb67791e36cb833432Chris Lattner  DeleteContainerSeconds(CAZConstants);
879df0fb4e8176325d713ba4eb67791e36cb833432Chris Lattner  DeleteContainerSeconds(CPNConstants);
889df0fb4e8176325d713ba4eb67791e36cb833432Chris Lattner  DeleteContainerSeconds(UVConstants);
892f1efd639c8659582d0df2b8f927a018b057037fJeffrey Yasskin  InlineAsms.freeConstants();
901852e217019507c6329ee3af227dc05c6e517878Nick Lewycky  DeleteContainerSeconds(IntConstants);
911852e217019507c6329ee3af227dc05c6e517878Nick Lewycky  DeleteContainerSeconds(FPConstants);
921afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner
9327dd9cf5d1ec831a1cd0766580e6d1177a9800a3Chris Lattner  for (StringMap<ConstantDataSequential*>::iterator I = CDSConstants.begin(),
9427dd9cf5d1ec831a1cd0766580e6d1177a9800a3Chris Lattner       E = CDSConstants.end(); I != E; ++I)
9527dd9cf5d1ec831a1cd0766580e6d1177a9800a3Chris Lattner    delete I->second;
9627dd9cf5d1ec831a1cd0766580e6d1177a9800a3Chris Lattner  CDSConstants.clear();
972c79ecbd704c656178ffa43d5a58ebe3ca188b40Bill Wendling
982c79ecbd704c656178ffa43d5a58ebe3ca188b40Bill Wendling  // Destroy attributes.
99f6670729aabc1fab85238d2b306a1c1767a807bbBill Wendling  for (FoldingSetIterator<AttributeImpl> I = AttrsSet.begin(),
1000976e00fd1cbf4128daeb72efd8957d00383fda9Bill Wendling         E = AttrsSet.end(); I != E; ) {
101f6670729aabc1fab85238d2b306a1c1767a807bbBill Wendling    FoldingSetIterator<AttributeImpl> Elem = I++;
102fd8d62c0b449b9070dc18355ac243c7fa78d40d6Benjamin Kramer    delete &*Elem;
103fd8d62c0b449b9070dc18355ac243c7fa78d40d6Benjamin Kramer  }
104fd8d62c0b449b9070dc18355ac243c7fa78d40d6Benjamin Kramer
1050976e00fd1cbf4128daeb72efd8957d00383fda9Bill Wendling  // Destroy attribute lists.
10618e7211068c9d2c6204512f9c468ee179818a4b6Bill Wendling  for (FoldingSetIterator<AttributeSetImpl> I = AttrsLists.begin(),
1070976e00fd1cbf4128daeb72efd8957d00383fda9Bill Wendling         E = AttrsLists.end(); I != E; ) {
10818e7211068c9d2c6204512f9c468ee179818a4b6Bill Wendling    FoldingSetIterator<AttributeSetImpl> Elem = I++;
1090976e00fd1cbf4128daeb72efd8957d00383fda9Bill Wendling    delete &*Elem;
1100976e00fd1cbf4128daeb72efd8957d00383fda9Bill Wendling  }
1110976e00fd1cbf4128daeb72efd8957d00383fda9Bill Wendling
1128b1f2f3b7007e1e086c0e20ad4fdea72222c4bafBill Wendling  // Destroy attribute node lists.
1138b1f2f3b7007e1e086c0e20ad4fdea72222c4bafBill Wendling  for (FoldingSetIterator<AttributeSetNode> I = AttrsSetNodes.begin(),
1148b1f2f3b7007e1e086c0e20ad4fdea72222c4bafBill Wendling         E = AttrsSetNodes.end(); I != E; ) {
1158b1f2f3b7007e1e086c0e20ad4fdea72222c4bafBill Wendling    FoldingSetIterator<AttributeSetNode> Elem = I++;
1168b1f2f3b7007e1e086c0e20ad4fdea72222c4bafBill Wendling    delete &*Elem;
1178b1f2f3b7007e1e086c0e20ad4fdea72222c4bafBill Wendling  }
1188b1f2f3b7007e1e086c0e20ad4fdea72222c4bafBill Wendling
1192f1efd639c8659582d0df2b8f927a018b057037fJeffrey Yasskin  // Destroy MDNodes.  ~MDNode can move and remove nodes between the MDNodeSet
1202f1efd639c8659582d0df2b8f927a018b057037fJeffrey Yasskin  // and the NonUniquedMDNodes sets, so copy the values out first.
1212f1efd639c8659582d0df2b8f927a018b057037fJeffrey Yasskin  SmallVector<MDNode*, 8> MDNodes;
1222f1efd639c8659582d0df2b8f927a018b057037fJeffrey Yasskin  MDNodes.reserve(MDNodeSet.size() + NonUniquedMDNodes.size());
1232f1efd639c8659582d0df2b8f927a018b057037fJeffrey Yasskin  for (FoldingSetIterator<MDNode> I = MDNodeSet.begin(), E = MDNodeSet.end();
124c09ef37171b2a6c914ce34928a4ff4a839b21dbeChris Lattner       I != E; ++I)
1252f1efd639c8659582d0df2b8f927a018b057037fJeffrey Yasskin    MDNodes.push_back(&*I);
1262f1efd639c8659582d0df2b8f927a018b057037fJeffrey Yasskin  MDNodes.append(NonUniquedMDNodes.begin(), NonUniquedMDNodes.end());
1279b0e47efc607f6dcfca34e033d56e4655a7bb893Dan Gohman  for (SmallVectorImpl<MDNode *>::iterator I = MDNodes.begin(),
128c09ef37171b2a6c914ce34928a4ff4a839b21dbeChris Lattner         E = MDNodes.end(); I != E; ++I)
1292f1efd639c8659582d0df2b8f927a018b057037fJeffrey Yasskin    (*I)->destroy();
1302f1efd639c8659582d0df2b8f927a018b057037fJeffrey Yasskin  assert(MDNodeSet.empty() && NonUniquedMDNodes.empty() &&
1312f1efd639c8659582d0df2b8f927a018b057037fJeffrey Yasskin         "Destroying all MDNodes didn't empty the Context's sets.");
1322c79ecbd704c656178ffa43d5a58ebe3ca188b40Bill Wendling
1332f1efd639c8659582d0df2b8f927a018b057037fJeffrey Yasskin  // Destroy MDStrings.
1341852e217019507c6329ee3af227dc05c6e517878Nick Lewycky  DeleteContainerSeconds(MDStringCache);
1352f1efd639c8659582d0df2b8f927a018b057037fJeffrey Yasskin}
1362d24e2a396a1d211baaeedf32148a3b657240170David Blaikie
1372d24e2a396a1d211baaeedf32148a3b657240170David Blaikie// ConstantsContext anchors
1382d24e2a396a1d211baaeedf32148a3b657240170David Blaikievoid UnaryConstantExpr::anchor() { }
1392d24e2a396a1d211baaeedf32148a3b657240170David Blaikie
1402d24e2a396a1d211baaeedf32148a3b657240170David Blaikievoid BinaryConstantExpr::anchor() { }
1412d24e2a396a1d211baaeedf32148a3b657240170David Blaikie
1422d24e2a396a1d211baaeedf32148a3b657240170David Blaikievoid SelectConstantExpr::anchor() { }
1432d24e2a396a1d211baaeedf32148a3b657240170David Blaikie
1442d24e2a396a1d211baaeedf32148a3b657240170David Blaikievoid ExtractElementConstantExpr::anchor() { }
1452d24e2a396a1d211baaeedf32148a3b657240170David Blaikie
1462d24e2a396a1d211baaeedf32148a3b657240170David Blaikievoid InsertElementConstantExpr::anchor() { }
1472d24e2a396a1d211baaeedf32148a3b657240170David Blaikie
1482d24e2a396a1d211baaeedf32148a3b657240170David Blaikievoid ShuffleVectorConstantExpr::anchor() { }
1492d24e2a396a1d211baaeedf32148a3b657240170David Blaikie
1502d24e2a396a1d211baaeedf32148a3b657240170David Blaikievoid ExtractValueConstantExpr::anchor() { }
1512d24e2a396a1d211baaeedf32148a3b657240170David Blaikie
1522d24e2a396a1d211baaeedf32148a3b657240170David Blaikievoid InsertValueConstantExpr::anchor() { }
1532d24e2a396a1d211baaeedf32148a3b657240170David Blaikie
1542d24e2a396a1d211baaeedf32148a3b657240170David Blaikievoid GetElementPtrConstantExpr::anchor() { }
1552d24e2a396a1d211baaeedf32148a3b657240170David Blaikie
1562d24e2a396a1d211baaeedf32148a3b657240170David Blaikievoid CompareConstantExpr::anchor() { }
157