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