268
|
1 from . import Block, Function, Statement, Temp
|
171
|
2
|
268
|
3 class NamedClassGenerator:
|
|
4 def __init__(self, prefix, cls):
|
171
|
5 self.prefix = prefix
|
268
|
6 self.cls = cls
|
171
|
7 def NumGen():
|
|
8 a = 0
|
|
9 while True:
|
|
10 yield a
|
|
11 a = a + 1
|
|
12 self.nums = NumGen()
|
268
|
13
|
174
|
14 def gen(self, prefix=None):
|
|
15 if not prefix:
|
|
16 prefix = self.prefix
|
268
|
17 return self.cls('{0}{1}'.format(prefix, self.nums.__next__()))
|
171
|
18
|
|
19
|
|
20 class Builder:
|
268
|
21 """ Base class for ir code generators """
|
249
|
22 def __init__(self):
|
268
|
23 self.prepare()
|
|
24
|
|
25 def prepare(self):
|
|
26 self.newTemp = NamedClassGenerator('reg', Temp).gen
|
|
27 self.newBlock = NamedClassGenerator('block', Block).gen
|
|
28 self.bb = None
|
|
29 self.m = None
|
|
30 self.fn = None
|
|
31 self.loc = None
|
171
|
32
|
249
|
33 # Helpers:
|
|
34 def setModule(self, m):
|
268
|
35 self.m = m
|
205
|
36
|
249
|
37 def newFunction(self, name):
|
172
|
38 f = Function(name)
|
|
39 self.m.addFunc(f)
|
|
40 return f
|
205
|
41
|
268
|
42 def setFunction(self, f):
|
|
43 self.fn = f
|
|
44 self.bb = f.entry if f else None
|
205
|
45
|
268
|
46 def setBlock(self, b):
|
|
47 self.bb = b
|
205
|
48
|
249
|
49 def setLoc(self, l):
|
|
50 self.loc = l
|
|
51
|
268
|
52 def emit(self, i):
|
|
53 assert isinstance(i, Statement)
|
249
|
54 i.debugLoc = self.loc
|
|
55 if not self.bb:
|
186
|
56 raise Exception('No basic block')
|
249
|
57 self.bb.addInstruction(i)
|
171
|
58
|