/* * Converts blocks to functions (is not part of Jeremiahs disassembler - and also IDA) * deprecated! */ void RoseBin_FlowAnalysis::convertBlocksToFunctions(SgAsmNode* globalNode) { vector<SgNode*> tree =NodeQuery::querySubTree(globalNode, V_SgAsmBlock); vector<SgNode*>::iterator itV = tree.begin(); //cerr << " ObjDump-BinRose:: Converting Blocks To Functions" << endl; for (;itV!=tree.end();itV++) { SgAsmBlock* block = isSgAsmBlock(*itV); if (block && block!=globalNode) { uint64_t addr = block->get_address(); isSgAsmBlock(globalNode)->remove_statement(block); block->set_parent(NULL); SgAsmFunction* func = new SgAsmFunction(addr, RoseBin_support::HexToString(addr)); ROSE_ASSERT(g_algo->info); g_algo->info->returnTargets[func].insert(g_algo->info->returnTargets[block].begin(), g_algo->info->returnTargets[block].end()); isSgAsmBlock(globalNode)->append_statement(func); func->set_parent(globalNode); vector <SgNode*> vec =block->get_traversalSuccessorContainer(); for (unsigned int itf = 0; itf < vec.size() ; itf++) { SgAsmInstruction* finst = isSgAsmInstruction(vec[itf]); finst->set_parent(func); func->append_statement(finst); } block->remove_children(); } } // string filename="_binary_tree_func.dot"; //AST_BIN_Traversal* trav = new AST_BIN_Traversal(); //trav->run(globalNode, filename); }
/* * This function removes blocks, so functions contain only instructions * deprecated! */ void RoseBin_FlowAnalysis::flattenBlocks(SgAsmNode* globalNode) { vector<SgNode*> tree =NodeQuery::querySubTree(globalNode, V_SgAsmBlock); vector<SgNode*>::iterator itV = tree.begin(); //cerr << " ObjDump-BinRose:: Removing Blocks " << endl; for (;itV!=tree.end();itV++) { SgAsmBlock* block = isSgAsmBlock(*itV); if (block && block!=globalNode) { SgAsmFunction* func = isSgAsmFunction(block->get_parent()); if (func) { ROSE_ASSERT(g_algo->info); g_algo->info->returnTargets[func].insert(g_algo->info->returnTargets[block].begin(), g_algo->info->returnTargets[block].end()); vector <SgNode*> vec =block->get_traversalSuccessorContainer(); for (unsigned int itf = 0; itf < vec.size() ; itf++) { SgAsmInstruction* finst = isSgAsmInstruction(vec[itf]); finst->set_parent(func); func->append_statement(finst); } func->remove_statement(block); } } } }