#   Copyright (C) 1999 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:
# jlarmour@cygnus.co.uk

# This file was written by Jonathan Larmour (jlarmour@cygnus.co.uk).

# GCC testsuite that uses the `dg.exp' driver.

# Load support procs.
load_lib gcc-dg.exp

###################################
# proc gcc_target_object_format { }
###################################

proc gcc_target_object_format { } { 
    global gcc_target_object_format_saved

    if [info exists gcc_target_object_format_saved] {
        verbose "gcc_target_object_format returning saved $gcc_target_object_format_saved" 2
        return $gcc_target_object_format_saved
    } else {

        set objdump_name [find_binutils_prog objdump]
        set open_file [open objfmtst.c w]
        puts $open_file "void foo(void) { }"
        close $open_file
        
        gcc_target_compile objfmtst.c objfmtst.o object ""
        
        set output [exec $objdump_name --file-headers objfmtst.o ]
        
        file delete objfmtst.o
        
        if ![ regexp "file format (.*)arch" $output dummy objformat ]  {
            verbose "Could not parse objdump output" 2
            set gcc_target_object_format_saved unknown
        } else {
            switch -regexp $objformat {
                elf          {
                    verbose "gcc_target_object_format returning elf" 2
                    set gcc_target_object_format_saved elf
                } 
                ecoff        {
                    verbose "gcc_target_object_format returning ecoff" 2
                    set gcc_target_object_format_saved ecoff
                }
                coff         {
                    verbose "gcc_target_object_format returning coff" 2
                    set gcc_target_object_format_saved coff
                }
                a\.out       {
                    verbose "gcc_target_object_format returning a.out" 2
                    set gcc_target_object_format_saved a.out
                }
                default      {
                    verbose "gcc_target_object_format returning unknown" 2
                    set gcc_target_object_format_saved unknown
                }
            }
        }
        return $gcc_target_object_format_saved
    }
}

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

# weak symbols are only supported in some configs/object formats
# this proc returns 1 if they're support, 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 }
    }
}

##########
# weak-1.c
##########

if { [ check_weak_available ] == 1 } {
    dg-init

    set lines [gcc_target_compile "$srcdir/$subdir/weak-1a.c" "weak-1a.o" object ""]
    if ![string match "" $lines] then {
        fail "weak-1a.o"
    } else {
        dg-runtest "$srcdir/$subdir/weak-1.c" "weak-1a.o" "" 
        file delete weak-1a.o
    }
    dg-finish
} elseif { [ check_weak_available ] == 0 } {
    unsupported "weak-1.c"
} else {
    unresolved "weak-1.c"
}

##########
# weak-2.c
##########

if { [ check_weak_available ] == 1 } {
    dg-init
    
    set lines [gcc_target_compile "$srcdir/$subdir/weak-2a.c" "weak-2a.o" object ""]
    if ![string match "" $lines] then {
        fail "weak-2a.o"
    } else {
        set lines [gcc_target_compile "$srcdir/$subdir/weak-2b.c" "weak-2b.o" object ""]
        if ![string match "" $lines] then {
            fail "weak-2b.o"
        } else {
            dg-runtest "$srcdir/$subdir/weak-2.c" "weak-2a.o weak-2b.o" "" 
            file delete weak-2a.o weak-2b.o
        }
    }
    dg-finish
} elseif { [ check_weak_available ] == 0 } {
    unsupported "weak-2.c"
} else {
    unresolved "weak-2.c"
}

###########
# alias-1.c
###########

dg-init
dg-runtest "$srcdir/$subdir/alias-1.c" "" ""
dg-finish

###########
# wkali-1.c
###########

dg-init
dg-runtest "$srcdir/$subdir/wkali-1.c" "" ""
dg-finish

###########
# wkali-2.c
###########

if { [ check_weak_available ] == 1 } {
    dg-init
    set lines [gcc_target_compile "$srcdir/$subdir/wkali-2a.c" "wkali-2a.o" object ""]
    if ![string match "" $lines] then {
        fail "wkali-2a.o"
    } else {
        set lines [gcc_target_compile "$srcdir/$subdir/wkali-2b.c" "wkali-2b.o" object ""]
        if ![string match "" $lines] then {
            fail "wkali-2b.o"
        } else {
            dg-runtest "$srcdir/$subdir/wkali-2.c" "wkali-2a.o wkali-2b.o" ""
            file delete wkali-2a.o wkali-2b.o
        }
    }
    dg-finish
} elseif { [ check_weak_available ] == 0 } {
    unsupported "wkali-2.c"
} else {
    unresolved "wkali-2.c"
}

###########
# gcsec-1.c
###########

set ld_output [ exec [ find_ld ] --help ]

if { [ string first "--gc-sections" $ld_output ] >= 0 } {

    dg-init
    dg-runtest "$srcdir/$subdir/gcsec-1.c" "-ffunction-sections -fdata-sections -Wl,--gc-sections" ""
    dg-finish
} else {
    unsupported "gcsec-1.c"
}

### EOF ecos.exp
