# Copyright 2003-2021 Free Software Foundation, Inc.

# 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, see <http://www.gnu.org/licenses/>.  */

# tls-shared.exp -- Expect script to test thread local storage in gdb, with
# shared libraries.

standard_testfile tls-main.c
set libfile tls-shared
set srcfile_lib ${libfile}.c
set binfile_lib [standard_output_file ${libfile}.so]

remote_exec build "rm -f ${binfile}"

# get the value of gcc_compiled
if [get_compiler_info] {
    return -1
}


if { [gdb_compile_shlib_pthreads ${srcdir}/${subdir}/${srcfile_lib} ${binfile_lib} {debug}] != ""
     || [gdb_compile_pthreads ${srcdir}/${subdir}/${srcfile} ${binfile} executable [list debug shlib=${binfile_lib}]] != ""} {
    return -1
}


clean_restart ${binfile}
gdb_load_shlib ${binfile_lib}

if ![runto_main] then {
    return 0
}

gdb_test "print i_tls" "2" "print thread local storage variable"

gdb_test "ptype i_tls" "int" "ptype of thread local storage variable"

gdb_test "info address i_tls" \
	"Symbol \\\"i_tls\\\" is a thread-local variable at offset 0x0 in the thread-local storage for .*tls-shared.." \
	"print storage info for thread local storage variable"

set line_number [gdb_get_line_number "break here to check result"]

gdb_test "break $line_number" \
	"Breakpoint.*at.*file.*tls-main.c.*line ${line_number}." \
	"break at and of main"
gdb_test "continue" \
	"main .* at .*:.*return 0.*break here to check result.*" \
        "continue to break"
# This is more of a gcc/glibc test, really. 
#
gdb_test "print result" "3"
