# Expect script for tests for >64k sections
#   Copyright 2002, 2003, 2005, 2006, 2007, 2008
#   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 Hans-Peter Nilsson (hp@axis.com)
#

# Exclude non-ELF targets.

if ![is_elf_format] {
    return
}

# Targets using the generic linker backend don't sort section symbols
# before local symbols, so don't bother testing them.
if { [istarget "arc-*-*"]
     || [istarget "d30v-*-*"]
     || [istarget "dlx-*-*"]
     || [istarget "i960-*-*"]
     || [istarget "or32-*-*"]
     || [istarget "pj*-*-*"]
     || [istarget "m32r-*-*"] } {
    return
}

# Test >64k sections, with and without -r.  First, create the assembly
# files.  Have a relocation to another section and one within the local
# section.

set test1 "64ksec-r"
set test2 "64ksec"

if { ![runtest_file_p $runtests $test1] \
	&& ![runtest_file_p $runtests $test2] } {
    return
}

set sfiles {}
set max_sec 66000
set secs_per_file 1000
for { set i 0 } { $i < $max_sec / $secs_per_file } { incr i } {
    set sfile "$objdir/tmpdir/sec64-$i.s"
    lappend sfiles $sfile
    if [catch { set ofd [open $sfile w] } x] {
	perror "$x"
	unresolved $test1
	unresolved $test2
	return
    }

    if { $i == 0 } {
	puts $ofd " .global start"
	puts $ofd "start:"
	puts $ofd " .global _start"
	puts $ofd "_start:"
	puts $ofd " .global __start"
	puts $ofd "__start:"
	puts $ofd " .global main"
	puts $ofd "main:"
	puts $ofd " .global foo_0"
	puts $ofd "foo_0: .dc.a 0"
    }

    # Make sure the used section is not covered by common linker scripts.
    # They should get separate section entries even without -r.
    puts $ofd " .altmacro"
    puts $ofd " .macro sec secn, secp"
    if {![istarget "frv-*-*linux*"]} then {
	puts $ofd "  .section .foo.\\secn,\"ax\""
    } else {
	puts $ofd "  .section .foo.\\secn,\"aw\""
    }
    puts $ofd "  .global foo_\\secn"
    puts $ofd "foo_\\secn:"
    puts $ofd "  .dc.a foo_\\secp"
    puts $ofd "bar_\\secn:"
    puts $ofd "  .dc.a bar_\\secn"
    puts $ofd " .endm"
    if {![istarget "bfin-*-*"]} then {
	puts $ofd " secn = [expr $i * $secs_per_file]"
    } else {
	puts $ofd " .set secn, [expr $i * $secs_per_file]"
    }
    puts $ofd " .rept $secs_per_file"
    if {![istarget "bfin-*-*"]} then {
	puts $ofd "  secn = secn + 1"
    } else {
	puts $ofd "  .set secn, secn + 1"
    }
    puts $ofd "  sec %(secn), %(secn-1)"
    puts $ofd " .endr"

    close $ofd
}

if [catch { set ofd [open "tmpdir/$test1.d" w] } x] {
    perror "$x"
    unresolved $test1
    unresolved $test2
    return
}

# The ld-r linked file will contain relocation-sections too, so make it
# half the size in order to try and keep the test-time down.

