1//===- MetadataImpl.h - Helpers for implementing metadata -----------------===// 2// 3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4// See https://llvm.org/LICENSE.txt for license information. 5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6// 7//===----------------------------------------------------------------------===// 8// 9// This file has private helpers for implementing metadata types. 10// 11//===----------------------------------------------------------------------===// 12 13#ifndef LLVM_IR_METADATAIMPL_H 14#define LLVM_IR_METADATAIMPL_H 15 16#include "llvm/ADT/DenseSet.h" 17#include "llvm/IR/Metadata.h" 18 19namespace llvm { 20 21template <class T, class InfoT> 22static T *getUniqued(DenseSet<T *, InfoT> &Store, 23 const typename InfoT::KeyTy &Key) { 24 auto I = Store.find_as(Key); 25 return I == Store.end() ? nullptr : *I; 26} 27 28template <class T> T *MDNode::storeImpl(T *N, StorageType Storage) { 29 switch (Storage) { 30 case Uniqued: 31 llvm_unreachable("Cannot unique without a uniquing-store"); 32 case Distinct: 33 N->storeDistinctInContext(); 34 break; 35 case Temporary: 36 break; 37 } 38 return N; 39} 40 41template <class T, class StoreT> 42T *MDNode::storeImpl(T *N, StorageType Storage, StoreT &Store) { 43 switch (Storage) { 44 case Uniqued: 45 Store.insert(N); 46 break; 47 case Distinct: 48 N->storeDistinctInContext(); 49 break; 50 case Temporary: 51 break; 52 } 53 return N; 54} 55 56} // end namespace llvm 57 58#endif 59