# Expect script for symbol export classes, x86-64 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 x86_64*-*-linux*] } {
    return
}

proc x86_64_export_class_test { abi flag emul } {

    set testname "x86-64 $abi symbol export class test"

    set dump [string map {32 ../ld-i386/i386 x32 x86-64-x32 64 x86-64-64} $abi]

    set AFLAGS "$flag"
    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 } \
	    {} \
	    "x86-64-$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 } \
	    {} \
	    "x86-64-$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/x86-64-$abi-export-class-ref-r.o tmpdir/x86-64-$abi-export-class-lib.so" "" \
	    "$AFLAGS" \
	    { ../ld-elf/export-class-dep.s ../ld-elf/export-class-def.s } \
	    [list \
		[list readelf -r $dump-export-class.rd] \
		[list readelf "-x .data" ../ld-i386/i386-export-class.xd] \
	    ] \
	    "x86-64-$abi-export-class.so" \
	] \
    ]
}

set abis { 32 --32 elf_i386 x32 --x32 elf32_x86_64 64 --64 elf_x86_64 }
foreach { abi flag emul } $abis {
    x86_64_export_class_test $abi $flag $emul
}
