# Expect script for frame section tests
#   Copyright 2004, 2005, 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 as_opt ""

# This target requires extra as options when building code for shared
# libraries.
if { [istarget "tic6x-*-*"] } {
    set as_opt "-mpic -mpid=near"
}

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

global as
global ld

if { ![ld_assemble_flags $as $as_opt $srcdir/$subdir/tbss.s tmpdir/tbss.o ]
     || ![ld_assemble_flags $as $as_opt $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_flags $as $as_opt $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"
    }
}
