Index: gdb-7.5.91.20130407/gdb/testsuite/gdb.threads/tls-rhbz947564.cc =================================================================== --- /dev/null +++ gdb-7.5.91.20130407/gdb/testsuite/gdb.threads/tls-rhbz947564.cc @@ -0,0 +1,53 @@ +#include +#include + +class x + { + public: + int n; + + x() : n(0) {} + }; + +class y + { + public: + int v; + + y() : v(0) {} + static __thread x *xp; + }; + +__thread x *y::xp; + +static void +foo (y *yp) +{ + yp->v = 1; /* foo_marker */ +} + +static void * +bar (void *unused) +{ + x xinst; + y::xp= &xinst; + + y yy; + foo(&yy); + + return NULL; +} + +int +main(int argc, char *argv[]) +{ + pthread_t t[2]; + + pthread_create (&t[0], NULL, bar, NULL); + pthread_create (&t[1], NULL, bar, NULL); + + pthread_join (t[0], NULL); + pthread_join (t[1], NULL); + + return 0; +} Index: gdb-7.5.91.20130407/gdb/testsuite/gdb.threads/tls-rhbz947564.exp =================================================================== --- /dev/null +++ gdb-7.5.91.20130407/gdb/testsuite/gdb.threads/tls-rhbz947564.exp @@ -0,0 +1,75 @@ +# Copyright (C) 2013 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 . */ + +set testfile tls-rhbz947564 +set srcfile ${testfile}.cc +set binfile ${objdir}/${subdir}/${testfile} + +if [istarget "*-*-linux"] then { + set target_cflags "-D_MIT_POSIX_THREADS" +} else { + set target_cflags "" +} + +if {[gdb_compile_pthreads "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable [list c++ debug]] != "" } { + return -1 +} + +gdb_exit +gdb_start +gdb_reinitialize_dir $srcdir/$subdir + +gdb_load ${binfile} + +if { ![runto_main] } { + fail "Can't run to function main" + return 0 +} + +gdb_breakpoint "foo" +gdb_continue_to_breakpoint "foo" ".* foo_marker .*" + +proc get_xp_val {try} { + global expect_out + global gdb_prompt + global hex + + set xp_val "" + gdb_test_multiple "print *yp" "print yp value" { + -re { = \{v = 0, static xp = (0x[0-9a-f]+)\}.* } { + pass "print $try value of *yp" + set xp_val $expect_out(1,string) + } + -re "$gdb_prompt $" { + fail "print $try value of *yp" + } + timeout { + fail "print $try value of *yp (timeout)" + } + } + return $xp_val +} + +set first_run [get_xp_val "first"] + +gdb_test "continue" "Breakpoint \[0-9\]+, foo \\\(yp=$hex\\\) at.*" + +set second_run [get_xp_val "second"] + +if { $first_run != $second_run } { + pass "different values for TLS variable" +} else { + fail "different values for TLS variable" +}