Home | History | Annotate | Line # | Download | only in contrib
      1  1.1  mrg #!/bin/sh
      2  1.1  mrg #
      3  1.1  mrg # This script parses the output of a gcc bootstrap when using warning
      4  1.1  mrg # flags and determines various statistics.
      5  1.1  mrg # 
      6  1.7  mrg # usage: warn_summary [-llf] [-s stage] [-nosub|-ch|-cp|-f|-fortran|-ada|-intl|-fixinc]
      7  1.1  mrg # 	[-pass|-wpass] [file(s)]
      8  1.1  mrg #
      9  1.1  mrg # -llf
     10  1.1  mrg # Filter out long lines from the bootstrap output before any other
     11  1.1  mrg # action.  This is useful for systems with broken awks/greps which choke
     12  1.1  mrg # on long lines.  It is not done by default as it sometimes slows things
     13  1.1  mrg # down.
     14  1.1  mrg #
     15  1.1  mrg # -s number
     16  1.1  mrg # Take warnings from stage "Number".  Stage 0 means show warnings from
     17  1.1  mrg # before and after the gcc bootstrap directory.  E.g. libraries, etc.
     18  1.1  mrg # This presupposes using "gcc -W*" for the stage1 compiler.
     19  1.1  mrg #
     20  1.1  mrg # -nosub
     21  1.1  mrg # Only show warnings from the gcc top level directory.
     22  1.7  mrg # -ch|-cp|-f|-fortran|-ada|-intl|-fixinc
     23  1.1  mrg # Only show warnings from the specified gcc subdirectory.
     24  1.1  mrg # These override each other so only the last one passed takes effect.
     25  1.1  mrg #
     26  1.1  mrg # -pass
     27  1.1  mrg # Pass through the bootstrap output after filtering stage and subdir
     28  1.1  mrg # (useful for manual inspection.)  This is all lines, not just warnings.
     29  1.1  mrg # -wpass
     30  1.1  mrg # Pass through only warnings from the bootstrap output after filtering
     31  1.1  mrg # stage and subdir.
     32  1.1  mrg #
     33  1.1  mrg # By Kaveh Ghazi  (ghazi (at] caip.rutgers.edu)  12/13/97.
     34  1.1  mrg 
     35  1.1  mrg 
     36  1.1  mrg # Some awks choke on long lines, sed seems to do a better job.
     37  1.1  mrg # Truncate lines > 255 characters.  RE '.\{255,\}' doesn't seem to work. :-(
     38  1.1  mrg # Only do this if -llf was specified, because it can really slow things down.
     39  1.1  mrg longLineFilter()
     40  1.1  mrg {
     41  1.1  mrg   if test -z "$llf" ; then
     42  1.1  mrg     cat
     43  1.1  mrg   else
     44  1.1  mrg     sed 's/^\(...............................................................................................................................................................................................................................................................\).*/\1/'
     45  1.1  mrg   fi
     46  1.1  mrg }
     47  1.1  mrg 
     48  1.1  mrg # This function does one of three things.  It either passes through
     49  1.1  mrg # all warning data, or passes through gcc toplevel warnings, or passes
     50  1.1  mrg # through a particular subdirectory set of warnings.
     51  1.1  mrg subdirectoryFilter()
     52  1.1  mrg {
     53  1.1  mrg   longLineFilter | (
     54  1.1  mrg   if test -z "$filter" ; then
     55  1.1  mrg     # Pass through all lines.
     56  1.1  mrg     cat
     57  1.1  mrg   else
     58  1.1  mrg     if test "$filter" = nosub ; then
     59  1.1  mrg       # Omit all subdirectories.
     60  1.7  mrg       egrep -v '/gcc/(ch|cp|f|fortran|ada|intl|fixinc)/'
     61  1.1  mrg     else
     62  1.1  mrg       # Pass through only subdir $filter.
     63  1.1  mrg       grep "/gcc/$filter/"
     64  1.1  mrg     fi
     65  1.1  mrg   fi )
     66  1.1  mrg }
     67  1.1  mrg 
     68  1.1  mrg # This function displays all lines from stageN of the bootstrap.  If
     69  1.1  mrg # stage==0, then show lines prior to stage1 and lines from after the last
     70  1.1  mrg # stage.  I.e. utilities, libraries, etc.
     71  1.1  mrg stageNfilter()
     72  1.1  mrg {
     73  1.1  mrg   if test "$stageN" -lt 1 ; then
     74  1.1  mrg     # stage "0" means check everything *but* gcc.
     75  1.1  mrg     $AWK "BEGIN{t=1} ; /^Bootstrapping the compiler/{t=0} ; /^Building runtime libraries/{t=1} ; {if(t==1)print}"
     76  1.1  mrg   else
     77  1.1  mrg     if test "$stageN" -eq 1 ; then
     78  1.1  mrg       $AWK "/^Bootstrapping the compiler|^Building the C and C\+\+ compiler/{t=1} ; /stage$stageN/{t=0} ; {if(t==1)print}"
     79  1.1  mrg     else
     80  1.1  mrg       stageNminus1=`expr $stageN - 1`
     81  1.1  mrg       $AWK "/stage${stageNminus1}\//{t=1} ; /stage$stageN/{t=0} ; {if(t==1)print}"
     82  1.1  mrg     fi
     83  1.1  mrg   fi
     84  1.1  mrg }
     85  1.1  mrg 
     86  1.1  mrg # This function displays lines containing warnings.
     87  1.1  mrg warningFilter()
     88  1.1  mrg {
     89  1.1  mrg   grep ' warning: '
     90  1.1  mrg }
     91  1.1  mrg 
     92  1.1  mrg # This function replaces `xxx' with `???', where xxx is usually some
     93  1.1  mrg # variable or function name.  This allows similar warnings to be
     94  1.1  mrg # counted together when summarizing.  However it avoids replacing
     95  1.1  mrg # certain C keywords which are known appear in various messages.
     96  1.1  mrg 
     97  1.1  mrg keywordFilter() {
     98  1.1  mrg   sed 's/.*warning: //; 
     99  1.1  mrg 	s/`\(int\)'"'"'/"\1"/g;
    100  1.1  mrg 	s/`\(long\)'"'"'/"\1"/g;
    101  1.1  mrg 	s/`\(char\)'"'"'/"\1"/g;
    102  1.1  mrg 	s/`\(inline\)'"'"'/"\1"/g;
    103  1.1  mrg 	s/`\(else\)'"'"'/"\1"/g;
    104  1.1  mrg 	s/`\(return\)'"'"'/"\1"/g;
    105  1.1  mrg 	s/`\(static\)'"'"'/"\1"/g;
    106  1.1  mrg 	s/`\(extern\)'"'"'/"\1"/g;
    107  1.1  mrg 	s/`\(const\)'"'"'/"\1"/g;
    108  1.1  mrg 	s/`\(noreturn\)'"'"'/"\1"/g;
    109  1.1  mrg 	s/`\(longjmp\)'"'"' or `\(vfork\)'"'"'/"\1" or "\2"/g;
    110  1.1  mrg 	s/'"[\`'][^']*'/"'"???"/g;
    111  1.1  mrg 	s/.*format, .* arg (arg [0-9][0-9]*)/??? format, ??? arg (arg ???)/;
    112  1.1  mrg 	s/\([( ]\)arg [0-9][0-9]*\([) ]\)/\1arg ???\2/;
    113  1.1  mrg 	s/"\([^"]*\)"/`\1'"'"'/g'
    114  1.1  mrg }
    115  1.1  mrg 
    116  1.1  mrg # This function strips out relative pathnames for source files printed
    117  1.1  mrg # by the warningFilter function.  This is done so that as the snapshot
    118  1.1  mrg # directory name changes every week, the output of this program can be
    119  1.1  mrg # compared to previous runs without spurious diffs caused by source
    120  1.1  mrg # directory name changes.
    121  1.1  mrg 
    122  1.1  mrg srcdirFilter()
    123  1.1  mrg {
    124  1.1  mrg   sed '
    125  1.1  mrg s%^[^ ]*/\(gcc/\)%\1%;
    126  1.1  mrg s%^[^ ]*/\(include/\)%\1%;
    127  1.1  mrg s%^[^ ]*/\(texinfo/\)%\1%;
    128  1.1  mrg s%^[^ ]*/\(fastjar/\)%\1%;
    129  1.1  mrg s%^[^ ]*/\(zlib/\)%\1%;
    130  1.1  mrg s%^[^ ]*/\(fixincludes/\)%\1%;
    131  1.1  mrg s%^[^ ]*/\(sim/\)%\1%;
    132  1.1  mrg s%^[^ ]*/\(newlib/\)%\1%;
    133  1.1  mrg s%^[^ ]*/\(mpfr/\)%\1%;
    134  1.1  mrg s%^[^ ]*/\(lib[a-z23+-]*/\)%\1%;'
    135  1.1  mrg }
    136  1.1  mrg 
    137  1.1  mrg # Start the main section.
    138  1.1  mrg 
    139  1.7  mrg usage="usage: `basename $0` [-llf] [-s stage] [-nosub|-ch|-cp|-f|-fortran|-ada|-intl|-fixinc] [-pass|-wpass] [file(s)]"
    140  1.1  mrg stageN=3
    141  1.8  mrg tmpfile=${TMPDIR:-/tmp}/tmp-warn.$$
    142  1.1  mrg 
    143  1.1  mrg # Remove $tmpfile on exit and various signals.
    144  1.1  mrg trap "rm -f $tmpfile" 0
    145  1.1  mrg trap "rm -f $tmpfile ; exit 1" 1 2 3 5 9 13 15
    146  1.1  mrg 
    147  1.1  mrg # Find a good awk.
    148  1.1  mrg if test -z "$AWK" ; then
    149  1.1  mrg   for AWK in gawk nawk awk ; do
    150  1.1  mrg     if type $AWK 2>&1 | grep 'not found' > /dev/null 2>&1 ; then
    151  1.1  mrg       :
    152  1.1  mrg     else
    153  1.1  mrg       break
    154  1.1  mrg     fi
    155  1.1  mrg   done
    156  1.1  mrg fi
    157  1.1  mrg 
    158  1.1  mrg # Parse command line arguments.
    159  1.1  mrg while test -n "$1" ; do
    160  1.1  mrg  case "$1" in
    161  1.1  mrg    -llf) llf=1 ; shift ;;
    162  1.1  mrg    -s)  if test -z "$2"; then echo $usage 1>&2; exit 1; fi
    163  1.1  mrg 	stageN="$2"; shift 2 ;;
    164  1.1  mrg    -s*) stageN="`expr $1 : '-s\(.*\)'`" ; shift ;;
    165  1.7  mrg    -nosub|-ch|-cp|-f|-fortran|-ada|-intl|-fixinc) filter="`expr $1 : '-\(.*\)'`" ; shift ;;
    166  1.1  mrg    -pass) pass=1 ; shift ;;
    167  1.1  mrg    -wpass) pass=w ; shift ;;
    168  1.1  mrg    -*)  echo $usage 1>&2 ; exit 1 ;;
    169  1.1  mrg    *)   break ;;
    170  1.1  mrg  esac
    171  1.1  mrg done
    172  1.1  mrg 
    173  1.1  mrg # Check for a valid value of $stageN.
    174  1.1  mrg case "$stageN" in
    175  1.1  mrg   [0-9]) ;;
    176  1.1  mrg   *) echo "Stage <$stageN> must be in the range [0..9]." 1>&2 ; exit 1 ;;
    177  1.1  mrg esac
    178  1.1  mrg 
    179  1.1  mrg for file in "$@" ; do
    180  1.1  mrg 
    181  1.1  mrg   stageNfilter < $file | subdirectoryFilter > $tmpfile
    182  1.1  mrg 
    183  1.1  mrg   # (Just) show me the warnings.
    184  1.1  mrg   if test "$pass" != '' ; then
    185  1.1  mrg     if test "$pass" = w ; then
    186  1.1  mrg       warningFilter < $tmpfile
    187  1.1  mrg     else
    188  1.1  mrg       cat $tmpfile
    189  1.1  mrg     fi
    190  1.1  mrg     continue
    191  1.1  mrg   fi
    192  1.1  mrg 
    193  1.1  mrg   if test -z "$filter" ; then
    194  1.1  mrg     echo "Counting all warnings,"
    195  1.1  mrg   else
    196  1.1  mrg     if test "$filter" = nosub ; then
    197  1.1  mrg       echo "Counting non-subdirectory warnings,"
    198  1.1  mrg     else
    199  1.1  mrg       echo "Counting warnings in the gcc/$filter subdirectory,"
    200  1.1  mrg     fi
    201  1.1  mrg   fi
    202  1.1  mrg   count=`warningFilter < $tmpfile | wc -l`
    203  1.1  mrg   echo there are $count warnings in stage$stageN of this bootstrap.
    204  1.1  mrg 
    205  1.1  mrg   echo
    206  1.1  mrg   echo Number of warnings per file:
    207  1.1  mrg   warningFilter < $tmpfile | srcdirFilter | $AWK -F: '{print$1}' | sort | \
    208  1.1  mrg     uniq -c | sort -nr
    209  1.1  mrg 
    210  1.1  mrg   echo
    211  1.1  mrg   echo Number of warning types:
    212  1.1  mrg   warningFilter < $tmpfile | keywordFilter | sort | uniq -c | sort -nr
    213  1.1  mrg 
    214  1.1  mrg done
    215