# Copyright 2003, 2007, 2008, 2009, 2010, 2011 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.

if $tracelevel then {
    strace $tracelevel
}

set testfile tls-main
set libfile tls-shared
set srcfile ${testfile}.c
set binfile ${objdir}/${subdir}/${testfile}
set srcfile_lib ${libfile}.c
set binfile_lib ${objdir}/${subdir}/${libfile}.so

remote_exec build "rm -f ${binfile}"

# get the value of gcc_compiled
if [get_compiler_info ${binfile}] {
    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
}


gdb_exit
gdb_start
gdb_reinitialize_dir $srcdir/$subdir
gdb_load ${binfile}
gdb_load_shlibs ${binfile_lib}

if ![runto_main] then {
    fail "Can't run to main"
    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-main.." \
	"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" "print result"


