# Expect script for ld-powerpc tests
#   Copyright 2002, 2003, 2005, 2006, 2007, 2008, 2009 Free Software Foundation
#
# 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.
#

if { ![istarget "powerpc*-*-*"]	} {
    return
}

if {[istarget "*-*-vxworks"]} {
    set ppcvxtests {
	{"VxWorks shared library test 1 (default script)" "-shared"
	 "-mregnames" {vxworks1-lib.s}
	 {{readelf --segments vxworks1-lib.sd}}
	 "libvxworks1.so"}
	{"VxWorks shared library test 1" "-shared -Tvxworks1.ld"
	 "-mregnames" {vxworks1-lib.s}
	 {{readelf --relocs vxworks1-lib.rd} {objdump -dr vxworks1-lib.dd}
	  {readelf --symbols vxworks1-lib.nd} {readelf -d vxworks1-lib.td}}
	 "libvxworks1.so"}
	{"VxWorks executable test 1 (dynamic)" \
	 "tmpdir/libvxworks1.so -Tvxworks1.ld -q --force-dynamic"
	 "-mregnames" {vxworks1.s}
	 {{readelf --relocs vxworks1.rd} {objdump -dr vxworks1.dd}}
	 "vxworks1"}
	{"VxWorks executable test 2 (dynamic)" \
	 "-Tvxworks1.ld -q --force-dynamic"
	 "-mregnames" {vxworks2.s}
	 {{readelf --segments vxworks2.sd}}
	 "vxworks2"}
	{"VxWorks executable test 2 (static)"
	 "-Tvxworks1.ld"
	 "-mregnames" {vxworks2.s}
	 {{readelf --segments vxworks2-static.sd}}
	 "vxworks2"}
	{"VxWorks relax test"
	 "-Tvxworks1.ld --relax -q"
	 "-mregnames" {vxworks-relax.s}
	 {{readelf --relocs vxworks-relax.rd}}
	 "vxworks-relax"}
	{"VxWorks relocatable relax test"
	 "-Tvxworks1.ld -r --relax -q"
	 "-mregnames" {vxworks-relax-2.s}
	 {{readelf --relocs vxworks-relax-2.rd}}
	 "vxworks-relax-2"}
    }
    run_ld_link_tests $ppcvxtests
    run_dump_test "vxworks1-static"
    return
}

# powerpc ELF only at the moment.  Disable for nto too, even though it
# is ELF, because we pass -melf32ppc to ld and powerpc-nto-ld wants
# -melf32ppcnto.

if { [istarget "*-*-macos*"] || [istarget "*-*-netware*"]
     || [istarget "*-*-pe"] || [istarget "*-*-winnt*"]
     || [istarget "*-*-cygwin*"] || [istarget "*-*-aix*"]
     || [istarget "*-*-beos*"] || [istarget "*-*-lynxos*"]
     || [istarget "*-*-nto*"] } {
    return
}

proc supports_ppc64 { } {
    global ld

    catch "exec $ld --help | grep emulations" tmp
    if [ string match "*elf64ppc*" $tmp ] then {
	return 1
    } else {
	return 0
    }
}

# List contains test-items with 3 items followed by 2 lists:
# 0:name 1:ld options 2:assembler options
# 3:filenames of assembler files 4: action and options. 5: name of output file

# Actions:
# objdump: Apply objdump options on result.  Compare with regex (last arg).
# nm: Apply nm options on result.  Compare with regex (last arg).
# readelf: Apply readelf options on result.  Compare with regex (last arg).

set ppcelftests {
    {"Reloc section order" "-melf32ppc -shared -z nocombreloc" "-a32" {reloc.s}
     {{objdump -hw reloc.d}} "reloc.so"}
    {"APUinfo section processing" "-melf32ppc"
     "-a32 -me500" {apuinfo1.s apuinfo-nul.s apuinfo2.s}
    {{readelf -x2 apuinfo.rd}} "apuinfo"}
    {"APUinfo NULL section processing" "-melf32ppc"
     "-a32 -me500" {apuinfo-nul1.s apuinfo-nul.s}
    {{readelf -x2 apuinfo-nul.rd}} "apuinfo"}
    {"TLS32 static exec" "-melf32ppc" "-a32"  {tls32.s tlslib32.s}
     {{objdump -dr tls32.d} {objdump -sj.got tls32.g}
      {objdump -sj.tdata tls32.t}}
     "tls32"}
    {"TLS32 helper shared library" "-shared -melf32ppc tmpdir/tlslib32.o" "" {}
     {} "libtlslib32.so"}
    {"TLS32 dynamic exec" "-melf32ppc tmpdir/tls32.o tmpdir/libtlslib32.so" "" {}
     {{readelf -WSsrl tlsexe32.r} {objdump -dr tlsexe32.d}
      {objdump -sj.got tlsexe32.g} {objdump -sj.tdata tlsexe32.t}}
      "tlsexe32"}
    {"TLS32 shared" "-shared -melf32ppc tmpdir/tls32.o" "" {}
     {{readelf -WSsrl tlsso32.r} {objdump -dr tlsso32.d}
      {objdump -sj.got tlsso32.g} {objdump -sj.tdata tlsso32.t}}
      "tls32.so"}
    {"TLS32 markers" "-melf32ppc" "-a32"  {tlsmark32.s tlslib32.s}
     {{objdump -dr tlsmark32.d}}
      "tlsmark32"}
    {"Shared library with global symbol" "-shared -melf32ppc" "-a32" {sdalib.s}
     {} "sdalib.so"}
    {"Dynamic application with SDA" "-melf32ppc tmpdir/sdalib.so" "-a32" {sdadyn.s}
     {{objdump -R sdadyn.d}} "sdadyn"}
    {"relaxing" "-melf32ppc --relax -Ttext=0 --defsym far=0x80001234 --defsym near=0x00004320" "-a32" "relax.s"
     {{objdump -dr relax.d}}
      "relax"}
    {"relocatable relaxing" "-melf32ppc -r --relax" "-a32" "relax.s"
     {{objdump -dr relaxr.d}}
      "relax"}
}

