Refactor Varnode printRaw

This commit is contained in:
caheckman 2021-01-07 15:13:41 -05:00
parent 5f715d73e3
commit 3bfcb95788
4 changed files with 75 additions and 64 deletions

View file

@ -49,7 +49,7 @@ YACC=bison
# libraries # libraries
#INCLUDES=-I$(BFDHOME)/include #INCLUDES=-I$(BFDHOME)/include
INCLUDES= INCLUDES=
BFDLIB=-lbfd -liberty -lz BFDLIB=-lbfd -lz
LNK= LNK=

View file

@ -274,11 +274,11 @@ Datatype *TypeOpBinary::getInputLocal(const PcodeOp *op,int4 slot) const
void TypeOpBinary::printRaw(ostream &s,const PcodeOp *op) void TypeOpBinary::printRaw(ostream &s,const PcodeOp *op)
{ {
op->getOut()->printRaw(s); Varnode::printRaw(s,op->getOut());
s << " = "; s << " = ";
op->getIn(0)->printRaw(s); Varnode::printRaw(s,op->getIn(0));
s << ' ' << getOperatorName(op) << ' '; s << ' ' << getOperatorName(op) << ' ';
op->getIn(1)->printRaw(s); Varnode::printRaw(s,op->getIn(1));
} }
Datatype *TypeOpUnary::getOutputLocal(const PcodeOp *op) const Datatype *TypeOpUnary::getOutputLocal(const PcodeOp *op) const
@ -296,9 +296,9 @@ Datatype *TypeOpUnary::getInputLocal(const PcodeOp *op,int4 slot) const
void TypeOpUnary::printRaw(ostream &s,const PcodeOp *op) void TypeOpUnary::printRaw(ostream &s,const PcodeOp *op)
{ {
op->getOut()->printRaw(s); Varnode::printRaw(s,op->getOut());
s << " = " << getOperatorName(op) << ' '; s << " = " << getOperatorName(op) << ' ';
op->getIn(0)->printRaw(s); Varnode::printRaw(s,op->getIn(0));
} }
Datatype *TypeOpFunc::getOutputLocal(const PcodeOp *op) const Datatype *TypeOpFunc::getOutputLocal(const PcodeOp *op) const
@ -316,12 +316,12 @@ Datatype *TypeOpFunc::getInputLocal(const PcodeOp *op,int4 slot) const
void TypeOpFunc::printRaw(ostream &s,const PcodeOp *op) void TypeOpFunc::printRaw(ostream &s,const PcodeOp *op)
{ {
op->getOut()->printRaw(s); Varnode::printRaw(s,op->getOut());
s << " = " << getOperatorName(op) << '('; s << " = " << getOperatorName(op) << '(';
op->getIn(0)->printRaw(s); Varnode::printRaw(s,op->getIn(0));
for(int4 i=1;i<op->numInput();++i) { for(int4 i=1;i<op->numInput();++i) {
s << ','; s << ',';
op->getIn(i)->printRaw(s); Varnode::printRaw(s,op->getIn(i));
} }
s << ')'; s << ')';
} }
@ -350,9 +350,9 @@ Datatype *TypeOpCopy::getOutputToken(const PcodeOp *op,CastStrategy *castStrateg
void TypeOpCopy::printRaw(ostream &s,const PcodeOp *op) void TypeOpCopy::printRaw(ostream &s,const PcodeOp *op)
{ {
op->getOut()->printRaw(s); Varnode::printRaw(s,op->getOut());
s << " = "; s << " = ";
op->getIn(0)->printRaw(s); Varnode::printRaw(s,op->getIn(0));
} }
TypeOpLoad::TypeOpLoad(TypeFactory *t) : TypeOp(t,CPUI_LOAD,"load") TypeOpLoad::TypeOpLoad(TypeFactory *t) : TypeOp(t,CPUI_LOAD,"load")
@ -412,11 +412,11 @@ Datatype *TypeOpLoad::getOutputToken(const PcodeOp *op,CastStrategy *castStrateg
void TypeOpLoad::printRaw(ostream &s,const PcodeOp *op) void TypeOpLoad::printRaw(ostream &s,const PcodeOp *op)
{ {
op->getOut()->printRaw(s); Varnode::printRaw(s,op->getOut());
s << " = *("; s << " = *(";
AddrSpace *spc = Address::getSpaceFromConst(op->getIn(0)->getAddr()); AddrSpace *spc = Address::getSpaceFromConst(op->getIn(0)->getAddr());
s << spc->getName() << ','; s << spc->getName() << ',';
op->getIn(1)->printRaw(s); Varnode::printRaw(s,op->getIn(1));
s << ')'; s << ')';
} }
@ -469,9 +469,9 @@ void TypeOpStore::printRaw(ostream &s,const PcodeOp *op)
s << "*("; s << "*(";
AddrSpace *spc = Address::getSpaceFromConst(op->getIn(0)->getAddr()); AddrSpace *spc = Address::getSpaceFromConst(op->getIn(0)->getAddr());
s << spc->getName() << ','; s << spc->getName() << ',';
op->getIn(1)->printRaw(s); Varnode::printRaw(s,op->getIn(1));
s << ") = "; s << ") = ";
op->getIn(2)->printRaw(s); Varnode::printRaw(s,op->getIn(2));
} }
TypeOpBranch::TypeOpBranch(TypeFactory *t) : TypeOp(t,CPUI_BRANCH,"goto") TypeOpBranch::TypeOpBranch(TypeFactory *t) : TypeOp(t,CPUI_BRANCH,"goto")
@ -485,7 +485,7 @@ void TypeOpBranch::printRaw(ostream &s,const PcodeOp *op)
{ {
s << name << ' '; s << name << ' ';
op->getIn(0)->printRaw(s); Varnode::printRaw(s,op->getIn(0));
} }
TypeOpCbranch::TypeOpCbranch(TypeFactory *t) : TypeOp(t,CPUI_CBRANCH,"goto") TypeOpCbranch::TypeOpCbranch(TypeFactory *t) : TypeOp(t,CPUI_CBRANCH,"goto")
@ -511,9 +511,9 @@ void TypeOpCbranch::printRaw(ostream &s,const PcodeOp *op)
{ {
s << name << ' '; s << name << ' ';
op->getIn(0)->printRaw(s); // Print the distant (non-fallthru) destination Varnode::printRaw(s,op->getIn(0)); // Print the distant (non-fallthru) destination
s << " if ("; s << " if (";
op->getIn(1)->printRaw(s); Varnode::printRaw(s,op->getIn(1));
if (op->isBooleanFlip()^op->isFallthruTrue()) if (op->isBooleanFlip()^op->isFallthruTrue())
s << " == 0)"; s << " == 0)";
else else
@ -531,7 +531,7 @@ void TypeOpBranchind::printRaw(ostream &s,const PcodeOp *op)
{ {
s << name << ' '; s << name << ' ';
op->getIn(0)->printRaw(s); Varnode::printRaw(s,op->getIn(0));
} }
TypeOpCall::TypeOpCall(TypeFactory *t) : TypeOp(t,CPUI_CALL,"call") TypeOpCall::TypeOpCall(TypeFactory *t) : TypeOp(t,CPUI_CALL,"call")
@ -545,17 +545,17 @@ void TypeOpCall::printRaw(ostream &s,const PcodeOp *op)
{ {
if (op->getOut() != (Varnode *)0) { if (op->getOut() != (Varnode *)0) {
op->getOut()->printRaw(s); Varnode::printRaw(s,op->getOut());
s << " = "; s << " = ";
} }
s << name << ' '; s << name << ' ';
op->getIn(0)->printRaw(s); Varnode::printRaw(s,op->getIn(0));
if (op->numInput()>1) { if (op->numInput()>1) {
s << '('; s << '(';
op->getIn(1)->printRaw(s); Varnode::printRaw(s,op->getIn(1));
for(int4 i=2;i<op->numInput();++i) { for(int4 i=2;i<op->numInput();++i) {
s << ','; s << ',';
op->getIn(i)->printRaw(s); Varnode::printRaw(s,op->getIn(i));
} }
s << ')'; s << ')';
} }
@ -669,17 +669,17 @@ void TypeOpCallind::printRaw(ostream &s,const PcodeOp *op)
{ {
if (op->getOut() != (Varnode *)0) { if (op->getOut() != (Varnode *)0) {
op->getOut()->printRaw(s); Varnode::printRaw(s,op->getOut());
s << " = "; s << " = ";
} }
s << name; s << name;
op->getIn(0)->printRaw(s); Varnode::printRaw(s,op->getIn(0));
if (op->numInput()>1) { if (op->numInput()>1) {
s << '('; s << '(';
op->getIn(1)->printRaw(s); Varnode::printRaw(s,op->getIn(1));
for(int4 i=2;i<op->numInput();++i) { for(int4 i=2;i<op->numInput();++i) {
s << ','; s << ',';
op->getIn(i)->printRaw(s); Varnode::printRaw(s,op->getIn(i));
} }
s << ')'; s << ')';
} }
@ -696,16 +696,16 @@ void TypeOpCallother::printRaw(ostream &s,const PcodeOp *op)
{ {
if (op->getOut() != (Varnode *)0) { if (op->getOut() != (Varnode *)0) {
op->getOut()->printRaw(s); Varnode::printRaw(s,op->getOut());
s << " = "; s << " = ";
} }
s << getOperatorName(op); s << getOperatorName(op);
if (op->numInput()>1) { if (op->numInput()>1) {
s << '('; s << '(';
op->getIn(1)->printRaw(s); Varnode::printRaw(s,op->getIn(1));
for(int4 i=2;i<op->numInput();++i) { for(int4 i=2;i<op->numInput();++i) {
s << ','; s << ',';
op->getIn(i)->printRaw(s); Varnode::printRaw(s,op->getIn(i));
} }
s << ')'; s << ')';
} }
@ -784,15 +784,15 @@ void TypeOpReturn::printRaw(ostream &s,const PcodeOp *op)
s << name; s << name;
if (op->numInput()>=1) { if (op->numInput()>=1) {
s << '('; s << '(';
op->getIn(0)->printRaw(s); Varnode::printRaw(s,op->getIn(0));
s << ')'; s << ')';
} }
if (op->numInput()>1) { if (op->numInput()>1) {
s << ' '; s << ' ';
op->getIn(1)->printRaw(s); Varnode::printRaw(s,op->getIn(1));
for(int4 i=2;i<op->numInput();++i) { for(int4 i=2;i<op->numInput();++i) {
s << ','; s << ',';
op->getIn(i)->printRaw(s); Varnode::printRaw(s,op->getIn(i));
} }
} }
} }
@ -1204,11 +1204,11 @@ TypeOpIntSright::TypeOpIntSright(TypeFactory *t)
void TypeOpIntSright::printRaw(ostream &s,const PcodeOp *op) void TypeOpIntSright::printRaw(ostream &s,const PcodeOp *op)
{ {
op->getOut()->printRaw(s); Varnode::printRaw(s,op->getOut());
s << " = "; s << " = ";
op->getIn(0)->printRaw(s); Varnode::printRaw(s,op->getIn(0));
s << " s>> "; s << " s>> ";
op->getIn(1)->printRaw(s); Varnode::printRaw(s,op->getIn(1));
} }
Datatype *TypeOpIntSright::getInputCast(const PcodeOp *op,int4 slot,const CastStrategy *castStrategy) const Datatype *TypeOpIntSright::getInputCast(const PcodeOp *op,int4 slot,const CastStrategy *castStrategy) const
@ -1501,16 +1501,16 @@ TypeOpMulti::TypeOpMulti(TypeFactory *t) : TypeOp(t,CPUI_MULTIEQUAL,"?")
void TypeOpMulti::printRaw(ostream &s,const PcodeOp *op) void TypeOpMulti::printRaw(ostream &s,const PcodeOp *op)
{ {
op->getOut()->printRaw(s); Varnode::printRaw(s,op->getOut());
s << " = "; s << " = ";
op->getIn(0)->printRaw(s); Varnode::printRaw(s,op->getIn(0));
// if (op->Input(0)->isWritten()) // if (op->Input(0)->isWritten())
// s << '(' << op->Input(0)->Def()->Start() << ')'; // s << '(' << op->Input(0)->Def()->Start() << ')';
if (op->numInput()==1) if (op->numInput()==1)
s << ' ' << getOperatorName(op); s << ' ' << getOperatorName(op);
for(int4 i=1;i<op->numInput();++i) { for(int4 i=1;i<op->numInput();++i) {
s << ' ' << getOperatorName(op) << ' '; s << ' ' << getOperatorName(op) << ' ';
op->getIn(i)->printRaw(s); Varnode::printRaw(s,op->getIn(i));
// if (op->Input(i)->isWritten()) // if (op->Input(i)->isWritten())
// s << '(' << op->Input(i)->Def()->Start() << ')'; // s << '(' << op->Input(i)->Def()->Start() << ')';
} }
@ -1539,16 +1539,16 @@ Datatype *TypeOpIndirect::getInputLocal(const PcodeOp *op,int4 slot) const
void TypeOpIndirect::printRaw(ostream &s,const PcodeOp *op) void TypeOpIndirect::printRaw(ostream &s,const PcodeOp *op)
{ {
op->getOut()->printRaw(s); Varnode::printRaw(s,op->getOut());
s << " = "; s << " = ";
if (op->isIndirectCreation()) { if (op->isIndirectCreation()) {
s << "[create] "; s << "[create] ";
} }
else { else {
op->getIn(0)->printRaw(s); Varnode::printRaw(s,op->getIn(0));
s << ' ' << getOperatorName(op) << ' '; s << ' ' << getOperatorName(op) << ' ';
} }
op->getIn(1)->printRaw(s); Varnode::printRaw(s,op->getIn(1));
} }
TypeOpPiece::TypeOpPiece(TypeFactory *t) TypeOpPiece::TypeOpPiece(TypeFactory *t)
@ -1614,9 +1614,9 @@ TypeOpCast::TypeOpCast(TypeFactory *t) : TypeOp(t,CPUI_CAST,"(cast)")
void TypeOpCast::printRaw(ostream &s,const PcodeOp *op) void TypeOpCast::printRaw(ostream &s,const PcodeOp *op)
{ {
op->getOut()->printRaw(s); Varnode::printRaw(s,op->getOut());
s << " = " << name << ' '; s << " = " << name << ' ';
op->getIn(0)->printRaw(s); Varnode::printRaw(s,op->getIn(0));
} }
TypeOpPtradd::TypeOpPtradd(TypeFactory *t) : TypeOp(t,CPUI_PTRADD,"+") TypeOpPtradd::TypeOpPtradd(TypeFactory *t) : TypeOp(t,CPUI_PTRADD,"+")
@ -1659,13 +1659,13 @@ Datatype *TypeOpPtradd::getInputCast(const PcodeOp *op,int4 slot,const CastStrat
void TypeOpPtradd::printRaw(ostream &s,const PcodeOp *op) void TypeOpPtradd::printRaw(ostream &s,const PcodeOp *op)
{ {
op->getOut()->printRaw(s); Varnode::printRaw(s,op->getOut());
s << " = "; s << " = ";
op->getIn(0)->printRaw(s); Varnode::printRaw(s,op->getIn(0));
s << ' ' << name << ' '; s << ' ' << name << ' ';
op->getIn(1)->printRaw(s); Varnode::printRaw(s,op->getIn(1));
s << "(*"; s << "(*";
op->getIn(2)->printRaw(s); Varnode::printRaw(s,op->getIn(2));
s << ')'; s << ')';
} }
@ -1720,11 +1720,11 @@ Datatype *TypeOpPtrsub::getOutputToken(const PcodeOp *op,CastStrategy *castStrat
void TypeOpPtrsub::printRaw(ostream &s,const PcodeOp *op) void TypeOpPtrsub::printRaw(ostream &s,const PcodeOp *op)
{ {
op->getOut()->printRaw(s); Varnode::printRaw(s,op->getOut());
s << " = "; s << " = ";
op->getIn(0)->printRaw(s); Varnode::printRaw(s,op->getIn(0));
s << ' ' << name << ' '; s << ' ' << name << ' ';
op->getIn(1)->printRaw(s); Varnode::printRaw(s,op->getIn(1));
} }
TypeOpSegment::TypeOpSegment(TypeFactory *t) : TypeOp(t,CPUI_SEGMENTOP,"segmentop") TypeOpSegment::TypeOpSegment(TypeFactory *t) : TypeOp(t,CPUI_SEGMENTOP,"segmentop")
@ -1738,16 +1738,16 @@ void TypeOpSegment::printRaw(ostream &s,const PcodeOp *op)
{ {
if (op->getOut() != (Varnode *)0) { if (op->getOut() != (Varnode *)0) {
op->getOut()->printRaw(s); Varnode::printRaw(s,op->getOut());
s << " = "; s << " = ";
} }
s << getOperatorName(op); s << getOperatorName(op);
s << '('; s << '(';
AddrSpace *spc = Address::getSpaceFromConst(op->getIn(0)->getAddr()); AddrSpace *spc = Address::getSpaceFromConst(op->getIn(0)->getAddr());
s << spc->getName() << ','; s << spc->getName() << ',';
op->getIn(1)->printRaw(s); Varnode::printRaw(s,op->getIn(1));
s << ','; s << ',';
op->getIn(2)->printRaw(s); Varnode::printRaw(s,op->getIn(2));
s << ')'; s << ')';
} }
@ -1800,7 +1800,7 @@ void TypeOpCpoolref::printRaw(ostream &s,const PcodeOp *op)
{ {
if (op->getOut() != (Varnode *)0) { if (op->getOut() != (Varnode *)0) {
op->getOut()->printRaw(s); Varnode::printRaw(s,op->getOut());
s << " = "; s << " = ";
} }
s << getOperatorName(op); s << getOperatorName(op);
@ -1811,10 +1811,10 @@ void TypeOpCpoolref::printRaw(ostream &s,const PcodeOp *op)
if (rec != (const CPoolRecord *)0) if (rec != (const CPoolRecord *)0)
s << '_' << rec->getToken(); s << '_' << rec->getToken();
s << '('; s << '(';
op->getIn(0)->printRaw(s); Varnode::printRaw(s,op->getIn(0));
for(int4 i=2;i<op->numInput();++i) { for(int4 i=2;i<op->numInput();++i) {
s << ','; s << ',';
op->getIn(i)->printRaw(s); Varnode::printRaw(s,op->getIn(i));
} }
s << ')'; s << ')';
} }
@ -1830,15 +1830,15 @@ void TypeOpNew::printRaw(ostream &s,const PcodeOp *op)
{ {
if (op->getOut() != (Varnode *)0) { if (op->getOut() != (Varnode *)0) {
op->getOut()->printRaw(s); Varnode::printRaw(s,op->getOut());
s << " = "; s << " = ";
} }
s << getOperatorName(op); s << getOperatorName(op);
s << '('; s << '(';
op->getIn(0)->printRaw(s); Varnode::printRaw(s,op->getIn(0));
for(int4 i=1;i<op->numInput();++i) { for(int4 i=1;i<op->numInput();++i) {
s << ','; s << ',';
op->getIn(i)->printRaw(s); Varnode::printRaw(s,op->getIn(i));
} }
s << ')'; s << ')';
} }

View file

@ -634,10 +634,6 @@ int4 Varnode::printRawNoMarkup(ostream &s) const
void Varnode::printRaw(ostream &s) const void Varnode::printRaw(ostream &s) const
{ {
if (this == (const Varnode *)0) {
s << "<null>";
return;
}
int4 expect = printRawNoMarkup(s); int4 expect = printRawNoMarkup(s);
if (expect != size) if (expect != size)
@ -836,6 +832,20 @@ void Varnode::saveXml(ostream &s) const
s << "/>"; s << "/>";
} }
/// Invoke the printRaw method on the given Varnode pointer, but take into account that it
/// might be null.
/// \param s is the output stream to write to
/// \param vn is the given Varnode pointer (may be null)
void Varnode::printRaw(ostream &s,const Varnode *vn)
{
if (vn == (const Varnode *)0) {
s << "<null>";
return;
}
vn->printRaw(s);
}
/// \param m is the underlying address space manager /// \param m is the underlying address space manager
/// \param uspace is the \e unique space /// \param uspace is the \e unique space
/// \param ubase is the base offset for allocating temporaries /// \param ubase is the base offset for allocating temporaries

View file

@ -310,6 +310,7 @@ public:
bool copyShadow(const Varnode *op2) const; ///< Are \b this and \b op2 copied from the same source? bool copyShadow(const Varnode *op2) const; ///< Are \b this and \b op2 copied from the same source?
void saveXml(ostream &s) const; ///< Save a description of \b this as an XML tag void saveXml(ostream &s) const; ///< Save a description of \b this as an XML tag
static bool comparePointers(const Varnode *a,const Varnode *b) { return (*a < *b); } ///< Compare Varnodes as pointers static bool comparePointers(const Varnode *a,const Varnode *b) { return (*a < *b); } ///< Compare Varnodes as pointers
static void printRaw(ostream &s,const Varnode *vn); ///< Print raw info about a Varnode to stream
// static Varnode *restoreXml(const Element *el,Funcdata &fd,bool coderef); // static Varnode *restoreXml(const Element *el,Funcdata &fd,bool coderef);
}; };