#   Copyright (C) 1999, 2001 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, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.  

# Please email any bugs, comments, and/or additions to this file to:
# gcc-patches@gcc.gnu.org

# This file defines procs for determining features supported by the target.

###############################
# proc check_weak_available { }
###############################

# weak symbols are only supported in some configs/object formats
# this proc returns 1 if they're supported, 0 if they're not, or -1 if unsure

proc check_weak_available { } {
    global target_cpu

    # All mips targets should support it
    
    if { [ string first "mips" $target_cpu ] >= 0 } {
        return 1
    }

    # ELF and ECOFF support it. a.out does with gas/gld but may also with
    # other linkers, so we should try it

    set objformat [gcc_target_object_format]

    switch $objformat {
        elf      { return 1 }
        ecoff    { return 1 }
        a.out    { return 1 }
        unknown  { return -1 }
        default  { return 0 }
    }
}

###############################
# proc check_alias_available { }
###############################

# Determine if the target toolchain supports the alias attribute.
# Parameter is the pathname of a file that can be used to test the alias support.
# Returns yes if it does.
# Returns no if it does not.
# Returns dontknow if something went wrong
# For an example of the use of this function, see gcc.dg/special/ecos.exp

proc check_alias_available { testfile } {
    global alias_available_saved
    
    if [info exists alias_available_saved] {
        verbose "check_alias_available  returning saved $alias_available_saved" 2
    } else {
        verbose "check_alias_available  compiling testfile $testfile" 2
	set lines [gcc_target_compile $testfile "tmp.o" object ""]
	
	if [string match "" $lines] then {
	    # No error messages, everything is OK.
	    set alias_available_saved yes
	} else {
	    if [regexp "alias definitions not supported" $lines] {
		verbose "check_alias_available  target does not support aliases" 2

		set objformat [gcc_target_object_format]

		if { $objformat == "elf" } {
		    verbose "check_alias_available  but target uses ELF format, so it ought to" 2
		    set alias_available_saved dontknow
		} else {
		    set alias_available_saved no
		}
	    } else {
		if [regexp "only weak aliases are supported" $lines] {
		verbose "check_alias_available  target supports only weak aliases" 2
		set alias_available_saved no
		} else {
		    set alias_available_saved dontknow
		}
	    }
	}
	
	verbose "check_alias_available  returning $alias_available_saved" 2
    }

    return $alias_available_saved
}
