# Expect script for i386 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 "i?86-*-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" \
	"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-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 tmpdir/tls-main1.o \
	 tmpdir/libtls-1a.so tmpdir/libtls-1b.so -Wl,-R,tmpdir" \
	"-Wa,-mx86-used-note=yes" \
	{ dummy.s } \
	"tls-1e" \
	"pass.out" \
    ] \
    [list \
	"TLS without PLT (2)" \
	"tmpdir/tls-main1.o tmpdir/tls-def1.o \
	 tmpdir/libtls-1b.so -Wl,-R,tmpdir" \
	"-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" \
    ] \
]

# Run-time tests which require working GNU2 TLS support.
if { ![check_gnu2_tls_available] } {
    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_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 (-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" \
	"-pie -Wl,--no-as-needed tmpdir/libtlsdesc1.so" \
	"-Wa,-mx86-used-note=yes" \
	{ tlsdesc1a.c } \
	"tlsdesc1c" \
	"pass.out" \
	"-fPIE $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" \
    ] \
]
