]> git.ipfire.org Git - thirdparty/binutils-gdb.git/blobdiff - gdb/gdb_mbuild.sh
gdb: allow specifying multiple filters when running selftests
[thirdparty/binutils-gdb.git] / gdb / gdb_mbuild.sh
index a1077401a2e43ccf0d22ee016cddd85889f6fbf6..53b5578aea835d61043f3942dc92741467cf2a46 100755 (executable)
@@ -3,23 +3,27 @@
 #  Multi-build script for testing compilation of all maintained
 #  configs of GDB.
 
-#  Copyright 2002 Free Software Foundation, Inc.
+#  Copyright (C) 2002-2020 Free Software Foundation, Inc.
 
 #  Contributed by Richard Earnshaw  (rearnsha@arm.com)
 
 #  This program is free software; you can redistribute it and/or modify
 #  it under the terms of the GNU General Public License as published by
-#  the Free Software Foundation; either version 2 of the License, or
+#  the Free Software Foundation; either version 3 of the License, or
 #  (at your option) any later version.
-
+#
 #  This program is distributed in the hope that it will be useful,
 #  but WITHOUT ANY WARRANTY; without even the implied warranty of
 #  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 #  GNU General Public License for more details.
-
+#
 #  You should have received a copy of the GNU General Public License
-#  along with this program; if not, write to the Free Software
-#  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+#  along with this program.  If not, see <http://www.gnu.org/licenses/>.
+
+# Make certain that the script is not running in an internationalized
+# environment.
+LANG=c ; export LANG
+LC_ALL=c ; export LC_ALL
 
 usage()
 {
@@ -29,6 +33,7 @@ Usage: gdb_mbuild.sh [ <options> ... ] <srcdir> <builddir>
    -j <makejobs>  Run <makejobs> in parallel.  Passed to make.
                  On a single cpu machine, 2 is recommended.
    -k             Keep going.  Do not stop after the first build fails.
+   --keep         Keep builds.  Do not remove each build when finished.
    -e <regexp>    Regular expression for selecting the targets to build.
    -f             Force rebuild.  Even rebuild previously built directories.
    -v             Be more (and more, and more) verbose.
@@ -53,6 +58,7 @@ keepgoing=
 force=false
 targexp=""
 verbose=0
+keep=false
 while test $# -gt 0
 do
     case "$1" in
@@ -72,6 +78,9 @@ do
        # Should we soldier on after the first build fails?
        keepgoing=-k
        ;;
+    --keep )
+        keep=true
+       ;;
     -e )
        # A regular expression for selecting targets
        shift
@@ -80,7 +89,8 @@ do
        ;;
     -f )
        # Force a rebuild
-       force=true ; shift ;;
+       force=true ;
+       ;;
     -v )
        # Be more, and more, and more, verbose
        verbose=`expr ${verbose} + 1`
@@ -185,7 +195,7 @@ log ()
 
 
 
-# Warn the user of what is comming, print the list of targets
+# Warn the user of what is coming, print the list of targets
 
 echo "$alltarg"
 echo ""
@@ -199,7 +209,7 @@ do
     trap "exit 1"  1 2 15
     dir=${builddir}/${target}
 
-    # Should a scratch rebuild be forced, for perhaphs the entire
+    # Should a scratch rebuild be forced, for perhaps the entire
     # build be skipped?
 
     if ${force}
@@ -261,8 +271,13 @@ do
 
     if test ! -x gdb/gdb -a ! -x gdb/gdb.exe
     then
+       # Iff the build fails remove the final build target so that
+       # the follow-on code knows things failed.  Stops the follow-on
+       # code thinking that a failed rebuild succeeded (executable
+       # left around from previous build).
        echo ... ${make} ${keepgoing} ${makejobs} ${target}
-       ${make} ${keepgoing} ${makejobs} all-gdb 2>&1 | log 1 Build.log
+       ( ${make} ${keepgoing} ${makejobs} all-gdb || rm -f gdb/gdb gdb/gdb.exe
+       ) 2>&1 | log 1 Build.log
     fi
     fail "compile failed" ! -x gdb/gdb -a ! -x gdb/gdb.exe
  
@@ -279,14 +294,40 @@ EOF
     fail "gdb printed no output" ! -s Gdb.log
     grep -e internal-error Gdb.log && fail "gdb panic" 1
 
+    echo ... cleanup ${target}
+
+    # Create a sed script that cleans up the output from GDB.
+    rm -f mbuild.sed
+    touch mbuild.sed || exit 1
+    # Rules to replace <0xNNNN> with the corresponding function's
+    # name.
+    sed -n -e '/<0x0*>/d' -e 's/^.*<0x\([0-9a-f]*\)>.*$/0x\1/p' Gdb.log \
+    | sort -u \
+    | while read addr
+    do
+       func="`addr2line -f -e ./gdb/gdb -s ${addr} | sed -n -e 1p`"
+       test ${verbose} -gt 0 && echo "${addr} ${func}" 1>&2
+       echo "s/<${addr}>/<${func}>/g"
+    done >> mbuild.sed
+    # Rules to strip the leading paths off of file names.
+    echo 's/"\/.*\/gdb\//"gdb\//g' >> mbuild.sed
+    # Run the script
+    sed -f mbuild.sed Gdb.log > Mbuild.log
+
     # Replace the build directory with a file as semaphore that stops
     # a rebuild. (should the logs be saved?)
 
     cd ${builddir}
-    rm -f ${target}.tmp
-    mv ${target}/Gdb.log ${target}.tmp
-    rm -rf ${target}
-    mv ${target}.tmp ${target}
+
+    if ${keep}
+    then
+       :
+    else
+       rm -f ${target}.tmp
+       mv ${target}/Mbuild.log ${target}.tmp
+       rm -rf ${target}
+       mv ${target}.tmp ${target}
+    fi
 
     # Success!
     echo ... ${target} built