#ifndef __CPUI_PARAMID__
#define __CPUI_PARAMID__
#include "funcdata.hh"
class ParamMeasure {
public:
enum ParamIDIO {
INPUT = 0,
OUTPUT = 1
};
enum ParamRank {
BESTRANK = 1,
DIRECTWRITEWITHOUTREAD = 1, DIRECTREAD = 2, DIRECTWRITEWITHREAD = 2, DIRECTWRITEUNKNOWNREAD = 3, SUBFNPARAM = 4, THISFNPARAM = 4, SUBFNRETURN = 5, THISFNRETURN = 5, INDIRECT = 6, WORSTRANK = 7
};
struct WalkState {
bool best;
int4 depth;
ParamRank terminalrank;
};
private:
VarnodeData vndata;
Datatype *vntype;
ParamRank rank;
ParamIDIO io;
int4 numcalls;
void walkforward( WalkState &state, PcodeOp *ignoreop, Varnode *vn );
void walkbackward( WalkState &state, PcodeOp *ignoreop,Varnode *vn );
void updaterank( ParamRank rank_in,bool best ) { rank = (best==true) ? min( rank, rank_in ) : max( rank, rank_in ); }
public:
ParamMeasure( const Address &addr, int4 sz, Datatype *dt, ParamIDIO io_in) {
vndata.space=addr.getSpace(); vndata.offset=addr.getOffset(); vndata.size = sz; vntype=dt; io = io_in; rank=WORSTRANK; }
void calculateRank(bool best,Varnode *basevn,PcodeOp *ignoreop);
void saveXml( ostream &s,string tag,bool moredetail ) const;
void savePretty( ostream &s,bool moredetail ) const;
int4 getMeasure(void) const { return (int4) rank; }
};
class ParamIDAnalysis
{
Funcdata *fd;
list<ParamMeasure> InputParamMeasures;
list<ParamMeasure> OutputParamMeasures;
public:
ParamIDAnalysis( Funcdata *fd_in, bool justproto );
void saveXml( ostream &s, bool moredetail ) const;
void savePretty( ostream &s, bool moredetail ) const;
};
#endif