]> oss.titaniummirror.com Git - msp430-gcc.git/blobdiff - contrib/check_warning_flags.sh
Imported gcc-4.4.3
[msp430-gcc.git] / contrib / check_warning_flags.sh
diff --git a/contrib/check_warning_flags.sh b/contrib/check_warning_flags.sh
new file mode 100755 (executable)
index 0000000..eb53832
--- /dev/null
@@ -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 <Ralf.Wildenhues@gmx.de>.
+#
+# 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