# Copyright 2003-2018 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 {
    fail "can't run to main"
    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"
