# Expect script for frame section tests
#   Copyright 2004, 2007 Free Software Foundation, Inc.
#
# This file is part of the GNU Binutils.
#
# 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 3 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., 51 Franklin Street - Fifth Floor, Boston,
# MA 02110-1301, USA.
#
# Written by H.J. Lu (hongjiu.lu@intel.com)
#

# Make sure that ld correctly handles frame sections in ELF.

# This test can only be run on ELF platforms.
if ![is_elf_format] {
    return
}

# No shared lib support on this target.
if { [istarget "mcore-*-*"] } {
    return
}

# Too small MAXPAGESIZE on this target.
if { [istarget "sh*-*-elf*"] } {
    return
}

# ??? These targets have their own .tbss section, with different meaning
# to the usual ELF .tbss.
if { [istarget "hppa64-*-*"] || [istarget "v850-*-*"] } {
    return
}

set test1	"read-only .eh_frame section"
set test2	"read-only .gcc_except_table section"

global as
global ld

if { ![ld_assemble $as $srcdir/$subdir/tbss.s tmpdir/tbss.o ]
     || ![ld_assemble $as $srcdir/$subdir/frame.s tmpdir/frame.o] } {
    unresolved "$test1"
    return
}

if { [ld_simple_link $ld tmpdir/frame.so "--shared tmpdir/frame.o tmpdir/tbss.o"] } {
    pass "$test1"
} else {
    if [string match "*shared not supported*" $link_output] {
	unsupported "-shared is not supported by this target"
    } else {
	fail "$test1"
    }
}

if ![ld_assemble $as $srcdir/$subdir/table.s tmpdir/table.o ] {
    unresolved "$test2"
    return
}

if { [ld_simple_link $ld tmpdir/table.so "--shared tmpdir/table.o tmpdir/tbss.o"] } {
    pass "$test2"
} else {
    if [string match "*shared not supported*" $link_output] {
	unsupported "-shared is not supported by this target"
    } else {
	fail "$test2"
    }
}
