summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--include/llvm/ADT/ilist_node.h4
-rw-r--r--include/llvm/BasicBlock.h11
-rw-r--r--lib/VMCore/BasicBlock.cpp34
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();
}