# Expect script for x86-64 TLS tests.
#   Copyright (C) 2016-2021 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.
#

# The following tests require running the executable generated by ld,
# or enough of a build environment to create a fully linked executable.
# This is not commonly available when testing a cross-built linker.
if ![isnative] {
    return
}

# Only on Linux for now.
if ![istarget "x86_64-*-linux*"] {
    return
}

# Check to see if the C compiler works
if { ![check_compiler_available] } {
    return
}

run_cc_link_tests [list \
    [list \
	"Build tls-def1.o tls-main1.o" \
	"" \
	"-fPIE -Wa,-mx86-used-note=yes" \
	{tls-def1.c tls-main1.c} \
    ] \
    [list \
	"Build tls-gd1.o tls-ld1.o" \
	"" \
	"-fPIC -Wa,-mrelax-relocations=yes,-mx86-used-note=yes" \
	{tls-gd1.S tls-ld1.S} \
    ] \
    [list \
	"Build libtls-1a.so" \
	"-shared tmpdir/tls-def1.o" \
	"-Wa,-mx86-used-note=yes" \
	{dummy.s} \
	{} \
	"libtls-1a.so" \
    ] \
    [list \
	"Build libtls-1b.so" \
	"-shared tmpdir/tls-gd1.o tmpdir/tls-ld1.o" \
	"-Wa,-mx86-used-note=yes" \
	{dummy.s} \
	{} \
	"libtls-1b.so" \
    ] \
    [list \
	"Build libtls-1bn.so" \
	"-Wl,-z,now -shared tmpdir/tls-gd1.o tmpdir/tls-ld1.o" \
	"-Wa,-mx86-used-note=yes" \
	{dummy.s} \
	{} \
	"libtls-1bn.so" \
    ] \
]

run_ld_link_exec_tests [list \
    [list \
	"TLS GD/LD -> LE transition without PLT (dynamic)" \
	"tmpdir/tls-def1.o tmpdir/tls-main1.o tmpdir/tls-gd1.o \
	 tmpdir/tls-ld1.o" \
	"-Wa,-mx86-used-note=yes" \
	{ dummy.s } \
	"tls-1a" \
	"pass.out" \
    ] \
    [list \
	"TLS GD/LD -> LE transition without PLT (dynamic, -z now)" \
	"-Wl,-z,now tmpdir/tls-def1.o tmpdir/tls-main1.o tmpdir/tls-gd1.o \
	 tmpdir/tls-ld1.o" \
	"-Wa,-mx86-used-note=yes" \
	{ dummy.s } \
	"tls-1an" \
	"pass.out" \
    ] \
    [list \
	"TLS GD/LD -> LE transition without PLT (PIE)" \
	"-pie tmpdir/tls-def1.o tmpdir/tls-main1.o tmpdir/tls-gd1.o \
	 tmpdir/tls-ld1.o" \
	"-Wa,-mx86-used-note=yes" \
	{ dummy.s } \
	"tls-1b" \
	"pass.out" \
    ] \
    [list \
	"TLS GD/LD -> LE transition without PLT (PIE, -z now)" \
	"-pie -Wl,-z,now tmpdir/tls-def1.o tmpdir/tls-main1.o tmpdir/tls-gd1.o \
	 tmpdir/tls-ld1.o" \
	"-Wa,-mx86-used-note=yes" \
	{ dummy.s } \
	"tls-1bn" \
	"pass.out" \
    ] \
    [list \
	"TLS GD/LD -> LE transition without PLT (static)" \
	"-static tmpdir/tls-def1.o tmpdir/tls-main1.o tmpdir/tls-gd1.o \
	 tmpdir/tls-ld1.o" \
	"-Wa,-mx86-used-note=yes" \
	{ dummy.s } \
	"tls-1c" \
	"pass.out" \
    ] \
    [list \
	"TLS GD/LD -> IE transition without PLT" \
	"-Wl,--no-as-needed,-R,tmpdir tmpdir/tls-main1.o \
	 tmpdir/tls-gd1.o tmpdir/tls-ld1.o tmpdir/libtls-1a.so" \
	"-Wa,-mx86-used-note=yes" \
	{ dummy.s } \
	"tls-1d" \
	"pass.out" \
    ] \
    [list \
	"TLS GD/LD -> IE transition without PLT (-z now)" \
	"-Wl,-z,now tmpdir/tls-main1.o tmpdir/tls-gd1.o tmpdir/tls-ld1.o \
	 tmpdir/libtls-1a.so -Wl,-R,tmpdir" \
	"-Wa,-mx86-used-note=yes" \
	{ dummy.s } \
	"tls-1dn" \
	"pass.out" \
    ] \
    [list \
	"TLS without PLT (1)" \
	"-Wl,--no-as-needed,-R,tmpdir tmpdir/tls-main1.o \
	 tmpdir/libtls-1a.so tmpdir/libtls-1b.so" \
	"-Wa,-mx86-used-note=yes" \
	{ dummy.s } \
	"tls-1e" \
	"pass.out" \
    ] \
    [list \
	"TLS without PLT (2)" \
	"-Wl,--no-as-needed,-R,tmpdir tmpdir/tls-main1.o \
	 tmpdir/tls-def1.o tmpdir/libtls-1b.so" \
	"-Wa,-mx86-used-note=yes" \
	{ dummy.s } \
	"tls-1f" \
	"pass.out" \
    ] \
    [list \
	"TLS without PLT (3)" \
	"-Wl,--no-as-needed -Wl,-z,now tmpdir/tls-main1.o \
	 tmpdir/libtls-1a.so tmpdir/libtls-1bn.so -Wl,-R,tmpdir" \
	"-Wa,-mx86-used-note=yes" \
	{ dummy.s } \
	"tls-1en" \
	"pass.out" \
    ] \
    [list \
	"TLS without PLT (4)" \
	"-Wl,-z,now tmpdir/tls-main1.o tmpdir/tls-def1.o \
	 tmpdir/libtls-1bn.so -Wl,-R,tmpdir" \
	"-Wa,-mx86-used-note=yes" \
	{ dummy.s } \
	"tls-1fn" \
	"pass.out" \
    ] \
]

