github/workflows/pycopy-test: Upgrade Pycopy to 3.6.1.
[ScratchABlock.git] / asmprinter.py
blobe9178f046dba9439bcae9c7bcc42fe5ae6b67cf6
1 import sys
2 import argparse
3 from parser import *
4 import core
5 import dot
6 from xform import foreach_inst
9 class AsmPrinter(CFGPrinter):
11 def __init__(self, cfg, stream=sys.stdout):
12 super().__init__(cfg, stream)
13 self.addr_width = 8
14 self.inst_indent = 4
15 self.no_dead = False
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:
36 return
37 addr = inst.addr
38 if addr is None:
39 addr = "?"
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:
52 return
53 print("%s %s:" % (self.format_addr(self.addr), label), file=self.stream)
55 def print_graph_header(self):
56 pass
57 def print_header(self):
58 pass
59 def print_separator(self):
60 pass
61 def print_trailer(self):
62 pass
64 def print(self):
65 core.ADDR.resolver = self.resolve_label
66 super().print()
69 def dump_asm(cfg):
70 p = AsmPrinter(cfg)
71 p.print()