1# Copyright 2003-2016 Free Software Foundation, Inc. 2 3# This program is free software; you can redistribute it and/or modify 4# it under the terms of the GNU General Public License as published by 5# the Free Software Foundation; either version 3 of the License, or 6# (at your option) any later version. 7# 8# This program is distributed in the hope that it will be useful, 9# but WITHOUT ANY WARRANTY; without even the implied warranty of 10# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 11# GNU General Public License for more details. 12# 13# You should have received a copy of the GNU General Public License 14# along with this program. If not, see <http://www.gnu.org/licenses/>. */ 15 16# tls-so_extern.exp -- Expect script to test thread local storage in gdb, with 17# a variable defined in a shared library. 18 19standard_testfile tls-so_extern_main.c 20set libfile tls-so_extern 21set srcfile_lib ${libfile}.c 22set binfile_lib [standard_output_file ${libfile}.so] 23 24 25# get the value of gcc_compiled 26if [get_compiler_info] { 27 return -1 28} 29 30 31if { [gdb_compile_shlib_pthreads ${srcdir}/${subdir}/${srcfile_lib} ${binfile_lib} {debug}] != "" 32 || [gdb_compile_pthreads ${srcdir}/${subdir}/${srcfile} ${binfile} executable [list debug shlib=${binfile_lib}]] != ""} { 33 return -1 34} 35 36 37clean_restart ${binfile} 38gdb_load_shlib ${binfile_lib} 39 40if ![runto_main] then { 41 fail "Can't run to main" 42 return 0 43} 44 45gdb_test "print so_extern" "0x0" "print thread local storage variable" 46 47gdb_test "ptype so_extern" "void \\*" "ptype of thread local storage variable" 48 49gdb_test "info address so_extern" \ 50 "Symbol \\\"so_extern\\\" is a thread-local variable at offset 0x0 in the thread-local storage for .*tls-so_extern.*" \ 51 "print storage info for thread local storage variable" 52 53set line_number [gdb_get_line_number "break here to check result"] 54 55gdb_test "break $line_number" \ 56 "Breakpoint.*at.*file.*tls-so_extern_main.c.*line ${line_number}." \ 57 "break in thread function" 58gdb_test "continue" \ 59 "tls_ptr .* at .*:.*break here to check result.*" \ 60 "continue to break in tls_ptr called by main" 61gdb_test "print so_extern == &so_extern" \ 62 " = 1" \ 63 "check so_extern address in main" 64gdb_test "continue" \ 65 "tls_ptr .* at .*:.*break here to check result.*" \ 66 "continue to break in a thread" 67gdb_test "print so_extern == &so_extern" \ 68 " = 1" \ 69 "check so_extern address" 70gdb_test "continue" \ 71 "tls_ptr .* at .*:.*break here to check result.*" \ 72 "continue to break in the other thread" 73gdb_test "print so_extern == &so_extern" \ 74 " = 1" \ 75 "check so_extern address in other thread" 76gdb_test "continue" \ 77 "tls_ptr .* at .*:.*break here to check result.*" \ 78 "continue to break in tls_ptr called at end of main" 79gdb_test "print so_extern == &so_extern" \ 80 " = 1" \ 81 "check so_extern address at end of main" 82