# Copyright (C) 1992, 1993, 1994, 1996, 1997, 1999, 2000, 2001, 2003, 2004 Free Software Foundation, Inc.

# This program 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 2 of the License, or
# (at your option) any later version.
# 
# This program 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 this program; if not, write to the Free Software
# Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.

# This file was written by Rob Savoye (rob@cygnus.com)
# Currently maintained by Doug Evans (dje@cygnus.com)

# This file is loaded by the tool init file (eg: unix.exp).  It provides
# default definitions for gcc_start, etc. and other supporting cast members.

# These globals are used by gcc_start if no compiler arguments are provided.
# They are also used by the various testsuites to define the environment:
# where to find stdio.h, libc.a, etc.

# we want to use libgloss so we can get find_gcc.
load_lib libgloss.exp
load_lib prune.exp
load_lib gcc-defs.exp

#
# GCC_UNDER_TEST is the compiler under test.
#

#
# default_gcc_version -- extract and print the version number of the compiler
#

proc default_gcc_version { } {
    global GCC_UNDER_TEST

    gcc_init;

    # ignore any arguments after the command
    set compiler [lindex $GCC_UNDER_TEST 0]

    if ![is_remote host] {
	set compiler_name [which $compiler];
    } else {
	set compiler_name $compiler;
    }

    # verify that the compiler exists
    if { $compiler_name != 0 } then {
	set tmp [remote_exec host "$compiler -v"]
	set status [lindex $tmp 0];
	set output [lindex $tmp 1];
	regexp " version \[^\n\r\]*" $output version
	if { $status == 0 && [info exists version] } then {
	    clone_output "$compiler_name $version\n"
	} else {
	    clone_output "Couldn't determine version of $compiler_name: $output\n"
	}
    } else {
	# compiler does not exist (this should have already been detected)
	warning "$compiler does not exist"
    }
}

#
# gcc_version -- Call default_gcc_version, so we can override it if needed.
#

proc gcc_version { } {
    default_gcc_version;
}

#
# gcc_init -- called at the start of each .exp script.
#
# There currently isn't much to do, but always using it allows us to
# make some enhancements without having to go back and rewrite the scripts.
#

set gcc_initialized 0

proc gcc_init { args } {
    global tmpdir
    global libdir
    global gluefile wrap_flags
    global gcc_initialized
    global GCC_UNDER_TEST
    global TOOL_EXECUTABLE

    if { $gcc_initialized == 1 } { return; }

    if ![info exists GCC_UNDER_TEST] {
	if [info exists TOOL_EXECUTABLE] {
	    set GCC_UNDER_TEST $TOOL_EXECUTABLE;
	} else {
	    set GCC_UNDER_TEST "[find_gcc]"
	}
    }

    if ![info exists tmpdir] then {
	set tmpdir /tmp
    }

    gcc_maybe_build_wrapper "${tmpdir}/gcc-testglue.o"
}

#
# gcc_target_compile -- compile a source file
#

proc gcc_target_compile { source dest type options } {
    global tmpdir;
    global gluefile wrap_flags;
    global GCC_UNDER_TEST
    global TOOL_OPTIONS
	
    if {[target_info needs_status_wrapper] != "" && \
	    [target_info needs_status_wrapper] != "0" && \
	    [info exists gluefile] } {
	lappend options "libs=${gluefile}"
	lappend options "ldflags=$wrap_flags"
    }

    if [target_info exists gcc,stack_size] {
	lappend options "additional_flags=-DSTACK_SIZE=[target_info gcc,stack_size]"
    }
    if [target_info exists gcc,no_trampolines] {
	lappend options "additional_flags=-DNO_TRAMPOLINES"
    }
    if [target_info exists gcc,no_label_values] {
	lappend options "additional_flags=-DNO_LABEL_VALUES"
    }
    # TOOL_OPTIONS must come first, so that it doesn't override testcase
    # specific options.
    if [info exists TOOL_OPTIONS] {
	# APPLE LOCAL mainline
	set options [concat "{additional_flags=$TOOL_OPTIONS}" $options];
    }
    if [target_info exists gcc,timeout] {
	lappend options "timeout=[target_info gcc,timeout]"
    }
    # APPLE LOCAL begin testsuite multiply defined
    if [ istarget *-*-darwin* ] {
	lappend options "ldflags=-Wl,-multiply_defined,suppress"
    }
    # APPLE LOCAL end testsuite multiply defined
    lappend options "compiler=$GCC_UNDER_TEST"
    set options [dg-additional-files-options $options $source]
    return [target_compile $source $dest $type $options]
}
