Fix problems with freeing memory twice
authorChris Lattner <sabre@nondot.org>
Sun, 9 Sep 2001 22:26:29 +0000 (22:26 +0000)
committerChris Lattner <sabre@nondot.org>
Sun, 9 Sep 2001 22:26:29 +0000 (22:26 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@520 91177308-0d34-0410-b5e6-96231b3b80d8

lib/CodeGen/MachineInstr.cpp

index a53d29c6571bd8fd6bdb009a4f2c1f2bcda8f74c..aa9765d21d23f0bc3576028006e9bba2561a08a8 100644 (file)
@@ -17,7 +17,6 @@
 #include "llvm/Method.h"
 #include "llvm/ConstPoolVals.h"
 #include "llvm/Instruction.h"
-#include <strstream>
 
 
 //************************ Class Implementations **************************/
@@ -105,47 +104,45 @@ operator<< (ostream& os, const MachineInstr& minstr)
   return os;
 }
 
-ostream&
-operator<< (ostream& os, const MachineOperand& mop)
-{
-  strstream regInfo;
-  if (mop.opType == MachineOperand::MO_VirtualRegister)
-    regInfo << "(val " << mop.value << ")" << ends;
-  else if (mop.opType == MachineOperand::MO_MachineRegister)
-    regInfo << "("       << mop.regNum << ")" << ends;
-  else if (mop.opType == MachineOperand::MO_CCRegister)
-    regInfo << "(val " << mop.value << ")" << ends;
-  
-  switch(mop.opType)
-    {
-    case MachineOperand::MO_VirtualRegister:
-    case MachineOperand::MO_MachineRegister:
-      os << "%reg" << regInfo.str();
-      free(regInfo.str());
-      break;
-      
-    case MachineOperand::MO_CCRegister:
-      os << "%ccreg" << regInfo.str();
-      free(regInfo.str());
-      break;
-
-    case MachineOperand::MO_SignExtendedImmed:
-      os << mop.immedVal;
-      break;
-
-    case MachineOperand::MO_UnextendedImmed:
-      os << mop.immedVal;
-      break;
+static inline ostream &OutputOperand(ostream &os, const MachineOperand &mop) {
+  switch (mop.getOperandType()) {
+  case MachineOperand::MO_CCRegister:
+  case MachineOperand::MO_VirtualRegister:
+    return os << "(val " << mop.getVRegValue() << ")";
+  case MachineOperand::MO_MachineRegister:
+    return os << "("     << mop.getMachineRegNum() << ")";
+  default:
+    assert(0 && "Unknown operand type");
+    return os;
+  }
+}
 
-    case MachineOperand::MO_PCRelativeDisp:
-      os << "%disp(label " << mop.value << ")";
-      break;
-
-    default:
-      assert(0 && "Unrecognized operand type");
-      break;
-    }
 
+ostream &operator<<(ostream &os, const MachineOperand &mop) {
+  switch(mop.opType) {
+  case MachineOperand::MO_VirtualRegister:
+  case MachineOperand::MO_MachineRegister:
+    os << "%reg";
+    return OutputOperand(os, mop);
+  case MachineOperand::MO_CCRegister:
+    os << "%ccreg";
+    return OutputOperand(os, mop);
+    
+  case MachineOperand::MO_SignExtendedImmed:
+    return os << mop.immedVal;
+    
+  case MachineOperand::MO_UnextendedImmed:
+    return os << mop.immedVal;
+    
+  case MachineOperand::MO_PCRelativeDisp:
+    os << "%disp(label ";
+    return OutputOperand(os, mop) << ")";
+    
+  default:
+    assert(0 && "Unrecognized operand type");
+    break;
+  }
+  
   return os;
 }