# 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"
    }
}
