implement DOTGraphTraits<SelectionDAG*>::getNodeLabel in terms of

SDNode::print_details to eliminate a ton of near-duplicate code.


git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@74311 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Chris Lattner 2009-06-26 19:06:10 +00:00
parent 89ca575c31
commit d212bb8ef2

View File

@ -123,145 +123,12 @@ namespace llvm {
std::string DOTGraphTraits<SelectionDAG*>::getNodeLabel(const SDNode *Node,
const SelectionDAG *G,
bool ShortNames) {
std::string Op = Node->getOperationName(G);
if (const ConstantSDNode *CSDN = dyn_cast<ConstantSDNode>(Node)) {
Op += ": " + utostr(CSDN->getZExtValue());
} else if (const ConstantFPSDNode *CSDN = dyn_cast<ConstantFPSDNode>(Node)) {
Op += ": " + ftostr(CSDN->getValueAPF());
} else if (const GlobalAddressSDNode *GADN =
dyn_cast<GlobalAddressSDNode>(Node)) {
Op += ": " + GADN->getGlobal()->getName();
if (int64_t Offset = GADN->getOffset()) {
if (Offset > 0)
Op += "+" + itostr(Offset);
else
Op += itostr(Offset);
}
if (unsigned char TF = GADN->getTargetFlags())
Op += " [TF=" + utostr(TF) + "]";
} else if (const FrameIndexSDNode *FIDN = dyn_cast<FrameIndexSDNode>(Node)) {
Op += " " + itostr(FIDN->getIndex());
} else if (const JumpTableSDNode *JTDN = dyn_cast<JumpTableSDNode>(Node)) {
Op += " " + itostr(JTDN->getIndex());
if (unsigned char TF = JTDN->getTargetFlags())
Op += " [TF=" + utostr(TF) + "]";
} else if (const ConstantPoolSDNode *CP = dyn_cast<ConstantPoolSDNode>(Node)){
if (CP->isMachineConstantPoolEntry()) {
Op += '<';
{
raw_string_ostream OSS(Op);
OSS << *CP->getMachineCPVal();
}
Op += '>';
} else {
if (ConstantFP *CFP = dyn_cast<ConstantFP>(CP->getConstVal()))
Op += "<" + ftostr(CFP->getValueAPF()) + ">";
else if (ConstantInt *CI = dyn_cast<ConstantInt>(CP->getConstVal()))
Op += "<" + utostr(CI->getZExtValue()) + ">";
else {
Op += '<';
{
raw_string_ostream OSS(Op);
WriteAsOperand(OSS, CP->getConstVal(), false);
}
Op += '>';
}
}
Op += " A=" + itostr(CP->getAlignment());
if (unsigned char TF = CP->getTargetFlags())
Op += " TF=" + utostr(TF);
} else if (const BasicBlockSDNode *BBDN = dyn_cast<BasicBlockSDNode>(Node)) {
Op = "BB: ";
const Value *LBB = (const Value*)BBDN->getBasicBlock()->getBasicBlock();
if (LBB)
Op += LBB->getName();
//Op += " " + (const void*)BBDN->getBasicBlock();
} else if (const RegisterSDNode *R = dyn_cast<RegisterSDNode>(Node)) {
if (G && R->getReg() != 0 &&
TargetRegisterInfo::isPhysicalRegister(R->getReg())) {
Op = Op + " " +
G->getTarget().getRegisterInfo()->getName(R->getReg());
} else {
Op += " #" + utostr(R->getReg());
}
} else if (const DbgStopPointSDNode *D = dyn_cast<DbgStopPointSDNode>(Node)) {
DICompileUnit CU(cast<GlobalVariable>(D->getCompileUnit()));
std::string FN;
Op += ": " + CU.getFilename(FN);
Op += ":" + utostr(D->getLine());
if (D->getColumn() != 0)
Op += ":" + utostr(D->getColumn());
} else if (const LabelSDNode *L = dyn_cast<LabelSDNode>(Node)) {
Op += ": LabelID=" + utostr(L->getLabelID());
} else if (const CallSDNode *C = dyn_cast<CallSDNode>(Node)) {
Op += ": CallingConv=" + utostr(C->getCallingConv());
if (C->isVarArg())
Op += ", isVarArg";
if (C->isTailCall())
Op += ", isTailCall";
} else if (const ExternalSymbolSDNode *ES =
dyn_cast<ExternalSymbolSDNode>(Node)) {
Op += "'" + std::string(ES->getSymbol()) + "'";
} else if (const SrcValueSDNode *M = dyn_cast<SrcValueSDNode>(Node)) {
if (M->getValue())
Op += "<" + M->getValue()->getName() + ">";
else
Op += "<null>";
} else if (const MemOperandSDNode *M = dyn_cast<MemOperandSDNode>(Node)) {
const Value *V = M->MO.getValue();
Op += '<';
if (!V) {
Op += "(unknown)";
} else if (const PseudoSourceValue *PSV = dyn_cast<PseudoSourceValue>(V)) {
// PseudoSourceValues don't have names, so use their print method.
raw_string_ostream OSS(Op);
PSV->print(OSS);
} else {
Op += V->getName();
}
Op += '+' + itostr(M->MO.getOffset()) + '>';
} else if (const ARG_FLAGSSDNode *N = dyn_cast<ARG_FLAGSSDNode>(Node)) {
Op = Op + " AF=" + N->getArgFlags().getArgFlagsString();
} else if (const VTSDNode *N = dyn_cast<VTSDNode>(Node)) {
Op = Op + " VT=" + N->getVT().getMVTString();
} else if (const LoadSDNode *LD = dyn_cast<LoadSDNode>(Node)) {
bool doExt = true;
switch (LD->getExtensionType()) {
default: doExt = false; break;
case ISD::EXTLOAD:
Op = Op + "<anyext ";
break;
case ISD::SEXTLOAD:
Op = Op + " <sext ";
break;
case ISD::ZEXTLOAD:
Op = Op + " <zext ";
break;
}
if (doExt)
Op += LD->getMemoryVT().getMVTString() + ">";
if (LD->isVolatile())
Op += "<V>";
Op += LD->getIndexedModeName(LD->getAddressingMode());
if (LD->getAlignment() > 1)
Op += " A=" + utostr(LD->getAlignment());
} else if (const StoreSDNode *ST = dyn_cast<StoreSDNode>(Node)) {
if (ST->isTruncatingStore())
Op += "<trunc " + ST->getMemoryVT().getMVTString() + ">";
if (ST->isVolatile())
Op += "<V>";
Op += ST->getIndexedModeName(ST->getAddressingMode());
if (ST->getAlignment() > 1)
Op += " A=" + utostr(ST->getAlignment());
std::string Result = Node->getOperationName(G);
{
raw_string_ostream OS(Result);
Node->print_details(OS, G);
}
#if 0
Op += " Id=" + itostr(Node->getNodeId());
#endif
return Op;
return Result;
}