15460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao//===- GCFactoryListTraits.h ----------------------------------------------===//
25460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao//
35460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao//                     The MCLinker Project
45460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao//
55460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao// This file is distributed under the University of Illinois Open Source
65460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao// License. See LICENSE.TXT for details.
75460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao//
85460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao//===----------------------------------------------------------------------===//
937b74a387bb3993387029859c2d9d051c41c724eStephen Hines#ifndef MCLD_SUPPORT_GCFACTORYLISTTRAITS_H_
1037b74a387bb3993387029859c2d9d051c41c724eStephen Hines#define MCLD_SUPPORT_GCFACTORYLISTTRAITS_H_
115460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
125460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao#include <llvm/ADT/ilist.h>
1337b74a387bb3993387029859c2d9d051c41c724eStephen Hines#include <llvm/ADT/ilist_node.h>
145460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
155460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao#include <assert.h>
165460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
17d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liaonamespace mcld {
185460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
195460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao/** \class GCFactoryListTraits
205460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao *  \brief GCFactoryListTraits provides trait class for llvm::iplist when
215460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao *  the nodes in the list is produced by GCFactory.
225460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao */
2337b74a387bb3993387029859c2d9d051c41c724eStephen Hinestemplate <typename DataType>
2437b74a387bb3993387029859c2d9d051c41c724eStephen Hinesclass GCFactoryListTraits : public llvm::ilist_default_traits<DataType> {
2537b74a387bb3993387029859c2d9d051c41c724eStephen Hines private:
2637b74a387bb3993387029859c2d9d051c41c724eStephen Hines  class SentinelNode : public DataType {
2737b74a387bb3993387029859c2d9d051c41c724eStephen Hines   public:
2837b74a387bb3993387029859c2d9d051c41c724eStephen Hines    SentinelNode() {}
295460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  };
305460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
3137b74a387bb3993387029859c2d9d051c41c724eStephen Hines public:
325460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  // override the traits provided in llvm::ilist_sentinel_traits since we've
335460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  // defined our own sentinel.
3437b74a387bb3993387029859c2d9d051c41c724eStephen Hines  DataType* createSentinel() const {
3537b74a387bb3993387029859c2d9d051c41c724eStephen Hines    return reinterpret_cast<DataType*>(&mSentinel);
3637b74a387bb3993387029859c2d9d051c41c724eStephen Hines  }
375460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
3837b74a387bb3993387029859c2d9d051c41c724eStephen Hines  static void destroySentinel(DataType* pData) {}
395460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
4037b74a387bb3993387029859c2d9d051c41c724eStephen Hines  DataType* provideInitialHead() const { return createSentinel(); }
415460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
4237b74a387bb3993387029859c2d9d051c41c724eStephen Hines  DataType* ensureHead(DataType* pData) const { return createSentinel(); }
435460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
4437b74a387bb3993387029859c2d9d051c41c724eStephen Hines  static void noteHead(DataType* pNew, DataType* pSentinel) {}
455460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
465460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  // override the traits provided in llvm::ilist_node_traits since
4737b74a387bb3993387029859c2d9d051c41c724eStephen Hines  static DataType* createNode(const DataType& V) {
485460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao    assert(false && "Only GCFactory knows how to create a node.");
495460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  }
5037b74a387bb3993387029859c2d9d051c41c724eStephen Hines  static void deleteNode(DataType* V) {
515460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao    // No action. GCFactory will handle it by itself.
525460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  }
535460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
5437b74a387bb3993387029859c2d9d051c41c724eStephen Hines private:
555460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  mutable SentinelNode mSentinel;
565460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao};
575460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
5837b74a387bb3993387029859c2d9d051c41c724eStephen Hines}  // namespace mcld
595460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
6037b74a387bb3993387029859c2d9d051c41c724eStephen Hines#endif  // MCLD_SUPPORT_GCFACTORYLISTTRAITS_H_
61