The best unbreakage yet, addressing Bill's concerns.

llvm-svn: 32622
This commit is contained in:
Jeff Cohen 2006-12-16 02:15:42 +00:00
parent d4fd650c5f
commit c396e18e8e
6 changed files with 60 additions and 55 deletions

View File

@ -56,13 +56,18 @@ namespace llvm {
}
void dump() const;
void print(std::ostream &os) const;
private:
LiveRange(); // DO NOT IMPLEMENT
};
std::ostream& operator<<(std::ostream& os, const LiveRange &LR);
OStream& operator<<(OStream& os, const LiveRange &LR);
inline OStream& operator<<(OStream& os, const LiveRange &LR) {
if (os.stream()) LR.print(*os.stream());
return os;
}
inline bool operator<(unsigned V, const LiveRange &LR) {
return V < LR.start;

View File

@ -226,7 +226,10 @@ private: // Methods used to maintain doubly linked list of blocks...
};
std::ostream& operator<<(std::ostream &OS, const MachineBasicBlock &MBB);
OStream& operator<<(OStream &OS, const MachineBasicBlock &MBB);
inline OStream& operator<<(OStream &OS, const MachineBasicBlock &MBB) {
if (OS.stream()) MBB.print(*OS.stream());
return OS;
}
//===--------------------------------------------------------------------===//
// GraphTraits specializations for machine basic block graphs (machine-CFGs)

View File

@ -76,6 +76,9 @@ private:
int offset;
MachineOperand() {}
void print(std::ostream &os) const;
public:
MachineOperand(const MachineOperand &M) {
*this = M;
@ -285,8 +288,14 @@ public:
IsDead = false;
}
friend OStream& operator<<(OStream& os, const MachineOperand& mop);
friend std::ostream& operator<<(std::ostream& os, const MachineOperand& mop);
friend OStream& operator<<(OStream& os, const MachineOperand& mop) {
if (os.stream()) mop.print(*os.stream());
return os;
}
friend std::ostream& operator<<(std::ostream& os, const MachineOperand& mop) {
mop.print(os);
return os;
}
friend class MachineInstr;
};
@ -398,9 +407,16 @@ public:
if (OS.stream()) print(*OS.stream(), TM);
}
void print(std::ostream &OS, const TargetMachine *TM) const;
void print(std::ostream &OS) const;
void dump() const;
friend OStream& operator<<(OStream& os, const MachineInstr& minstr);
friend std::ostream& operator<<(std::ostream& os, const MachineInstr& minstr);
friend OStream& operator<<(OStream& os, const MachineInstr& minstr) {
if (os.stream()) minstr.print(*os.stream());
return os;
}
friend std::ostream& operator<<(std::ostream& os, const MachineInstr& minstr){
minstr.print(os);
return os;
}
//===--------------------------------------------------------------------===//
// Accessors to add operands when building up machine instructions.

View File

@ -512,7 +512,6 @@ void LiveInterval::dump() const {
}
OStream& llvm::operator<<(OStream& os, const LiveRange &LR) {
if (os.stream()) *os.stream() << LR;
return os;
void LiveRange::print(std::ostream &os) const {
os << *this;
}

View File

@ -31,11 +31,6 @@ std::ostream& llvm::operator<<(std::ostream &OS, const MachineBasicBlock &MBB) {
return OS;
}
OStream& llvm::operator<<(OStream &OS, const MachineBasicBlock &MBB) {
if (OS.stream()) *OS.stream() << MBB;
return OS;
}
// MBBs start out as #-1. When a MBB is added to a MachineFunction, it
// gets the next available unique MBB number. If it is removed from a
// MachineFunction, it goes back to being #-1.

View File

@ -304,74 +304,61 @@ void MachineInstr::print(std::ostream &OS, const TargetMachine *TM) const {
OS << "\n";
}
std::ostream &llvm::operator<<(std::ostream &os, const MachineInstr &MI) {
void MachineInstr::print(std::ostream &os) const {
// If the instruction is embedded into a basic block, we can find the target
// info for the instruction.
if (const MachineBasicBlock *MBB = MI.getParent()) {
if (const MachineBasicBlock *MBB = getParent()) {
const MachineFunction *MF = MBB->getParent();
if (MF)
MI.print(os, &MF->getTarget());
print(os, &MF->getTarget());
else
MI.print(os, 0);
return os;
print(os, 0);
}
// Otherwise, print it out in the "raw" format without symbolic register names
// and such.
os << MI.getInstrDescriptor()->Name;
os << getInstrDescriptor()->Name;
for (unsigned i = 0, N = MI.getNumOperands(); i < N; i++) {
os << "\t" << MI.getOperand(i);
if (MI.getOperand(i).isReg() && MI.getOperand(i).isDef())
for (unsigned i = 0, N = getNumOperands(); i < N; i++) {
os << "\t" << getOperand(i);
if (getOperand(i).isReg() && getOperand(i).isDef())
os << "<d>";
}
return os << "\n";
os << "\n";
}
std::ostream &llvm::operator<<(std::ostream &OS, const MachineOperand &MO) {
switch (MO.getType()) {
case MachineOperand::MO_Register:
OutputReg(OS, MO.getReg());
void MachineOperand::print(std::ostream &OS) const {
switch (getType()) {
case MO_Register:
OutputReg(OS, getReg());
break;
case MachineOperand::MO_Immediate:
OS << (long)MO.getImmedValue();
case MO_Immediate:
OS << (long)getImmedValue();
break;
case MachineOperand::MO_MachineBasicBlock:
case MO_MachineBasicBlock:
OS << "<mbb:"
<< ((Value*)MO.getMachineBasicBlock()->getBasicBlock())->getName()
<< "@" << (void*)MO.getMachineBasicBlock() << ">";
<< ((Value*)getMachineBasicBlock()->getBasicBlock())->getName()
<< "@" << (void*)getMachineBasicBlock() << ">";
break;
case MachineOperand::MO_FrameIndex:
OS << "<fi#" << MO.getFrameIndex() << ">";
case MO_FrameIndex:
OS << "<fi#" << getFrameIndex() << ">";
break;
case MachineOperand::MO_ConstantPoolIndex:
OS << "<cp#" << MO.getConstantPoolIndex() << ">";
case MO_ConstantPoolIndex:
OS << "<cp#" << getConstantPoolIndex() << ">";
break;
case MachineOperand::MO_JumpTableIndex:
OS << "<jt#" << MO.getJumpTableIndex() << ">";
case MO_JumpTableIndex:
OS << "<jt#" << getJumpTableIndex() << ">";
break;
case MachineOperand::MO_GlobalAddress:
OS << "<ga:" << ((Value*)MO.getGlobal())->getName() << ">";
case MO_GlobalAddress:
OS << "<ga:" << ((Value*)getGlobal())->getName() << ">";
break;
case MachineOperand::MO_ExternalSymbol:
OS << "<es:" << MO.getSymbolName() << ">";
case MO_ExternalSymbol:
OS << "<es:" << getSymbolName() << ">";
break;
default:
assert(0 && "Unrecognized operand type");
break;
}
return OS;
}
OStream& llvm::operator<<(OStream& os, const MachineInstr& minstr) {
if (os.stream()) *os.stream() << minstr;
return os;
}
OStream& llvm::operator<<(OStream& os, const MachineOperand& mop) {
if (os.stream()) *os.stream() << mop;
return os;
}