#! /bin/sh

# Compare stripped copies of two given object files.

# Copyright (C) 2007, 2008, 2009 Free Software Foundation
# Originally by Alexandre Oliva <aoliva@redhat.com>

# 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-debug 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

cp "$1" "$1.$suf1"
strip "$1.$suf1"

cp "$2" "$2.$suf2"
strip "$2.$suf2"

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

  # Assembler-generated CFI will add an .eh_frame section for -g not
  # present in -g0.  Try to cope with it by checking that an .eh_frame
  # section is present in either object file, and then stripping it
  # off before re-comparing.

  cmd=
  cmp1=
  cmp2=

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

      $cmd --section-headers "$1.$suf1" | grep '\.eh_frame' > /dev/null
      cmp1=$?

      $cmd --section-headers "$2.$suf2" | grep '\.eh_frame' > /dev/null
      cmp2=$?

      break
    fi
  done

  # If we found .eh_frame in one but not the other, or if we could not
  # find a command to tell, try to strip off the .eh_frame section
  # from both.
  if test "x$cmp1" != "x$cmp2" || test "x$cmd" = "x"; then
    suf3=$suf1.
    while test -f "$1.$suf3"; do
      suf3=$suf3.
    done

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

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

    echo stripping off .eh_frame, then retrying >&2

    if (objcopy -v) 2>&1 | grep -e "--remove-section" > /dev/null; then
      objcopy --remove-section .eh_frame --remove-section .rel.eh_frame --remove-section .rela.eh_frame "$1.$suf1" "$1.$suf3"
      mv "$1.$suf3" "$1.$suf1"

      objcopy --remove-section .eh_frame --remove-section .rel.eh_frame --remove-section .rela.eh_frame "$2.$suf2" "$2.$suf4"
      mv "$2.$suf4" "$2.$suf2"
    elif (strip --help) 2>&1 | grep -e --remove-section > /dev/null; then
      cp "$1.$suf1" "$1.$suf3"
      strip --remove-section .eh_frame --remove-section .rel.eh_frame --remove-section .rela.eh_frame "$1.$suf3"
      mv "$1.$suf3" "$1.$suf1"

      cp "$2.$suf2" "$2.$suf4"
      strip --remove-section .eh_frame --remove-section .rel.eh_frame --remove-section .rela.eh_frame "$2.$suf4"
      mv "$2.$suf4" "$2.$suf2"
    else
      echo failed to strip off .eh_frame >&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
