~zulcss/samba/server-dailies-3.4

« back to all changes in this revision

Viewing changes to source4/script/findstatic.pl

  • Committer: Chuck Short
  • Date: 2010-09-28 20:38:39 UTC
  • Revision ID: zulcss@ubuntu.com-20100928203839-pgjulytsi9ue63x1
Initial version

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
#!/usr/bin/perl -w
 
2
# find a list of fns and variables in the code that could be static
 
3
# usually called with something like this:
 
4
#    findstatic.pl `find . -name "*.o"`
 
5
# Andrew Tridgell <tridge@samba.org>
 
6
 
 
7
use strict;
 
8
 
 
9
# use nm to find the symbols
 
10
my($saved_delim) = $/;
 
11
undef $/;
 
12
my($syms) = `nm -o @ARGV`;
 
13
$/ = $saved_delim;
 
14
 
 
15
my(@lines) = split(/\n/s, $syms);
 
16
 
 
17
my(%def);
 
18
my(%undef);
 
19
my(%stype);
 
20
 
 
21
my(%typemap) = (
 
22
               "T" => "function",
 
23
               "C" => "uninitialised variable",
 
24
               "D" => "initialised variable"
 
25
                );
 
26
 
 
27
 
 
28
# parse the symbols into defined and undefined 
 
29
for (my($i)=0; $i <= $#{@lines}; $i++) {
 
30
        my($line) = $lines[$i];
 
31
        if ($line =~ /(.*):[a-f0-9]* ([TCD]) (.*)/) {
 
32
                my($fname) = $1;
 
33
                my($symbol) = $3;
 
34
                push(@{$def{$fname}}, $symbol);
 
35
                $stype{$symbol} = $2;
 
36
        }
 
37
        if ($line =~ /(.*):\s* U (.*)/) {
 
38
                my($fname) = $1;
 
39
                my($symbol) = $2;
 
40
                push(@{$undef{$fname}}, $symbol);
 
41
        }
 
42
}
 
43
 
 
44
# look for defined symbols that are never referenced outside the place they 
 
45
# are defined
 
46
foreach my $f (keys %def) {
 
47
        print "Checking $f\n";
 
48
        my($found_one) = 0;
 
49
        foreach my $s (@{$def{$f}}) {
 
50
                my($found) = 0;
 
51
                foreach my $f2 (keys %undef) {
 
52
                        if ($f2 ne $f) {
 
53
                                foreach my $s2 (@{$undef{$f2}}) {
 
54
                                        if ($s2 eq $s) {
 
55
                                                $found = 1;
 
56
                                                $found_one = 1;
 
57
                                        }
 
58
                                }
 
59
                        }
 
60
                }
 
61
                if ($found == 0) {
 
62
                        my($t) = $typemap{$stype{$s}};
 
63
                        print "  '$s' is unique to $f  ($t)\n";
 
64
                }
 
65
        }
 
66
        if ($found_one == 0) {
 
67
                print "  all symbols in '$f' are unused (main program?)\n";
 
68
        }
 
69
}
 
70