in preprocess/asm_mips.py [0:0]
def __get_nodes__(self, operand, is_tgt):
# parsing operands
name = 'tgt' if is_tgt else 'src'
# First case: simple register value = non-memory operand
if '(' not in operand and ')' not in operand:
if isinstance(operand, list):
reg = operand[0]
else:
reg = operand
reg_node = self.__add_node__(Node(name=reg,
node_id=self.num_nodes,
node_type='reg-'+name,
ins_id=self.num_ins,
is_var=True))
self.__add_edge__(Edge(name='',
edge_type=self.edge_type_2_id['non-mem-reg'],
src=self.num_ins,
tgt=reg_node.id))
# add data dependency edges
if self.raw:
if not is_tgt and reg_node.name in self.src_vnode:
self.__add_edge__(Edge(name='',
edge_type=self.edge_type_2_id['last-read'],
src=reg_node.id,
tgt=self.src_vnode[reg_node.name].id))
reg_node.edges[self.edge_type_2_id['last-read']] = self.src_vnode[reg_node.name]
self.__add_edge__(Edge(name='',
edge_type=self.edge_type_2_id['last-read'],
src=self.src_vnode[reg_node.name].id,
tgt=reg_node.id))
self.src_vnode[reg_node.name].edges[self.edge_type_2_id['last-read']] = reg_node
self.src_vnode[reg_node.name] = reg_node
elif not is_tgt:
self.src_vnode[reg_node.name] = reg_node
if is_tgt and reg_node.name in self.tgt_vnode:
self.__add_edge__(Edge(name='',
edge_type=self.edge_type_2_id['last-write'],
src=reg_node.id,
tgt=self.tgt_vnode[reg_node.name].id))
reg_node.edges[self.edge_type_2_id['last-write']] = self.tgt_vnode[reg_node.name]
self.__add_edge__(Edge(name='',
edge_type=self.edge_type_2_id['last-write'],
src=self.tgt_vnode[reg_node.name].id,
tgt=reg_node.id))
self.tgt_vnode[reg_node.name].edges[self.edge_type_2_id['last-write']] = reg_node
self.tgt_vnode[reg_node.name] = reg_node
elif is_tgt:
self.tgt_vnode[reg_node.name] = reg_node
if not is_tgt and reg_node.name in self.src_vnode:
self.__add_edge__(Edge(name='',
edge_type=self.edge_type_2_id['last-read'],
src=reg_node.id,
tgt=self.src_vnode[reg_node.name].id))
reg_node.edges[self.edge_type_2_id['last-read']] = self.src_vnode[reg_node.name]
self.__add_edge__(Edge(name='',
edge_type=self.edge_type_2_id['last-read'],
src=self.src_vnode[reg_node.name].id,
tgt=reg_node.id))
self.src_vnode[reg_node.name].edges[self.edge_type_2_id['last-read']] = reg_node
elif not is_tgt:
self.src_vnode[reg_node.name] = reg_node
if is_tgt and reg_node.name in self.tgt_vnode:
# pdb.set_trace()
self.__add_edge__(Edge(name='',
edge_type=self.edge_type_2_id['last-write'],
src=reg_node.id,
tgt=self.tgt_vnode[reg_node.name].id))
reg_node.edges[self.edge_type_2_id['last-write']] = self.tgt_vnode[reg_node.name]
self.__add_edge__(Edge(name='',
edge_type=self.edge_type_2_id['last-write'],
src=self.tgt_vnode[reg_node.name].id,
tgt=reg_node.id))
self.tgt_vnode[reg_node.name].edges[self.edge_type_2_id['last-write']] = reg_node
elif is_tgt:
self.tgt_vnode[reg_node.name] = reg_node
# Second case: memory operation: src = load, tgt=store
else:
# getting offset if any
# in the format offset(base)
# base can be expanded to (start, index, stride)
if operand[0] == '(':
# no offset
base = operand
else:
# with offset
offset, base = operand.rsplit('(', 1)
# add offset node
offset_node = self.__add_node__(Node(name=offset,
node_id=self.num_nodes,
node_type='offset'+ name,
ins_id=self.num_ins,
is_var=True))
# add edges between type 2 and 3 (offset)
self.__add_edge__(Edge(name='',
edge_type=self.edge_type_2_id['mem-offset'],
src=self.num_ins,
tgt=offset_node.id))
base = '(' + base
if base[-1] != ')':
base += ')'
base = base[1:-1].split(',')
# single base
if len(base) == 1:
base = base[0]
base_node = self.__add_node__(Node(name=base,
node_id=self.num_nodes,
node_type='base'+name,
ins_id=self.num_ins,
is_var=True))
self.__add_edge__(Edge(name='',
edge_type=self.edge_type_2_id['mem-base'],
src=self.num_ins,
tgt=base_node.id))
# array indexing
else:
if len(base) == 2:
base += ['1']
assert (len(base) == 3), 'base operation incorrect!'
new_types = ['base', 'idx-stride', 'start', 'index', 'stride']
new_nodes = []
# add pseudo nodes
for i in range(2):
new_node = self.__add_node__(Node(name='pseudo_'+new_types[i],
node_id=self.num_nodes,
node_type=new_types[i],
ins_id=self.num_ins))
new_nodes.append(new_node)
# add new nodes
for i in range(3):
new_node = self.__add_node__(Node(name=base[i],
node_id=self.num_nodes,
node_type=new_types[i+2],
ins_id=self.num_ins,
is_var=True))
new_nodes.append(new_node)
# add new edges:
self.__add_edge__(Edge(name='',
edge_type=self.edge_type_2_id['mem-index'],
src=new_nodes[1].id,
tgt=new_nodes[3].id))
new_nodes[1].edges[self.edge_type_2_id['mem-index']] = new_nodes[3]
self.__add_edge__(Edge(name='',
edge_type=self.edge_type_2_id['mem-stride'],
src=new_nodes[1].id,
tgt=new_nodes[4].id))
new_nodes[1].edges[self.edge_type_2_id['mem-stride']] = new_nodes[4]
self.__add_edge__(Edge(name='',
edge_type=self.edge_type_2_id['mem-start'],
src=self.num_ins,
tgt=new_nodes[2].id))
self.__add_edge__(Edge(name='',
edge_type=self.edge_type_2_id['mem-index-stride'],
src=self.num_ins,
tgt=new_nodes[1].id))