#! /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.o file2.o' >&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
  fi
fi

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

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

exit $status
