Blame view
scripts/export_report.pl
4.5 KB
cb77f0d62 scripts: Switch t... |
1 |
#!/usr/bin/env perl |
59bd9ded4 treewide: Replace... |
2 |
# SPDX-License-Identifier: GPL-2.0-only |
c5e300338 kbuild: export-sy... |
3 4 |
# # (C) Copyright IBM Corporation 2006. |
c5e300338 kbuild: export-sy... |
5 6 7 8 |
# Author : Ram Pai (linuxram@us.ibm.com) # # Usage: export_report.pl -k Module.symvers [-o report_file ] -f *.mod.c # |
cb77f0d62 scripts: Switch t... |
9 |
use warnings; |
c5e300338 kbuild: export-sy... |
10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
use Getopt::Std; use strict; sub numerically { my $no1 = (split /\s+/, $a)[1]; my $no2 = (split /\s+/, $b)[1]; return $no1 <=> $no2; } sub alphabetically { my ($module1, $value1) = @{$a}; my ($module2, $value2) = @{$b}; return $value1 <=> $value2 || $module2 cmp $module1; } sub print_depends_on { my ($href) = @_; print " "; |
bdabc7a34 export_report: so... |
29 30 |
for my $mod (sort keys %$href) { my $list = $href->{$mod}; |
c5e300338 kbuild: export-sy... |
31 32 33 34 |
print "\t$mod: "; foreach my $sym (sort numerically @{$list}) { my ($symbol, $no) = split /\s+/, $sym; |
bdabc7a34 export_report: so... |
35 36 |
printf("\t\t%-25s ", $symbol); |
c5e300338 kbuild: export-sy... |
37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 |
} print " "; } print " "; print "~"x80 , " "; } sub usage { print "Usage: @_ -h -k Module.symvers [ -o outputfile ] ", "\t-f: treat all the non-option argument as .mod.c files. ", "Recommend using this as the last option ", "\t-h: print detailed help ", "\t-k: the path to Module.symvers file. By default uses ", "the file from the current directory ", "\t-o outputfile: output the report to outputfile "; exit 0; } sub collectcfiles { |
de7b0b411 export_report: do... |
64 |
my @file; |
7deb55f57 kbuild: export_re... |
65 66 67 68 69 |
open my $fh, '< modules.order' or die "cannot open modules.order: $! "; while (<$fh>) { s/\.ko$/.mod.c/; push (@file, $_) |
de7b0b411 export_report: do... |
70 |
} |
7deb55f57 kbuild: export_re... |
71 |
close($fh); |
91416cfdf export_report: fi... |
72 73 |
chomp @file; return @file; |
c5e300338 kbuild: export-sy... |
74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 |
} my (%SYMBOL, %MODULE, %opt, @allcfiles); if (not getopts('hk:o:f',\%opt) or defined $opt{'h'}) { usage($0); } if (defined $opt{'f'}) { @allcfiles = @ARGV; } else { @allcfiles = collectcfiles(); } if (not defined $opt{'k'}) { $opt{'k'} = "Module.symvers"; } |
91416cfdf export_report: fi... |
91 92 93 |
open (my $module_symvers, '<', $opt{'k'}) or die "Sorry, cannot open $opt{'k'}: $! "; |
c5e300338 kbuild: export-sy... |
94 95 |
if (defined $opt{'o'}) { |
91416cfdf export_report: fi... |
96 97 98 99 100 |
open (my $out, '>', $opt{'o'}) or die "Sorry, cannot open $opt{'o'} $! "; select $out; |
c5e300338 kbuild: export-sy... |
101 |
} |
91416cfdf export_report: fi... |
102 |
|
c5e300338 kbuild: export-sy... |
103 104 105 106 |
# # collect all the symbols and their attributes from the # Module.symvers file # |
91416cfdf export_report: fi... |
107 |
while ( <$module_symvers> ) { |
c5e300338 kbuild: export-sy... |
108 |
chomp; |
5190044c2 modpost: move the... |
109 |
my (undef, $symbol, $module, $gpl, $namespace) = split('\t'); |
c5e300338 kbuild: export-sy... |
110 111 |
$SYMBOL { $symbol } = [ $module , "0" , $symbol, $gpl]; } |
91416cfdf export_report: fi... |
112 |
close($module_symvers); |
c5e300338 kbuild: export-sy... |
113 114 115 116 |
# # collect the usage count of each symbol. # |
ca995cbf7 export_report: us... |
117 |
my $modversion_warnings = 0; |
c5e300338 kbuild: export-sy... |
118 |
foreach my $thismod (@allcfiles) { |
91416cfdf export_report: fi... |
119 120 121 122 123 |
my $module; unless (open ($module, '<', $thismod)) { warn "Sorry, cannot open $thismod: $! "; |
c5e300338 kbuild: export-sy... |
124 125 |
next; } |
91416cfdf export_report: fi... |
126 |
|
c5e300338 kbuild: export-sy... |
127 |
my $state=0; |
91416cfdf export_report: fi... |
128 |
while ( <$module> ) { |
c5e300338 kbuild: export-sy... |
129 |
chomp; |
88f567f3a kbuild: fix perl ... |
130 |
if ($state == 0) { |
c5e300338 kbuild: export-sy... |
131 132 133 |
$state = 1 if ($_ =~ /static const struct modversion_info/); next; } |
88f567f3a kbuild: fix perl ... |
134 |
if ($state == 1) { |
c5e300338 kbuild: export-sy... |
135 136 137 |
$state = 2 if ($_ =~ /__attribute__\(\(section\("__versions"\)\)\)/); next; } |
88f567f3a kbuild: fix perl ... |
138 |
if ($state == 2) { |
cf9a6adea kbuild: fix expor... |
139 |
if ( $_ !~ /0x[0-9a-f]+,/ ) { |
c5e300338 kbuild: export-sy... |
140 141 142 143 144 145 146 147 |
next; } my $sym = (split /([,"])/,)[4]; my ($module, $value, $symbol, $gpl) = @{$SYMBOL{$sym}}; $SYMBOL{ $sym } = [ $module, $value+1, $symbol, $gpl]; push(@{$MODULE{$thismod}} , $sym); } } |
88f567f3a kbuild: fix perl ... |
148 |
if ($state != 2) { |
ca995cbf7 export_report: us... |
149 150 151 |
warn "WARNING:$thismod is not built with CONFIG_MODVERSIONS enabled "; $modversion_warnings++; |
c5e300338 kbuild: export-sy... |
152 |
} |
91416cfdf export_report: fi... |
153 |
close($module); |
c5e300338 kbuild: export-sy... |
154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 |
} print "\tThis file reports the exported symbols usage patterns by in-tree ", "\t\t\t\tmodules "; printf("%s ","x"x80); printf("\t\t\t\tINDEX "); printf("SECTION 1: Usage counts of all exported symbols "); printf("SECTION 2: List of modules and the exported symbols they use "); printf("%s ","x"x80); printf("SECTION 1:\tThe exported symbols and their usage count "); printf("%-25s\t%-25s\t%-5s\t%-25s ", "Symbol", "Module", "Usage count", "export type"); # # print the list of unused exported symbols # foreach my $list (sort alphabetically values(%SYMBOL)) { my ($module, $value, $symbol, $gpl) = @{$list}; printf("%-25s\t%-25s\t%-10s\t", $symbol, $module, $value); if (defined $gpl) { printf("%-25s ",$gpl); } else { printf(" "); } } printf("%s ","x"x80); printf("SECTION 2: \tThis section reports export-symbol-usage of in-kernel modules. Each module lists the modules, and the symbols from that module that it uses. Each listed symbol reports the number of modules using it "); |
ca995cbf7 export_report: us... |
207 208 209 210 211 |
print " NOTE: Got $modversion_warnings CONFIG_MODVERSIONS warnings " if $modversion_warnings; |
c5e300338 kbuild: export-sy... |
212 213 |
print "~"x80 , " "; |
bdabc7a34 export_report: so... |
214 215 |
for my $thismod (sort keys %MODULE) { my $list = $MODULE{$thismod}; |
c5e300338 kbuild: export-sy... |
216 217 218 219 220 221 222 223 224 225 |
my %depends; $thismod =~ s/\.mod\.c/.ko/; print "\t\t\t$thismod "; foreach my $symbol (@{$list}) { my ($module, $value, undef, $gpl) = @{$SYMBOL{$symbol}}; push (@{$depends{"$module"}}, "$symbol $value"); } print_depends_on(\%depends); } |