X-Git-Url: http://git.sourceforge.jp/view?p=pf3gnuchains%2Fgcc-fork.git;a=blobdiff_plain;f=contrib%2Fwarn_summary;h=253d244c3dd5aa590742a9090a378dee2bfc00f5;hp=1fb62b03e6cea3644e7f7601bfeeb4c3b5a3fd9c;hb=dfec1549f3f6582af8bc3b9bf41fefe02423c83a;hpb=4ad725b32e9c609bd5ea25b6c92abe6c33e548c6 diff --git a/contrib/warn_summary b/contrib/warn_summary index 1fb62b03e6c..253d244c3dd 100755 --- a/contrib/warn_summary +++ b/contrib/warn_summary @@ -1,17 +1,145 @@ #!/bin/sh +# # This script parses the output of a gcc bootstrap when using warning # flags and determines various statistics. +# +# usage: warn_summary [-llf] [-s stage] [-nosub|-ch|-cp|-f|-fortran|-java|-ada|-intl|-fixinc] +# [-pass|-wpass] [file(s)] +# +# -llf +# Filter out long lines from the bootstrap output before any other +# action. This is useful for systems with broken awks/greps which choke +# on long lines. It is not done by default as it sometimes slows things +# down. +# +# -s number +# Take warnings from stage "Number". Stage 0 means show warnings from +# before and after the gcc bootstrap directory. E.g. libraries, etc. +# This presupposes using "gcc -W*" for the stage1 compiler. +# +# -nosub +# Only show warnings from the gcc top level directory. +# -ch|-cp|-f|-fortran|-java|-ada|-intl|-fixinc +# Only show warnings from the specified gcc subdirectory. +# These override each other so only the last one passed takes effect. +# +# -pass +# Pass through the bootstrap output after filtering stage and subdir +# (useful for manual inspection.) This is all lines, not just warnings. +# -wpass +# Pass through only warnings from the bootstrap output after filtering +# stage and subdir. # # By Kaveh Ghazi (ghazi@caip.rutgers.edu) 12/13/97. -# This function displays all warnings from stage3 of the bootstrap. -stage3warns() + +# Some awks choke on long lines, sed seems to do a better job. +# Truncate lines > 255 characters. RE '.\{255,\}' doesn't seem to work. :-( +# Only do this if -llf was specified, because it can really slow things down. +longLineFilter() +{ + if test -z "$llf" ; then + cat + else + sed 's/^\(...............................................................................................................................................................................................................................................................\).*/\1/' + fi +} + +# This function does one of three things. It either passes through +# all warning data, or passes through gcc toplevel warnings, or passes +# through a particular subdirectory set of warnings. +subdirectoryFilter() +{ + longLineFilter | ( + if test -z "$filter" ; then + # Pass through all lines. + cat + else + if test "$filter" = nosub ; then + # Omit all subdirectories. + egrep -v '/gcc/(ch|cp|f|fortran|java|ada|intl|fixinc)/' + else + # Pass through only subdir $filter. + grep "/gcc/$filter/" + fi + fi ) +} + +# This function displays all lines from stageN of the bootstrap. If +# stage==0, then show lines prior to stage1 and lines from after the last +# stage. I.e. utilities, libraries, etc. +stageNfilter() +{ + if test "$stageN" -lt 1 ; then + # stage "0" means check everything *but* gcc. + $AWK "BEGIN{t=1} ; /^Bootstrapping the compiler/{t=0} ; /^Building runtime libraries/{t=1} ; {if(t==1)print}" + else + if test "$stageN" -eq 1 ; then + $AWK "/^Bootstrapping the compiler|^Building the C and C\+\+ compiler/{t=1} ; /stage$stageN/{t=0} ; {if(t==1)print}" + else + stageNminus1=`expr $stageN - 1` + $AWK "/stage${stageNminus1}\//{t=1} ; /stage$stageN/{t=0} ; {if(t==1)print}" + fi + fi +} + +# This function displays lines containing warnings. +warningFilter() { -# Some awks choke on long lines so grep them out. - grep -v libf2c.a $1 | \ - $AWK '/ warning: /{if(t==1)print} ; /stage2/{if(t==0)t=1}' + grep ' warning: ' } +# This function replaces `xxx' with `???', where xxx is usually some +# variable or function name. This allows similar warnings to be +# counted together when summarizing. However it avoids replacing +# certain C keywords which are known appear in various messages. + +keywordFilter() { + sed 's/.*warning: //; + s/`\(int\)'"'"'/"\1"/g; + s/`\(long\)'"'"'/"\1"/g; + s/`\(char\)'"'"'/"\1"/g; + s/`\(inline\)'"'"'/"\1"/g; + s/`\(else\)'"'"'/"\1"/g; + s/`\(return\)'"'"'/"\1"/g; + s/`\(static\)'"'"'/"\1"/g; + s/`\(extern\)'"'"'/"\1"/g; + s/`\(const\)'"'"'/"\1"/g; + s/`\(noreturn\)'"'"'/"\1"/g; + s/`\(longjmp\)'"'"' or `\(vfork\)'"'"'/"\1" or "\2"/g; + s/'"[\`'][^']*'/"'"???"/g; + s/.*format, .* arg (arg [0-9][0-9]*)/??? format, ??? arg (arg ???)/; + s/\([( ]\)arg [0-9][0-9]*\([) ]\)/\1arg ???\2/; + s/"\([^"]*\)"/`\1'"'"'/g' +} + +# This function strips out relative pathnames for source files printed +# by the warningFilter function. This is done so that as the snapshot +# directory name changes every week, the output of this program can be +# compared to previous runs without spurious diffs caused by source +# directory name changes. + +srcdirFilter() +{ + sed ' +s%^[^ ]*/\(gcc/\)%\1%; +s%^[^ ]*/\(include/\)%\1%; +s%^[^ ]*/\(texinfo/\)%\1%; +s%^[^ ]*/\(fastjar/\)%\1%; +s%^[^ ]*/\(zlib/\)%\1%; +s%^[^ ]*/\(lib[a-z23+-]*/\)%\1%;' +} + +# Start the main section. + +usage="usage: `basename $0` [-llf] [-s stage] [-nosub|-ch|-cp|-f|-fortran|-java|-ada|-intl|-fixinc] [-pass|-wpass] [file(s)]" +stageN=3 +tmpfile=/tmp/tmp-warn.$$ + +# Remove $tmpfile on exit and various signals. +trap "rm -f $tmpfile" 0 +trap "rm -f $tmpfile ; exit 1" 1 2 3 5 9 13 15 + # Find a good awk. if test -z "$AWK" ; then for AWK in gawk nawk awk ; do @@ -23,30 +151,60 @@ if test -z "$AWK" ; then done fi +# Parse command line arguments. +while test -n "$1" ; do + case "$1" in + -llf) llf=1 ; shift ;; + -s) if test -z "$2"; then echo $usage 1>&2; exit 1; fi + stageN="$2"; shift 2 ;; + -s*) stageN="`expr $1 : '-s\(.*\)'`" ; shift ;; + -nosub|-ch|-cp|-f|-fortran|-java|-ada|-intl|-fixinc) filter="`expr $1 : '-\(.*\)'`" ; shift ;; + -pass) pass=1 ; shift ;; + -wpass) pass=w ; shift ;; + -*) echo $usage 1>&2 ; exit 1 ;; + *) break ;; + esac +done + +# Check for a valid value of $stageN. +case "$stageN" in + [0-9]) ;; + *) echo "Stage <$stageN> must be in the range [0..9]." 1>&2 ; exit 1 ;; +esac + for file in "$@" ; do - count=`stage3warns $file | wc -l` - echo There are $count warnings in stage3 of this bootstrap. + stageNfilter < $file | subdirectoryFilter > $tmpfile + + # (Just) show me the warnings. + if test "$pass" != '' ; then + if test "$pass" = w ; then + warningFilter < $tmpfile + else + cat $tmpfile + fi + continue + fi + + if test -z "$filter" ; then + echo "Counting all warnings," + else + if test "$filter" = nosub ; then + echo "Counting non-subdirectory warnings," + else + echo "Counting warnings in the gcc/$filter subdirectory," + fi + fi + count=`warningFilter < $tmpfile | wc -l` + echo there are $count warnings in stage$stageN of this bootstrap. echo echo Number of warnings per file: - stage3warns $file | $AWK -F: '{print$1}' | sort | uniq -c | sort -nr + warningFilter < $tmpfile | srcdirFilter | $AWK -F: '{print$1}' | sort | \ + uniq -c | sort -nr echo echo Number of warning types: - stage3warns $file | sed 's/.*warning: //; - s/`\(int\)'"'"'/"\1"/g; - s/`\(char\)'"'"'/"\1"/g; - s/`\(inline\)'"'"'/"\1"/g; - s/`\(else\)'"'"'/"\1"/g; - s/`\(return\)'"'"'/"\1"/g; - s/`\(static\)'"'"'/"\1"/g; - s/`\(extern\)'"'"'/"\1"/g; - s/`\(longjmp\)'"'"' or `\(vfork\)'"'"'/"\1" or "\2"/g; - s/`'"[^']*'/"'`???'"'/g;"' - s/.*format, .* arg (arg [0-9]*)/??? format, ??? arg (arg ???)/; - s/(arg [0-9]*)/(arg ???)/; - s/"\([^"]*\)"/`\1'"'"'/g' | \ - sort | uniq -c | sort -nr + warningFilter < $tmpfile | keywordFilter | sort | uniq -c | sort -nr done