# The m32r target generates both REL and RELA relocs (for historical
# reasons) so the expected number of sections will be much more than
# 68000, which throws this particular test right off.
if { ![istarget "m32r-*-*"] } then {
    foreach sfile [lrange $sfiles 0 [expr [llength $sfiles] / 2]] {
	puts $ofd "#source: $sfile"
    }
    puts $ofd "#ld: -r"
    puts $ofd "#readelf: -W -Ss"
    puts $ofd "There are 680.. section headers.*:"
    puts $ofd "#..."
    puts $ofd "  \\\[ 0\\\] .* 680\[0-9\]\[0-9\]\[ \]+0\[ \]+0"
    puts $ofd "#..."
    puts $ofd "  \\\[ \[0-9\]\\\] \.foo\.1\[ \]+PROGBITS\[ \]+.*"
    puts $ofd "#..."
    puts $ofd "  \\\[65279\\\] (.rel\[a\]?)?\\.foo\\.\[0-9\]+ .*"
    puts $ofd "  \\\[65280\\\] (.rel\[a\]?)?\\.foo\\.\[0-9\]+ .*"
    puts $ofd "#..."
    puts $ofd " 340..: 0+\[ \]+0\[ \]+SECTION\[ \]+LOCAL\[ \]+DEFAULT\[ \]+68... "
    puts $ofd "#..."
    puts $ofd " 340..: 0+(2|4|8)\[ \]+0\[ \]+NOTYPE\[ \]+LOCAL\[ \]+DEFAULT\[ \]+\[2-5\] bar_1$"
    puts $ofd "#..."
    puts $ofd ".* bar_34000$"
    puts $ofd "#..."
    # Global symbols are not in "alphanumeric" order, so we just check
    # that the first and the last are present in any order (assuming no
    # duplicates).
    puts $ofd ".* (\[0-9\] foo_1|68... foo_34000)$"
    puts $ofd "#..."
    puts $ofd ".* (\[0-9\] foo_1|68... foo_34000)$"
    puts $ofd "#pass"
    close $ofd
    run_dump_test "tmpdir/$test1"
}

if [catch { set ofd [open "tmpdir/$test2.d" w] } x] {
    perror "$x"
    unresolved $test2
    return
}

# too big for d10v and msp
# lack of fancy orphan section handling causes overlap on fr30 and iq2000
if { ![istarget "d10v-*-*"]
     && ![istarget "msp*-*-*"]
     && ![istarget "fr30-*-*"] 
     && ![istarget "iq2000-*-*"] } {
    foreach sfile $sfiles { puts $ofd "#source: $sfile" }
    if { [istarget "avr-*-*"] } then {
	puts $ofd "#as: -mmcu=avr6"
	puts $ofd "#ld: -mavr6"
    } elseif { [istarget spu*-*-*] } {
	puts $ofd "#ld: --local-store 0:0"
    } else {
	puts $ofd "#ld:"
    }
    puts $ofd "#readelf: -W -Ss"
    puts $ofd "There are 660.. section headers.*:"
    puts $ofd "#..."
    puts $ofd "  \\\[ 0\\\] .* 660..\[ \]+0\[ \]+0"
    puts $ofd "#..."
    puts $ofd "  \\\[65279\\\] \\.foo\\.\[0-9\]+ .*"
    puts $ofd "  \\\[65280\\\] \\.foo\\.\[0-9\]+ .*"
    puts $ofd "#..."
    puts $ofd " 660..: \[0-9a-f\]+\[ \]+0\[ \]+SECTION\[ \]+LOCAL\[ \]+DEFAULT\[ \]+660.. "
    puts $ofd "#..."
    puts $ofd " 660..: \[0-9a-f\]+\[ \]+0\[ \]+NOTYPE\[ \]+LOCAL\[ \]+DEFAULT\[ \]+\[0-9\] bar_1$"
    puts $ofd "#..."
    puts $ofd ".* bar_66000$"
    puts $ofd "#..."
    # Global symbols are not in "alphanumeric" order, so we just check
    # that the first and the last are present in any order (assuming no
    # duplicates).
    puts $ofd ".* (\[0-9\] foo_1|66... foo_66000)$"
    puts $ofd "#..."
    puts $ofd ".* (\[0-9\] foo_1|66... foo_66000)$"
    puts $ofd "#pass"
    close $ofd
    run_dump_test "tmpdir/$test2"
}

for { set i 1 } { $i < $max_sec / $secs_per_file } { incr i } {
    catch "exec rm -f tmpdir/dump$i.o" status
}
