3 #ifndef ROSE_BinaryAnalysis_Dominance_H
4 #define ROSE_BinaryAnalysis_Dominance_H
5 #include <featureTests.h>
6 #ifdef ROSE_ENABLE_BINARY_ANALYSIS
8 #include <Rose/BinaryAnalysis/ControlFlow.h>
10 #include <boost/graph/depth_first_search.hpp>
11 #include <boost/graph/reverse_graph.hpp>
14 namespace BinaryAnalysis {
20 typedef boost::adjacency_list<boost::setS,
22 boost::bidirectionalS,
23 boost::property<boost::vertex_name_t, SgAsmBlock*>
26 template<
class ControlFlowGraph>
27 struct RelationMap:
public std::vector<typename boost::graph_traits<ControlFlowGraph>::vertex_descriptor> {
31 void clear_ast(
SgNode *ast) ROSE_DEPRECATED(
"Use Sawyer::Container::Algorithm::graphDominators");
33 template<
class DominanceGraph>
34 void apply_to_ast(
const DominanceGraph &idg)
35 ROSE_DEPRECATED(
"Use Sawyer::Container::Algorithm::graphDominators");
37 template<
class ControlFlowGraph>
39 ROSE_DEPRECATED(
"Use Sawyer::Container::Algorithm::graphDominators");
41 template<
class DominanceGraph>
42 void cache_vertex_descriptors(
const DominanceGraph&)
43 ROSE_DEPRECATED("Use
Sawyer::Container::Algorithm::graphDominators");
46 ROSE_DEPRECATED("Use
Sawyer::Container::Algorithm::graphDominators");
49 template<class ControlFlowGraph>
51 build_idom_relation_from_cfg(const ControlFlowGraph &cfg,
52 typename
boost::graph_traits<ControlFlowGraph>::vertex_descriptor start)
53 ROSE_DEPRECATED("Use
Sawyer::Container::Algorithm::graphDominators");
55 template<class ControlFlowGraph>
56 void build_idom_relation_from_cfg(const ControlFlowGraph &cfg,
57 typename
boost::graph_traits<ControlFlowGraph>::vertex_descriptor start,
59 ROSE_DEPRECATED("Use
Sawyer::Container::Algorithm::graphDominators");
61 template<class ControlFlowGraph>
63 build_postdom_relation_from_cfg(const ControlFlowGraph &cfg,
64 typename
boost::graph_traits<ControlFlowGraph>::vertex_descriptor start)
65 ROSE_DEPRECATED("Use
Sawyer::Container::Algorithm::graphDominators");
67 template<class ControlFlowGraph>
69 build_postdom_relation_from_cfg(const ControlFlowGraph &cfg,
70 typename
boost::graph_traits<ControlFlowGraph>::vertex_descriptor start,
71 typename
boost::graph_traits<ControlFlowGraph>::vertex_descriptor stop)
72 ROSE_DEPRECATED("Use
Sawyer::Container::Algorithm::graphDominators");
74 template<class ControlFlowGraph>
75 void build_postdom_relation_from_cfg(const ControlFlowGraph &cfg,
76 typename
boost::graph_traits<ControlFlowGraph>::vertex_descriptor start,
78 ROSE_DEPRECATED("Use
Sawyer::Container::Algorithm::graphDominators");
80 template<class ControlFlowGraph>
81 void build_postdom_relation_from_cfg(const ControlFlowGraph &cfg,
82 typename
boost::graph_traits<ControlFlowGraph>::vertex_descriptor start,
83 typename
boost::graph_traits<ControlFlowGraph>::vertex_descriptor stop,
85 ROSE_DEPRECATED("Use
Sawyer::Container::Algorithm::graphDominators");
88 template<class DominanceGraph, class ControlFlowGraph>
89 DominanceGraph build_idom_graph_from_cfg(const ControlFlowGraph &cfg,
90 typename
boost::graph_traits<ControlFlowGraph>::vertex_descriptor start)
91 ROSE_DEPRECATED("Use
Sawyer::Container::Algorithm::graphDominators");
93 template<class ControlFlowGraph, class DominanceGraph>
94 void build_idom_graph_from_cfg(const ControlFlowGraph &cfg,
95 typename
boost::graph_traits<ControlFlowGraph>::vertex_descriptor start,
97 ROSE_DEPRECATED("Use
Sawyer::Container::Algorithm::graphDominators");
99 template<class DominanceGraph, class ControlFlowGraph>
100 DominanceGraph build_postdom_graph_from_cfg(const ControlFlowGraph &cfg,
101 typename
boost::graph_traits<ControlFlowGraph>::vertex_descriptor start)
102 ROSE_DEPRECATED("Use
Sawyer::Container::Algorithm::graphDominators");
104 template<class DominanceGraph, class ControlFlowGraph>
105 DominanceGraph build_postdom_graph_from_cfg(const ControlFlowGraph &cfg,
106 typename
boost::graph_traits<ControlFlowGraph>::vertex_descriptor start,
107 typename
boost::graph_traits<ControlFlowGraph>::vertex_descriptor stop)
108 ROSE_DEPRECATED("Use
Sawyer::Container::Algorithm::graphDominators");
110 template<class ControlFlowGraph, class DominanceGraph>
111 void build_postdom_graph_from_cfg(const ControlFlowGraph &cfg,
112 typename
boost::graph_traits<ControlFlowGraph>::vertex_descriptor start,
114 ROSE_DEPRECATED("Use
Sawyer::Container::Algorithm::graphDominators");
116 template<class ControlFlowGraph, class DominanceGraph>
117 void build_postdom_graph_from_cfg(const ControlFlowGraph &cfg,
118 typename
boost::graph_traits<ControlFlowGraph>::vertex_descriptor start,
119 typename
boost::graph_traits<ControlFlowGraph>::vertex_descriptor stop,
121 ROSE_DEPRECATED("Use
Sawyer::Container::Algorithm::graphDominators");
124 template<class DominanceGraph, class ControlFlowGraph>
125 DominanceGraph build_graph_from_relation(const ControlFlowGraph &cfg,
127 ROSE_DEPRECATED("Use
Sawyer::Container::Algorithm::graphDominators");
129 template<class ControlFlowGraph, class DominanceGraph>
130 void build_graph_from_relation(const ControlFlowGraph &cfg,
133 ROSE_DEPRECATED("Use
Sawyer::Container::Algorithm::graphDominators");
135 void set_debug(FILE *debug) { this->debug = debug; }
137 FILE *get_debug()
const {
return debug; }
147 template<
class DominanceGraph>
149 Dominance::apply_to_ast(
const DominanceGraph &idg)
152 fprintf(debug,
"Rose::BinaryAnalysis::Dominance::apply_to_ast:\n");
154 typename boost::graph_traits<DominanceGraph>::edge_iterator ei, ei_end;
155 for (boost::tie(ei, ei_end)=edges(idg); ei!=ei_end; ++ei) {
156 SgAsmBlock *dom_block =
get(boost::vertex_name, idg, source(*ei, idg));
157 SgAsmBlock *sub_block =
get(boost::vertex_name, idg, target(*ei, idg));
159 fprintf(debug,
" edge (d,s) = (%" PRIuPTR
",%" PRIuPTR
") = (0x%08" PRIx64
", 0x%08" PRIx64
")\n",
166 template<
class ControlFlowGraph>
168 Dominance::apply_to_ast(
const ControlFlowGraph &cfg,
169 const RelationMap<ControlFlowGraph> &idom)
171 typedef typename boost::graph_traits<ControlFlowGraph>::vertex_descriptor CFG_Vertex;
173 assert(idom.size()<=num_vertices(cfg));
174 for (
size_t subordinate=0; subordinate<idom.size(); subordinate++) {
175 SgAsmBlock *sub_block =
get(boost::vertex_name, cfg, (CFG_Vertex)subordinate);
176 if (sub_block && idom[subordinate]!=boost::graph_traits<ControlFlowGraph>::null_vertex()) {
177 CFG_Vertex dominator = idom[subordinate];
178 SgAsmBlock *dom_block =
get(boost::vertex_name, cfg, dominator);
184 template<
class DominanceGraph>
186 Dominance::cache_vertex_descriptors(
const DominanceGraph &dg)
188 typename boost::graph_traits<DominanceGraph>::vertex_iterator vi, vi_end;
189 for (boost::tie(vi, vi_end)=vertices(dg); vi!=vi_end; ++vi) {
190 SgAsmBlock *block =
get(boost::vertex_name, dg, *vi);
201 template<
class ControlFlowGraph,
class DominanceGraph>
203 Dominance::build_idom_graph_from_cfg(
const ControlFlowGraph &cfg,
204 typename boost::graph_traits<ControlFlowGraph>::vertex_descriptor start,
205 DominanceGraph &result)
207 RelationMap<ControlFlowGraph> idoms;
208 build_idom_relation_from_cfg(cfg, start, idoms);
209 build_graph_from_relation(cfg, idoms, result);
212 template<
class DominanceGraph,
class ControlFlowGraph>
214 Dominance::build_idom_graph_from_cfg(
const ControlFlowGraph &cfg,
215 typename boost::graph_traits<ControlFlowGraph>::vertex_descriptor start)
218 build_idom_graph_from_cfg(cfg, start, dg);
222 template<
class ControlFlowGraph>
223 Dominance::RelationMap<ControlFlowGraph>
224 Dominance::build_idom_relation_from_cfg(
const ControlFlowGraph &cfg,
225 typename boost::graph_traits<ControlFlowGraph>::vertex_descriptor start)
227 RelationMap<ControlFlowGraph> idom;
228 build_idom_relation_from_cfg(cfg, start, idom);
264 template<
class ControlFlowGraph>
266 Dominance::build_idom_relation_from_cfg(
const ControlFlowGraph &cfg,
267 typename boost::graph_traits<ControlFlowGraph>::vertex_descriptor start,
268 RelationMap<ControlFlowGraph> &result)
270 typedef typename boost::graph_traits<ControlFlowGraph>::vertex_descriptor CFG_Vertex;
272 struct debug_dom_set {
273 debug_dom_set(FILE *debug,
size_t vertex_i,
size_t idom_i,
274 const std::vector<size_t> &domsets,
const std::vector<CFG_Vertex> &flowlist) {
276 fprintf(debug,
"{ #%" PRIuPTR
"(%" PRIuPTR
")", vertex_i, flowlist[vertex_i]);
277 for (
size_t d=idom_i; d!=vertex_i; vertex_i=d, d=domsets[d])
278 fprintf(debug,
" #%" PRIuPTR
"(%" PRIuPTR
")", d, flowlist[d]);
279 fprintf(debug,
" }");
285 fprintf(debug,
"Rose::BinaryAnalysis::Dominance::build_idom_relation_from_cfg: starting at vertex %" PRIuPTR
"\n", start);
286 SgAsmBlock *block =
get(boost::vertex_name, cfg, start);
289 fprintf(debug,
" Vertex %" PRIuPTR
" is %s block of", start, func->
get_entry_block()==block?
"the entry":
"a");
291 fprintf(debug,
" an unnamed function");
293 fprintf(debug,
" function <%s>", func->
get_name().c_str());
295 fprintf(debug,
" at 0x%08" PRIx64
"\n", func->
get_entry_va());
300 std::vector<size_t> rflowlist;
301 std::vector<CFG_Vertex> flowlist = ControlFlow().flow_order(cfg, start, &rflowlist);
302 std::vector<size_t> idom(flowlist.size());
303 for (
size_t i=0; i<flowlist.size(); i++)
307 fprintf(debug,
" CFG:\n");
308 typename boost::graph_traits<ControlFlowGraph>::vertex_iterator vi, vi_end;
309 for (boost::tie(vi, vi_end)=vertices(cfg); vi!=vi_end; ++vi) {
310 SgAsmBlock *block =
get(boost::vertex_name, cfg, *vi);
311 fprintf(debug,
" %" PRIuPTR
" 0x%08" PRIx64
" --> {", (
size_t)(*vi), block?block->
get_address():0);
312 typename boost::graph_traits<ControlFlowGraph>::out_edge_iterator ei, ei_end;
313 for (boost::tie(ei, ei_end)=out_edges(*vi, cfg); ei!=ei_end; ++ei) {
314 fprintf(debug,
" %" PRIuPTR
"", (
size_t)target(*ei, cfg));
316 fprintf(debug,
" }\n");
319 fprintf(debug,
" Note: notation #M(N) means CFG vertex N at position M in the flow list.\n");
320 fprintf(debug,
" Flowlist: {");
321 for (
size_t i=0; i<flowlist.size(); i++) {
322 fprintf(debug,
" #%" PRIuPTR
"(%" PRIuPTR
")", i, (
size_t)flowlist[i]);
323 assert((
size_t)flowlist[i]<rflowlist.size());
324 assert(rflowlist[flowlist[i]]==i);
326 fprintf(debug,
" }\n");
334 fprintf(debug,
" Next pass through vertices...\n");
335 for (
size_t vertex_i=0; vertex_i<flowlist.size(); vertex_i++) {
336 CFG_Vertex vertex = flowlist[vertex_i];
338 fprintf(debug,
" vertex #%" PRIuPTR
"(%" PRIuPTR
")", (
size_t)vertex_i, (
size_t)vertex);
340 fprintf(debug,
" [skipping start vertex]\n");
342 fprintf(debug,
" dominators are ");
343 debug_dom_set(debug, vertex_i, idom[vertex_i], idom, flowlist);
344 fprintf(debug,
"\n");
349 typename boost::graph_traits<ControlFlowGraph>::in_edge_iterator pi, pi_end;
350 size_t new_idom = vertex_i;
351 for (boost::tie(pi, pi_end)=in_edges(vertex, cfg); pi!=pi_end; ++pi) {
352 CFG_Vertex predecessor = source(*pi, cfg);
353 assert(predecessor>=0 && predecessor<rflowlist.size());
354 size_t predecessor_i = rflowlist[predecessor];
356 fprintf(debug,
" pred #%zd(%" PRIuPTR
")", (
size_t)predecessor_i, (
size_t)predecessor);
360 if (predecessor!=vertex && predecessor_i!=boost::graph_traits<ControlFlowGraph>::null_vertex()) {
361 if (predecessor==start) {
362 new_idom = predecessor_i;
364 fprintf(debug,
"; new doms of #%" PRIuPTR
"(%" PRIuPTR
") are ", vertex_i, vertex);
365 debug_dom_set(debug, vertex_i, predecessor_i, idom, flowlist);
367 }
else if (idom[predecessor_i]!=predecessor_i) {
368 if (new_idom==vertex_i) {
369 new_idom = predecessor_i;
371 fprintf(debug,
"; new doms of #%" PRIuPTR
"(%" PRIuPTR
") are ", vertex_i, vertex);
372 debug_dom_set(debug, vertex_i, predecessor_i, idom, flowlist);
376 fprintf(debug,
"; new doms of #%" PRIuPTR
"(%" PRIuPTR
") are intersect(", vertex_i, vertex);
377 debug_dom_set(debug, vertex_i, new_idom, idom, flowlist);
378 fprintf(debug,
", ");
379 debug_dom_set(debug, vertex_i, predecessor_i, idom, flowlist);
381 size_t f1=new_idom, f2=predecessor_i;
390 fprintf(debug,
") = ");
391 debug_dom_set(debug, vertex_i, new_idom, idom, flowlist);
397 fprintf(debug,
"\n");
399 if (idom[vertex_i]!=new_idom) {
400 idom[vertex_i] = new_idom;
409 result.resize(num_vertices(cfg), boost::graph_traits<ControlFlowGraph>::null_vertex());
410 for (
size_t i=0; i<flowlist.size(); i++) {
412 result[flowlist[i]] = flowlist[idom[i]];
416 fprintf(debug,
" Final dom sets:\n");
417 for (
size_t vertex_i=0; vertex_i<flowlist.size(); vertex_i++) {
418 CFG_Vertex vertex = flowlist[vertex_i];
419 fprintf(debug,
" #%" PRIuPTR
"(%" PRIuPTR
") has dominators ", (
size_t)vertex_i, (
size_t)vertex);
420 debug_dom_set(debug, vertex_i, idom[vertex_i], idom, flowlist);
421 fprintf(debug,
"\n");
423 fprintf(debug,
" Final result:\n");
424 for (
size_t i=0; i<result.size(); i++) {
425 if (result[i]==boost::graph_traits<ControlFlow::Graph>::null_vertex()) {
426 fprintf(debug,
" CFG vertex %" PRIuPTR
" has no immediate dominator\n", i);
428 fprintf(debug,
" CFG vertex %" PRIuPTR
" has immediate dominator %" PRIuPTR
"\n", i, result[i]);
442 template<
class ControlFlowGraph,
class DominanceGraph>
444 Dominance::build_postdom_graph_from_cfg(
const ControlFlowGraph &cfg,
445 typename boost::graph_traits<ControlFlowGraph>::vertex_descriptor start,
446 DominanceGraph &result)
448 RelationMap<ControlFlowGraph> pdoms;
449 build_postdom_relation_from_cfg(cfg, start, pdoms);
450 build_graph_from_relation(cfg, pdoms, result);
453 template<
class ControlFlowGraph,
class DominanceGraph>
455 Dominance::build_postdom_graph_from_cfg(
const ControlFlowGraph &cfg,
456 typename boost::graph_traits<ControlFlowGraph>::vertex_descriptor start,
457 typename boost::graph_traits<ControlFlowGraph>::vertex_descriptor stop,
458 DominanceGraph &result)
460 RelationMap<ControlFlowGraph> pdoms;
461 build_postdom_relation_from_cfg(cfg, start, stop, pdoms);
462 build_graph_from_relation(cfg, pdoms, result);
465 template<
class DominanceGraph,
class ControlFlowGraph>
467 Dominance::build_postdom_graph_from_cfg(
const ControlFlowGraph &cfg,
468 typename boost::graph_traits<ControlFlowGraph>::vertex_descriptor start)
471 build_postdom_graph_from_cfg(cfg, start, dg);
475 template<
class DominanceGraph,
class ControlFlowGraph>
477 Dominance::build_postdom_graph_from_cfg(
const ControlFlowGraph &cfg,
478 typename boost::graph_traits<ControlFlowGraph>::vertex_descriptor start,
479 typename boost::graph_traits<ControlFlowGraph>::vertex_descriptor stop)
482 build_postdom_graph_from_cfg(cfg, start, stop, dg);
486 template<
class ControlFlowGraph>
487 Dominance::RelationMap<ControlFlowGraph>
488 Dominance::build_postdom_relation_from_cfg(
const ControlFlowGraph &cfg,
489 typename boost::graph_traits<ControlFlowGraph>::vertex_descriptor start)
491 RelationMap<ControlFlowGraph> pdom;
492 build_postdom_relation_from_cfg(cfg, start, pdom);
496 template<
class ControlFlowGraph>
497 Dominance::RelationMap<ControlFlowGraph>
498 Dominance::build_postdom_relation_from_cfg(
const ControlFlowGraph &cfg,
499 typename boost::graph_traits<ControlFlowGraph>::vertex_descriptor start,
500 typename boost::graph_traits<ControlFlowGraph>::vertex_descriptor stop)
502 RelationMap<ControlFlowGraph> pdom;
503 build_postdom_relation_from_cfg(cfg, start, stop, pdom);
507 template<
class ControlFlowGraph>
509 Dominance::build_postdom_relation_from_cfg(
const ControlFlowGraph &cfg,
510 typename boost::graph_traits<ControlFlowGraph>::vertex_descriptor start,
511 typename boost::graph_traits<ControlFlowGraph>::vertex_descriptor stop,
512 RelationMap<ControlFlowGraph> &result)
516 fprintf(debug,
" Calling build_idom_relation_from_cfg() on reversed CFG...\n");
517 typedef typename boost::reverse_graph<ControlFlowGraph> ReversedControlFlowGraph;
518 ReversedControlFlowGraph rcfg(cfg);
519 RelationMap<ReversedControlFlowGraph> rrelation;
520 build_idom_relation_from_cfg(rcfg, stop, rrelation);
521 result.assign(rrelation.begin(), rrelation.end());
524 template<
class ControlFlowGraph>
526 Dominance::build_postdom_relation_from_cfg(
const ControlFlowGraph &cfg,
527 typename boost::graph_traits<ControlFlowGraph>::vertex_descriptor start,
528 RelationMap<ControlFlowGraph> &result)
531 fprintf(debug,
"Rose::BinaryAnalysis::Dominance::build_postdom_relation_from_cfg: starting at vertex %" PRIuPTR
"\n", start);
532 SgAsmBlock *block =
get(boost::vertex_name, cfg, start);
535 fprintf(debug,
" Vertex %" PRIuPTR
" is %s block of", start, func->
get_entry_block()==block?
"the entry":
"a");
537 fprintf(debug,
" an unnamed function");
539 fprintf(debug,
" function <%s>", func->
get_name().c_str());
541 fprintf(debug,
" at 0x%08" PRIx64
"\n", func->
get_entry_va());
547 typedef typename boost::graph_traits<ControlFlowGraph>::vertex_descriptor CFG_Vertex;
548 std::vector<CFG_Vertex> retblocks = ControlFlow().return_blocks(cfg, start);
549 if (1==retblocks.size()) {
551 fprintf(debug,
" CFG has unique exit vertex %" PRIuPTR
", block 0x%08" PRIx64
"\n",
553 get(boost::vertex_name, cfg, retblocks[0])->get_address());
554 build_postdom_relation_from_cfg(cfg, start, retblocks[0], result);
555 }
else if (0==retblocks.size()) {
562 fprintf(debug,
" CFG has no exit or terminal vertex; post-dominance cannot be calculated\n");
563 result.insert(result.begin(), num_vertices(cfg), boost::graph_traits<ControlFlowGraph>::null_vertex());
566 ControlFlowGraph cfg_copy = cfg;
567 assert(!retblocks.empty());
568 CFG_Vertex unique_exit = add_vertex(cfg_copy);
569 put(boost::vertex_name, cfg_copy, unique_exit, (
SgAsmBlock*)0);
570 for (
size_t i=0; i<retblocks.size(); i++)
571 add_edge(retblocks[i], unique_exit, cfg_copy);
573 fprintf(debug,
" CFG has %" PRIuPTR
" exit blocks. Added unique exit vertex %" PRIuPTR
"\n", retblocks.size(), unique_exit);
576 build_postdom_relation_from_cfg(cfg_copy, start, unique_exit, result);
579 assert(unique_exit+1==num_vertices(cfg_copy));
581 for (
size_t i=0; i<result.size(); ++i) {
582 if (result[i]>=result.size())
583 result[i] = boost::graph_traits<ControlFlowGraph>::null_vertex();
588 fprintf(debug,
" Final result:\n");
589 for (
size_t i=0; i<result.size(); i++) {
590 if (result[i]==boost::graph_traits<ControlFlowGraph>::null_vertex()) {
591 fprintf(debug,
" CFG vertex %" PRIuPTR
" has no immediate post dominator\n", i);
593 fprintf(debug,
" CFG vertex %" PRIuPTR
" has immediate post dominator %" PRIuPTR
"\n", i, result[i]);
606 template<
class DominanceGraph,
class ControlFlowGraph>
608 Dominance::build_graph_from_relation(
const ControlFlowGraph &cfg,
609 const RelationMap<ControlFlowGraph> &relmap)
612 build_graph_from_relation(cfg, relmap, g);
616 template<
class ControlFlowGraph,
class DominanceGraph>
618 Dominance::build_graph_from_relation(
const ControlFlowGraph &cfg,
619 const RelationMap<ControlFlowGraph> &relmap,
622 typedef typename boost::graph_traits<DominanceGraph>::vertex_descriptor D_Vertex;
623 typedef typename boost::graph_traits<ControlFlowGraph>::vertex_descriptor CFG_Vertex;
626 fprintf(debug,
"Rose::BinaryAnalysis::Dominance::build_graph_from_relation:\n");
627 fprintf(debug,
" building from this relation:\n");
628 for (
size_t i=0; i<relmap.size(); i++) {
629 if (relmap[i]==boost::graph_traits<ControlFlowGraph>::null_vertex()) {
630 fprintf(debug,
" CFG vertex %" PRIuPTR
" has no immediate dominator\n", i);
632 fprintf(debug,
" CFG vertex %" PRIuPTR
" has immediate dominator %" PRIuPTR
"\n", i, relmap[i]);
638 typename boost::graph_traits<ControlFlowGraph>::vertex_iterator vi, vi_end;
639 for (boost::tie(vi, vi_end)=vertices(cfg); vi!=vi_end; vi++) {
640 D_Vertex v = add_vertex(dg);
642 SgAsmBlock *block =
get(boost::vertex_name, cfg, *vi);
643 put(boost::vertex_name, dg, v, block);
645 for (boost::tie(vi, vi_end)=vertices(cfg); vi!=vi_end; vi++) {
646 CFG_Vertex subordinate = *vi;
647 CFG_Vertex dominator = relmap[subordinate];
648 if (dominator!=boost::graph_traits<ControlFlowGraph>::null_vertex()) {
650 fprintf(debug,
" adding edge (d,s) = (%" PRIuPTR
",%" PRIuPTR
")\n", dominator, subordinate);
651 add_edge(dominator, subordinate, dg);
void set_cached_vertex(size_t)
Property: Cached vertex for control flow graphs.
SgAsmBlock * get_entry_block() const
Function entry basic block.
Represents a synthesized function.
Main namespace for the ROSE library.
Name space for the entire library.
void set_immediate_dominator(SgAsmBlock *)
Property: Holds the immediate dominator block in the control flow graph.
const std::string & get_name() const
Property: Name.
This class represents the base class for all IR nodes within Sage III.
SgAsmFunction * get_enclosing_function() const
Returns the function that owns this block.
rose_addr_t get_entry_va() const
Property: Primary entry address.
rose_addr_t get_address() const
Property: Starting virtual address.