# Expect script for symbol export classes, PowerPC variation.
#
# Copyright 2012 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 supports_ppc64 { } {
    global ld

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

proc powerpc_export_class_test { abi emul } {

    set testname "PowerPC $abi symbol export class test"

    set AFLAGS "-a$abi -be"
    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" \
	] \
    ]
}

if { [supports_ppc64] } {
    set abis { 32 elf32ppclinux 64 elf64ppc }
} else {
    set abis { 32 elf32ppclinux }
}
foreach { abi emul } $abis {
    powerpc_export_class_test $abi $emul
}
