# Expect script for tests for >64k sections
#   Copyright (C) 2002-2016 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 "msp430*-*-*"]
     || [istarget "or1k*-*-*"]
     || [istarget "pj*-*-*"]
     || [istarget "m32r-*-*"] } {
    return
}

# ft32, m68hc11, m68hc12 and xgate run out of address space.
if {   [istarget "ft32-*-*"]
    || [istarget "m68hc1*-*"]
    || [istarget "xgate-*"] } {
    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 avr, d10v and msp
# lack of fancy orphan section handling causes overlap on fr30 and iq2000
if { ![istarget "d10v-*-*"]
     && ![istarget "avr-*-*"]
     && ![istarget "msp*-*-*"]
     && ![istarget "fr30-*-*"] 
     && ![istarget "iq2000-*-*"] } {
    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
}
