annotate python/ppci/ir2tree.py @ 365:98ff43cfdd36

Nasty bug in adr instruction
author Windel Bouwman
date Wed, 19 Mar 2014 22:32:04 +0100
parents c49459768aaa
children 988f3fb861e4
rev   line source
322
44f336460c2a Half of use of burg spec for arm
Windel Bouwman
parents:
diff changeset
1 from tree import Tree
44f336460c2a Half of use of burg spec for arm
Windel Bouwman
parents:
diff changeset
2 from . import ir
44f336460c2a Half of use of burg spec for arm
Windel Bouwman
parents:
diff changeset
3
323
e9fe6988497c Used burg for generating expressions
Windel Bouwman
parents: 322
diff changeset
4 """ Create a tree from ir code. """
e9fe6988497c Used burg for generating expressions
Windel Bouwman
parents: 322
diff changeset
5
322
44f336460c2a Half of use of burg spec for arm
Windel Bouwman
parents:
diff changeset
6 f_map = {} # Mapping from types to tree creation functions
44f336460c2a Half of use of burg spec for arm
Windel Bouwman
parents:
diff changeset
7
44f336460c2a Half of use of burg spec for arm
Windel Bouwman
parents:
diff changeset
8 def register(tp):
44f336460c2a Half of use of burg spec for arm
Windel Bouwman
parents:
diff changeset
9 """ Register a function for type tp """
44f336460c2a Half of use of burg spec for arm
Windel Bouwman
parents:
diff changeset
10 def reg_f(f):
44f336460c2a Half of use of burg spec for arm
Windel Bouwman
parents:
diff changeset
11 f_map[tp] = f
44f336460c2a Half of use of burg spec for arm
Windel Bouwman
parents:
diff changeset
12 return f
44f336460c2a Half of use of burg spec for arm
Windel Bouwman
parents:
diff changeset
13 return reg_f
44f336460c2a Half of use of burg spec for arm
Windel Bouwman
parents:
diff changeset
14
44f336460c2a Half of use of burg spec for arm
Windel Bouwman
parents:
diff changeset
15 @register(ir.Binop)
44f336460c2a Half of use of burg spec for arm
Windel Bouwman
parents:
diff changeset
16 def binop_to_tree(e):
44f336460c2a Half of use of burg spec for arm
Windel Bouwman
parents:
diff changeset
17 names = {'+':'ADDI32', '-':'SUBI32', '|':'ORI32', '<<':'SHLI32',
356
52492b304adf Added newline to print
Windel Bouwman
parents: 355
diff changeset
18 '*':'MULI32', '&':'ANDI32', '>>':'SHRI32'}
322
44f336460c2a Half of use of burg spec for arm
Windel Bouwman
parents:
diff changeset
19 op = names[e.operation]
44f336460c2a Half of use of burg spec for arm
Windel Bouwman
parents:
diff changeset
20 return Tree(op, makeTree(e.a), makeTree(e.b))
44f336460c2a Half of use of burg spec for arm
Windel Bouwman
parents:
diff changeset
21
44f336460c2a Half of use of burg spec for arm
Windel Bouwman
parents:
diff changeset
22 @register(ir.Temp)
44f336460c2a Half of use of burg spec for arm
Windel Bouwman
parents:
diff changeset
23 def temp_to_tree(e):
44f336460c2a Half of use of burg spec for arm
Windel Bouwman
parents:
diff changeset
24 t = Tree('REGI32')
44f336460c2a Half of use of burg spec for arm
Windel Bouwman
parents:
diff changeset
25 t.value = e
44f336460c2a Half of use of burg spec for arm
Windel Bouwman
parents:
diff changeset
26 return t
44f336460c2a Half of use of burg spec for arm
Windel Bouwman
parents:
diff changeset
27
364
c49459768aaa Work on globals
Windel Bouwman
parents: 356
diff changeset
28 @register(ir.GlobalVariable)
c49459768aaa Work on globals
Windel Bouwman
parents: 356
diff changeset
29 def global_address_to_tree(e):
c49459768aaa Work on globals
Windel Bouwman
parents: 356
diff changeset
30 t = Tree('GLOBALADDRESS')
c49459768aaa Work on globals
Windel Bouwman
parents: 356
diff changeset
31 t.value = ir.label_name(e)
c49459768aaa Work on globals
Windel Bouwman
parents: 356
diff changeset
32 return t
c49459768aaa Work on globals
Windel Bouwman
parents: 356
diff changeset
33
322
44f336460c2a Half of use of burg spec for arm
Windel Bouwman
parents:
diff changeset
34 @register(ir.Const)
44f336460c2a Half of use of burg spec for arm
Windel Bouwman
parents:
diff changeset
35 def const_to_tree(e):
354
5477e499b039 Added some sort of string functionality
Windel Bouwman
parents: 323
diff changeset
36 if type(e.value) is bytes:
5477e499b039 Added some sort of string functionality
Windel Bouwman
parents: 323
diff changeset
37 t = Tree('CONSTDATA')
5477e499b039 Added some sort of string functionality
Windel Bouwman
parents: 323
diff changeset
38 t.value = e.value
5477e499b039 Added some sort of string functionality
Windel Bouwman
parents: 323
diff changeset
39 return t
5477e499b039 Added some sort of string functionality
Windel Bouwman
parents: 323
diff changeset
40 elif type(e.value) is int:
5477e499b039 Added some sort of string functionality
Windel Bouwman
parents: 323
diff changeset
41 t = Tree('CONSTI32')
5477e499b039 Added some sort of string functionality
Windel Bouwman
parents: 323
diff changeset
42 t.value = e.value
5477e499b039 Added some sort of string functionality
Windel Bouwman
parents: 323
diff changeset
43 return t
5477e499b039 Added some sort of string functionality
Windel Bouwman
parents: 323
diff changeset
44 else:
5477e499b039 Added some sort of string functionality
Windel Bouwman
parents: 323
diff changeset
45 raise Exception('{} not implemented'.format(type(e.value)))
322
44f336460c2a Half of use of burg spec for arm
Windel Bouwman
parents:
diff changeset
46
44f336460c2a Half of use of burg spec for arm
Windel Bouwman
parents:
diff changeset
47 @register(ir.Mem)
44f336460c2a Half of use of burg spec for arm
Windel Bouwman
parents:
diff changeset
48 def mem_to_tree(e):
44f336460c2a Half of use of burg spec for arm
Windel Bouwman
parents:
diff changeset
49 return Tree('MEMI32', makeTree(e.e))
44f336460c2a Half of use of burg spec for arm
Windel Bouwman
parents:
diff changeset
50
354
5477e499b039 Added some sort of string functionality
Windel Bouwman
parents: 323
diff changeset
51 @register(ir.Addr)
5477e499b039 Added some sort of string functionality
Windel Bouwman
parents: 323
diff changeset
52 def mem_to_tree(e):
5477e499b039 Added some sort of string functionality
Windel Bouwman
parents: 323
diff changeset
53 return Tree('ADR', makeTree(e.e))
5477e499b039 Added some sort of string functionality
Windel Bouwman
parents: 323
diff changeset
54
322
44f336460c2a Half of use of burg spec for arm
Windel Bouwman
parents:
diff changeset
55 @register(ir.Call)
44f336460c2a Half of use of burg spec for arm
Windel Bouwman
parents:
diff changeset
56 def call_to_tree(e):
323
e9fe6988497c Used burg for generating expressions
Windel Bouwman
parents: 322
diff changeset
57 t = Tree('CALL')
e9fe6988497c Used burg for generating expressions
Windel Bouwman
parents: 322
diff changeset
58 t.value = e
e9fe6988497c Used burg for generating expressions
Windel Bouwman
parents: 322
diff changeset
59 return t
322
44f336460c2a Half of use of burg spec for arm
Windel Bouwman
parents:
diff changeset
60
44f336460c2a Half of use of burg spec for arm
Windel Bouwman
parents:
diff changeset
61 def makeTree(ir_node):
44f336460c2a Half of use of burg spec for arm
Windel Bouwman
parents:
diff changeset
62 """ Transform an ir node into a tree usable for matching """
44f336460c2a Half of use of burg spec for arm
Windel Bouwman
parents:
diff changeset
63 return f_map[type(ir_node)](ir_node)