changes to input processing

This commit is contained in:
caheckman 2019-10-09 14:29:30 -04:00
parent 1415a41432
commit 5baf046fba
2 changed files with 33 additions and 42 deletions

View file

@ -310,7 +310,10 @@ TransformVar *TransformManager::newSplit(Varnode *vn,const LaneDescription &desc
newVar->val = (vn->getOffset() >> bitpos) & calc_mask(newVar->byteSize); newVar->val = (vn->getOffset() >> bitpos) & calc_mask(newVar->byteSize);
} }
else { else {
newVar->type = TransformVar::piece; if (preserveAddress(vn, newVar->bitSize, bitpos))
newVar->type = TransformVar::piece;
else
newVar->type = TransformVar::piece_temp;
newVar->val = bitpos; newVar->val = bitpos;
} }
} }
@ -470,15 +473,28 @@ void TransformManager::createOps(void)
} while(followCount != 0); } while(followCount != 0);
} }
void TransformManager::createVarnodes(void) /// Record any input vars in the given container
/// \param inputList will hold any inputs
void TransformManager::createVarnodes(vector<TransformVar *> &inputList)
{ {
map<int4,TransformVar *>::iterator piter; map<int4,TransformVar *>::iterator piter;
for(piter=pieceMap.begin();piter!=pieceMap.end();++piter) { for(piter=pieceMap.begin();piter!=pieceMap.end();++piter) {
TransformVar *vArray = (*piter).second; TransformVar *vArray = (*piter).second;
for(int4 i=0;;++i) { for(int4 i=0;;++i) {
vArray[i].createReplacement(fd); TransformVar *rvn = vArray + i;
if ((vArray[i].flags & TransformVar::split_terminator)!=0) if (rvn->type == TransformVar::piece) {
Varnode *vn = rvn->vn;
if (vn->isInput()) {
inputList.push_back(rvn);
if (vn->isMark())
rvn->flags |= TransformVar::input_duplicate;
else
vn->setMark();
}
}
rvn->createReplacement(fd);
if ((rvn->flags & TransformVar::split_terminator)!=0)
break; break;
} }
} }
@ -501,42 +517,16 @@ void TransformManager::removeOld(void)
} }
} }
/// Collect all the Varnodes that are inputs and are getting replaced. /// Remove all input Varnodes from the given container.
/// There may be multiple references so we dedup with marks.
/// Remove all the replaced input Varnodes.
/// Mark all the replacement Varnodes as inputs. /// Mark all the replacement Varnodes as inputs.
void TransformManager::transformInputVarnodes(void) /// \param inputList is the given container of input placeholders
void TransformManager::transformInputVarnodes(vector<TransformVar *> &inputList)
{ {
map<int4,TransformVar *>::iterator iter; for(int4 i=0;i<inputList.size();++i) {
vector<TransformVar *> deadList; TransformVar *rvn = inputList[i];
if ((rvn->flags & TransformVar::input_duplicate)==0)
for(iter=pieceMap.begin();iter!=pieceMap.end();++iter) { fd->deleteVarnode(rvn->vn);
TransformVar *vArray = (*iter).second;
for(int4 i=0;;++i) {
TransformVar *rvn = vArray + i;
if (rvn->type == TransformVar::piece) {
Varnode *vn = rvn->vn;
if (vn->isInput()) {
deadList.push_back(rvn);
if (vn->isMark()) {
rvn->vn = (Varnode *)0; // Zero out if more than one TransformVar referencing input
}
else {
vn->setMark();
}
}
}
if ((rvn->flags & TransformVar::split_terminator)!=0)
break;
}
}
for(int4 i=0;i<deadList.size();++i) {
TransformVar *rvn = deadList[i];
Varnode *vn = rvn->vn;
if (vn != (Varnode *)0)
fd->deleteVarnode(vn);
rvn->replacement = fd->setInputVarnode(rvn->replacement); rvn->replacement = fd->setInputVarnode(rvn->replacement);
} }
} }
@ -560,9 +550,10 @@ void TransformManager::placeInputs(void)
void TransformManager::apply(void) void TransformManager::apply(void)
{ {
vector<TransformVar *> inputList;
createOps(); createOps();
createVarnodes(); createVarnodes(inputList);
removeOld(); removeOld();
transformInputVarnodes(); transformInputVarnodes(inputList);
placeInputs(); placeInputs();
} }

View file

@ -37,7 +37,7 @@ public:
/// \brief Flags for a TransformVar /// \brief Flags for a TransformVar
enum { enum {
split_terminator = 1, ///< The last (most significant piece) of a split array split_terminator = 1, ///< The last (most significant piece) of a split array
def_traverse = 2 ///< The op defining this Varnode has already been traversed input_duplicate = 2 ///< This is a piece of an input that has already been visited
}; };
private: private:
Varnode *vn; ///< Original \b big Varnode of which \b this is a component Varnode *vn; ///< Original \b big Varnode of which \b this is a component
@ -113,9 +113,9 @@ class TransformManager {
void specialHandling(TransformOp &rop); void specialHandling(TransformOp &rop);
void createOps(void); ///< Create a new op for each placeholder void createOps(void); ///< Create a new op for each placeholder
void createVarnodes(void); ///< Create a Varnode for each placeholder void createVarnodes(vector<TransformVar *> &inputList); ///< Create a Varnode for each placeholder
void removeOld(void); ///< Remove old preexisting PcodeOps and Varnodes that are now obsolete void removeOld(void); ///< Remove old preexisting PcodeOps and Varnodes that are now obsolete
void transformInputVarnodes(void); ///< Remove old input Varnodes, mark new input Varnodes void transformInputVarnodes(vector<TransformVar *> &inputList); ///< Remove old input Varnodes, mark new input Varnodes
void placeInputs(void); ///< Set input Varnodes for all new ops void placeInputs(void); ///< Set input Varnodes for all new ops
public: public:
TransformManager(Funcdata *f) { fd = f; } ///< Constructor TransformManager(Funcdata *f) { fd = f; } ///< Constructor