# Expect script for symbol export classes, PowerPC variation.
#
# Copyright (C) 2012-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 Maciej W. Rozycki <macro@codesourcery.com>
#

# Exclude non-Linux targets; feel free to include your favorite one
# if you like.
if { ![istarget powerpc*-*-linux*] } {
    return
}

proc powerpc_export_class_test { abi endian emul } {

    set testname "PowerPC $abi $endian symbol export class test"

    set AFLAGS "-a$abi -$endian"
    set LDFLAGS "-m$emul"

    # Build an auxiliary shared object with conflicting versioned symbol
    # definitions.
    run_ld_link_tests [list \
	[list \
	    "$testname (auxiliary shared object)" \
	    "$LDFLAGS -shared -version-script ../ld-elf/export-class-lib.ver" "" \
	    "$AFLAGS" \
	    { ../ld-elf/export-class-lib.s } \
	    {} \
	    "powerpc-$abi-export-class-lib.so" \
	] \
    ]

    # Build a static object that pulls symbol definitions.  It has to come
    # first before the auxiliary shared object and other static objects on
    # the linker's command line and hence we need to build it separately.
    run_ld_link_tests [list \
	[list \
	    "$testname (initial static object)" \
	    "$LDFLAGS -r" "" \
	    "$AFLAGS" \
	    { ../ld-elf/export-class-ref.s } \
	    {} \
	    "powerpc-$abi-export-class-ref-r.o" \
	] \
    ]

    # Build static objects that satisfy symbol dependencies and preempt
    # shared-object symbol definitions, and link all the objects built into
    # the final shared object.  The command-line order of objects linked is
    # important to make sure the linker correctly preempts versioned symbols
    # from the auxiliary shared object and is as follows: ref, lib, dep, def.
    # Get a dump to make sure symbol dependencies are resolved internally.
    run_ld_link_tests [list \
	[list \
	    "$testname (final shared object)" \
	    "$LDFLAGS -shared -Tdata=0x12340000 tmpdir/powerpc-$abi-export-class-ref-r.o tmpdir/powerpc-$abi-export-class-lib.so" "" \
	    "$AFLAGS" \
	    { ../ld-elf/export-class-dep.s ../ld-elf/export-class-def.s } \
	    [list \
		[list readelf -r powerpc-$abi-export-class.rd] \
		[list readelf "-x .data" powerpc-$abi-export-class.xd] \
	    ] \
	    "powerpc-$abi-export-class.so" \
	] \
    ]
}

set abis { 32 be elf32ppclinux 32 le elf32lppclinux 64 be elf64ppc 64 le elf64lppc }

global ld
catch "exec $ld --help | grep emulations" ldemul

foreach { abi endian emul } $abis {
    if { [string first $emul $ldemul] != -1 } then {
	powerpc_export_class_test $abi $endian $emul
    }
}
