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