# Expect script for tests for >64k sections
#   Copyright 2002, 2003, 2006 Free Software Foundation, Inc.
#
# This file 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 2 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"
    puts $ofd "  .section .foo.\\secn,\"ax\""
    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"
    puts $ofd " secn = [expr $i * $secs_per_file]"
    puts $ofd " .rept $secs_per_file"
    puts $ofd "  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.
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\\\] .* 682\[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 "  \\\[65536\\\] (.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" }
puts $ofd "#ld:"
puts $ofd "#readelf: -W -Ss"
puts $ofd "There are 660.. section headers.*:"
puts $ofd "#..."
puts $ofd "  \\\[ 0\\\] .* 662..\[ \]+0\[ \]+0"
puts $ofd "#..."
puts $ofd "  \\\[65279\\\] \\.foo\\.\[0-9\]+ .*"
puts $ofd "  \\\[65536\\\] \\.foo\\.\[0-9\]+ .*"
puts $ofd "#..."
puts $ofd " 660..: \[0-9a-f\]+\[ \]+0\[ \]+SECTION\[ \]+LOCAL\[ \]+DEFAULT\[ \]+662.. "
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
}
