Home | History | Annotate | Line # | Download | only in contrib
compare-lto revision 1.1.1.2
      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.1.2  mrg   echo 'usage: compare-lto file1 file2' >&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.1.2  mrg 
    105  1.1.1.2  mrg   # PE-COFF executables are timestamped so skip leading bytes for them.
    106  1.1.1.2  mrg   else
    107  1.1.1.2  mrg     case "$1" in
    108  1.1.1.2  mrg       *.exe)
    109  1.1.1.2  mrg         if cmp -i 256 "$1" "$2"; then
    110  1.1.1.2  mrg           status=0
    111  1.1.1.2  mrg         else
    112  1.1.1.2  mrg           status=1
    113  1.1.1.2  mrg         fi
    114  1.1.1.2  mrg         ;;
    115  1.1.1.2  mrg       *)
    116  1.1.1.2  mrg         if test -f "$1.exe" && cmp -i 256 "$1.exe" "$2.exe"; then
    117  1.1.1.2  mrg           status=0
    118  1.1.1.2  mrg         else
    119  1.1.1.2  mrg           status=1
    120  1.1.1.2  mrg         fi
    121  1.1.1.2  mrg         ;;
    122  1.1.1.2  mrg     esac
    123      1.1  mrg   fi
    124      1.1  mrg fi
    125      1.1  mrg 
    126      1.1  mrg $rm "$1.$suf1" "$2.$suf2"
    127      1.1  mrg 
    128      1.1  mrg trap "exit $status; exit" 0 1 2 15
    129      1.1  mrg 
    130      1.1  mrg exit $status
    131