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