• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 //===- MetadataImpl.h - Helpers for implementing metadata -----------------===//
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 has private helpers for implementing metadata types.
11 //
12 //===----------------------------------------------------------------------===//
13 
14 #ifndef LLVM_IR_METADATAIMPL_H
15 #define LLVM_IR_METADATAIMPL_H
16 
17 #include "llvm/ADT/DenseSet.h"
18 #include "llvm/IR/Metadata.h"
19 
20 namespace llvm {
21 
22 template <class T, class InfoT>
getUniqued(DenseSet<T *,InfoT> & Store,const typename InfoT::KeyTy & Key)23 static T *getUniqued(DenseSet<T *, InfoT> &Store,
24                      const typename InfoT::KeyTy &Key) {
25   auto I = Store.find_as(Key);
26   return I == Store.end() ? nullptr : *I;
27 }
28 
storeImpl(T * N,StorageType Storage)29 template <class T> T *MDNode::storeImpl(T *N, StorageType Storage) {
30   switch (Storage) {
31   case Uniqued:
32     llvm_unreachable("Cannot unique without a uniquing-store");
33   case Distinct:
34     N->storeDistinctInContext();
35     break;
36   case Temporary:
37     break;
38   }
39   return N;
40 }
41 
42 template <class T, class StoreT>
storeImpl(T * N,StorageType Storage,StoreT & Store)43 T *MDNode::storeImpl(T *N, StorageType Storage, StoreT &Store) {
44   switch (Storage) {
45   case Uniqued:
46     Store.insert(N);
47     break;
48   case Distinct:
49     N->storeDistinctInContext();
50     break;
51   case Temporary:
52     break;
53   }
54   return N;
55 }
56 
57 } // end namespace llvm
58 
59 #endif
60