#! /bin/bash

# Compare the assembly language output for all the gcc tests.
# Copyright (C) 2009, 2011 Free Software Foundation, Inc.
# Contributed by Paolo Bonzini.
#
# Invoke it as "bash compare-all-tests target1 target2 ... targetN".
# Assumptions are:
#
# 1) that the base and patched compilers reside respectively in
# base-$target-build and $target-build, where $target is the commandline
# argument to compare-all-tests, and should match the variables in the
# script itself so that the correct set of options is tested.  Both
# compilers should be fully built (including target libraries).
# 
# 2) that the testsuite has been run on the base compiler (since it's
# just compilation testing, using RUNTESTFLAGS=--target_board=basic-sim
# usually suffices).
# 
# Tests that fail to compile on the base compiler are not compared.

alpha_opts='-mlong-double-64/-mieee -mlong-double-64 -mlong-double-128/-mieee -mlong-double-128'
arm_opts='-mthumb/-march=armv5t -mthumb/-march=armv6t2 -march=armv5 -mthumb/-march=armv6t2/-mfpu=vfp/-mfloat-abi=softfp -march=armv5/-mfpu=vfp/-mfloat-abi=softfp'
cris_opts='-march=v32 -march=v1'
h8300_opts='/ -mh -mh/-mn -ms -ms/-mn -msx -msx/-mn -mint32 -mh/-mint32 -mh/-mn/-mint32 -ms/-mint32 -ms/-mn/-mint32 -msx/-mint32 -msx/-mn/-mint32'
i386_opts='-m32 -m64 -m32/-msse/-msse2/-mfpmath=sse'
m32c_opts='-mcpu=r8c -mcpu=m16c -mcpu=m32c'
m68k_opts='-m68000 -m68020 -m68020/-m68881 -m68040/-m68881 -m68060/-m68881 -mcfv4e'
mips_opts='-msoft-float/-mgp32/-mips16 -mabi=32/-mfp32/-mgp32/-mips16 -mabi=o64/-mfp64/-mgp64/-mips16 -msoft-float/-mgp32 -mfp32/-mgp32 -march=mips64r2/-mabi=32/-mfp64/-mgp32 -msoft-float/-mgp64 -msingle-float/-mfp32/-mgp64 -mfp64/-mgp64'
mn10300_opts='-mam33 -mam33-2'
pa_opts='-march=2.0 -march=1.0 -march=1.1'
ppc_opts='-m32 -m64'
s390_opts='-m31 -m31/-mzarch -m64'
sh_opts='-m3 -m3e -m4 -m4a -m4al -m4/-mieee -m1 -m1/-mno-cbranchdi -m2a -m2a/-mieee -m2e -m2e/-mieee'
sparc_opts='-mcpu=v8/-m32 -mcpu=v9/-m32 -m64'

all_targets='alpha arm avr bfin cris fr30 frv h8300 ia64 iq2000 m32c m32r m68k mcore mips mmix mn10300 pa pdp11 ppc sh sparc v850 vax xstormy16 xtensa' # e500 

test_one_file ()
{
  local bdir pdir opts bline pline
  bdir=base-$1-gcc-build
  pdir=$1-gcc-build
  bline=$2
  pline=${2//$bdir/$pdir}
  opts=${3//\// }
  echo "$pline $opts"
  $bline $opts 2>/dev/null >/dev/null || return 0
  diff -L "$bdir/gcc/cc1 $opts" -L "$pdir/gcc/cc1 $opts" -u \
    <( $bline $opts 2>&1 ) <( $pline $opts 2>&1 ) || { echo -n . >&2; return 1; }
}
  
test_all_opts ()
{
  eval opts=\$${1}_opts
  if test -z "$opts"; then
    test_one_file $1 "$2"
  else
    for opt in $opts; do
      test_one_file $1 "$2" $opt
    done
  fi
}

for target in ${*-$all_targets}; do
  mkdir -p $target-gcc-build/gcc/testsuite/gcc
  cp -R base-$target-gcc-build/gcc/testsuite/gcc/gcc.dg-struct-layout-1 \
    $target-gcc-build/gcc/testsuite/gcc/gcc.dg-struct-layout-1 

  # Provide targ-include files for newlib
  # for newlib_path in `echo base-$target-gcc-build/*/newlib`; do
  #   test -d $newlib_path && ln -sf ../../$newlib_path ${newlib_path/base-}
  # done

  echo -n Testing $target >&2
  sed '/^Executing on host: /!d
    /xgcc -B/!d
    / -E /d
    / -g/d
    / -print-prog-name=/d
    s/^Executing on host: //
    s/   *(timeout.*//
    s/ -fverbose-asm / /
    s/ -frtl-abstract-sequences / /
    s/ -fdump[-a-z0-9]* / /g
    s/ -da / /g
    s/ -\{1,2\}save-temps / /
    s/ -c / -S /
    / -S /! s/ -o / -S -o /
    s/ -o [^ ]*/ -frandom-seed=0 -o -/' base-$target-gcc-build/gcc/testsuite/gcc/gcc.log | while read line; do
    case "$line" in
      *" -m"*) test_one_file $target "$line" "" ;;
      *) test_all_opts $target "$line" ;;
    esac
  done > compare-$target.log
  echo >&2
done
