#! /bin/sh

# Copyright (C) 2007-2013 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_PLUGIN_LD_FOR_TARGET="@ORIGINAL_PLUGIN_LD_FOR_TARGET@"
ORIGINAL_NM_FOR_TARGET="@ORIGINAL_NM_FOR_TARGET@"
exeext=@host_exeext@
fast_install=@enable_fast_install@
objdir=@objdir@

invoked=`basename "$0"`
id=$invoked
case "$invoked" in
  as)
    original=$ORIGINAL_AS_FOR_TARGET
    prog=as-new$exeext
    dir=gas
    ;;
  collect-ld)
    # when using a linker plugin, gcc will always pass '-plugin' as the
    # first or second option to the linker.
    if test x"$1" = "x-plugin" || test x"$2" = "x-plugin"; then
      original=$ORIGINAL_PLUGIN_LD_FOR_TARGET
    else
      original=$ORIGINAL_LD_FOR_TARGET
    fi
    prog=ld-new$exeext
    dir=ld
    id=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*.
      eval LT_RCU="\${LT_RCU_$id}"
      test x"$LT_RCU" = x"1" && exec $scriptdir/../prev-$dir/$prog ${1+"$@"}

      eval LT_RCU_$id=1
      export LT_RCU_$id
      $scriptdir/../$dir/$prog ${1+"$@"}
      result=$?
      exit $result

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