mirror of
https://github.com/NationalSecurityAgency/ghidra.git
synced 2025-10-05 10:49:34 +02:00
changes to input processing
This commit is contained in:
parent
1415a41432
commit
5baf046fba
2 changed files with 33 additions and 42 deletions
|
@ -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();
|
||||||
}
|
}
|
||||||
|
|
|
@ -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
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue