14 ROSE_ASSERT(!get_statementList().empty());
16 ROSE_ASSERT(last!=NULL);
27 for (SgAsmStatementPtrList::const_iterator si=stmts.begin(); si!=stmts.end(); ++si) {
39 return (prefix +
"L = left over blocks N = NOP/zero padding F = fragment\n" +
40 prefix +
"J = jump table E = Function entry\n" +
41 prefix +
"H = CFG head U = user-def reason M = miscellaneous\n" +
42 prefix +
"1 = first CFG traversal 2 = second CFG traversal 3 = third CFG traversal\n");
49 return reason_str(do_pad, get_reason());
61 if (r & BLK_LEFTOVERS) {
63 }
else if (r & BLK_PADDING) {
65 }
else if (r & BLK_FRAGMENT) {
67 }
else if (r & BLK_JUMPTABLE) {
73 if (r & BLK_CFGHEAD) {
75 }
else if (r & BLK_GRAPH1) {
77 }
else if (r & BLK_GRAPH2) {
83 if (r & BLK_USERDEF) {
86 char abbr[32], full[64];
87 int width = snprintf(abbr,
sizeof abbr,
"%u", BLK_MISCMASK);
88 snprintf(abbr,
sizeof abbr,
"M%0*u", width, (r & BLK_MISCMASK));
89 abbr[
sizeof(abbr)-1] =
'\0';
92 if (miscname.empty() || miscname[0]==
'(') {
93 snprintf(full,
sizeof full,
"misc-%u", (r & BLK_MISCMASK));
95 for (
size_t i=0; i<miscname.size(); ++i)
96 miscname[i] = tolower(miscname[i]);
97 strncpy(full, miscname.c_str(),
sizeof full);
99 full[
sizeof(full)-1] =
'\0';
119 target_va = return_va = INVALID_ADDR;;
120 if (!is_basic_block())
122 std::vector<SgAsmInstruction*> insns = SageInterface::querySubTree<SgAsmInstruction>(
this);
123 assert(!insns.empty());
127 SgAsmFunction *func = SageInterface::getEnclosingNode<SgAsmFunction>(
this);
129 std::set<rose_addr_t> callee_vas;
133 for (SgAsmIntegerValuePtrList::const_iterator si=successors.begin(); si!=successors.end(); ++si) {
134 rose_addr_t successor_va = (*si)->get_absolute_value();
135 if (
SgAsmInstruction *target_insn = imap.get_value_or(successor_va, NULL)) {
136 SgAsmFunction *target_func = SageInterface::getEnclosingNode<SgAsmFunction>(target_insn);
138 callee_vas.insert(successor_va);
139 }
else if (return_va!=INVALID_ADDR) {
140 target_va = return_va = INVALID_ADDR;
143 return_va = successor_va;
151 bool retval = insns.front()->is_function_call(insns, &target_va, &return_va);
153 target_va = return_va = INVALID_ADDR;
154 }
else if (INVALID_ADDR==target_va && 1==callee_vas.size()) {
155 target_va = *callee_vas.begin();