Home | History | Annotate | Download | only in IR
      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 
     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>
     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