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