Mercurial > hg > CbC > CbC_llvm
view lib/IR/MetadataTracking.cpp @ 92:8a1cd0ffee6e
Create prototype declaration automatically if prototype was not found when parsing continuation arguments.
author | Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp> |
---|---|
date | Fri, 17 Apr 2015 13:54:34 +0900 |
parents | 60c9769439b8 |
children |
line wrap: on
line source
//===- MetadataTracking.cpp - Implement metadata tracking -----------------===// // // The LLVM Compiler Infrastructure // // This file is distributed under the University of Illinois Open Source // License. See LICENSE.TXT for details. // //===----------------------------------------------------------------------===// // // This file implements Metadata tracking. // //===----------------------------------------------------------------------===// #include "llvm/IR/MetadataTracking.h" #include "llvm/IR/Metadata.h" using namespace llvm; ReplaceableMetadataImpl *ReplaceableMetadataImpl::get(Metadata &MD) { if (auto *N = dyn_cast<MDNode>(&MD)) return N->Context.getReplaceableUses(); return dyn_cast<ValueAsMetadata>(&MD); } bool MetadataTracking::track(void *Ref, Metadata &MD, OwnerTy Owner) { assert(Ref && "Expected live reference"); assert((Owner || *static_cast<Metadata **>(Ref) == &MD) && "Reference without owner must be direct"); if (auto *R = ReplaceableMetadataImpl::get(MD)) { R->addRef(Ref, Owner); return true; } return false; } void MetadataTracking::untrack(void *Ref, Metadata &MD) { assert(Ref && "Expected live reference"); if (auto *R = ReplaceableMetadataImpl::get(MD)) R->dropRef(Ref); } bool MetadataTracking::retrack(void *Ref, Metadata &MD, void *New) { assert(Ref && "Expected live reference"); assert(New && "Expected live reference"); assert(Ref != New && "Expected change"); if (auto *R = ReplaceableMetadataImpl::get(MD)) { R->moveRef(Ref, New, MD); return true; } return false; } bool MetadataTracking::isReplaceable(const Metadata &MD) { return ReplaceableMetadataImpl::get(const_cast<Metadata &>(MD)); }