X-Git-Url: https://oss.titaniummirror.com/gitweb?a=blobdiff_plain;f=contrib%2Fcheck_warning_flags.sh;fp=contrib%2Fcheck_warning_flags.sh;h=eb53832730cebe127b75b031154e044c5f644245;hb=6fed43773c9b0ce596dca5686f37ac3fc0fa11c0;hp=0000000000000000000000000000000000000000;hpb=27b11d56b743098deb193d510b337ba22dc52e5c;p=msp430-gcc.git diff --git a/contrib/check_warning_flags.sh b/contrib/check_warning_flags.sh new file mode 100755 index 00000000..eb538327 --- /dev/null +++ b/contrib/check_warning_flags.sh @@ -0,0 +1,180 @@ +#! /bin/sh +# +# Check that the warning flags documented in invoke.texi match up +# with what the compiler accepts. +# +# Copyright (C) 2008, 2009 Free Software Foundation, Inc. +# Written by Ralf Wildenhues . +# +# This script is Free Software, and it can be copied, distributed and +# modified as defined in the GNU General Public License. A copy of +# its license can be downloaded from http://www.gnu.org/copyleft/gpl.html +# +# Call this script as +# check_warning_flags.sh path/to/invoke.texi +# with CC set to the compiler to be tested. +# The script scribbles in the current directory. + +progname=`echo "$0" | sed 's,.*/,,'` +usage () +{ + echo "usage: $progname path/to/gcc/doc" + echo "set \$CC to the compiler to be checked" + exit 1 +} + +ret=0 +LC_ALL=C +export LC_ALL +: ${CC=gcc} +test $# = 1 || usage +gcc_docdir=$1 +invoke_texi=$gcc_docdir/invoke.texi +test -r "$invoke_texi" || { + echo "$progname: error: cannot read '$invoke_texi'" >&2 + usage +} +filebase=check_warning_flags_file$$ +stderr=check_warning_flags_stderr$$ + +remove_problematic_flags=' + /-Wlarger-than-/d + /-Wframe-larger-than/d + /-Wdisallowed-function-list/d + /-W[alp],/d + /-Werror/d + /-Wpadded/d + /pedantic-ms-format/d + /=/d' + +# Ensure that indexed warnings are accepted. +set x `sed '/^@opindex W/{ + s/^@opindex /-/ + '"$remove_problematic_flags"' + /-W[alp]$/d + p +} +d' <"$invoke_texi"` +shift +: >$filebase.c +$CC -c $filebase.c "$@" 2>&1 | + grep -v 'command line option.*is valid for.*but not for' >$stderr +if test -s $stderr; then + echo "options listed in @opindex but not accepted by the compiler:" >&2 + cat $stderr >&2 + ret=1 +fi +rm -f $filebase.c $stderr + +# Check documentation of warning options. +for lang in c c++ objc obj-c++; do + case $lang in + c) ext=c; langmatch='[^-]C[^+].*only' ;; + c++) ext=C; langmatch='[^-]C++.*only' ;; + objc) ext=m; langmatch='Objective-C[^+].*only' ;; + obj-c++) ext=M; langmatch='Objective-C++.*only' ;; + esac + file=$filebase.$ext + : >$file + $CC -c $file 2>$stderr + if grep 'not installed on this system' $stderr >/dev/null || + grep 'installation problem, cannot exec' $stderr >/dev/null || + grep 'error trying to exec' $stderr >/dev/null + then + echo "$progname: $CC is not configured for language $lang, skipping checks" >&2 + rm -f $file $filebase.o $filebase.obj $stderr + continue + fi + + # Verify good warning flags. + set x `sed ' + t a + :a + /^@item -W/{ + /'"$langmatch"'/b x + / only)/d + b x + } + d + :x + '"$remove_problematic_flags"' + s/^@item // + s/ .*// + ' <"$invoke_texi"` + shift + $CC -c $file -O "$@" 2>$stderr + if test -s $stderr; then + echo failures: >&2 + cat $stderr >&2 + ret=1 + fi + + # Verify bad warning flags. + set x `sed ' + t a + :a + /^@item -W/{ + / only)/!d + /'"$langmatch"'/d + b x + } + d + :x + '"$remove_problematic_flags"' + s/^@item // + s/ .*// + ' <"$invoke_texi"` + shift + $CC -c $file -O "$@" 2>$stderr + # cat $stderr >&2 + test $# = `grep 'command line option.*valid.*but not for' <$stderr | wc -l` || { + for warning + do + grep "command line option.*$warning.*valid" <$stderr >&2 || + echo "valid for $lang but not annotated as such: $warning" + done + ret=1 + } + rm -f $file $filebase.o $filebase.obj $stderr +done + + +remove_problematic_help_flags=' + /^W$/d + /^W[alp]$/d + /^Werror-implicit-function-declaration$/d + /^Wsynth$/d + /-$/d + /=/d' +help_flags=` + $CC --help -v 2>/dev/null | tr ' ' '\n' | + sed -n ' + b a + :a + s/^-\(W[^<,]*\).*/\1/ + t x + d + :x + '"$remove_problematic_help_flags"' + p' | sort -u` +: >$filebase.c +for flag in $help_flags; do + $CC -c $filebase.c -$flag 2>/dev/null || { + echo "warning -$flag not supported" >&2 + ret=1 + } + grep "@item.*$flag" $gcc_docdir/../*/*.texi >/dev/null || { + # For @item, we are satisfied with either -Wfoo or -Wno-foo. + inverted_flag=`echo "$flag" | sed ' + s/^Wno-/W/ + t + s/^W/Wno-/'` + grep "@item.*$inverted_flag" $gcc_docdir/../*/*.texi >/dev/null || { + echo "warning -$flag not documented in $gcc_docdir/../*/*.texi" >&2 + ret=1 + } + } +done +rm -f $filebase.c $filebase.o + +exit $ret