コード例 #1
0
ファイル: stack_logic.py プロジェクト: bacam/graph-refine
def get_loop_virtual_stack_analysis (p, tag):
	"""computes variable liveness etc analyses with stack slots treated
	as virtual variables."""
	cache_key = ('loop_stack_analysis', tag)
	if cache_key in p.cached_analysis:
		return p.cached_analysis[cache_key]

	(ent, fname, _) = p.get_entry_details (tag)
	(_, sp) = get_stack_sp (p, tag)
	cc = get_asm_calling_convention (fname)
	rets = list (set ([ptr for arg in cc['rets']
		for (ptr, _) in stack_virtualise_expr (arg, None)[0]]))
	rets = [adjust_ret_ptr (ret) for ret in rets]
	renames = p.entry_exit_renames (tags = [tag])
	r = renames[tag + '_OUT']
	rets = [syntax.rename_expr (ret, r) for ret in rets]

	ns = [n for n in p.nodes if p.node_tags[n][0] == tag]

	ptrs = list (set ([(n, ptr) for n in ns
		for ptr in (stack_virtualise_node (p.nodes[n], None))[0]]))
	ptrs += [(n, (sp, 'StackPointer')) for n in ns if p.loop_id (n)]
	offs = get_ptr_offsets (p, [(n, ptr) for (n, (ptr, _)) in ptrs],
		[(ent, sp, 'stack')]
			+ [(ent, ptr, 'indirect_ret') for ptr in rets[:1]])

	ptr_offs = {}
	rep_offs = {}
	upd_offsets = {}
	for ((n, ptr), off, k) in offs:
		ptr_offs.setdefault (n, {})
		rep_offs.setdefault (n, {})
		ptr_offs[n][ptr] = (k, off)
		rep_offs[n][k] = (ptr, - off)

	for (n, (ptr, kind)) in ptrs:
		if kind == 'MemUpdate' and p.loop_id (n):
			loop = p.loop_id (n)
			(k, off) = ptr_offs[n][ptr]
			upd_offsets.setdefault (loop, set ())
			upd_offsets[loop].add ((k, off))
	loc_offs = mk_get_local_offs (p, tag, rep_offs)

	adj_nodes = {}
	for n in ns:
		(_, node) = stack_virtualise_node (p.nodes[n],
			ptr_offs.get (n, {}))
		adj_nodes[n] = node

	# finally do analysis on this collection of nodes

	preds = dict (p.preds)
	preds['Ret'] = [n for n in preds['Ret'] if p.node_tags[n][0] == tag]
	preds['Err'] = [n for n in preds['Err'] if p.node_tags[n][0] == tag]
	vds = logic.compute_var_deps (adj_nodes,
		adjusted_var_dep_outputs (p), preds)

	result = (vds, adj_nodes, loc_offs, upd_offsets)
	p.cached_analysis[cache_key] = result
	return result
コード例 #2
0
ファイル: problem.py プロジェクト: bacam/graph-refine
	def compute_var_dependencies (self):
		var_deps = logic.compute_var_deps (self.nodes,
			self.var_dep_outputs, self.preds)
		var_deps2 = dict ([(n, dict ([(v, None)
				for v in var_deps.get (n, [])]))
			for n in self.nodes])
		return var_deps2
コード例 #3
0
def rename_vars (function):
	preds = logic.compute_preds (function.nodes)
	var_deps = logic.compute_var_deps (function.nodes,
		lambda x: function.outputs, preds)

	vs = set ()
	dont_rename_vs = set ()
	for n in var_deps:
		rev_renames = {}
		for (v, t) in var_deps[n]:
			v2 = recommended_rename (v)
			rev_renames.setdefault (v2, [])
			rev_renames[v2].append ((v, t))
			vs.add ((v, t))
		for (v2, vlist) in rev_renames.iteritems ():
			if len (vlist) > 1:
				dont_rename_vs.update (vlist)

	renames = dict ([(v, recommended_rename (v)) for (v, t) in vs
		if (v, t) not in dont_rename_vs])

	f = function
	f.inputs = [(renames.get (v, v), t) for (v, t) in f.inputs]
	f.outputs = [(renames.get (v, v), t) for (v, t) in f.outputs]
	for n in f.nodes:
		f.nodes[n] = syntax.copy_rename (f.nodes[n], (renames, {}))
コード例 #4
0
ファイル: problem.py プロジェクト: SEL4PROJ/graph-refine
 def compute_var_dependencies(self):
     if "var_dependencies" in self.cached_analysis:
         return self.cached_analysis["var_dependencies"]
     var_deps = logic.compute_var_deps(self.nodes, self.var_dep_outputs, self.preds)
     var_deps2 = dict([(n, dict([(v, None) for v in var_deps.get(n, [])])) for n in self.nodes])
     self.cached_analysis["var_dependencies"] = var_deps2
     return var_deps2
コード例 #5
0
ファイル: pseudo_compile.py プロジェクト: yyshen/graph-refine
def rename_vars(function):
    preds = logic.compute_preds(function.nodes)
    var_deps = logic.compute_var_deps(function.nodes,
                                      lambda x: function.outputs, preds)

    vs = set()
    dont_rename_vs = set()
    for n in var_deps:
        rev_renames = {}
        for (v, t) in var_deps[n]:
            v2 = recommended_rename(v)
            rev_renames.setdefault(v2, [])
            rev_renames[v2].append((v, t))
            vs.add((v, t))
        for (v2, vlist) in rev_renames.iteritems():
            if len(vlist) > 1:
                dont_rename_vs.update(vlist)

    renames = dict([(v, recommended_rename(v)) for (v, t) in vs
                    if (v, t) not in dont_rename_vs])

    f = function
    f.inputs = [(renames.get(v, v), t) for (v, t) in f.inputs]
    f.outputs = [(renames.get(v, v), t) for (v, t) in f.outputs]
    for n in f.nodes:
        f.nodes[n] = syntax.copy_rename(f.nodes[n], (renames, {}))
コード例 #6
0
 def compute_var_dependencies(self):
     if 'var_dependencies' in self.cached_analysis:
         return self.cached_analysis['var_dependencies']
     var_deps = logic.compute_var_deps(self.nodes, self.var_dep_outputs,
                                       self.preds)
     var_deps2 = dict([(n, dict([(v, None) for v in var_deps.get(n, [])]))
                       for n in self.nodes])
     self.cached_analysis['var_dependencies'] = var_deps2
     return var_deps2
コード例 #7
0
ファイル: stack_logic.py プロジェクト: yyshen/graph-refine
    adj_nodes = {}
    for n in ns:
        try:
            (_, node) = stack_virtualise_node(p.nodes[n], ptr_offs.get(n, {}))
        except StackOffsMissing, e:
            printout("Stack analysis issue at (%d, %s)." % (n, p.node_tags[n]))
            node = p.nodes[n]
        adj_nodes[n] = node

    # finally do analysis on this collection of nodes

    preds = dict(p.preds)
    preds['Ret'] = [n for n in preds['Ret'] if p.node_tags[n][0] == tag]
    preds['Err'] = [n for n in preds['Err'] if p.node_tags[n][0] == tag]
    vds = logic.compute_var_deps(adj_nodes, adjusted_var_dep_outputs(p), preds)

    result = (vds, adj_nodes, loc_offs, upd_offsets, (ptrs, offs))
    p.cached_analysis[cache_key] = result
    return result


def norm_int(n, radix):
    n = n & ((1 << radix) - 1)
    n2 = n - (1 << radix)
    if abs(n2) < abs(n):
        return n2
    else:
        return n