Fix problems with freeing memory twice
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@520 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/lib/CodeGen/MachineInstr.cpp b/lib/CodeGen/MachineInstr.cpp
index a53d29c..aa9765d 100644
--- a/lib/CodeGen/MachineInstr.cpp
+++ b/lib/CodeGen/MachineInstr.cpp
@@ -17,7 +17,6 @@
#include "llvm/Method.h"
#include "llvm/ConstPoolVals.h"
#include "llvm/Instruction.h"
-#include <strstream>
//************************ Class Implementations **************************/
@@ -105,47 +104,45 @@
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;
+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;
+ }
+}
+
+
+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;
+ }
- 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;
-
- case MachineOperand::MO_PCRelativeDisp:
- os << "%disp(label " << mop.value << ")";
- break;
-
- default:
- assert(0 && "Unrecognized operand type");
- break;
- }
-
return os;
}