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