本文整理汇总了C++中PBB::setJumpReqd方法的典型用法代码示例。如果您正苦于以下问题:C++ PBB::setJumpReqd方法的具体用法?C++ PBB::setJumpReqd怎么用?C++ PBB::setJumpReqd使用的例子?那么, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在类PBB
的用法示例。
在下文中一共展示了PBB::setJumpReqd方法的2个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C++代码示例。
示例1: processProc
//.........这里部分代码省略.........
name = pBF->GetDynamicProcName(a);
}
}
else {
name = namesList.find(uNewAddr)->second;
}
if (name && noReturnCallDest(name)) {
// Make sure it has a return appended (so there is only one exit from the function)
//call->setReturnAfterCall(true); // I think only the Sparc frontend cares
// Create the new basic block
pBB = pCfg->newBB(BB_rtls, CALL, 1);
appendSyntheticReturn(pBB, pProc, pRtl);
// Stop decoding sequentially
sequentialDecode = false;
}
else {
// Create the new basic block
pBB = pCfg->newBB(BB_rtls, CALL, 1);
if (call->isReturnAfterCall()) {
// Constuct the RTLs for the new basic block
std::list<RTL*>* rtls = new std::list<RTL*>();
// The only RTL in the basic block is one with a ReturnStatement
std::list<Statement*>* sl = new std::list<Statement*>;
sl->push_back(new ReturnStatement());
rtls->push_back(new RTL(pRtl->getAddress()+1, sl));
BasicBlock* returnBB = pCfg->newBB(rtls, RET, 0);
// Add out edge from call to return
pCfg->addOutEdge(pBB, returnBB);
// Put a label on the return BB (since it's an orphan); a jump will be reqd
pCfg->setLabel(returnBB);
pBB->setJumpReqd();
// Mike: do we need to set return locations?
// This ends the function
sequentialDecode = false;
}
else {
// Add the fall through edge if the block didn't
// already exist
if (pBB != NULL)
pCfg->addOutEdge(pBB, uAddr+inst.numBytes);
}
}
}
extraProcessCall(call, BB_rtls);
// Create the list of RTLs for the next basic block and continue with the next instruction.
BB_rtls = NULL;
break;
}
case STMT_RET: {
// Stop decoding sequentially
sequentialDecode = false;
pBB = createReturnBlock(pProc, BB_rtls, pRtl);
// Create the list of RTLs for the next basic block and
// continue with the next instruction.
BB_rtls = NULL; // New RTLList for next BB
}
break;
示例2: processProc
//.........这里部分代码省略.........
cout << "p" << hex << uNewAddr << "\t" << flush;
}
// Check if this is the _exit function. May prevent us from
// attempting to decode invalid instructions.
char* name = prog.pBF->SymbolByAddress(uNewAddr);
if (name && strcmp(name, "_exit") == 0)
{
// Create the new basic block
pBB = pCfg->newBB(BB_rtls, CALL, 0);
// Stop decoding sequentially
sequentialDecode = false;
}
else
{
// Create the new basic block
pBB = pCfg->newBB(BB_rtls, CALL, 1);
if (call->isReturnAfterCall())
{
// Constuct the RTLs for the new basic block
list<HRTL*>* rtls = new list<HRTL*>();
// The only RTL in the basic block is a high level
// return that doesn't have any RTs.
rtls->push_back(new HLReturn(0, NULL));
BasicBlock* returnBB = pCfg->newBB(rtls, RET, 0);
// Add out edge from call to return
pCfg->addOutEdge(pBB, returnBB);
// Put a label on the return BB (since it's an
// orphan); a jump will be reqd
pCfg->setLabel(returnBB);
pBB->setJumpReqd();
// Give the enclosing proc a dummy callee epilogue
pProc->setEpilogue(new CalleeEpilogue("__dummy",
list<string>()));
// Mike: do we need to set return locations?
// This ends the function
sequentialDecode = false;
}
else
{
// Add the fall through edge if the block didn't
// already exist
if (pBB != NULL)
pCfg->addOutEdge(pBB, uAddr + inst.numBytes);
}
}
}
// Create the list of RTLs for the next basic block and continue
// with the next instruction.
BB_rtls = NULL;
break;
}
case RET_HRTL:
// Stop decoding sequentially
sequentialDecode = false;
// Add the RTL to the list
BB_rtls->push_back(pRtl);
// Create the basic block
pBB = pCfg->newBB(BB_rtls, RET, 0);