summaryrefslogtreecommitdiffstats
path: root/tools
diff options
context:
space:
mode:
authorphk <phk@FreeBSD.org>2000-10-28 21:44:05 +0000
committerphk <phk@FreeBSD.org>2000-10-28 21:44:05 +0000
commitf8252177682b60816e68ec8c9e9ba416abb1762a (patch)
treea81c0b9259e1f4fd3cdc2cc3f0a7f27ebc33a34d /tools
parent82c32a8a3fa0c616208e6307b4d3d959da533536 (diff)
downloadFreeBSD-src-f8252177682b60816e68ec8c9e9ba416abb1762a.zip
FreeBSD-src-f8252177682b60816e68ec8c9e9ba416abb1762a.tar.gz
The latest & greatest unused #include spotter. Faster, one-pass and
more precise than ever. 1230 hits on the current kernel.
Diffstat (limited to 'tools')
-rw-r--r--tools/tools/kerninclude/kerninclude.sh408
1 files changed, 214 insertions, 194 deletions
diff --git a/tools/tools/kerninclude/kerninclude.sh b/tools/tools/kerninclude/kerninclude.sh
index 526d9ad..a15d6b9 100644
--- a/tools/tools/kerninclude/kerninclude.sh
+++ b/tools/tools/kerninclude/kerninclude.sh
@@ -11,135 +11,21 @@
# This script tries to find #include statements which are not needed in
# the FreeBSD kernel tree.
#
-# For each include file on the tasklist (set in $includes right below)
-# For each object file (see around line 170 for how these are selected)
-# For each kernel (set in $kernels right below) and all modules
-# if the object exists
-# figure out the sourcefile
-# if the sourcefile doesn't contain "#include $include"
-# continue
-# if object can be compile without $include existing
-# continue /* probably protected by #ifdef something */
-# if object can't be compile with empty file for $include
-# continue /* needed something/
-# if the compiler warnings/errors were different than normal
-# continue /* needed something/
-# if the resulting object were different than normal
-# continue /* needed something */
-# /* didn't need this include */
-# remove $include from source file
-#
-# Takes about 12h to run on a PII/400
-#
-# NOTE: /usr/include is mucked about with!!
-#
set -e
# Base of the kernel sources you want to work on
-cd /some/sourcetree/sys
+cd /sys
# Set to true to start from scratch, false to resume
-init=true
+init=false
# Which kernels you want to check
kernels="LINT GENERIC GENERIC98"
-# Which includes you want to check
-(
-find */include -name '*.h' -ls | sed 's;.*include;machine;'
-find * -name '*.h' -print
-) | sed '
-/compile/d
-/modules/d
-/boot/d
-' | sort -u > _includes
-
-# Insert some filtering here if you want to...
-includes=`cat _includes`
-
NO_MODULES=yes
export NO_MODULES
-check_it ()
-{
- if [ -f ::$2 ] ; then
- if grep "#[ ]*include[ ].$1." ::$2 > /dev/null; then
- src=`ls -l ::$2 | awk '{print $11}'`
- else
- echo " -"
- exit 0
- fi
- else
- rm -f $2
- make -n $2 > _0 2>&1 || true
- src=`awk '$1 == "cc" {print $NF}' _0`
- if expr "x$src" : 'x.*\.c$' > /dev/null ; then
- ln -s $src ::$2
- else
- echo " not C source"
- # don't create $2, we don't care about it.
- exit 0
- fi
- if grep "#[ ]*include[ ].$1." $src > /dev/null; then
- true
- else
- echo " -"
- touch $2
- exit 0
- fi
- fi
- rm ../../$3
- rm -f $2
- if [ -f /usr/include/$1 ] ; then
- mv /usr/include/$1 /usr/include/${1}_
- make $2 > _0 2>&1 || true
- mv /usr/include/${1}_ /usr/include/$1
- else
- make $2 > _0 2>&1 || true
- fi
- echo > ../../$3
- if [ -f $2 ] ; then
- echo " no read"
- cp ../../${3}_ ../../$3
- exit 0
- fi
-
- make $2 > _1 2>&1 || true
-
- cp ../../${3}_ ../../$3
-
- if [ ! -f $2 ] ; then
- echo " compile error"
- touch $2
- exit 0
- fi
- m2=`md5 < $2`
-
- rm $2
- make $2 > _0 2>&1 || true
- if [ ! -f $2 ] ; then
- echo "$2 reference compile failed"
- touch $2
- cat _0
- exit 0
- fi
- m1=`md5 < $2`
-
- if cmp _0 _1 > /dev/null 2>&1 ; then
- true
- else
- echo " warnings changed"
- exit 0
- fi
-
- if [ $m1 != $m2 ] ; then
- echo " MD5 changed"
- #exit 0
- fi
-}
-
-
if $init ; then
(
echo "Cleaning modules"
@@ -156,42 +42,56 @@ if $init ; then
cd compile
ls | grep -v CVS | xargs rm -rf
)
+fi
- echo "Configuring kernels"
- (
- cd i386/conf
- make LINT
- config -r -p LINT
+(
+echo "Cleaning temp files"
+find . -name '*.h_' -print | xargs rm -f
+find . -name '::*' -print | xargs rm -f
+find . -name '*.o' -size 0 -print | xargs rm -f
+)
+
+echo "Configuring kernels"
+(
+ cd i386/conf
+ make LINT
+ if $init ; then
+ config -r LINT
config -r GENERIC
- )
- (
- cd pc98/conf
- cp -f GENERIC GENERIC98
+ else
+ config LINT
+ config GENERIC
+ fi
+)
+(
+ cd pc98/conf
+ cp -f GENERIC GENERIC98
+ if $init ; then
config -r GENERIC98
- )
-
- for i in $kernels
- do
- (
- echo "Compiling $i"
- cd compile/$i
- rm -f ::*
- make -k > x.0 2>&1
- tail -4 x.0
- if [ ! -f kernel ] ; then
- echo "Error: No $i kernel built"
- exit 1
- fi
- )
- done
+ else
+ config GENERIC98
+ fi
+)
+for i in $kernels
+do
(
- echo "Compiling modules"
- cd modules
- rm -f */::*
- make -k > x.0 2>&1 || true
+ echo "Compiling $i"
+ cd compile/$i
+ make > x.0 2>&1
+ tail -4 x.0
+ if [ ! -f kernel ] ; then
+ echo "Error: No $i kernel built"
+ exit 1
+ fi
)
-fi
+done
+
+(
+echo "Compiling modules"
+cd modules
+make > x.0 2>&1
+)
# Generate the list of object files we want to check
# you can put a convenient grep right before the sort
@@ -215,72 +115,192 @@ done
/vers.o/d
/setdef0.o/d
/setdef1.o/d
-/::/d
' | sort -u > _
objlist=`cat _`
-find . -name '*.h_' -print | xargs rm -f
-for incl in $includes
+for o in $objlist
do
- inclf=`echo $incl | sed 's/machine/i386\/include/'`
- if [ ! -f ${inclf} ] ; then
+ l=""
+ src=""
+ for k in $kernels
+ do
+ if [ ! -f compile/$k/$o ] ; then
+ continue;
+ fi
+ l="$l compile/$k"
+ if [ "x$src" = "x" ] ; then
+ cd compile/$k
+ mv $o ${o}_
+ make -n $o > _
+ mv ${o}_ $o
+ src=compile/$k/`awk '$1 == "cc" {print $NF}' _`
+ cd ../..
+ if expr "x$src" : 'x.*\.c$' > /dev/null ; then
+ true
+ else
+ echo NO SRC $o
+ src=""
+ fi
+ fi
+ done
+ for m in modules/*
+ do
+ if [ ! -d $m -o ! -f $m/$o ] ; then
+ continue;
+ fi
+ l="$l $m"
+ if [ "x$src" = "x" ] ; then
+ cd $m
+ mv $o ${o}_
+ make -n $o > _
+ mv ${o}_ $o
+ src=`awk '$1 == "cc" {print $NF}' _`
+ cd ../..
+ if expr "x$src" : 'x.*\.c$' > /dev/null ; then
+ if [ "`dirname $src`" = "." ] ; then
+ src="$m/$src"
+ fi
+ true
+ else
+ echo NO SRC $o
+ src=""
+ fi
+ fi
+ done
+ if [ "x$src" = "x" ] ; then
+ echo "NO SOURCE $o"
continue
fi
- if [ ! -f ${inclf}_ ] ; then
- cp $inclf ${inclf}_
- fi
- for obj in $objlist
+ echo "OBJ $o"
+ echo " SRC $src"
+
+ grep -n '^[ ]*#[ ]*include' $src | sed '
+ s/^\([0-9]*\):[ ]*#[ ]*include[ ]*[<"]/\1 /
+ s/[">].*//
+ / opt_/d
+ ' | sort -rn | while read lin incl
do
- (
- echo -n "$incl $obj:"
- src=""
+ S=""
+ echo " INCL $lin $incl"
+ cp $src ${src}_
+
+ # Check if we can compile without this #include line.
- cd compile
- for i in $kernels
+ sed "${lin}s/.*//" ${src}_ > ${src}
+ for t in $l
do
- cd $i
+ cd $t
+ mv ${o} ${o}_
+ if make ${o} > _log 2>&1 ; then
+ if cmp -s ${o} ${o}_ ; then
+ echo " $t same object"
+ else
+ echo " $t changed object"
+ S=TAG
+ fi
+ else
+ echo " $t used"
+ S=TAG
+ fi
+ mv ${o}_ ${o}
+ cd ../..
+ if [ "x$S" != "x" ] ; then
+ break
+ fi
+ done
+ if [ "x$S" != "x" ] ; then
+ mv ${src}_ ${src}
+ continue
+ fi
- if [ ! -f $obj ] ; then
- cd ..
- continue
+ # Check if this is because it is a nested #include
+ for t in $l
+ do
+ cd $t
+ rm -rf foo
+ mkdir -p foo/${incl}
+ rmdir foo/${incl}
+ touch foo/${incl}
+ mv ${o} ${o}_
+ if make INCLMAGIC=-Ifoo ${o} > _log2 2>&1 ; then
+ if cmp -s ${o} ${o}_ ; then
+ echo " $t still same object"
+ else
+ echo " $t changed object"
+ S=TAG
+ fi
+ else
+ echo " $t nested include"
+ S=TAG
+ fi
+ rm -rf foo
+ mv ${o}_ ${o}
+ cd ../..
+ if [ "x$S" != "x" ] ; then
+ break
fi
- echo -n " [$i]"
- check_it $incl $obj $inclf
- cd ..
done
- cd ..
- cd modules
- for d in */$obj
+ if [ "x$S" != "x" ] ; then
+ mv ${src}_ ${src}
+ continue
+ fi
+
+ # Check if this is because it is #ifdef'ed out
+
+ sed "${lin}s/.*/#error \"BARF\"/" ${src}_ > ${src}
+ for t in $l
do
- if [ ! -f $d ] ; then
- continue
+ cd $t
+ mv ${o} ${o}_
+ if make ${o} > /dev/null 2>&1 ; then
+ echo " $t line not read"
+ S=TAG
+ fi
+ mv ${o}_ ${o}
+ cd ../..
+ if [ "x$S" != "x" ] ; then
+ break
fi
- b=`dirname $d`
- echo -n " [$b]"
- cd $b
- check_it $incl $obj $inclf
- cd ..
done
- cd ..
- if [ "x$src" = "x" ] ; then
- echo " -"
- exit 0
+
+ mv ${src}_ ${src}
+ if [ "x$S" != "x" ] ; then
+ continue
fi
- echo -n " ($src)"
- echo "$incl $src" >> _incl
- (
- cd compile/LINT
- if [ -f $src ] ; then
- grep -v "#[ ]*include[ ]*.$incl." $src > ${src}_
- mv ${src}_ $src
- echo " BINGO!"
- else
- echo " BINGO!, but not in LINT"
+
+ # Check if the warnings changed.
+
+ for t in $l
+ do
+ cd $t
+ mv ${o} ${o}_
+ if make ${o} > _ref 2>&1 ; then
+ if cmp -s _ref _log ; then
+ echo " $t same warnings"
+ else
+ echo " $t changed warnings"
+ S=TAG
+ fi
+ else
+ echo "ARGHH!!!"
+ exit 9
+ fi
+
+ mv ${o}_ ${o}
+ cd ../..
+ if [ "x$S" != "x" ] ; then
+ break
+ fi
+ done
+ if [ "x$S" != "x" ] ; then
+ continue
fi
- )
- )
+ cp $src ${src}_
+ sed "${lin}d" ${src}_ > ${src}
+ rm ${src}_
+ touch _again
+ echo "BINGO $src $lin $incl $obj $l"
done
done
-
OpenPOWER on IntegriCloud