mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-11-22 10:42:39 +01:00
[SelectionDAG] Updates for -dag-dump-verbose
Summary: This patch makes some changes related to -dag-dump-verbose. Main use case has been when debugging how SelectionDAG is dealing with debug info (SDDbgValue nodes). 1) We now print the number of DbgValues that are mapped to each SDNode. 2) Removed duplicated printing of DebugLoc (nowadays DebugLoc is printed also when not using -dag-dump-verbose). 3) Renamed SDDbgValue::dump to SDDbgValue::print, and added a new SDDbgValue::dump that will start a new line after calling print. 4) SDDbgValue::print now prints "Order", and it also prints some additional information when kind is CONST/FRAMEIX/VREG. 5) SelectionDAG::dump() now dumps all SDDbgValue nodes after the list of SDNodes (both "regular" and "ByVal" SDDbgValue:s). Invalidated nodes are not printed. 6) Prohibit inline printing of SDNode operands that has SDDbgValue nodes associated to them. Reviewers: jmorse, aprantl Reviewed By: aprantl Subscribers: llvm-commits Differential Revision: https://reviews.llvm.org/D56793 llvm-svn: 351581
This commit is contained in:
parent
e34410afe9
commit
a7ae705090
@ -1363,21 +1363,20 @@ public:
|
||||
/// with this SelectionDAG.
|
||||
bool hasDebugValues() const { return !DbgInfo->empty(); }
|
||||
|
||||
SDDbgInfo::DbgIterator DbgBegin() { return DbgInfo->DbgBegin(); }
|
||||
SDDbgInfo::DbgIterator DbgEnd() { return DbgInfo->DbgEnd(); }
|
||||
SDDbgInfo::DbgIterator DbgBegin() const { return DbgInfo->DbgBegin(); }
|
||||
SDDbgInfo::DbgIterator DbgEnd() const { return DbgInfo->DbgEnd(); }
|
||||
|
||||
SDDbgInfo::DbgIterator ByvalParmDbgBegin() {
|
||||
SDDbgInfo::DbgIterator ByvalParmDbgBegin() const {
|
||||
return DbgInfo->ByvalParmDbgBegin();
|
||||
}
|
||||
|
||||
SDDbgInfo::DbgIterator ByvalParmDbgEnd() {
|
||||
SDDbgInfo::DbgIterator ByvalParmDbgEnd() const {
|
||||
return DbgInfo->ByvalParmDbgEnd();
|
||||
}
|
||||
|
||||
SDDbgInfo::DbgLabelIterator DbgLabelBegin() {
|
||||
SDDbgInfo::DbgLabelIterator DbgLabelBegin() const {
|
||||
return DbgInfo->DbgLabelBegin();
|
||||
}
|
||||
SDDbgInfo::DbgLabelIterator DbgLabelEnd() {
|
||||
SDDbgInfo::DbgLabelIterator DbgLabelEnd() const {
|
||||
return DbgInfo->DbgLabelEnd();
|
||||
}
|
||||
|
||||
|
@ -136,7 +136,8 @@ public:
|
||||
/// dbg.addr is emitted twice.
|
||||
void clearIsEmitted() { Emitted = false; }
|
||||
|
||||
LLVM_DUMP_METHOD void dump(raw_ostream &OS) const;
|
||||
LLVM_DUMP_METHOD void dump() const;
|
||||
LLVM_DUMP_METHOD void print(raw_ostream &OS) const;
|
||||
};
|
||||
|
||||
/// Holds the information from a dbg_label node through SDISel.
|
||||
|
@ -145,6 +145,8 @@ std::string SDNode::getOperationName(const SelectionDAG *G) const {
|
||||
unsigned IID = cast<ConstantSDNode>(getOperand(OpNo))->getZExtValue();
|
||||
if (IID < Intrinsic::num_intrinsics)
|
||||
return Intrinsic::getName((Intrinsic::ID)IID, None);
|
||||
else if (!G)
|
||||
return "Unknown intrinsic";
|
||||
else if (const TargetIntrinsicInfo *TII = G->getTarget().getIntrinsicInfo())
|
||||
return TII->getName(IID);
|
||||
llvm_unreachable("Invalid intrinsic ID");
|
||||
@ -684,45 +686,63 @@ void SDNode::print_details(raw_ostream &OS, const SelectionDAG *G) const {
|
||||
if (getNodeId() != -1)
|
||||
OS << " [ID=" << getNodeId() << ']';
|
||||
if (!(isa<ConstantSDNode>(this) || (isa<ConstantFPSDNode>(this))))
|
||||
OS << "# D:" << isDivergent();
|
||||
OS << " # D:" << isDivergent();
|
||||
|
||||
if (!G)
|
||||
return;
|
||||
|
||||
DILocation *L = getDebugLoc();
|
||||
if (!L)
|
||||
return;
|
||||
|
||||
if (auto *Scope = L->getScope())
|
||||
OS << Scope->getFilename();
|
||||
else
|
||||
OS << "<unknown>";
|
||||
OS << ':' << L->getLine();
|
||||
if (unsigned C = L->getColumn())
|
||||
OS << ':' << C;
|
||||
|
||||
for (SDDbgValue *Dbg : G->GetDbgValues(this)) {
|
||||
if (Dbg->getKind() != SDDbgValue::SDNODE || Dbg->isInvalidated())
|
||||
continue;
|
||||
Dbg->dump(OS);
|
||||
}
|
||||
if (G && !G->GetDbgValues(this).empty()) {
|
||||
OS << " [NoOfDbgValues=" << G->GetDbgValues(this).size() << ']';
|
||||
for (SDDbgValue *Dbg : G->GetDbgValues(this))
|
||||
if (!Dbg->isInvalidated())
|
||||
Dbg->print(OS);
|
||||
} else if (getHasDebugValue())
|
||||
OS << " [NoOfDbgValues>0]";
|
||||
}
|
||||
}
|
||||
|
||||
LLVM_DUMP_METHOD void SDDbgValue::dump(raw_ostream &OS) const {
|
||||
OS << " DbgVal";
|
||||
if (kind==SDNODE)
|
||||
OS << '(' << u.s.ResNo << ')';
|
||||
OS << ":\"" << Var->getName() << '"';
|
||||
LLVM_DUMP_METHOD void SDDbgValue::print(raw_ostream &OS) const {
|
||||
OS << " DbgVal(Order=" << getOrder() << ')';
|
||||
if (isInvalidated()) OS << "(Invalidated)";
|
||||
if (isEmitted()) OS << "(Emitted)";
|
||||
switch (getKind()) {
|
||||
case SDNODE:
|
||||
if (getSDNode())
|
||||
OS << "(SDNODE=" << PrintNodeId(*getSDNode()) << ':' << getResNo() << ')';
|
||||
else
|
||||
OS << "(SDNODE)";
|
||||
break;
|
||||
case CONST:
|
||||
OS << "(CONST)";
|
||||
break;
|
||||
case FRAMEIX:
|
||||
OS << "(FRAMEIX=" << getFrameIx() << ')';
|
||||
break;
|
||||
case VREG:
|
||||
OS << "(VREG=" << getVReg() << ')';
|
||||
break;
|
||||
}
|
||||
if (isIndirect()) OS << "(Indirect)";
|
||||
OS << ":\"" << Var->getName() << '"';
|
||||
#ifndef NDEBUG
|
||||
if (Expr->getNumElements())
|
||||
Expr->dump();
|
||||
if (Expr->getNumElements())
|
||||
Expr->dump();
|
||||
#endif
|
||||
}
|
||||
|
||||
#if !defined(NDEBUG) || defined(LLVM_ENABLE_DUMP)
|
||||
LLVM_DUMP_METHOD void SDDbgValue::dump() const {
|
||||
if (isInvalidated())
|
||||
return;
|
||||
print(dbgs());
|
||||
dbgs() << "\n";
|
||||
}
|
||||
#endif
|
||||
|
||||
/// Return true if this node is so simple that we should just print it inline
|
||||
/// if it appears as an operand.
|
||||
static bool shouldPrintInline(const SDNode &Node) {
|
||||
static bool shouldPrintInline(const SDNode &Node, const SelectionDAG *G) {
|
||||
// Avoid lots of cluttering when inline printing nodes with associated
|
||||
// DbgValues in verbose mode.
|
||||
if (VerboseDAGDumping && G && !G->GetDbgValues(&Node).empty())
|
||||
return false;
|
||||
if (Node.getOpcode() == ISD::EntryToken)
|
||||
return false;
|
||||
return Node.getNumOperands() == 0;
|
||||
@ -731,7 +751,7 @@ static bool shouldPrintInline(const SDNode &Node) {
|
||||
#if !defined(NDEBUG) || defined(LLVM_ENABLE_DUMP)
|
||||
static void DumpNodes(const SDNode *N, unsigned indent, const SelectionDAG *G) {
|
||||
for (const SDValue &Op : N->op_values()) {
|
||||
if (shouldPrintInline(*Op.getNode()))
|
||||
if (shouldPrintInline(*Op.getNode(), G))
|
||||
continue;
|
||||
if (Op.getNode()->hasOneUse())
|
||||
DumpNodes(Op.getNode(), indent+2, G);
|
||||
@ -748,12 +768,24 @@ LLVM_DUMP_METHOD void SelectionDAG::dump() const {
|
||||
I != E; ++I) {
|
||||
const SDNode *N = &*I;
|
||||
if (!N->hasOneUse() && N != getRoot().getNode() &&
|
||||
(!shouldPrintInline(*N) || N->use_empty()))
|
||||
(!shouldPrintInline(*N, this) || N->use_empty()))
|
||||
DumpNodes(N, 2, this);
|
||||
}
|
||||
|
||||
if (getRoot().getNode()) DumpNodes(getRoot().getNode(), 2, this);
|
||||
dbgs() << "\n\n";
|
||||
dbgs() << "\n";
|
||||
|
||||
if (VerboseDAGDumping) {
|
||||
if (DbgBegin() != DbgEnd())
|
||||
dbgs() << "SDDbgValues:\n";
|
||||
for (auto *Dbg : make_range(DbgBegin(), DbgEnd()))
|
||||
Dbg->dump();
|
||||
if (ByvalParmDbgBegin() != ByvalParmDbgEnd())
|
||||
dbgs() << "Byval SDDbgValues:\n";
|
||||
for (auto *Dbg : make_range(ByvalParmDbgBegin(), ByvalParmDbgEnd()))
|
||||
Dbg->dump();
|
||||
}
|
||||
dbgs() << "\n";
|
||||
}
|
||||
#endif
|
||||
|
||||
@ -769,7 +801,7 @@ static bool printOperand(raw_ostream &OS, const SelectionDAG *G,
|
||||
if (!Value.getNode()) {
|
||||
OS << "<null>";
|
||||
return false;
|
||||
} else if (shouldPrintInline(*Value.getNode())) {
|
||||
} else if (shouldPrintInline(*Value.getNode(), G)) {
|
||||
OS << Value->getOperationName(G) << ':';
|
||||
Value->print_types(OS, G);
|
||||
Value->print_details(OS, G);
|
||||
|
Loading…
Reference in New Issue
Block a user