diff options
-rw-r--r-- | include/llvm/ADT/ilist_node.h | 4 | ||||
-rw-r--r-- | include/llvm/BasicBlock.h | 11 | ||||
-rw-r--r-- | lib/VMCore/BasicBlock.cpp | 34 |
3 files changed, 12 insertions, 37 deletions
diff --git a/include/llvm/ADT/ilist_node.h b/include/llvm/ADT/ilist_node.h index d68f3f2..86d5a50 100644 --- a/include/llvm/ADT/ilist_node.h +++ b/include/llvm/ADT/ilist_node.h @@ -20,6 +20,9 @@ namespace llvm { template<typename NodeTy> struct ilist_nextprev_traits; +template<typename NodeTy> +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<NodeTy>; }; } // End llvm namespace diff --git a/include/llvm/BasicBlock.h b/include/llvm/BasicBlock.h index 780aca5..29caa0a 100644 --- a/include/llvm/BasicBlock.h +++ b/include/llvm/BasicBlock.h @@ -26,11 +26,15 @@ class TerminatorInst; template<> struct ilist_traits<Instruction> : public SymbolTableListTraits<Instruction, BasicBlock> { // 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<Instruction*>(static_cast<const Instruction*>(&Sentinel)); + } + static void destroySentinel(Instruction *I) { } static iplist<Instruction> &getList(BasicBlock *BB); static ValueSymbolTable *getSymTab(BasicBlock *ItemParent); static int getListOffset(); +private: + ilist_node<Instruction> Sentinel; }; /// This represents a single basic block in LLVM. A basic block is simply a @@ -49,9 +53,10 @@ template<> struct ilist_traits<Instruction> /// @brief LLVM Basic Block Representation class BasicBlock : public Value, // Basic blocks are data objects also public ilist_node<BasicBlock> { + public: typedef iplist<Instruction> InstListType; -private : +private: InstListType InstList; Function *Parent; diff --git a/lib/VMCore/BasicBlock.cpp b/lib/VMCore/BasicBlock.cpp index a76f659..66ee99d 100644 --- a/lib/VMCore/BasicBlock.cpp +++ b/lib/VMCore/BasicBlock.cpp @@ -31,40 +31,6 @@ ilist_traits<Instruction>::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<Instruction>(V) && classof(cast<Instruction>(V)); - } - }; -} - -Instruction *ilist_traits<Instruction>::createSentinel() { - return new DummyInst(); -} iplist<Instruction> &ilist_traits<Instruction>::getList(BasicBlock *BB) { return BB->getInstList(); } |