1*1f5207b7SJohn Levon#!/usr/bin/perl
2*1f5207b7SJohn Levon
3*1f5207b7SJohn Levon# This script is supposed to help use the param_mapper output.
4*1f5207b7SJohn Levon# Give it a function and parameter and it lists the functions
5*1f5207b7SJohn Levon# and parameters which are basically equivalent.
6*1f5207b7SJohn Levon
7*1f5207b7SJohn Levonuse strict;
8*1f5207b7SJohn Levon
9*1f5207b7SJohn Levonsub usage()
10*1f5207b7SJohn Levon{
11*1f5207b7SJohn Levon    print ("trace_params.pl <smatch output file> <function> <parameter>\n");
12*1f5207b7SJohn Levon    exit(1);
13*1f5207b7SJohn Levon}
14*1f5207b7SJohn Levon
15*1f5207b7SJohn Levonmy %param_map;
16*1f5207b7SJohn Levon
17*1f5207b7SJohn Levonmy $UNKNOWN  = 1;
18*1f5207b7SJohn Levonmy $NOTFOUND = 2;
19*1f5207b7SJohn Levonmy $FOUND    = 3;
20*1f5207b7SJohn Levon
21*1f5207b7SJohn Levonsub recurse($$)
22*1f5207b7SJohn Levon{
23*1f5207b7SJohn Levon    my $link = shift;
24*1f5207b7SJohn Levon    my $target = shift;
25*1f5207b7SJohn Levon    my $found = 0;
26*1f5207b7SJohn Levon
27*1f5207b7SJohn Levon    if ($link =~ /$target/) {
28*1f5207b7SJohn Levon        $param_map{$link}->{found} = $FOUND;
29*1f5207b7SJohn Levon        return 1;
30*1f5207b7SJohn Levon    }
31*1f5207b7SJohn Levon
32*1f5207b7SJohn Levon    if ($param_map{$link}->{found} == $FOUND) {
33*1f5207b7SJohn Levon        return 1;
34*1f5207b7SJohn Levon    }
35*1f5207b7SJohn Levon    if ($param_map{$link}->{found} == $NOTFOUND) {
36*1f5207b7SJohn Levon        return 0;
37*1f5207b7SJohn Levon    }
38*1f5207b7SJohn Levon
39*1f5207b7SJohn Levon    $param_map{$link}->{found} = $NOTFOUND;
40*1f5207b7SJohn Levon    foreach my $l (@{$param_map{$link}->{links}}){
41*1f5207b7SJohn Levon        $found = recurse($l, $target);
42*1f5207b7SJohn Levon        if ($found) {
43*1f5207b7SJohn Levon            $param_map{$link}->{found} = $FOUND;
44*1f5207b7SJohn Levon            return 1;
45*1f5207b7SJohn Levon        }
46*1f5207b7SJohn Levon    }
47*1f5207b7SJohn Levon
48*1f5207b7SJohn Levon    return 0;
49*1f5207b7SJohn Levon}
50*1f5207b7SJohn Levon
51*1f5207b7SJohn Levonsub compress_all($$)
52*1f5207b7SJohn Levon{
53*1f5207b7SJohn Levon    my $f = shift;
54*1f5207b7SJohn Levon    my $p = shift;
55*1f5207b7SJohn Levon    my $target = "$f%$p";
56*1f5207b7SJohn Levon
57*1f5207b7SJohn Levon    foreach my $link (keys %param_map){
58*1f5207b7SJohn Levon        recurse($link, $target);
59*1f5207b7SJohn Levon    }
60*1f5207b7SJohn Levon}
61*1f5207b7SJohn Levon
62*1f5207b7SJohn Levonsub add_link($$)
63*1f5207b7SJohn Levon{
64*1f5207b7SJohn Levon    my $one = shift;
65*1f5207b7SJohn Levon    my $two = shift;
66*1f5207b7SJohn Levon
67*1f5207b7SJohn Levon    if (!defined($param_map{$one})) {
68*1f5207b7SJohn Levon        $param_map{$one} = {found => $UNKNOWN, links => []};
69*1f5207b7SJohn Levon    }
70*1f5207b7SJohn Levon    push @{$param_map{$one}->{links}}, $two;
71*1f5207b7SJohn Levon}
72*1f5207b7SJohn Levon
73*1f5207b7SJohn Levonsub load_all($)
74*1f5207b7SJohn Levon{
75*1f5207b7SJohn Levon    my $file = shift;
76*1f5207b7SJohn Levon
77*1f5207b7SJohn Levon    open(FILE, "<$file");
78*1f5207b7SJohn Levon    while (<FILE>) {
79*1f5207b7SJohn Levon        if (/.*?:\d+ (.*?)\(\) info: param_mapper (\d+) => (.*?) (\d+)/) {
80*1f5207b7SJohn Levon            add_link("$1%$2", "$3%$4");
81*1f5207b7SJohn Levon        }
82*1f5207b7SJohn Levon    }
83*1f5207b7SJohn Levon}
84*1f5207b7SJohn Levon
85*1f5207b7SJohn Levonsub print_found()
86*1f5207b7SJohn Levon{
87*1f5207b7SJohn Levon    foreach my $func (keys %param_map){
88*1f5207b7SJohn Levon        my $tmp = $param_map{$func};
89*1f5207b7SJohn Levon
90*1f5207b7SJohn Levon        if ($tmp->{found} == $FOUND) {
91*1f5207b7SJohn Levon            my ($f, $p) = split(/%/, $func);
92*1f5207b7SJohn Levon            print("$f $p\n");
93*1f5207b7SJohn Levon        }
94*1f5207b7SJohn Levon    }
95*1f5207b7SJohn Levon}
96*1f5207b7SJohn Levon
97*1f5207b7SJohn Levonmy $file = shift();
98*1f5207b7SJohn Levonmy $func = shift();
99*1f5207b7SJohn Levonmy $param = shift();
100*1f5207b7SJohn Levon
101*1f5207b7SJohn Levonif (!$file or !$func or !defined($param)) {
102*1f5207b7SJohn Levon    usage();
103*1f5207b7SJohn Levon}
104*1f5207b7SJohn Levon
105*1f5207b7SJohn Levonif (! -e $file) {
106*1f5207b7SJohn Levon    printf("Error:  $file does not exist.\n");
107*1f5207b7SJohn Levon    exit(1);
108*1f5207b7SJohn Levon}
109*1f5207b7SJohn Levon
110*1f5207b7SJohn Levonload_all($file);
111*1f5207b7SJohn Levoncompress_all($func, $param);
112*1f5207b7SJohn Levonprint_found();
113