LLVM  3.7.0
MetadataTracking.cpp
Go to the documentation of this file.
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 
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 
54  return ReplaceableMetadataImpl::get(const_cast<Metadata &>(MD));
55 }
This file contains the declarations for metadata subclasses.
Shared implementation of use-lists for replaceable metadata.
Definition: Metadata.h:204
static bool track(Metadata *&MD)
Track the reference to metadata.
Value wrapper in the Metadata hierarchy.
Definition: Metadata.h:252
static bool retrack(Metadata *&MD, Metadata *&New)
Move tracking from one reference to another.
static void untrack(Metadata *&MD)
Stop tracking a reference to metadata.
LLVM_ATTRIBUTE_UNUSED_RESULT std::enable_if< !is_simple_type< Y >::value, typename cast_retty< X, const Y >::ret_type >::type dyn_cast(const Y &Val)
Definition: Casting.h:285
#define N
static bool isReplaceable(const Metadata &MD)
Check whether metadata is replaceable.
Root of the metadata hierarchy.
Definition: Metadata.h:45