]> CyberLeo.Net >> Repos - FreeBSD/releng/9.2.git/blob - tools/tools/kernxref/kernxref.sh
- Copy stable/9 to releng/9.2 as part of the 9.2-RELEASE cycle.
[FreeBSD/releng/9.2.git] / tools / tools / kernxref / kernxref.sh
1 :
2 #
3 # ----------------------------------------------------------------------------
4 # "THE BEER-WARE LICENSE" (Revision 42):
5 # <phk@FreeBSD.org> wrote this file.  As long as you retain this notice you
6 # can do whatever you want with this stuff. If we meet some day, and you think
7 # this stuff is worth it, you can buy me a beer in return.   Poul-Henning Kamp
8 # ----------------------------------------------------------------------------
9 #
10 # Sort options by "Matthew Emmerton" <matt@gsicomp.on.ca>
11 #
12 # $FreeBSD$
13 #
14 # This shell script will make a cross reference of the symbols of a kernel.
15 #
16
17 COMPILEDIR=/sys/`uname -m`/compile
18 KERNELNAME=LINT
19 SORTORDER=-k1
20
21 args=`getopt h?k:s: $*`;
22 if [ $? != 0 ]
23 then
24         args="-h";
25 fi
26 set -- $args;
27 for i
28 do
29         case "$i"
30         in
31         -h|-\?)
32                 echo "Usage: $0 [ -k <kernelname> ] [ -s [ 'symbol' | 'filename' ] ]";
33                 exit 0;
34                 ;;
35         -k)
36                 KERNELNAME=$2
37                 if [ -d ${COMPILEDIR}/${KERNELNAME} ];
38                 then
39                         shift; shift;
40                         continue;
41                 fi
42                 echo "Kernel '$KERNELNAME' does not exist in ${COMPILEDIR}!";
43                 exit 1;
44                 ;;
45         -s)
46                 if [ "x$2" = "xsymbol" ]
47                 then
48                         SORTORDER=-k1
49                         shift; shift;
50                         continue;
51                 fi
52                 if [ "x$2" = "xfilename" ]
53                 then
54                         SORTORDER=-k2
55                         shift; shift;
56                         continue;
57                 fi
58                 echo "Invalid selection for -s: $2";
59                 exit 1;
60                 ;;
61         --)
62                 shift;
63                 break;
64                 ;;
65         esac
66 done
67
68 cd ${COMPILEDIR}/${KERNELNAME}
69
70 MOD_OBJS=`find modules -name \*.o`
71
72 for i in *.o $MOD_OBJS
73 do
74         nm -gon $i
75 done | sed '
76 /aicasm.*:/d
77 /genassym.*:/d
78 s/.*\///
79 s/:/ /
80 ' |  awk '
81 NF > 1  {
82         if ($2 == "t") 
83                 next
84         if ($2 == "F")
85                 next
86         if ($2 == "U") {
87                 ref[$3]=ref[$3]" "$1
88                 nm[$3]++
89         } else if ($3 == "D" || $3 == "T" || $3 == "B" || $3 == "R" || $3 == "A") {
90                 if (def[$4] != "")
91                         def[$4]=def[$4]" "$1
92                 else
93                         def[$4]=$1
94                 nm[$4]++
95         } else if ($2 == "?") {
96                 if (def[$3] == "S")
97                         i++
98                 else if (def[$3] != "")
99                         def[$3]=def[$3]",S"
100                 else
101                         def[$3]="S"
102                 ref[$3]=ref[$3]" "$1
103                 nm[$3]++
104         } else if ($2 == "C") {
105                 if (def[$3] == $2)
106                         i++
107                 else if (def[$3] == "")
108                         def[$3]=$1
109                 else
110                         ref[$3]=ref[$3]" "$1
111                 nm[$3]++
112         } else {
113                 print ">>>",$0
114         }
115         }
116 END     {
117         for (i in nm) {
118                 printf "%s {%s} %s\n",i,def[i],ref[i]
119         }
120         }
121 ' | sort $SORTORDER | awk '
122         {
123         if ($2 == "{S}")
124                 $2 = "<Linker set>"
125         if (length($3) == 0) {
126                 printf "%-31s %d %s\tUNREF\n",$1,0, $2
127                 N1++
128         } else if ($2 == "{}") {
129                 printf "%-31s %d {UNDEF}\n",$1, NF-2
130                 N2++
131         } else {
132                 printf "%-31s %d %s",$1,NF-2,$2
133                 p = 80;
134                 for (i = 3 ; i <= NF; i++) {
135                         if (p+length ($i)+1 > 48) {
136                                 printf "\n\t\t\t\t\t%s", $i
137                                 p = 7;
138                         } else {
139                                 printf " %s", $i
140                         }
141                         p += 1 + length ($i)
142                 }
143                 printf "\n"
144                 N3++
145                 if (NF-2 == 1) 
146                         N4++
147                 if (NF-2 == 2)
148                         N5++
149         }
150         }
151 END     {
152         printf "Total symbols: %5d\n",N1+N2+N3
153         printf "unref symbols: %5d\n",N1
154         printf "undef symbols: %5d\n",N2
155         printf "1 ref symbols: %5d\n",N4
156         printf "2 ref symbols: %5d\n",N5
157         }
158 '