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

# 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\[ \]+\[23\] 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
}
foreach sfile $sfiles { puts $ofd "#source: $sfile" }
if { [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
}
