LLVMContextImpl.cpp revision d04a8d4b33ff316ca4cf961e06c9e312eff8e64f
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" 162c79ecbd704c656178ffa43d5a58ebe3ca188b40Bill Wendling#include "llvm/Attributes.h" 1730268be89df6444f5ffb585439b3fbfec9055197Owen Anderson#include "llvm/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) { 3842a4ee0a35b4672311c1b988bd883167de9f88cdChris Lattner InlineAsmDiagHandler = 0; 3942a4ee0a35b4672311c1b988bd883167de9f88cdChris Lattner 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. 992c79ecbd704c656178ffa43d5a58ebe3ca188b40Bill Wendling for (FoldingSetIterator<AttributesImpl> I = AttrsSet.begin(), 1000976e00fd1cbf4128daeb72efd8957d00383fda9Bill Wendling E = AttrsSet.end(); I != E; ) { 101fd8d62c0b449b9070dc18355ac243c7fa78d40d6Benjamin Kramer FoldingSetIterator<AttributesImpl> Elem = I++; 102fd8d62c0b449b9070dc18355ac243c7fa78d40d6Benjamin Kramer delete &*Elem; 103fd8d62c0b449b9070dc18355ac243c7fa78d40d6Benjamin Kramer } 104fd8d62c0b449b9070dc18355ac243c7fa78d40d6Benjamin Kramer 1050976e00fd1cbf4128daeb72efd8957d00383fda9Bill Wendling // Destroy attribute lists. 1060976e00fd1cbf4128daeb72efd8957d00383fda9Bill Wendling for (FoldingSetIterator<AttributeListImpl> I = AttrsLists.begin(), 1070976e00fd1cbf4128daeb72efd8957d00383fda9Bill Wendling E = AttrsLists.end(); I != E; ) { 1080976e00fd1cbf4128daeb72efd8957d00383fda9Bill Wendling FoldingSetIterator<AttributeListImpl> Elem = I++; 1090976e00fd1cbf4128daeb72efd8957d00383fda9Bill Wendling delete &*Elem; 1100976e00fd1cbf4128daeb72efd8957d00383fda9Bill Wendling } 1110976e00fd1cbf4128daeb72efd8957d00383fda9Bill Wendling 1122f1efd639c8659582d0df2b8f927a018b057037fJeffrey Yasskin // Destroy MDNodes. ~MDNode can move and remove nodes between the MDNodeSet 1132f1efd639c8659582d0df2b8f927a018b057037fJeffrey Yasskin // and the NonUniquedMDNodes sets, so copy the values out first. 1142f1efd639c8659582d0df2b8f927a018b057037fJeffrey Yasskin SmallVector<MDNode*, 8> MDNodes; 1152f1efd639c8659582d0df2b8f927a018b057037fJeffrey Yasskin MDNodes.reserve(MDNodeSet.size() + NonUniquedMDNodes.size()); 1162f1efd639c8659582d0df2b8f927a018b057037fJeffrey Yasskin for (FoldingSetIterator<MDNode> I = MDNodeSet.begin(), E = MDNodeSet.end(); 117c09ef37171b2a6c914ce34928a4ff4a839b21dbeChris Lattner I != E; ++I) 1182f1efd639c8659582d0df2b8f927a018b057037fJeffrey Yasskin MDNodes.push_back(&*I); 1192f1efd639c8659582d0df2b8f927a018b057037fJeffrey Yasskin MDNodes.append(NonUniquedMDNodes.begin(), NonUniquedMDNodes.end()); 1209b0e47efc607f6dcfca34e033d56e4655a7bb893Dan Gohman for (SmallVectorImpl<MDNode *>::iterator I = MDNodes.begin(), 121c09ef37171b2a6c914ce34928a4ff4a839b21dbeChris Lattner E = MDNodes.end(); I != E; ++I) 1222f1efd639c8659582d0df2b8f927a018b057037fJeffrey Yasskin (*I)->destroy(); 1232f1efd639c8659582d0df2b8f927a018b057037fJeffrey Yasskin assert(MDNodeSet.empty() && NonUniquedMDNodes.empty() && 1242f1efd639c8659582d0df2b8f927a018b057037fJeffrey Yasskin "Destroying all MDNodes didn't empty the Context's sets."); 1252c79ecbd704c656178ffa43d5a58ebe3ca188b40Bill Wendling 1262f1efd639c8659582d0df2b8f927a018b057037fJeffrey Yasskin // Destroy MDStrings. 1271852e217019507c6329ee3af227dc05c6e517878Nick Lewycky DeleteContainerSeconds(MDStringCache); 1282f1efd639c8659582d0df2b8f927a018b057037fJeffrey Yasskin} 1292d24e2a396a1d211baaeedf32148a3b657240170David Blaikie 1302d24e2a396a1d211baaeedf32148a3b657240170David Blaikie// ConstantsContext anchors 1312d24e2a396a1d211baaeedf32148a3b657240170David Blaikievoid UnaryConstantExpr::anchor() { } 1322d24e2a396a1d211baaeedf32148a3b657240170David Blaikie 1332d24e2a396a1d211baaeedf32148a3b657240170David Blaikievoid BinaryConstantExpr::anchor() { } 1342d24e2a396a1d211baaeedf32148a3b657240170David Blaikie 1352d24e2a396a1d211baaeedf32148a3b657240170David Blaikievoid SelectConstantExpr::anchor() { } 1362d24e2a396a1d211baaeedf32148a3b657240170David Blaikie 1372d24e2a396a1d211baaeedf32148a3b657240170David Blaikievoid ExtractElementConstantExpr::anchor() { } 1382d24e2a396a1d211baaeedf32148a3b657240170David Blaikie 1392d24e2a396a1d211baaeedf32148a3b657240170David Blaikievoid InsertElementConstantExpr::anchor() { } 1402d24e2a396a1d211baaeedf32148a3b657240170David Blaikie 1412d24e2a396a1d211baaeedf32148a3b657240170David Blaikievoid ShuffleVectorConstantExpr::anchor() { } 1422d24e2a396a1d211baaeedf32148a3b657240170David Blaikie 1432d24e2a396a1d211baaeedf32148a3b657240170David Blaikievoid ExtractValueConstantExpr::anchor() { } 1442d24e2a396a1d211baaeedf32148a3b657240170David Blaikie 1452d24e2a396a1d211baaeedf32148a3b657240170David Blaikievoid InsertValueConstantExpr::anchor() { } 1462d24e2a396a1d211baaeedf32148a3b657240170David Blaikie 1472d24e2a396a1d211baaeedf32148a3b657240170David Blaikievoid GetElementPtrConstantExpr::anchor() { } 1482d24e2a396a1d211baaeedf32148a3b657240170David Blaikie 1492d24e2a396a1d211baaeedf32148a3b657240170David Blaikievoid CompareConstantExpr::anchor() { } 150