本文整理汇总了C++中BasicBlock::getExitInstruction方法的典型用法代码示例。如果您正苦于以下问题:C++ BasicBlock::getExitInstruction方法的具体用法?C++ BasicBlock::getExitInstruction怎么用?C++ BasicBlock::getExitInstruction使用的例子?那么, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在类BasicBlock
的用法示例。
在下文中一共展示了BasicBlock::getExitInstruction方法的2个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C++代码示例。
示例1: interposeBlock
void FlowGraph::interposeBlock(BasicBlock* bb){
ASSERT(bb->getNumberOfSources() == 1 && bb->getNumberOfTargets() == 1);
BasicBlock* sourceBlock = bb->getSourceBlock(0);
BasicBlock* targetBlock = bb->getTargetBlock(0);
//sourceBlock->print();
//targetBlock->print();
bool linkFound = false;
for (uint32_t i = 0; i < sourceBlock->getNumberOfTargets(); i++){
if (sourceBlock->getTargetBlock(i)->getIndex() == targetBlock->getIndex()){
linkFound = true;
break;
}
}
if (!linkFound){
function->print();
print();
sourceBlock->print();
targetBlock->print();
}
ASSERT(linkFound && "There should be a source -> target block relationship between the blocks passed to this function");
ASSERT(sourceBlock->getBaseAddress() + sourceBlock->getNumberOfBytes() != targetBlock->getBaseAddress() && "Source shouldn't fall through to target");
bb->setBaseAddress(blocks.back()->getBaseAddress() + blocks.back()->getNumberOfBytes());
bb->setIndex(basicBlocks.size());
basicBlocks.append(bb);
//PRINT_INFOR("now there are %d bbs in function %s", basicBlocks.size(), function->getName());
//PRINT_INFOR("new block has base addres %#llx", bb->getBaseAddress());
blocks.append(bb);
sourceBlock->removeTargetBlock(targetBlock);
sourceBlock->addTargetBlock(bb);
targetBlock->removeSourceBlock(sourceBlock);
targetBlock->addSourceBlock(bb);
X86Instruction* jumpToTarget = bb->getLeader();
jumpToTarget->setBaseAddress(blocks.back()->getBaseAddress() + blocks.back()->getSizeInBytes());
jumpToTarget->setIndex(0);
ASSERT(sourceBlock->getExitInstruction());
ASSERT(sourceBlock->getExitInstruction()->getAddressAnchor());
ASSERT(sourceBlock->getExitInstruction()->getTargetAddress() == targetBlock->getBaseAddress());
sourceBlock->getExitInstruction()->getAddressAnchor()->updateLink(jumpToTarget);
//bb->print();
//bb->printInstructions();
}
示例2: instrument
void TauFunctionTrace::instrument(){
//InstrumentationTool::instrument();
LineInfoFinder* lineInfoFinder = NULL;
if (hasLineInformation()){
lineInfoFinder = getLineInfoFinder();
}
InstrumentationPoint* p;
uint64_t nameAddr = reserveDataOffset(sizeof(uint64_t));
uint64_t fileAddr = reserveDataOffset(sizeof(uint64_t));
uint64_t lineAddr = reserveDataOffset(sizeof(uint32_t));
uint64_t siteIndexAddr = reserveDataOffset(sizeof(uint32_t));
uint32_t site = functionEntry->addConstantArgument();
ASSERT(site == functionExit->addConstantArgument());
std::pebil_map_type<uint64_t, ControlInfo> functions;
std::vector<uint64_t> orderedfuncs;
uint32_t sequenceId = 0;
if (doIntro){
// go over all functions and intrument entries/exits
for (uint32_t i = 0; i < getNumberOfExposedFunctions(); i++){
Function* function = getExposedFunction(i);
uint64_t addr = function->getBaseAddress();
if (instrumentList && !instrumentList->functionMatches(function->getName())){
continue;
}
if (!strcmp(function->getName(), "_fini")){
continue;
}
BasicBlock* entryBlock = function->getFlowGraph()->getEntryBlock();
Vector<BasicBlock*>* exitPoints = function->getFlowGraph()->getExitBlocks();
std::string c;
c.append(function->getName());
if (c == "_start"){
exitPoints->append(getProgramExitBlock());
PRINT_INFOR("Special case: inserting exit for _start inside _fini since control generally doesn't reach its exit");
}
ASSERT(functions.count(addr) == 0 && "Multiple functions have the same base address?");
PRINT_INFOR("[FUNCTION index=%d] internal instrumentation: %s", sequenceId, function->getName());
ControlInfo f = ControlInfo();
f.name = c;
f.file = "";
f.line = 0;
f.index = sequenceId++;
f.baseaddr = addr;
f.type = ControlType_Function;
LineInfo* li = NULL;
if (lineInfoFinder){
li = lineInfoFinder->lookupLineInfo(addr);
}
if (li){
f.file.append(li->getFileName());
f.line = li->GET(lr_line);
}
functions[addr] = f;
orderedfuncs.push_back(addr);
InstrumentationPoint* prior = addInstrumentationPoint(entryBlock->getLeader(), functionEntry, InstrumentationMode_tramp, InstLocation_prior);
prior->setPriority(InstPriority_custom3);
assignStoragePrior(prior, f.index, site);
for (uint32_t j = 0; j < exitPoints->size(); j++){
InstrumentationPoint* after = addInstrumentationPoint((*exitPoints)[j]->getExitInstruction(), functionExit, InstrumentationMode_tramp, InstLocation_prior);
after->setPriority(InstPriority_custom5);
if (c == "_start" && j == exitPoints->size() - 1){
after->setPriority(InstPriority_custom6);
}
assignStoragePrior(after, f.index, site);
}
delete exitPoints;
}
} else {
// go over all instructions. when we find a call, instrument it
for (uint32_t i = 0; i < getNumberOfExposedInstructions(); i++){
X86Instruction* x = getExposedInstruction(i);
ASSERT(x->getContainer()->isFunction());
Function* function = (Function*)x->getContainer();
if (x->isFunctionCall()){
uint64_t addr = x->getTargetAddress();
Symbol* functionSymbol = getElfFile()->lookupFunctionSymbol(addr);
if (functionSymbol){
if (instrumentList && !instrumentList->functionMatches(functionSymbol->getSymbolName())){
//.........这里部分代码省略.........