#! /bin/sh

# Compare copies of two given object files.

# Copyright (C) 2007-2023 Free Software Foundation, Inc.
# 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
