blob: 5b4b55586a92ef8d280bba782d4f53c56c170d0b [file] [log] [blame]
Duncan P. N. Exon Smith5bf8fef2014-12-09 18:38:53 +00001//===- 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
17using namespace llvm;
18
19ReplaceableMetadataImpl *ReplaceableMetadataImpl::get(Metadata &MD) {
20 if (auto *N = dyn_cast<MDNode>(&MD)) {
21 if (auto *G = dyn_cast<GenericMDNode>(N))
22 return G->ReplaceableUses.get();
23 return cast<MDNodeFwdDecl>(N);
24 }
25 return dyn_cast<ValueAsMetadata>(&MD);
26}
27
28bool MetadataTracking::track(void *Ref, Metadata &MD, OwnerTy Owner) {
29 assert(Ref && "Expected live reference");
30 assert((Owner || *static_cast<Metadata **>(Ref) == &MD) &&
31 "Reference without owner must be direct");
32 if (auto *R = ReplaceableMetadataImpl::get(MD)) {
33 R->addRef(Ref, Owner);
34 return true;
35 }
36 return false;
37}
38
39void MetadataTracking::untrack(void *Ref, Metadata &MD) {
40 assert(Ref && "Expected live reference");
41 if (auto *R = ReplaceableMetadataImpl::get(MD))
42 R->dropRef(Ref);
43}
44
45bool MetadataTracking::retrack(void *Ref, Metadata &MD, void *New) {
46 assert(Ref && "Expected live reference");
47 assert(New && "Expected live reference");
48 assert(Ref != New && "Expected change");
49 if (auto *R = ReplaceableMetadataImpl::get(MD)) {
50 R->moveRef(Ref, New, MD);
51 return true;
52 }
53 return false;
54}
55
56bool MetadataTracking::isReplaceable(const Metadata &MD) {
57 return ReplaceableMetadataImpl::get(const_cast<Metadata &>(MD));
58}