1 1.1 mrg #! /bin/sh 2 1.1 mrg 3 1.1 mrg # Compare copies of two given object files. 4 1.1 mrg 5 1.1 mrg # Copyright (C) 2007, 2008, 2009, 2010, 2012 Free Software Foundation 6 1.1 mrg # Originally by Alexandre Oliva <aoliva (at] redhat.com> 7 1.1 mrg # Modified for LTO bootstrap by Richard Biener <rguenther (at] suse.de> 8 1.1 mrg 9 1.1 mrg # This file is part of GCC. 10 1.1 mrg 11 1.1 mrg # GCC is free software; you can redistribute it and/or modify it under 12 1.1 mrg # the terms of the GNU General Public License as published by the Free 13 1.1 mrg # Software Foundation; either version 3, or (at your option) any later 14 1.1 mrg # version. 15 1.1 mrg 16 1.1 mrg # GCC is distributed in the hope that it will be useful, but WITHOUT 17 1.1 mrg # ANY WARRANTY; without even the implied warranty of MERCHANTABILITY 18 1.1 mrg # or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public 19 1.1 mrg # License for more details. 20 1.1 mrg 21 1.1 mrg # You should have received a copy of the GNU General Public License 22 1.1 mrg # along with GCC; see the file COPYING3. If not see 23 1.1 mrg # <http://www.gnu.org/licenses/>. 24 1.1 mrg 25 1.1 mrg rm='rm -f' 26 1.1 mrg 27 1.1 mrg case $1 in 28 1.1 mrg -p | --preserve) 29 1.1 mrg rm='echo preserving' 30 1.1 mrg shift 31 1.1 mrg ;; 32 1.1 mrg esac 33 1.1 mrg 34 1.1 mrg if test $# != 2; then 35 1.1 mrg echo 'usage: compare-lto file1.o file2.o' >&2 36 1.1 mrg exit 1 37 1.1 mrg fi 38 1.1 mrg 39 1.1 mrg if test ! -f "$1"; then 40 1.1 mrg echo "$1" does not exist >&2 41 1.1 mrg exit 1 42 1.1 mrg fi 43 1.1 mrg 44 1.1 mrg if test ! -f "$2"; then 45 1.1 mrg echo "$2" does not exist >&2 46 1.1 mrg exit 1 47 1.1 mrg fi 48 1.1 mrg 49 1.1 mrg suf1=stripped 50 1.1 mrg while test -f "$1.$suf1"; do 51 1.1 mrg suf1=$suf1. 52 1.1 mrg done 53 1.1 mrg 54 1.1 mrg suf2=stripped 55 1.1 mrg while test -f "$2.$suf2"; do 56 1.1 mrg suf2=$suf2. 57 1.1 mrg done 58 1.1 mrg 59 1.1 mrg trap 'rm -f "$1.$suf1" "$2.$suf2"' 0 1 2 15 60 1.1 mrg 61 1.1 mrg if cmp "$1" "$2"; then 62 1.1 mrg status=0 63 1.1 mrg else 64 1.1 mrg status=1 65 1.1 mrg 66 1.1 mrg cmd= 67 1.1 mrg for t in objdump readelf eu-readelf; do 68 1.1 mrg if ($t --help) 2>&1 | grep ' --\[*section-\]*headers' > /dev/null; then 69 1.1 mrg cmd=$t 70 1.1 mrg break 71 1.1 mrg fi 72 1.1 mrg done 73 1.1 mrg 74 1.1 mrg # If there are LTO option sections, try to strip them off. 75 1.1 mrg if test "x$cmd" = "x" || 76 1.1 mrg $cmd --section-headers "$1" | grep '.gnu.lto_.opts' > /dev/null || 77 1.1 mrg $cmd --section-headers "$2" | grep '.gnu.lto_.opts' > /dev/null ; then 78 1.1 mrg 79 1.1 mrg echo stripping off LTO option section, then retrying >&2 80 1.1 mrg 81 1.1 mrg seclist=".gnu.lto_.opts" 82 1.1 mrg rsopts=`for sec in $seclist; do echo " --remove-section $sec"; done` 83 1.1 mrg 84 1.1 mrg if (objcopy -v) 2>&1 | grep ' --remove-section' > /dev/null; then 85 1.1 mrg objcopy $rsopts "$1" "$1.$suf1" 86 1.1 mrg objcopy $rsopts "$2" "$2.$suf2" 87 1.1 mrg elif (strip --help) 2>&1 | grep ' --remove-section' > /dev/null; then 88 1.1 mrg cp "$1" "$1.$suf1" 89 1.1 mrg strip $rsopts "$1.$suf1" 90 1.1 mrg 91 1.1 mrg cp "$2" "$2.$suf2" 92 1.1 mrg strip $rsopts "$2.$suf2" 93 1.1 mrg else 94 1.1 mrg echo failed to strip off LTO option section >&2 95 1.1 mrg fi 96 1.1 mrg 97 1.1 mrg trap 'rm -f "$1.$suf1" "$2.$suf2"' 0 1 2 15 98 1.1 mrg 99 1.1 mrg if cmp "$1.$suf1" "$2.$suf2"; then 100 1.1 mrg status=0 101 1.1 mrg else 102 1.1 mrg status=1 103 1.1 mrg fi 104 1.1 mrg fi 105 1.1 mrg fi 106 1.1 mrg 107 1.1 mrg $rm "$1.$suf1" "$2.$suf2" 108 1.1 mrg 109 1.1 mrg trap "exit $status; exit" 0 1 2 15 110 1.1 mrg 111 1.1 mrg exit $status 112