6 from xform
import foreach_inst
9 class AsmPrinter(CFGPrinter
):
11 def __init__(self
, cfg
, stream
=sys
.stdout
):
12 super().__init
__(cfg
, stream
)
17 self
.inst_printer
= self
.print_with_addr
18 self
.referenced_labels
= set()
19 self
.get_jump_labels()
21 def format_addr(self
, addr
, extra
=0):
22 return addr
.ljust(self
.addr_width
+ extra
)
24 def get_jump_labels(self
):
25 def collect_labels(inst
):
26 assert isinstance(inst
, Inst
), "Perhaps, this is structured CFG? Use --format=c for output."
27 addr
= inst
.jump_addr()
28 if isinstance(addr
, list):
29 self
.referenced_labels
.update(addr
)
30 elif addr
is not None:
31 self
.referenced_labels
.add(addr
)
32 foreach_inst(self
.cfg
, collect_labels
)
34 def print_with_addr(self
, inst
):
35 if inst
.op
== "DEAD" and self
.no_dead
:
40 return self
.format_addr(addr
, self
.inst_indent
) + " " + str(inst
)
42 def resolve_label(self
, addr
):
43 return self
.cfg
.parser
.label_from_addr(addr
)
45 def print_label(self
):
46 # If there was symbolic label originally, print it
47 # otherwise, skip it if it's not referenced by insts
48 # (like bblock start labels).
49 label
= self
.cfg
.parser
.label_from_addr(self
.addr
)
50 if label
== self
.addr
:
51 if self
.addr
not in self
.referenced_labels
:
53 print("%s %s:" % (self
.format_addr(self
.addr
), label
), file=self
.stream
)
55 def print_graph_header(self
):
57 def print_header(self
):
59 def print_separator(self
):
61 def print_trailer(self
):
65 core
.ADDR
.resolver
= self
.resolve_label