Home | History | Annotate | Download | only in IR
      1 //===- MetadataTracking.cpp - Implement metadata tracking -----------------===//
      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 Metadata tracking.
     11 //
     12 //===----------------------------------------------------------------------===//
     13 
     14 #include "llvm/IR/MetadataTracking.h"
     15 #include "llvm/IR/Metadata.h"
     16 
     17 using namespace llvm;
     18 
     19 ReplaceableMetadataImpl *ReplaceableMetadataImpl::get(Metadata &MD) {
     20   if (auto *N = dyn_cast<MDNode>(&MD))
     21     return N->Context.getReplaceableUses();
     22   return dyn_cast<ValueAsMetadata>(&MD);
     23 }
     24 
     25 bool MetadataTracking::track(void *Ref, Metadata &MD, OwnerTy Owner) {
     26   assert(Ref && "Expected live reference");
     27   assert((Owner || *static_cast<Metadata **>(Ref) == &MD) &&
     28          "Reference without owner must be direct");
     29   if (auto *R = ReplaceableMetadataImpl::get(MD)) {
     30     R->addRef(Ref, Owner);
     31     return true;
     32   }
     33   return false;
     34 }
     35 
     36 void MetadataTracking::untrack(void *Ref, Metadata &MD) {
     37   assert(Ref && "Expected live reference");
     38   if (auto *R = ReplaceableMetadataImpl::get(MD))
     39     R->dropRef(Ref);
     40 }
     41 
     42 bool MetadataTracking::retrack(void *Ref, Metadata &MD, void *New) {
     43   assert(Ref && "Expected live reference");
     44   assert(New && "Expected live reference");
     45   assert(Ref != New && "Expected change");
     46   if (auto *R = ReplaceableMetadataImpl::get(MD)) {
     47     R->moveRef(Ref, New, MD);
     48     return true;
     49   }
     50   return false;
     51 }
     52 
     53 bool MetadataTracking::isReplaceable(const Metadata &MD) {
     54   return ReplaceableMetadataImpl::get(const_cast<Metadata &>(MD));
     55 }
     56