diff --git a/include/llvm/ADT/ilist_node.h b/include/llvm/ADT/ilist_node.h index d68f3f23618..86d5a500f89 100644 --- a/include/llvm/ADT/ilist_node.h +++ b/include/llvm/ADT/ilist_node.h @@ -20,6 +20,9 @@ namespace llvm { template struct ilist_nextprev_traits; +template +struct ilist_traits; + /// ilist_node - Base class that provides next/prev services for nodes /// that use ilist_nextprev_traits or ilist_default_traits. /// @@ -36,6 +39,7 @@ private: void setNext(NodeTy *N) { Next = N; } protected: ilist_node() : Prev(0), Next(0) {} + friend struct ilist_traits; }; } // End llvm namespace diff --git a/include/llvm/BasicBlock.h b/include/llvm/BasicBlock.h index 780aca5ef6d..29caa0ab192 100644 --- a/include/llvm/BasicBlock.h +++ b/include/llvm/BasicBlock.h @@ -26,11 +26,15 @@ class TerminatorInst; template<> struct ilist_traits : public SymbolTableListTraits { // createSentinel is used to create a node that marks the end of the list... - static Instruction *createSentinel(); - static void destroySentinel(Instruction *I) { delete I; } + Instruction *createSentinel() const { + return const_cast(static_cast(&Sentinel)); + } + static void destroySentinel(Instruction *I) { } static iplist &getList(BasicBlock *BB); static ValueSymbolTable *getSymTab(BasicBlock *ItemParent); static int getListOffset(); +private: + ilist_node Sentinel; }; /// This represents a single basic block in LLVM. A basic block is simply a @@ -49,9 +53,10 @@ template<> struct ilist_traits /// @brief LLVM Basic Block Representation class BasicBlock : public Value, // Basic blocks are data objects also public ilist_node { + public: typedef iplist InstListType; -private : +private: InstListType InstList; Function *Parent; diff --git a/lib/VMCore/BasicBlock.cpp b/lib/VMCore/BasicBlock.cpp index a76f659233d..66ee99d1745 100644 --- a/lib/VMCore/BasicBlock.cpp +++ b/lib/VMCore/BasicBlock.cpp @@ -31,40 +31,6 @@ ilist_traits::getSymTab(BasicBlock *BB) { return 0; } - -namespace { - /// DummyInst - An instance of this class is used to mark the end of the - /// instruction list. This is not a real instruction. - struct VISIBILITY_HIDDEN DummyInst : public Instruction { - // allocate space for exactly zero operands - void *operator new(size_t s) { - return User::operator new(s, 0); - } - DummyInst() : Instruction(Type::VoidTy, OtherOpsEnd, 0, 0) { - // This should not be garbage monitored. - LeakDetector::removeGarbageObject(this); - } - - Instruction *clone() const { - assert(0 && "Cannot clone EOL");abort(); - return 0; - } - const char *getOpcodeName() const { return "*end-of-list-inst*"; } - - // Methods for support type inquiry through isa, cast, and dyn_cast... - static inline bool classof(const DummyInst *) { return true; } - static inline bool classof(const Instruction *I) { - return I->getOpcode() == OtherOpsEnd; - } - static inline bool classof(const Value *V) { - return isa(V) && classof(cast(V)); - } - }; -} - -Instruction *ilist_traits::createSentinel() { - return new DummyInst(); -} iplist &ilist_traits::getList(BasicBlock *BB) { return BB->getInstList(); }