blob: 47f0b9366d7d0db5f3b5a4d23f3826337fad3b1f [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) {
Duncan P. N. Exon Smith2711ca72015-01-19 19:02:06 +000020 if (auto *N = dyn_cast<MDNode>(&MD))
21 return N->Context.getReplaceableUses();
Duncan P. N. Exon Smith5bf8fef2014-12-09 18:38:53 +000022 return dyn_cast<ValueAsMetadata>(&MD);
23}
24
25bool 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
36void 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
42bool 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
53bool MetadataTracking::isReplaceable(const Metadata &MD) {
54 return ReplaceableMetadataImpl::get(const_cast<Metadata &>(MD));
55}