#! /bin/sh

# Compare copies of two given object files.

# Copyright (C) 2007, 2008, 2009, 2010, 2012 Free Software Foundation
# Originally by Alexandre Oliva <aoliva@redhat.com>
# Modified for LTO bootstrap by Richard Biener <rguenther@suse.de>

# This file is part of GCC.

# GCC 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 3, or (at your option) any later
# version.

# GCC 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 GCC; see the file COPYING3.  If not see
# <http://www.gnu.org/licenses/>.

rm='rm -f'

case $1 in
-p | --preserve)
  rm='echo preserving'
  shift
  ;;
esac

if test $# != 2; then
  echo 'usage: compare-lto file1 file2' >&2
  exit 1
fi

if test ! -f "$1"; then
  echo "$1" does not exist >&2
  exit 1
fi

if test ! -f "$2"; then
  echo "$2" does not exist >&2
  exit 1
fi

suf1=stripped
while test -f "$1.$suf1"; do
  suf1=$suf1.
done

suf2=stripped
while test -f "$2.$suf2"; do
  suf2=$suf2.
done

trap 'rm -f "$1.$suf1" "$2.$suf2"' 0 1 2 15

if cmp "$1" "$2"; then
  status=0
else
  status=1

  cmd=
  for t in objdump readelf eu-readelf; do
    if ($t --help) 2>&1 | grep ' --\[*section-\]*headers' > /dev/null; then
      cmd=$t
      break
    fi
  done

  # If there are LTO option sections, try to strip them off.
  if test "x$cmd" = "x" ||
     $cmd --section-headers "$1" | grep '.gnu.lto_.opts' > /dev/null ||
     $cmd --section-headers "$2" | grep '.gnu.lto_.opts' > /dev/null ; then

    echo stripping off LTO option section, then retrying >&2

    seclist=".gnu.lto_.opts"
    rsopts=`for sec in $seclist; do echo " --remove-section $sec"; done`

    if (objcopy -v) 2>&1 | grep ' --remove-section' > /dev/null; then
      objcopy $rsopts "$1" "$1.$suf1"
      objcopy $rsopts "$2" "$2.$suf2"
    elif (strip --help) 2>&1 | grep ' --remove-section' > /dev/null; then
      cp "$1" "$1.$suf1"
      strip $rsopts "$1.$suf1"

      cp "$2" "$2.$suf2"
      strip $rsopts "$2.$suf2"
    else
      echo failed to strip off LTO option section >&2
    fi

    trap 'rm -f "$1.$suf1" "$2.$suf2"' 0 1 2 15

    if cmp "$1.$suf1" "$2.$suf2"; then
      status=0
    else
      status=1
    fi

  # PE-COFF executables are timestamped so skip leading bytes for them.
  else
    case "$1" in
      *.exe)
        if cmp -i 256 "$1" "$2"; then
          status=0
        else
          status=1
        fi
        ;;
      *)
        if test -f "$1.exe" && cmp -i 256 "$1.exe" "$2.exe"; then
          status=0
        else
          status=1
        fi
        ;;
    esac
  fi
fi

$rm "$1.$suf1" "$2.$suf2"

trap "exit $status; exit" 0 1 2 15

exit $status
