#! /bin/sh

# Copyright (C) 2007, 2008 Free Software Foundation, Inc.
# 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/>.

# Invoke as, ld or nm from the build tree.

ORIGINAL_AS_FOR_TARGET="@ORIGINAL_AS_FOR_TARGET@"
ORIGINAL_LD_FOR_TARGET="@ORIGINAL_LD_FOR_TARGET@"
ORIGINAL_NM_FOR_TARGET="@ORIGINAL_NM_FOR_TARGET@"
exeext=@host_exeext@
fast_install=@enable_fast_install@
objdir=@objdir@

invoked=`basename "$0"`
case "$invoked" in
  as)
    original=$ORIGINAL_AS_FOR_TARGET
    prog=as-new$exeext
    dir=gas
    ;;
  collect-ld)
    original=$ORIGINAL_LD_FOR_TARGET
    prog=ld-new$exeext
    dir=ld
    ;;
  nm)
    original=$ORIGINAL_NM_FOR_TARGET
    prog=nm-new$exeext
    dir=binutils
    ;;
esac

case "$original" in
  ../*)
    # compute absolute path of the location of this script
    tdir=`dirname "$0"`
    scriptdir=`cd "$tdir" && pwd`

    if test -x $scriptdir/../$dir/$prog; then
      test "$fast_install" = yes || exec $scriptdir/../$dir/$prog ${1+"$@"}

      # if libtool did everything it needs to do, there's a fast path
      lt_prog=$scriptdir/../$dir/$objdir/lt-$prog 
      test -x $lt_prog && exec $lt_prog ${1+"$@"}

      # libtool has not relinked ld-new yet, but we cannot just use the
      # previous stage (because then the relinking would just never happen!).
      # So we take extra care to use prev-ld/ld-new *on recursive calls*.
      test x"$LT_RCU" = x"1" && exec $scriptdir/../prev-$dir/$prog ${1+"$@"}

      LT_RCU=1; export LT_RCU
      $scriptdir/../$dir/$prog ${1+"$@"}
      result=$?
      exit $result

    else
      exec $scriptdir/../prev-$dir/$prog ${1+"$@"}
    fi
    ;;
  *)
    exec "$original" ${1+"$@"}
    ;;
esac


