LCOV - code coverage report
Current view: top level - lib/IR - LLVMContextImpl.cpp (source / functions) Hit Total Coverage
Test: llvm-toolchain.info Lines: 92 93 98.9 %
Date: 2018-10-20 13:21:21 Functions: 13 13 100.0 %
Legend: Lines: hit not hit

          Line data    Source code
       1             : //===- LLVMContextImpl.cpp - Implement LLVMContextImpl --------------------===//
       2             : //
       3             : //                     The LLVM Compiler Infrastructure
       4             : //
       5             : // This file is distributed under the University of Illinois Open Source
       6             : // License. See LICENSE.TXT for details.
       7             : //
       8             : //===----------------------------------------------------------------------===//
       9             : //
      10             : //  This file implements the opaque LLVMContextImpl.
      11             : //
      12             : //===----------------------------------------------------------------------===//
      13             : 
      14             : #include "LLVMContextImpl.h"
      15             : #include "llvm/IR/Module.h"
      16             : #include "llvm/IR/OptBisect.h"
      17             : #include "llvm/IR/Type.h"
      18             : #include "llvm/Support/ManagedStatic.h"
      19             : #include <cassert>
      20             : #include <utility>
      21             : 
      22             : using namespace llvm;
      23             : 
      24       89820 : LLVMContextImpl::LLVMContextImpl(LLVMContext &C)
      25             :   : DiagHandler(llvm::make_unique<DiagnosticHandler>()),
      26             :     VoidTy(C, Type::VoidTyID),
      27             :     LabelTy(C, Type::LabelTyID),
      28             :     HalfTy(C, Type::HalfTyID),
      29             :     FloatTy(C, Type::FloatTyID),
      30             :     DoubleTy(C, Type::DoubleTyID),
      31             :     MetadataTy(C, Type::MetadataTyID),
      32             :     TokenTy(C, Type::TokenTyID),
      33             :     X86_FP80Ty(C, Type::X86_FP80TyID),
      34             :     FP128Ty(C, Type::FP128TyID),
      35             :     PPC_FP128Ty(C, Type::PPC_FP128TyID),
      36             :     X86_MMXTy(C, Type::X86_MMXTyID),
      37             :     Int1Ty(C, 1),
      38             :     Int8Ty(C, 8),
      39             :     Int16Ty(C, 16),
      40             :     Int32Ty(C, 32),
      41             :     Int64Ty(C, 64),
      42      628740 :     Int128Ty(C, 128) {}
      43             : 
      44      745020 : LLVMContextImpl::~LLVMContextImpl() {
      45             :   // NOTE: We need to delete the contents of OwnedModules, but Module's dtor
      46             :   // will call LLVMContextImpl::removeModule, thus invalidating iterators into
      47             :   // the container. Avoid iterators during this operation:
      48       82800 :   while (!OwnedModules.empty())
      49          20 :     delete *OwnedModules.begin();
      50             : 
      51             : #ifndef NDEBUG
      52             :   // Check for metadata references from leaked Instructions.
      53             :   for (auto &Pair : InstructionMetadata)
      54             :     Pair.first->dump();
      55             :   assert(InstructionMetadata.empty() &&
      56             :          "Instructions with metadata have been leaked");
      57             : #endif
      58             : 
      59             :   // Drop references for MDNodes.  Do this before Values get deleted to avoid
      60             :   // unnecessary RAUW when nodes are still unresolved.
      61      116564 :   for (auto *I : DistinctMDNodes)
      62       33784 :     I->dropAllReferences();
      63             : #define HANDLE_MDNODE_LEAF_UNIQUABLE(CLASS)                                    \
      64             :   for (auto *I : CLASS##s)                                                     \
      65             :     I->dropAllReferences();
      66             : #include "llvm/IR/Metadata.def"
      67             : 
      68             :   // Also drop references that come from the Value bridges.
      69      150065 :   for (auto &Pair : ValuesAsMetadata)
      70       67285 :     Pair.second->dropUsers();
      71       94861 :   for (auto &Pair : MetadataAsValues)
      72       12081 :     Pair.second->dropUse();
      73             : 
      74             :   // Destroy MDNodes.
      75      116564 :   for (MDNode *I : DistinctMDNodes)
      76       33784 :     I->deleteAsSubclass();
      77             : #define HANDLE_MDNODE_LEAF_UNIQUABLE(CLASS)                                    \
      78             :   for (CLASS * I : CLASS##s)                                                   \
      79             :     delete I;
      80             : #include "llvm/IR/Metadata.def"
      81             : 
      82             :   // Free the constants.
      83       86999 :   for (auto *I : ExprConstants)
      84        4220 :     I->dropAllReferences();
      85       83235 :   for (auto *I : ArrayConstants)
      86         455 :     I->dropAllReferences();
      87       85190 :   for (auto *I : StructConstants)
      88        2410 :     I->dropAllReferences();
      89       97172 :   for (auto *I : VectorConstants)
      90       14392 :     I->dropAllReferences();
      91       82780 :   ExprConstants.freeConstants();
      92       82780 :   ArrayConstants.freeConstants();
      93       82780 :   StructConstants.freeConstants();
      94       82780 :   VectorConstants.freeConstants();
      95       82780 :   InlineAsms.freeConstants();
      96             : 
      97       82780 :   CAZConstants.clear();
      98       82780 :   CPNConstants.clear();
      99       82780 :   UVConstants.clear();
     100       82780 :   IntConstants.clear();
     101       82780 :   FPConstants.clear();
     102             : 
     103      237491 :   for (auto &CDSConstant : CDSConstants)
     104       71931 :     delete CDSConstant.second;
     105       82780 :   CDSConstants.clear();
     106             : 
     107             :   // Destroy attributes.
     108       82780 :   for (FoldingSetIterator<AttributeImpl> I = AttrsSet.begin(),
     109      420626 :          E = AttrsSet.end(); I != E; ) {
     110             :     FoldingSetIterator<AttributeImpl> Elem = I++;
     111      255065 :     delete &*Elem;
     112             :   }
     113             : 
     114             :   // Destroy attribute lists.
     115      318289 :   for (FoldingSetIterator<AttributeListImpl> I = AttrsLists.begin(),
     116       82780 :                                              E = AttrsLists.end();
     117      318289 :        I != E;) {
     118             :     FoldingSetIterator<AttributeListImpl> Elem = I++;
     119             :     delete &*Elem;
     120             :   }
     121             : 
     122             :   // Destroy attribute node lists.
     123      257312 :   for (FoldingSetIterator<AttributeSetNode> I = AttrsSetNodes.begin(),
     124      340092 :          E = AttrsSetNodes.end(); I != E; ) {
     125             :     FoldingSetIterator<AttributeSetNode> Elem = I++;
     126             :     delete &*Elem;
     127             :   }
     128             : 
     129             :   // Destroy MetadataAsValues.
     130             :   {
     131             :     SmallVector<MetadataAsValue *, 8> MDVs;
     132       82780 :     MDVs.reserve(MetadataAsValues.size());
     133       94861 :     for (auto &Pair : MetadataAsValues)
     134       12081 :       MDVs.push_back(Pair.second);
     135       82780 :     MetadataAsValues.clear();
     136       94861 :     for (auto *V : MDVs)
     137       12081 :       delete V;
     138             :   }
     139             : 
     140             :   // Destroy ValuesAsMetadata.
     141       82780 :   for (auto &Pair : ValuesAsMetadata)
     142           0 :     delete Pair.second;
     143       82780 : }
     144             : 
     145        1099 : void LLVMContextImpl::dropTriviallyDeadConstantArrays() {
     146             :   bool Changed;
     147        1111 :   do {
     148             :     Changed = false;
     149             : 
     150        1323 :     for (auto I = ArrayConstants.begin(), E = ArrayConstants.end(); I != E;) {
     151         212 :       auto *C = *I++;
     152         212 :       if (C->use_empty()) {
     153             :         Changed = true;
     154          12 :         C->destroyConstant();
     155             :       }
     156             :     }
     157             :   } while (Changed);
     158        1099 : }
     159             : 
     160        1099 : void Module::dropTriviallyDeadConstantArrays() {
     161        1099 :   Context.pImpl->dropTriviallyDeadConstantArrays();
     162        1099 : }
     163             : 
     164             : namespace llvm {
     165             : 
     166             : /// Make MDOperand transparent for hashing.
     167             : ///
     168             : /// This overload of an implementation detail of the hashing library makes
     169             : /// MDOperand hash to the same value as a \a Metadata pointer.
     170             : ///
     171             : /// Note that overloading \a hash_value() as follows:
     172             : ///
     173             : /// \code
     174             : ///     size_t hash_value(const MDOperand &X) { return hash_value(X.get()); }
     175             : /// \endcode
     176             : ///
     177             : /// does not cause MDOperand to be transparent.  In particular, a bare pointer
     178             : /// doesn't get hashed before it's combined, whereas \a MDOperand would.
     179    37082248 : static const Metadata *get_hashable_data(const MDOperand &X) { return X.get(); }
     180             : 
     181             : } // end namespace llvm
     182             : 
     183       27098 : unsigned MDNodeOpsKey::calculateHash(MDNode *N, unsigned Offset) {
     184       27098 :   unsigned Hash = hash_combine_range(N->op_begin() + Offset, N->op_end());
     185             : #ifndef NDEBUG
     186             :   {
     187             :     SmallVector<Metadata *, 8> MDs(N->op_begin() + Offset, N->op_end());
     188             :     unsigned RawHash = calculateHash(MDs);
     189             :     assert(Hash == RawHash &&
     190             :            "Expected hash of MDOperand to equal hash of Metadata*");
     191             :   }
     192             : #endif
     193       27098 :   return Hash;
     194             : }
     195             : 
     196      960731 : unsigned MDNodeOpsKey::calculateHash(ArrayRef<Metadata *> Ops) {
     197      960731 :   return hash_combine_range(Ops.begin(), Ops.end());
     198             : }
     199             : 
     200      271508 : StringMapEntry<uint32_t> *LLVMContextImpl::getOrInsertBundleTag(StringRef Tag) {
     201      271508 :   uint32_t NewIdx = BundleTagCache.size();
     202      271508 :   return &*(BundleTagCache.insert(std::make_pair(Tag, NewIdx)).first);
     203             : }
     204             : 
     205        4708 : void LLVMContextImpl::getOperandBundleTags(SmallVectorImpl<StringRef> &Tags) const {
     206        4708 :   Tags.resize(BundleTagCache.size());
     207       23548 :   for (const auto &T : BundleTagCache)
     208       28264 :     Tags[T.second] = T.first();
     209        4708 : }
     210             : 
     211          70 : uint32_t LLVMContextImpl::getOperandBundleTagID(StringRef Tag) const {
     212          70 :   auto I = BundleTagCache.find(Tag);
     213             :   assert(I != BundleTagCache.end() && "Unknown tag!");
     214          70 :   return I->second;
     215             : }
     216             : 
     217      200088 : SyncScope::ID LLVMContextImpl::getOrInsertSyncScopeID(StringRef SSN) {
     218      200088 :   auto NewSSID = SSC.size();
     219             :   assert(NewSSID < std::numeric_limits<SyncScope::ID>::max() &&
     220             :          "Hit the maximum number of synchronization scopes allowed!");
     221      200088 :   return SSC.insert(std::make_pair(SSN, SyncScope::ID(NewSSID))).first->second;
     222             : }
     223             : 
     224        4831 : void LLVMContextImpl::getSyncScopeNames(
     225             :     SmallVectorImpl<StringRef> &SSNs) const {
     226        4831 :   SSNs.resize(SSC.size());
     227       19633 :   for (const auto &SSE : SSC)
     228       19942 :     SSNs[SSE.second] = SSE.first();
     229        4831 : }
     230             : 
     231             : /// Singleton instance of the OptBisect class.
     232             : ///
     233             : /// This singleton is accessed via the LLVMContext::getOptPassGate() function.
     234             : /// It provides a mechanism to disable passes and individual optimizations at
     235             : /// compile time based on a command line option (-opt-bisect-limit) in order to
     236             : /// perform a bisecting search for optimization-related problems.
     237             : ///
     238             : /// Even if multiple LLVMContext objects are created, they will all return the
     239             : /// same instance of OptBisect in order to provide a single bisect count.  Any
     240             : /// code that uses the OptBisect object should be serialized when bisection is
     241             : /// enabled in order to enable a consistent bisect count.
     242             : static ManagedStatic<OptBisect> OptBisector;
     243             : 
     244     9579779 : OptPassGate &LLVMContextImpl::getOptPassGate() const {
     245     9579779 :   if (!OPG)
     246       33721 :     OPG = &(*OptBisector);
     247     9579779 :   return *OPG;
     248             : }
     249             : 
     250           2 : void LLVMContextImpl::setOptPassGate(OptPassGate& OPG) {
     251           2 :   this->OPG = &OPG;
     252           2 : }

Generated by: LCOV version 1.13