xref: /netbsd-src/external/gpl3/gcc.old/dist/contrib/compare-lto (revision 4c3eb207d36f67d31994830c0a694161fc1ca39b)
1627f7eb2Smrg#! /bin/sh
2627f7eb2Smrg
3627f7eb2Smrg# Compare copies of two given object files.
4627f7eb2Smrg
5627f7eb2Smrg# Copyright (C) 2007, 2008, 2009, 2010, 2012 Free Software Foundation
6627f7eb2Smrg# Originally by Alexandre Oliva <aoliva@redhat.com>
7627f7eb2Smrg# Modified for LTO bootstrap by Richard Biener <rguenther@suse.de>
8627f7eb2Smrg
9627f7eb2Smrg# This file is part of GCC.
10627f7eb2Smrg
11627f7eb2Smrg# GCC is free software; you can redistribute it and/or modify it under
12627f7eb2Smrg# the terms of the GNU General Public License as published by the Free
13627f7eb2Smrg# Software Foundation; either version 3, or (at your option) any later
14627f7eb2Smrg# version.
15627f7eb2Smrg
16627f7eb2Smrg# GCC is distributed in the hope that it will be useful, but WITHOUT
17627f7eb2Smrg# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
18627f7eb2Smrg# or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public
19627f7eb2Smrg# License for more details.
20627f7eb2Smrg
21627f7eb2Smrg# You should have received a copy of the GNU General Public License
22627f7eb2Smrg# along with GCC; see the file COPYING3.  If not see
23627f7eb2Smrg# <http://www.gnu.org/licenses/>.
24627f7eb2Smrg
25627f7eb2Smrgrm='rm -f'
26627f7eb2Smrg
27627f7eb2Smrgcase $1 in
28627f7eb2Smrg-p | --preserve)
29627f7eb2Smrg  rm='echo preserving'
30627f7eb2Smrg  shift
31627f7eb2Smrg  ;;
32627f7eb2Smrgesac
33627f7eb2Smrg
34627f7eb2Smrgif test $# != 2; then
35*4c3eb207Smrg  echo 'usage: compare-lto file1 file2' >&2
36627f7eb2Smrg  exit 1
37627f7eb2Smrgfi
38627f7eb2Smrg
39627f7eb2Smrgif test ! -f "$1"; then
40627f7eb2Smrg  echo "$1" does not exist >&2
41627f7eb2Smrg  exit 1
42627f7eb2Smrgfi
43627f7eb2Smrg
44627f7eb2Smrgif test ! -f "$2"; then
45627f7eb2Smrg  echo "$2" does not exist >&2
46627f7eb2Smrg  exit 1
47627f7eb2Smrgfi
48627f7eb2Smrg
49627f7eb2Smrgsuf1=stripped
50627f7eb2Smrgwhile test -f "$1.$suf1"; do
51627f7eb2Smrg  suf1=$suf1.
52627f7eb2Smrgdone
53627f7eb2Smrg
54627f7eb2Smrgsuf2=stripped
55627f7eb2Smrgwhile test -f "$2.$suf2"; do
56627f7eb2Smrg  suf2=$suf2.
57627f7eb2Smrgdone
58627f7eb2Smrg
59627f7eb2Smrgtrap 'rm -f "$1.$suf1" "$2.$suf2"' 0 1 2 15
60627f7eb2Smrg
61627f7eb2Smrgif cmp "$1" "$2"; then
62627f7eb2Smrg  status=0
63627f7eb2Smrgelse
64627f7eb2Smrg  status=1
65627f7eb2Smrg
66627f7eb2Smrg  cmd=
67627f7eb2Smrg  for t in objdump readelf eu-readelf; do
68627f7eb2Smrg    if ($t --help) 2>&1 | grep ' --\[*section-\]*headers' > /dev/null; then
69627f7eb2Smrg      cmd=$t
70627f7eb2Smrg      break
71627f7eb2Smrg    fi
72627f7eb2Smrg  done
73627f7eb2Smrg
74627f7eb2Smrg  # If there are LTO option sections, try to strip them off.
75627f7eb2Smrg  if test "x$cmd" = "x" ||
76627f7eb2Smrg     $cmd --section-headers "$1" | grep '.gnu.lto_.opts' > /dev/null ||
77627f7eb2Smrg     $cmd --section-headers "$2" | grep '.gnu.lto_.opts' > /dev/null ; then
78627f7eb2Smrg
79627f7eb2Smrg    echo stripping off LTO option section, then retrying >&2
80627f7eb2Smrg
81627f7eb2Smrg    seclist=".gnu.lto_.opts"
82627f7eb2Smrg    rsopts=`for sec in $seclist; do echo " --remove-section $sec"; done`
83627f7eb2Smrg
84627f7eb2Smrg    if (objcopy -v) 2>&1 | grep ' --remove-section' > /dev/null; then
85627f7eb2Smrg      objcopy $rsopts "$1" "$1.$suf1"
86627f7eb2Smrg      objcopy $rsopts "$2" "$2.$suf2"
87627f7eb2Smrg    elif (strip --help) 2>&1 | grep ' --remove-section' > /dev/null; then
88627f7eb2Smrg      cp "$1" "$1.$suf1"
89627f7eb2Smrg      strip $rsopts "$1.$suf1"
90627f7eb2Smrg
91627f7eb2Smrg      cp "$2" "$2.$suf2"
92627f7eb2Smrg      strip $rsopts "$2.$suf2"
93627f7eb2Smrg    else
94627f7eb2Smrg      echo failed to strip off LTO option section >&2
95627f7eb2Smrg    fi
96627f7eb2Smrg
97627f7eb2Smrg    trap 'rm -f "$1.$suf1" "$2.$suf2"' 0 1 2 15
98627f7eb2Smrg
99627f7eb2Smrg    if cmp "$1.$suf1" "$2.$suf2"; then
100627f7eb2Smrg      status=0
101627f7eb2Smrg    else
102627f7eb2Smrg      status=1
103627f7eb2Smrg    fi
104*4c3eb207Smrg
105*4c3eb207Smrg  # PE-COFF executables are timestamped so skip leading bytes for them.
106*4c3eb207Smrg  else
107*4c3eb207Smrg    case "$1" in
108*4c3eb207Smrg      *.exe)
109*4c3eb207Smrg        if cmp -i 256 "$1" "$2"; then
110*4c3eb207Smrg          status=0
111*4c3eb207Smrg        else
112*4c3eb207Smrg          status=1
113*4c3eb207Smrg        fi
114*4c3eb207Smrg        ;;
115*4c3eb207Smrg      *)
116*4c3eb207Smrg        if test -f "$1.exe" && cmp -i 256 "$1.exe" "$2.exe"; then
117*4c3eb207Smrg          status=0
118*4c3eb207Smrg        else
119*4c3eb207Smrg          status=1
120*4c3eb207Smrg        fi
121*4c3eb207Smrg        ;;
122*4c3eb207Smrg    esac
123627f7eb2Smrg  fi
124627f7eb2Smrgfi
125627f7eb2Smrg
126627f7eb2Smrg$rm "$1.$suf1" "$2.$suf2"
127627f7eb2Smrg
128627f7eb2Smrgtrap "exit $status; exit" 0 1 2 15
129627f7eb2Smrg
130627f7eb2Smrgexit $status
131