# Expect script for tests for >64k sections
#   Copyright 2002, 2003, 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"
    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.

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