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 19 namespace llvm { 20 21 template <class T, class InfoT> 22 static 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 28 template <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 41 template <class T, class StoreT> 42 T *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