# Skip if -mtls-dialect=gnu2 doesn't work.
if { ![run_host_cmd_yesno $CC_FOR_TARGET "-c -O2 -fPIC $GNU2_CFLAGS $srcdir/$subdir/tlsdesc1b.c -o tmpdir/tlsdesc1b.o"] } {
    return
}

run_cc_link_tests [list \
    [list \
	"Build libtlsdesc1.so" \
	"-shared" \
	"-fPIC $GNU2_CFLAGS -Wa,-mx86-used-note=yes" \
	{ tlsdesc1b.c } \
	{} \
	"libtlsdesc1.so" \
    ] \
    [list \
	"Build libtlsdesc1n.so" \
	"-Wl,-z,now -shared" \
	"-fPIC $GNU2_CFLAGS -Wa,-mx86-used-note=yes" \
	{ tlsdesc1b.c } \
	{} \
	"libtlsdesc1n.so" \
    ] \
]

# Run-time tests which require working GNU2 TLS support.
if { ![check_gnu2_tls_available] } {
    return
}

if { [at_least_gcc_version 5 0] } {
    run_ld_link_exec_tests [list \
	[list \
	    "Run tlsdesc1" \
	    "-Wl,--no-as-needed tmpdir/libtlsdesc1.so" \
	    "-Wa,-mx86-used-note=yes" \
	    { tlsdesc1a.c } \
	    "tlsdesc1a" \
	    "pass.out" \
	    "$GNU2_CFLAGS" \
	] \
	[list \
	    "Run tlsdesc1 with PIE" \
	    "-pie -Wl,--no-as-needed tmpdir/libtlsdesc1.so" \
	    "-Wa,-mx86-used-note=yes" \
	    { tlsdesc1a.c } \
	    "tlsdesc1c" \
	    "pass.out" \
	    "-fPIE $GNU2_CFLAGS" \
	] \
    ]
}

run_ld_link_exec_tests [list \
    [list \
	"Run tlsdesc1 (-z now)" \
	"-Wl,-z,now -Wl,--no-as-needed tmpdir/libtlsdesc1n.so" \
	"-Wa,-mx86-used-note=yes" \
	{ tlsdesc1a.c } \
	"tlsdesc1b" \
	"pass.out" \
	"$GNU2_CFLAGS" \
    ] \
    [list \
	"Run tlsdesc1 with PIE (-z now)" \
	"-pie -Wl,-z,now -Wl,--no-as-needed tmpdir/libtlsdesc1n.so" \
	"-Wa,-mx86-used-note=yes" \
	{ tlsdesc1a.c } \
	"tlsdesc1d" \
	"pass.out" \
	"-fPIE $GNU2_CFLAGS" \
    ] \
]
