annotate python/ir/builder.py @ 270:cdc76d183bcc

first register allocator
author Windel Bouwman
date Mon, 19 Aug 2013 21:14:28 +0200
parents 5ec7580976d9
children
rev   line source
268
5ec7580976d9 Op naar tree-IR
Windel Bouwman
parents: 249
diff changeset
1 from . import Block, Function, Statement, Temp
171
3eb9b9e2958d Improved IR code
Windel Bouwman
parents:
diff changeset
2
268
5ec7580976d9 Op naar tree-IR
Windel Bouwman
parents: 249
diff changeset
3 class NamedClassGenerator:
5ec7580976d9 Op naar tree-IR
Windel Bouwman
parents: 249
diff changeset
4 def __init__(self, prefix, cls):
171
3eb9b9e2958d Improved IR code
Windel Bouwman
parents:
diff changeset
5 self.prefix = prefix
268
5ec7580976d9 Op naar tree-IR
Windel Bouwman
parents: 249
diff changeset
6 self.cls = cls
171
3eb9b9e2958d Improved IR code
Windel Bouwman
parents:
diff changeset
7 def NumGen():
3eb9b9e2958d Improved IR code
Windel Bouwman
parents:
diff changeset
8 a = 0
3eb9b9e2958d Improved IR code
Windel Bouwman
parents:
diff changeset
9 while True:
3eb9b9e2958d Improved IR code
Windel Bouwman
parents:
diff changeset
10 yield a
3eb9b9e2958d Improved IR code
Windel Bouwman
parents:
diff changeset
11 a = a + 1
3eb9b9e2958d Improved IR code
Windel Bouwman
parents:
diff changeset
12 self.nums = NumGen()
268
5ec7580976d9 Op naar tree-IR
Windel Bouwman
parents: 249
diff changeset
13
174
3eb06f5fb987 Added memory alloc for locals
Windel Bouwman
parents: 172
diff changeset
14 def gen(self, prefix=None):
3eb06f5fb987 Added memory alloc for locals
Windel Bouwman
parents: 172
diff changeset
15 if not prefix:
3eb06f5fb987 Added memory alloc for locals
Windel Bouwman
parents: 172
diff changeset
16 prefix = self.prefix
268
5ec7580976d9 Op naar tree-IR
Windel Bouwman
parents: 249
diff changeset
17 return self.cls('{0}{1}'.format(prefix, self.nums.__next__()))
171
3eb9b9e2958d Improved IR code
Windel Bouwman
parents:
diff changeset
18
3eb9b9e2958d Improved IR code
Windel Bouwman
parents:
diff changeset
19
3eb9b9e2958d Improved IR code
Windel Bouwman
parents:
diff changeset
20 class Builder:
268
5ec7580976d9 Op naar tree-IR
Windel Bouwman
parents: 249
diff changeset
21 """ Base class for ir code generators """
249
e41e4109addd Added current position arrow
Windel Bouwman
parents: 243
diff changeset
22 def __init__(self):
268
5ec7580976d9 Op naar tree-IR
Windel Bouwman
parents: 249
diff changeset
23 self.prepare()
5ec7580976d9 Op naar tree-IR
Windel Bouwman
parents: 249
diff changeset
24
5ec7580976d9 Op naar tree-IR
Windel Bouwman
parents: 249
diff changeset
25 def prepare(self):
5ec7580976d9 Op naar tree-IR
Windel Bouwman
parents: 249
diff changeset
26 self.newTemp = NamedClassGenerator('reg', Temp).gen
5ec7580976d9 Op naar tree-IR
Windel Bouwman
parents: 249
diff changeset
27 self.newBlock = NamedClassGenerator('block', Block).gen
5ec7580976d9 Op naar tree-IR
Windel Bouwman
parents: 249
diff changeset
28 self.bb = None
5ec7580976d9 Op naar tree-IR
Windel Bouwman
parents: 249
diff changeset
29 self.m = None
5ec7580976d9 Op naar tree-IR
Windel Bouwman
parents: 249
diff changeset
30 self.fn = None
5ec7580976d9 Op naar tree-IR
Windel Bouwman
parents: 249
diff changeset
31 self.loc = None
171
3eb9b9e2958d Improved IR code
Windel Bouwman
parents:
diff changeset
32
249
e41e4109addd Added current position arrow
Windel Bouwman
parents: 243
diff changeset
33 # Helpers:
e41e4109addd Added current position arrow
Windel Bouwman
parents: 243
diff changeset
34 def setModule(self, m):
268
5ec7580976d9 Op naar tree-IR
Windel Bouwman
parents: 249
diff changeset
35 self.m = m
205
d77cb5962cc5 Added some handcoded arm code generation
Windel Bouwman
parents: 204
diff changeset
36
249
e41e4109addd Added current position arrow
Windel Bouwman
parents: 243
diff changeset
37 def newFunction(self, name):
172
5a7d37d615ee Added function to IR
Windel Bouwman
parents: 171
diff changeset
38 f = Function(name)
5a7d37d615ee Added function to IR
Windel Bouwman
parents: 171
diff changeset
39 self.m.addFunc(f)
5a7d37d615ee Added function to IR
Windel Bouwman
parents: 171
diff changeset
40 return f
205
d77cb5962cc5 Added some handcoded arm code generation
Windel Bouwman
parents: 204
diff changeset
41
268
5ec7580976d9 Op naar tree-IR
Windel Bouwman
parents: 249
diff changeset
42 def setFunction(self, f):
5ec7580976d9 Op naar tree-IR
Windel Bouwman
parents: 249
diff changeset
43 self.fn = f
5ec7580976d9 Op naar tree-IR
Windel Bouwman
parents: 249
diff changeset
44 self.bb = f.entry if f else None
205
d77cb5962cc5 Added some handcoded arm code generation
Windel Bouwman
parents: 204
diff changeset
45
268
5ec7580976d9 Op naar tree-IR
Windel Bouwman
parents: 249
diff changeset
46 def setBlock(self, b):
5ec7580976d9 Op naar tree-IR
Windel Bouwman
parents: 249
diff changeset
47 self.bb = b
205
d77cb5962cc5 Added some handcoded arm code generation
Windel Bouwman
parents: 204
diff changeset
48
249
e41e4109addd Added current position arrow
Windel Bouwman
parents: 243
diff changeset
49 def setLoc(self, l):
e41e4109addd Added current position arrow
Windel Bouwman
parents: 243
diff changeset
50 self.loc = l
e41e4109addd Added current position arrow
Windel Bouwman
parents: 243
diff changeset
51
268
5ec7580976d9 Op naar tree-IR
Windel Bouwman
parents: 249
diff changeset
52 def emit(self, i):
5ec7580976d9 Op naar tree-IR
Windel Bouwman
parents: 249
diff changeset
53 assert isinstance(i, Statement)
249
e41e4109addd Added current position arrow
Windel Bouwman
parents: 243
diff changeset
54 i.debugLoc = self.loc
e41e4109addd Added current position arrow
Windel Bouwman
parents: 243
diff changeset
55 if not self.bb:
186
46d62dadd61b Improved testsuite
Windel Bouwman
parents: 174
diff changeset
56 raise Exception('No basic block')
249
e41e4109addd Added current position arrow
Windel Bouwman
parents: 243
diff changeset
57 self.bb.addInstruction(i)
171
3eb9b9e2958d Improved IR code
Windel Bouwman
parents:
diff changeset
58