83
|
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>
|
|
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
|
95
|
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
|
83
|
42 template <class T, class StoreT>
|
|
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
|