[llvm-commits] [llvm] r82599 - in /llvm/trunk: include/llvm/CodeGen/MachineMemOperand.h include/llvm/CodeGen/PseudoSourceValue.h include/llvm/Value.h lib/CodeGen/MachineInstr.cpp lib/CodeGen/PseudoSourceValue.cpp lib/CodeGen/SelectionDAG/SelectionDAG.cpp lib/VMCore/AsmWriter.cpp
Dan Gohman
gohman at apple.com
Tue Sep 22 18:33:16 PDT 2009
Author: djg
Date: Tue Sep 22 20:33:16 2009
New Revision: 82599
URL: http://llvm.org/viewvc/llvm-project?rev=82599&view=rev
Log:
Give MachineMemOperand an operator<<, factoring out code from
two different places for printing MachineMemOperands.
Drop the virtual from Value::dump and instead give Value a
protected virtual hook that can be overridden by subclasses
to implement custom printing. This lets printing be more
consistent, and simplifies printing of PseudoSourceValue
values.
Modified:
llvm/trunk/include/llvm/CodeGen/MachineMemOperand.h
llvm/trunk/include/llvm/CodeGen/PseudoSourceValue.h
llvm/trunk/include/llvm/Value.h
llvm/trunk/lib/CodeGen/MachineInstr.cpp
llvm/trunk/lib/CodeGen/PseudoSourceValue.cpp
llvm/trunk/lib/CodeGen/SelectionDAG/SelectionDAG.cpp
llvm/trunk/lib/VMCore/AsmWriter.cpp
Modified: llvm/trunk/include/llvm/CodeGen/MachineMemOperand.h
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/CodeGen/MachineMemOperand.h?rev=82599&r1=82598&r2=82599&view=diff
==============================================================================
--- llvm/trunk/include/llvm/CodeGen/MachineMemOperand.h (original)
+++ llvm/trunk/include/llvm/CodeGen/MachineMemOperand.h Tue Sep 22 20:33:16 2009
@@ -22,6 +22,7 @@
class Value;
class FoldingSetNodeID;
+class raw_ostream;
//===----------------------------------------------------------------------===//
/// MachineMemOperand - A description of a memory reference used in the backend.
@@ -92,6 +93,8 @@
void Profile(FoldingSetNodeID &ID) const;
};
+raw_ostream &operator<<(raw_ostream &OS, const MachineMemOperand &MRO);
+
} // End llvm namespace
#endif
Modified: llvm/trunk/include/llvm/CodeGen/PseudoSourceValue.h
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/CodeGen/PseudoSourceValue.h?rev=82599&r1=82598&r2=82599&view=diff
==============================================================================
--- llvm/trunk/include/llvm/CodeGen/PseudoSourceValue.h (original)
+++ llvm/trunk/include/llvm/CodeGen/PseudoSourceValue.h Tue Sep 22 20:33:16 2009
@@ -25,17 +25,15 @@
/// stack frame (e.g., a spill slot), below the stack frame (e.g., argument
/// space), or constant pool.
class PseudoSourceValue : public Value {
+ private:
+ /// printCustom - Implement printing for PseudoSourceValue. This is called
+ /// from Value::print or Value's operator<<.
+ ///
+ virtual void printCustom(raw_ostream &O) const;
+
public:
PseudoSourceValue();
- /// dump - Support for debugging, callable in GDB: V->dump()
- //
- virtual void dump() const;
-
- /// print - Implement operator<< on PseudoSourceValue.
- ///
- virtual void print(raw_ostream &OS) const;
-
/// isConstant - Test whether this PseudoSourceValue has a constant value.
///
virtual bool isConstant(const MachineFrameInfo *) const;
Modified: llvm/trunk/include/llvm/Value.h
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Value.h?rev=82599&r1=82598&r2=82599&view=diff
==============================================================================
--- llvm/trunk/include/llvm/Value.h (original)
+++ llvm/trunk/include/llvm/Value.h Tue Sep 22 20:33:16 2009
@@ -90,13 +90,18 @@
void operator=(const Value &); // Do not implement
Value(const Value &); // Do not implement
+protected:
+ /// printCustom - Value subclasses can override this to implement custom
+ /// printing behavior.
+ virtual void printCustom(raw_ostream &O) const;
+
public:
Value(const Type *Ty, unsigned scid);
virtual ~Value();
/// dump - Support for debugging, callable in GDB: V->dump()
//
- virtual void dump() const;
+ void dump() const;
/// print - Implement operator<< on Value.
///
Modified: llvm/trunk/lib/CodeGen/MachineInstr.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/MachineInstr.cpp?rev=82599&r1=82598&r2=82599&view=diff
==============================================================================
--- llvm/trunk/lib/CodeGen/MachineInstr.cpp (original)
+++ llvm/trunk/lib/CodeGen/MachineInstr.cpp Tue Sep 22 20:33:16 2009
@@ -15,6 +15,7 @@
#include "llvm/Constants.h"
#include "llvm/InlineAsm.h"
#include "llvm/Value.h"
+#include "llvm/Assembly/Writer.h"
#include "llvm/CodeGen/MachineFunction.h"
#include "llvm/CodeGen/MachineRegisterInfo.h"
#include "llvm/CodeGen/PseudoSourceValue.h"
@@ -297,6 +298,44 @@
ID.AddInteger(Flags);
}
+raw_ostream &llvm::operator<<(raw_ostream &OS, const MachineMemOperand &MRO) {
+ assert((MRO.isLoad() || MRO.isStore()) &&
+ "SV has to be a load, store or both.");
+
+ if (MRO.isVolatile())
+ OS << "Volatile ";
+
+ if (MRO.isLoad())
+ OS << "LD";
+ if (MRO.isStore())
+ OS << "ST";
+ OS << MRO.getSize();
+
+ // Print the address information.
+ OS << "[";
+ if (!MRO.getValue())
+ OS << "<unknown>";
+ else
+ WriteAsOperand(OS, MRO.getValue(), /*PrintType=*/false);
+
+ // If the alignment of the memory reference itself differs from the alignment
+ // of the base pointer, print the base alignment explicitly, next to the base
+ // pointer.
+ if (MRO.getBaseAlignment() != MRO.getAlignment())
+ OS << "(align=" << MRO.getBaseAlignment() << ")";
+
+ if (MRO.getOffset() != 0)
+ OS << "+" << MRO.getOffset();
+ OS << "]";
+
+ // Print the alignment of the reference.
+ if (MRO.getBaseAlignment() != MRO.getAlignment() ||
+ MRO.getBaseAlignment() != MRO.getSize())
+ OS << "(align=" << MRO.getAlignment() << ")";
+
+ return OS;
+}
+
//===----------------------------------------------------------------------===//
// MachineInstr Implementation
//===----------------------------------------------------------------------===//
@@ -967,32 +1006,9 @@
OS << ", Mem:";
for (std::list<MachineMemOperand>::const_iterator i = memoperands_begin(),
e = memoperands_end(); i != e; ++i) {
- const MachineMemOperand &MRO = *i;
- const Value *V = MRO.getValue();
-
- assert((MRO.isLoad() || MRO.isStore()) &&
- "SV has to be a load, store or both.");
-
- if (MRO.isVolatile())
- OS << "Volatile ";
-
- if (MRO.isLoad())
- OS << "LD";
- if (MRO.isStore())
- OS << "ST";
-
- OS << "(" << MRO.getSize() << "," << MRO.getAlignment() << ") [";
-
- if (!V)
- OS << "<unknown>";
- else if (!V->getName().empty())
- OS << V->getName();
- else if (const PseudoSourceValue *PSV = dyn_cast<PseudoSourceValue>(V)) {
- PSV->print(OS);
- } else
- OS << V;
-
- OS << " + " << MRO.getOffset() << "]";
+ OS << *i;
+ if (next(i) != e)
+ OS << " ";
}
}
Modified: llvm/trunk/lib/CodeGen/PseudoSourceValue.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/PseudoSourceValue.cpp?rev=82599&r1=82598&r2=82599&view=diff
==============================================================================
--- llvm/trunk/lib/CodeGen/PseudoSourceValue.cpp (original)
+++ llvm/trunk/lib/CodeGen/PseudoSourceValue.cpp Tue Sep 22 20:33:16 2009
@@ -47,12 +47,8 @@
Value(PointerType::getUnqual(Type::getInt8Ty(getGlobalContext())),
PseudoSourceValueVal) {}
-void PseudoSourceValue::dump() const {
- print(errs()); errs() << '\n';
-}
-
-void PseudoSourceValue::print(raw_ostream &OS) const {
- OS << PSVNames[this - *PSVs];
+void PseudoSourceValue::printCustom(raw_ostream &O) const {
+ O << PSVNames[this - *PSVs];
}
namespace {
@@ -67,7 +63,7 @@
virtual bool isConstant(const MachineFrameInfo *MFI) const;
- virtual void print(raw_ostream &OS) const {
+ virtual void printCustom(raw_ostream &OS) const {
OS << "FixedStack" << FI;
}
};
Modified: llvm/trunk/lib/CodeGen/SelectionDAG/SelectionDAG.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/SelectionDAG/SelectionDAG.cpp?rev=82599&r1=82598&r2=82599&view=diff
==============================================================================
--- llvm/trunk/lib/CodeGen/SelectionDAG/SelectionDAG.cpp (original)
+++ llvm/trunk/lib/CodeGen/SelectionDAG/SelectionDAG.cpp Tue Sep 22 20:33:16 2009
@@ -5580,10 +5580,7 @@
else
OS << "<null>";
} else if (const MemOperandSDNode *M = dyn_cast<MemOperandSDNode>(this)) {
- if (M->MO.getValue())
- OS << "<" << M->MO.getValue() << ":" << M->MO.getOffset() << ">";
- else
- OS << "<null:" << M->MO.getOffset() << ">";
+ OS << ": " << M->MO;
} else if (const VTSDNode *N = dyn_cast<VTSDNode>(this)) {
OS << ":" << N->getVT().getEVTString();
}
Modified: llvm/trunk/lib/VMCore/AsmWriter.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/VMCore/AsmWriter.cpp?rev=82599&r1=82598&r2=82599&view=diff
==============================================================================
--- llvm/trunk/lib/VMCore/AsmWriter.cpp (original)
+++ llvm/trunk/lib/VMCore/AsmWriter.cpp Tue Sep 22 20:33:16 2009
@@ -1198,6 +1198,11 @@
return;
}
+ if (V->getValueID() == Value::PseudoSourceValueVal) {
+ V->print(Out);
+ return;
+ }
+
char Prefix = '%';
int Slot;
if (Machine) {
@@ -2076,10 +2081,17 @@
} else if (isa<InlineAsm>(this)) {
WriteAsOperand(OS, this, true, 0);
} else {
- llvm_unreachable("Unknown value to print out!");
+ // Otherwise we don't know what it is. Call the virtual function to
+ // allow a subclass to print itself.
+ printCustom(OS);
}
}
+// Value::printCustom - subclasses should override this to implement printing.
+void Value::printCustom(raw_ostream &OS) const {
+ llvm_unreachable("Unknown value to print out!");
+}
+
// Value::dump - allow easy printing of Values from the debugger.
void Value::dump() const { print(errs()); errs() << '\n'; }
More information about the llvm-commits
mailing list