set ppc64elftests {
    {"TLS static exec" "-melf64ppc" "-a64"  {tls.s tlslib.s}
     {{objdump -dr tls.d} {objdump -sj.got tls.g} {objdump -sj.tdata tls.t}}
      "tls"}
    {"TLS helper shared library" "-shared -melf64ppc tmpdir/tlslib.o" "" {}
     {} "libtlslib.so"}
    {"TLS helper old shared lib" "-shared -melf64ppc" "-a64" {oldtlslib.s}
     {} "liboldlib.so"}
    {"TLS dynamic exec" "-melf64ppc tmpdir/tls.o tmpdir/libtlslib.so" "" {}
     {{readelf -WSsrl tlsexe.r} {objdump -dr tlsexe.d}
      {objdump -sj.got tlsexe.g} {objdump -sj.tdata tlsexe.t}}
      "tlsexe"}
    {"TLS dynamic old" "-melf64ppc tmpdir/tls.o tmpdir/liboldlib.so" "" {}
     {{readelf -WSsrl tlsexe.r} {objdump -dr tlsexe.d}
      {objdump -sj.got tlsexe.g} {objdump -sj.tdata tlsexe.t}}
      "tlsexeold"}
    {"TLS shared" "-shared -melf64ppc tmpdir/tls.o" "" {}
     {{readelf -WSsrl tlsso.r} {objdump -dr tlsso.d}
      {objdump -sj.got tlsso.g} {objdump -sj.tdata tlsso.t}}
      "tls.so"}
    {"TLSTOC static exec" "-melf64ppc tmpdir/tlslib.o " "-a64"  {tlstoc.s}
     {{objdump -dr tlstoc.d} {objdump -sj.got tlstoc.g}
      {objdump -sj.tdata tlstoc.t}}
      "tlstoc"}
    {"TLSTOC dynamic exec" "-melf64ppc tmpdir/tlstoc.o tmpdir/libtlslib.so"
     "" {}
     {{readelf -WSsrl tlsexetoc.r} {objdump -dr tlsexetoc.d}
      {objdump -sj.got tlsexetoc.g} {objdump -sj.tdata tlsexetoc.t}}
      "tlsexetoc"}
    {"TLSTOC dynamic old" "-melf64ppc tmpdir/tlstoc.o tmpdir/liboldlib.so"
     "" {}
     {{readelf -WSsrl tlsexetoc.r} {objdump -dr tlsexetoc.d}
      {objdump -sj.got tlsexetoc.g} {objdump -sj.tdata tlsexetoc.t}}
      "tlsexetocold"}
    {"TLSTOC shared" "-shared -melf64ppc tmpdir/tlstoc.o" "" {}
     {{readelf -WSsrl tlstocso.r} {objdump -dr tlstocso.d}
      {objdump -sj.got tlstocso.g} {objdump -sj.tdata tlstocso.t}}
      "tlstoc.so"}
    {"TLS markers" "-melf64ppc" "-a64"  {tlsmark.s tlslib.s}
     {{objdump -dr tlsmark.d}}
      "tlsmark"}
    {"sym@tocbase" "-shared -melf64ppc" "-a64" {symtocbase-1.s symtocbase-2.s}
	{{objdump -dj.data symtocbase.d}} "symtocbase.so"}
    {"TOC opt" "-melf64ppc" "-a64"  {tocopt.s}
     {{objdump -s tocopt.d}} "tocopt"}
}


run_ld_link_tests $ppcelftests

if [ supports_ppc64 ] then {
    run_ld_link_tests $ppc64elftests
    run_dump_test "relbrlt"
}

run_dump_test "plt1"

run_dump_test "attr-gnu-4-00"
run_dump_test "attr-gnu-4-01"
run_dump_test "attr-gnu-4-02"
run_dump_test "attr-gnu-4-03"
run_dump_test "attr-gnu-4-10"
run_dump_test "attr-gnu-4-11"
run_dump_test "attr-gnu-4-12"
run_dump_test "attr-gnu-4-13"
run_dump_test "attr-gnu-4-14"
run_dump_test "attr-gnu-4-20"
run_dump_test "attr-gnu-4-21"
run_dump_test "attr-gnu-4-22"
run_dump_test "attr-gnu-4-23"
run_dump_test "attr-gnu-4-24"
run_dump_test "attr-gnu-4-31"
run_dump_test "attr-gnu-4-32"
run_dump_test "attr-gnu-4-33"
run_dump_test "attr-gnu-4-34"
run_dump_test "attr-gnu-4-41"

run_dump_test "attr-gnu-8-11"
run_dump_test "attr-gnu-8-23"
run_dump_test "attr-gnu-8-31"

run_dump_test "attr-gnu-12-11"
run_dump_test "attr-gnu-12-21"
