• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 //===- GCFactoryListTraits.h ----------------------------------------------===//
2 //
3 //                     The MCLinker Project
4 //
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
7 //
8 //===----------------------------------------------------------------------===//
9 #ifndef MCLD_GC_FACTORY_LIST_TRAITS_H
10 #define MCLD_GC_FACTORY_LIST_TRAITS_H
11 #ifdef ENABLE_UNITTEST
12 #include <gtest.h>
13 #endif
14 
15 #include <llvm/ADT/ilist_node.h>
16 #include <llvm/ADT/ilist.h>
17 
18 #include <assert.h>
19 
20 namespace mcld {
21 
22 /** \class GCFactoryListTraits
23  *  \brief GCFactoryListTraits provides trait class for llvm::iplist when
24  *  the nodes in the list is produced by GCFactory.
25  */
26 template<typename DataType>
27 class GCFactoryListTraits : public llvm::ilist_default_traits<DataType>
28 {
29 private:
30   class SentinelNode : public DataType
31   {
32   public:
SentinelNode()33     SentinelNode() { }
34   };
35 
36 public:
37   // override the traits provided in llvm::ilist_sentinel_traits since we've
38   // defined our own sentinel.
createSentinel()39   DataType *createSentinel() const
40   { return reinterpret_cast<DataType*>(&mSentinel); }
41 
destroySentinel(DataType *)42   static void destroySentinel(DataType*) { }
43 
provideInitialHead()44   DataType *provideInitialHead() const
45   { return createSentinel(); }
46 
ensureHead(DataType *)47   DataType *ensureHead(DataType*) const
48   { return createSentinel(); }
49 
noteHead(DataType *,DataType *)50   static void noteHead(DataType*, DataType*) { }
51 
52   // override the traits provided in llvm::ilist_node_traits since
createNode(const DataType & V)53   static DataType *createNode(const DataType &V) {
54     assert(false && "Only GCFactory knows how to create a node.");
55   }
deleteNode(DataType * V)56   static void deleteNode(DataType *V) {
57     // No action. GCFactory will handle it by itself.
58   }
59 
60 private:
61   mutable SentinelNode mSentinel;
62 };
63 
64 } // namespace of mcld
65 
66 #endif
67