本文整理汇总了C++中Exp::getSubExp1方法的典型用法代码示例。如果您正苦于以下问题:C++ Exp::getSubExp1方法的具体用法?C++ Exp::getSubExp1怎么用?C++ Exp::getSubExp1使用的例子?那么, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在类Exp
的用法示例。
在下文中一共展示了Exp::getSubExp1方法的8个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C++代码示例。
示例1:
// Find the first Assignment with loc on the LHS
Assignment *
StatementList::findOnLeft(Exp *loc) const
{
for (const auto &s : slist) {
auto as = (Assignment *)s;
Exp *left = as->getLeft();
if (*left == *loc)
return as;
if (left->isLocal()) {
auto l = (Location *)left;
Exp *e = l->getProc()->expFromSymbol(((Const *)l->getSubExp1())->getStr());
if (e && ((*e == *loc) || (e->isSubscript() && *e->getSubExp1() == *loc))) {
return as;
}
}
}
return nullptr;
}
示例2:
Exp *GenericExpTransformer::applyTo(Exp *e, bool &bMod)
{
bool change;
Exp *bindings = e->match(match);
if (bindings == NULL) {
#if 0
if (e->getOper() == match->getOper())
LOG << "match failed: " << e << " with " << match << "\n";
#endif
return e;
}
if (where) {
Exp *cond = where->clone();
if (checkCond(cond, bindings) == false)
return e;
}
LOG << "applying generic exp transformer match: " << match;
if (where)
LOG << " where: " << where;
LOG << " become: " << become;
LOG << " to: " << e;
LOG << " bindings: " << bindings << "\n";
e = become->clone();
for (Exp *l = bindings; l->getOper() != opNil; l = l->getSubExp2())
e = e->searchReplaceAll(l->getSubExp1()->getSubExp1(),
l->getSubExp1()->getSubExp2(),
change);
LOG << "calculated result: " << e << "\n";
bMod = true;
Exp *r;
if (e->search(new Unary(opVar, new Terminal(opWild)), r)) {
LOG << "error: variable " << r << " in result!\n";
assert(false);
}
return e;
}
示例3: applyAllTo
Exp *ExpTransformer::applyAllTo(Exp *p, bool &bMod)
{
for (std::list<Exp*>::iterator it = cache.begin(); it != cache.end(); it++)
if (*(*it)->getSubExp1() == *p)
return (*it)->getSubExp2()->clone();
Exp *e = p->clone();
Exp *subs[3];
subs[0] = e->getSubExp1();
subs[1] = e->getSubExp2();
subs[2] = e->getSubExp3();
for (int i = 0; i < 3; i++)
if (subs[i]) {
bool mod = false;
subs[i] = applyAllTo(subs[i], mod);
if (mod && i == 0)
e->setSubExp1(subs[i]);
if (mod && i == 1)
e->setSubExp2(subs[i]);
if (mod && i == 2)
e->setSubExp3(subs[i]);
bMod |= mod;
// if (mod) i--;
}
#if 0
LOG << "applyAllTo called on " << e << "\n";
#endif
bool mod;
//do {
mod = false;
for (std::list<ExpTransformer *>::iterator it = transformers.begin(); it != transformers.end(); it++) {
e = (*it)->applyTo(e, mod);
bMod |= mod;
}
//} while (mod);
cache.push_back(new Binary(opEquals, p->clone(), e->clone()));
return e;
}
示例4: findOnLeft
// Find the first Assignment with loc on the LHS
Assignment* StatementList::findOnLeft(Exp* loc)
{
if (slist.size() == 0)
return NULL;
for (iterator it = slist.begin(); it != slist.end(); it++)
{
Exp *left = ((Assignment*)*it)->getLeft();
if (*left == *loc)
return (Assignment*)*it;
if (left->isLocal())
{
Location *l = (Location*)left;
Exp *e = l->getProc()->expFromSymbol(((Const*)l->getSubExp1())->getStr());
if (e && ((*e == *loc) || (e->isSubscript() && *e->getSubExp1() == *loc)))
{
return (Assignment*)*it;
}
}
}
return NULL;
}
示例5: checkCond
bool GenericExpTransformer::checkCond(Exp *cond, Exp *bindings)
{
switch (cond->getOper()) {
case opAnd:
return checkCond(cond->getSubExp1(), bindings)
&& checkCond(cond->getSubExp2(), bindings);
case opEquals:
{
Exp *lhs = cond->getSubExp1(), *rhs = cond->getSubExp2();
for (Exp *l = bindings; l->getOper() != opNil; l = l->getSubExp2()) {
Exp *e = l->getSubExp1();
bool change = false;
lhs = lhs->searchReplaceAll(e->getSubExp1()->clone(), e->getSubExp2()->clone(), change);
#if 0
if (change)
LOG << "replaced " << e->getSubExp1() << " with " << e->getSubExp2() << "\n";
#endif
change = false;
rhs = rhs->searchReplaceAll(e->getSubExp1()->clone(), e->getSubExp2()->clone(), change);
#if 0
if (change)
LOG << "replaced " << e->getSubExp1() << " with " << e->getSubExp2() << "\n";
#endif
}
if (lhs->getOper() == opTypeOf) {
#if 0 // ADHOC TA
Type *ty = lhs->getSubExp1()->getType();
#else
Type *ty = NULL;
#endif
if (ty == NULL) {
#if 0
if (VERBOSE)
LOG << "no type for typeof " << lhs << "\n";
#endif
return false;
}
lhs = new TypeVal(ty);
#if 0
LOG << "got typeval: " << lhs << "\n";
#endif
}
if (lhs->getOper() == opKindOf) {
OPER op = lhs->getSubExp1()->getOper();
lhs = new Const(operStrings[op]);
}
rhs = applyFuncs(rhs);
#if 0
LOG << "check equals in cond: " << lhs << " == " << rhs << "\n";
#endif
if (lhs->getOper() == opVar) {
Exp *le;
for (le = bindings; le->getOper() != opNil && le->getSubExp2()->getOper() != opNil; le = le->getSubExp2())
;
assert(le->getOper() != opNil);
le->setSubExp2(new Binary(opList, new Binary(opEquals, lhs->clone(), rhs->clone()), new Terminal(opNil)));
#if 0
LOG << "bindings now: " << bindings << "\n";
#endif
return true;
}
if (*lhs == *rhs)
return true;
#if 0 // ADHOC TA
if (lhs->getOper() == opTypeVal
&& rhs->getOper() == opTypeVal
&& lhs->getType()->resolvesToCompound()
&& rhs->getType()->isCompound())
return true;
#endif
Exp *new_bindings = lhs->match(rhs);
if (new_bindings == NULL)
return false;
#if 0
LOG << "matched lhs with rhs, bindings: " << new_bindings << "\n";
#endif
Exp *le;
for (le = bindings; le->getOper() != opNil && le->getSubExp2()->getOper() != opNil; le = le->getSubExp2())
;
assert(le->getOper() != opNil);
le->setSubExp2(new_bindings);
#if 0
LOG << "bindings now: " << bindings << "\n";
#endif
return true;
}
default:
LOG << "don't know how to handle oper "
<< operStrings[cond->getOper()] << " in cond.\n";
}
return false;
//.........这里部分代码省略.........
示例6: renameBlockVars
bool DataFlow::renameBlockVars(UserProc* proc, int n, bool clearStacks /* = false */ ) {
if (++progress > 200) {
std::cerr << 'r' << std::flush;
progress = 0;
}
bool changed = false;
// Need to clear the Stacks of old, renamed locations like m[esp-4] (these will be deleted, and will cause compare
// failures in the Stacks, so it can't be correctly ordered and hence balanced etc, and will lead to segfaults)
if (clearStacks) Stacks.clear();
// For each statement S in block n
BasicBlock::rtlit rit; StatementList::iterator sit;
PBB bb = BBs[n];
Statement* S;
for (S = bb->getFirstStmt(rit, sit); S; S = bb->getNextStmt(rit, sit)) {
// if S is not a phi function (per Appel)
/* if (!S->isPhi()) */ {
// For each use of some variable x in S (not just assignments)
LocationSet locs;
if (S->isPhi()) {
PhiAssign* pa = (PhiAssign*)S;
Exp* phiLeft = pa->getLeft();
if (phiLeft->isMemOf() || phiLeft->isRegOf())
phiLeft->getSubExp1()->addUsedLocs(locs);
// A phi statement may use a location defined in a childless call, in which case its use collector
// needs updating
PhiAssign::iterator pp;
for (pp = pa->begin(); pp != pa->end(); ++pp) {
Statement* def = pp->def;
if (def && def->isCall())
((CallStatement*)def)->useBeforeDefine(phiLeft->clone());
}
}
else { // Not a phi assignment
S->addUsedLocs(locs);
}
LocationSet::iterator xx;
for (xx = locs.begin(); xx != locs.end(); xx++) {
Exp* x = *xx;
// Don't rename memOfs that are not renamable according to the current policy
if (!canRename(x, proc)) continue;
Statement* def = NULL;
if (x->isSubscript()) { // Already subscripted?
// No renaming required, but redo the usage analysis, in case this is a new return, and also because
// we may have just removed all call livenesses
// Update use information in calls, and in the proc (for parameters)
Exp* base = ((RefExp*)x)->getSubExp1();
def = ((RefExp*)x)->getDef();
if (def && def->isCall()) {
// Calls have UseCollectors for locations that are used before definition at the call
((CallStatement*)def)->useBeforeDefine(base->clone());
continue;
}
// Update use collector in the proc (for parameters)
if (def == NULL)
proc->useBeforeDefine(base->clone());
continue; // Don't re-rename the renamed variable
}
// Else x is not subscripted yet
if (STACKS_EMPTY(x)) {
if (!Stacks[defineAll].empty())
def = Stacks[defineAll].top();
else {
// If the both stacks are empty, use a NULL definition. This will be changed into a pointer
// to an implicit definition at the start of type analysis, but not until all the m[...]
// have stopped changing their expressions (complicates implicit assignments considerably).
def = NULL;
// Update the collector at the start of the UserProc
proc->useBeforeDefine(x->clone());
}
}
else
def = Stacks[x].top();
if (def && def->isCall())
// Calls have UseCollectors for locations that are used before definition at the call
((CallStatement*)def)->useBeforeDefine(x->clone());
// Replace the use of x with x{def} in S
changed = true;
if (S->isPhi()) {
Exp* phiLeft = ((PhiAssign*)S)->getLeft();
phiLeft->setSubExp1(phiLeft->getSubExp1()->expSubscriptVar(x, def /*, this*/));
} else {
S->subscriptVar(x, def /*, this */);
}
}
}
// MVE: Check for Call and Return Statements; these have DefCollector objects that need to be updated
// Do before the below, so CallStatements have not yet processed their defines
if (S->isCall() || S->isReturn()) {
DefCollector* col;
if (S->isCall())
col = ((CallStatement*)S)->getDefCollector();
else
col = ((ReturnStatement*)S)->getCollector();
col->updateDefs(Stacks, proc);
}
// For each definition of some variable a in S
//.........这里部分代码省略.........
示例7: Binary
std::list<Statement *> *RTLInstDict::transformPostVars(std::list<Statement *> *rts, bool optimise)
{
std::list<Statement *>::iterator rt;
// Map from var (could be any expression really) to details
std::map<Exp *, transPost, lessExpStar> vars;
int tmpcount = 1; // For making temp names unique
// Exp *matchParam(1, idParam); // ? Was never used anyway
#ifdef DEBUG_POSTVAR
std::cout << "Transforming from:\n";
for (Exp_CIT p = rts->begin(); p != rts->end(); p++) {
std::cout << setw(8) << " ";
(*p)->print(std::cout);
std::cout << "\n";
}
#endif
// First pass: Scan for post-variables and usages of their referents
for (rt = rts->begin(); rt != rts->end(); rt++) {
// ss appears to be a list of expressions to be searched
// It is either the LHS and RHS of an assignment, or it's the parameters of a flag call
Binary *ss;
if ((*rt)->isAssign()) {
Exp *lhs = ((Assign *)*rt)->getLeft();
Exp *rhs = ((Assign *)*rt)->getRight();
// Look for assignments to post-variables
if (lhs && lhs->isPostVar()) {
if (vars.find(lhs) == vars.end()) {
// Add a record in the map for this postvar
transPost &el = vars[lhs];
el.used = false;
el.type = ((Assign *)*rt)->getType();
// Constuct a temporary. We should probably be smarter and actually check that it's not otherwise
// used here.
std::string tmpname = el.type->getTempName() + (tmpcount++) + "post" ;
el.tmp = Location::tempOf(new Const(tmpname.c_str()));
// Keep a copy of the referrent. For example, if the lhs is r[0]', base is r[0]
el.base = lhs->getSubExp1();
el.post = lhs; // The whole post-var, e.g. r[0]'
el.isNew = true;
// The emulator generator sets optimise false
// I think this forces always generating the temps (MVE)
if (!optimise) {
el.used = true;
el.isNew = false;
}
}
}
// For an assignment, the two expressions to search are the left and right hand sides (could just put the
// whole assignment on, I suppose)
ss = new Binary(opList,
lhs->clone(),
new Binary(opList,
rhs->clone(),
new Terminal(opNil)));
} else if ((*rt)->isFlagAssgn()) {
// An opFlagCall is assumed to be a Binary with a string and an opList of parameters
ss = (Binary *)((Binary *)*rt)->getSubExp2();
} else
ss = NULL;
/* Look for usages of post-variables' referents
* Trickier than you'd think, as we need to make sure to skip over the post-variables themselves. ie match
* r[0] but not r[0]'
* Note: back with SemStrs, we could use a match expression which was a wildcard prepended to the base
* expression; this would match either the base (r[0]) or the post-var (r[0]').
* Can't really use this with Exps, so we search twice; once for the base, and once for the post, and if we
* get more with the former, then we have a use of the base (consider r[0] + r[0]')
*/
for (std::map<Exp *, transPost, lessExpStar>::iterator sr = vars.begin(); sr != vars.end(); sr++) {
if (sr->second.isNew) {
// Make sure we don't match a var in its defining statement
sr->second.isNew = false;
continue;
}
Binary *cur;
for (cur = ss; !cur->isNil(); cur = (Binary *)cur->getSubExp2()) {
if (sr->second.used)
break; // Don't bother; already know it's used
Exp *s = cur->getSubExp1();
if (!s) continue;
if (*s == *sr->second.base) {
sr->second.used = true;
break;
}
std::list<Exp *> res1, res2;
s->searchAll(sr->second.base, res1);
s->searchAll(sr->second.post, res2);
// Each match of a post will also match the base.
// But if there is a bare (non-post) use of the base, there will be a result in res1 that is not in res2
if (res1.size() > res2.size())
sr->second.used = true;
}
}
//.........这里部分代码省略.........
示例8: processProc
//.........这里部分代码省略.........
if (uDest < pBF->getLimitTextHigh()) {
targetQueue.visit(pCfg, uDest, pBB);
pCfg->addOutEdge(pBB, uDest, true);
}
else {
std::cout<<"Entering Processing Proc5\n";
if (!ASS_FILE)
LOG << "Error: Instruction at " << uAddr << " branches beyond end of section, to "
<< uDest << "\n";
else{
targetQueue.visit(pCfg, uDest, pBB);
pCfg->addOutEdge(pBB, uDest, true);
}
}
}
break;
}
case STMT_CASE: {
Exp* pDest = stmt_jump->getDest();
if (pDest == NULL) { // Happens if already analysed (now redecoding)
// SWITCH_INFO* psi = ((CaseStatement*)stmt_jump)->getSwitchInfo();
BB_rtls->push_back(pRtl);
pBB = pCfg->newBB(BB_rtls, NWAY, 0); // processSwitch will update num outedges
pBB->processSwitch(pProc); // decode arms, set out edges, etc
sequentialDecode = false; // Don't decode after the jump
BB_rtls = NULL; // New RTLList for next BB
break; // Just leave it alone
}
// Check for indirect calls to library functions, especially in Win32 programs
if (pDest && pDest->getOper() == opMemOf &&
pDest->getSubExp1()->getOper() == opIntConst &&
pBF->IsDynamicLinkedProcPointer(((Const*)pDest->getSubExp1())->getAddr())) {
if (VERBOSE)
LOG << "jump to a library function: " << stmt_jump << ", replacing with a call/ret.\n";
// jump to a library function
// replace with a call ret
// TODO:
std::string func = pBF->GetDynamicProcName(
((Const*)stmt_jump->getDest()->getSubExp1())->getAddr());
//------------------------------------
CallStatement *call = new CallStatement;
call->setDest(stmt_jump->getDest()->clone());
LibProc *lp = pProc->getProg()->getLibraryProc(func.c_str());
if (lp == NULL)
LOG << "getLibraryProc returned NULL, aborting\n";
assert(lp);
call->setDestProc(lp);
std::list<Statement*>* stmt_list = new std::list<Statement*>;
stmt_list->push_back(call);
BB_rtls->push_back(new RTL(pRtl->getAddress(), stmt_list));
pBB = pCfg->newBB(BB_rtls, CALL, 1);
appendSyntheticReturn(pBB, pProc, pRtl);
sequentialDecode = false;
BB_rtls = NULL;
if (pRtl->getAddress() == pProc->getNativeAddress()) {
// it's a thunk
// Proc *lp = prog->findProc(func.c_str());
func = std::string("__imp_") + func;
pProc->setName(func.c_str());
//lp->setName(func.c_str());
Boomerang::get()->alert_update_signature(pProc);
}
callList.push_back(call);