# 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-so_extern.exp -- Expect script to test thread local storage in gdb, with
# a variable defined in a shared library.

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


# 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 so_extern" "0x0" "print thread local storage variable"

gdb_test "ptype so_extern" "void \\*" "ptype of thread local storage variable"

gdb_test "info address so_extern" \
	"Symbol \\\"so_extern\\\" is a thread-local variable at offset 0x0 in the thread-local storage for .*tls-so_extern.*" \
	"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-so_extern_main.c.*line ${line_number}." \
	"break in thread function"
gdb_test "continue" \
	"tls_ptr .* at .*:.*break here to check result.*" \
        "continue to break in tls_ptr called by main"
gdb_test "print so_extern == &so_extern" \
         " = 1" \
        "check so_extern address in main"
gdb_test "continue" \
	"tls_ptr .* at .*:.*break here to check result.*" \
        "continue to break in a thread"
gdb_test "print so_extern == &so_extern" \
         " = 1" \
        "check so_extern address"
gdb_test "continue" \
	"tls_ptr .* at .*:.*break here to check result.*" \
        "continue to break in the other thread"
gdb_test "print so_extern == &so_extern" \
         " = 1" \
        "check so_extern address in other thread"
gdb_test "continue" \
	"tls_ptr .* at .*:.*break here to check result.*" \
        "continue to break in tls_ptr called at end of main"
gdb_test "print so_extern == &so_extern" \
         " = 1" \
        "check so_extern address at end of main"
