Reverting dtor devirtualization patch.
[oota-llvm.git] / include / llvm / InstrTypes.h
index c14b3bbc26fa4ca3780b6adad3a013690dcfd045..a6a8fff40ce9707fdca087ee439378ebca94bbdb 100644 (file)
@@ -38,16 +38,14 @@ protected:
                  Use *Ops, unsigned NumOps, BasicBlock *InsertAtEnd)
     : Instruction(Ty, iType, Ops, NumOps, InsertAtEnd) {}
 
+  // Out of line virtual method, so the vtable, etc has a home.
+  ~TerminatorInst();
+
   /// Virtual methods - Terminators should overload these and provide inline
   /// overrides of non-V methods.
   virtual BasicBlock *getSuccessorV(unsigned idx) const = 0;
   virtual unsigned getNumSuccessorsV() const = 0;
   virtual void setSuccessorV(unsigned idx, BasicBlock *B) = 0;
-
-  static void destroyThis(TerminatorInst* v) {
-    Instruction::destroyThis(v);
-  }
-  friend class Value;
 public:
 
   virtual Instruction *clone() const = 0;
@@ -96,12 +94,10 @@ protected:
   UnaryInstruction(const Type *Ty, unsigned iType, Value *V, BasicBlock *IAE)
     : Instruction(Ty, iType, &Op, 1, IAE), Op(V, this_()) {
   }
-
-  static void destroyThis(UnaryInstruction* v) {
-    Instruction::destroyThis(v);
-  }
-  friend class Value;
 public:
+  // Out of line virtual method, so the vtable, etc has a home.
+  ~UnaryInstruction();
+
   // Transparently provide more efficient getOperand methods.
   Value *getOperand(unsigned i) const {
     assert(i == 0 && "getOperand() out of range!");
@@ -140,11 +136,6 @@ protected:
                  const std::string &Name, Instruction *InsertBefore);
   BinaryOperator(BinaryOps iType, Value *S1, Value *S2, const Type *Ty,
                  const std::string &Name, BasicBlock *InsertAtEnd);
-
-  static void destroyThis(BinaryOperator* v) {
-    Instruction::destroyThis(v);
-  }
-  friend class Value;
 public:
 
   /// Transparently provide more efficient getOperand methods.
@@ -281,12 +272,6 @@ protected:
     : UnaryInstruction(Ty, iType, S, InsertAtEnd) {
     setName(Name);
   }
-
-protected:
-  static void destroyThis(CastInst* v) {
-    UnaryInstruction::destroyThis(v);
-  }
-  friend class Value;
 public:
   /// Provides a way to construct any of the CastInst subclasses using an 
   /// opcode instead of the subclass's constructor. The opcode must be in the
@@ -508,10 +493,6 @@ protected:
 
   Use Ops[2]; // CmpInst instructions always have 2 operands, optimize
 
-  static void destroyThis(CmpInst* v) {
-    Instruction::destroyThis(v);
-  }
-  friend class Value;
 public:
   /// Construct a compare instruction, given the opcode, the predicate and 
   /// the two operands.  Optionally (if InstBefore is specified) insert the