aboutsummaryrefslogtreecommitdiff
path: root/gdb/testsuite
diff options
context:
space:
mode:
authorJan Kratochvil <jan.kratochvil@redhat.com>2008-12-02 14:51:01 +0000
committerJan Kratochvil <jan.kratochvil@redhat.com>2008-12-02 14:51:01 +0000
commite0740f779c1471fbc565ceedae93dea09bc0eadf (patch)
tree2a5d38d0d285c60457f1be35f6b5ef641c863e8f /gdb/testsuite
parentc29235ac9f1b955c3f4c89c5c8bc4ea4d4f80ae1 (diff)
downloadgdb-e0740f779c1471fbc565ceedae93dea09bc0eadf.zip
gdb-e0740f779c1471fbc565ceedae93dea09bc0eadf.tar.gz
gdb-e0740f779c1471fbc565ceedae93dea09bc0eadf.tar.bz2
gdb/
Fix resolving external references to TLS variables. * findvar.c: Include `objfiles.h'. (read_var_value <LOC_UNRESOLVED>): New variable `obj_section'. Handle SEC_THREAD_LOCAL variables. * printcmd.c (address_info <LOC_UNRESOLVED>): Handle SEC_THREAD_LOCAL variables. gdb/testsuite/ Test resolving external references to TLS variables. * gdb.threads/tls.exp: New tests to examine A_THREAD_LOCAL and FILE2_THREAD_LOCAL. (testfile2, srcfile2): New variables. * gdb.threads/tls.c (file2_thread_local) (function_referencing_file2_thread_local): New. * gdb.threads/tls2.c: New file.
Diffstat (limited to 'gdb/testsuite')
-rw-r--r--gdb/testsuite/ChangeLog14
-rw-r--r--gdb/testsuite/gdb.threads/tls.c9
-rw-r--r--gdb/testsuite/gdb.threads/tls.exp18
-rw-r--r--gdb/testsuite/gdb.threads/tls2.c28
4 files changed, 66 insertions, 3 deletions
diff --git a/gdb/testsuite/ChangeLog b/gdb/testsuite/ChangeLog
index ba8a240..f0dfcb5 100644
--- a/gdb/testsuite/ChangeLog
+++ b/gdb/testsuite/ChangeLog
@@ -1,8 +1,18 @@
+2008-12-02 Jan Kratochvil <jan.kratochvil@redhat.com>
+
+ Test resolving external references to TLS variables.
+ * gdb.threads/tls.exp: New tests to examine A_THREAD_LOCAL and
+ FILE2_THREAD_LOCAL.
+ (testfile2, srcfile2): New variables.
+ * gdb.threads/tls.c (file2_thread_local)
+ (function_referencing_file2_thread_local): New.
+ * gdb.threads/tls2.c: New file.
+
2008-11-28 Joel Brobecker <brobecker@adacore.com>
* gdb.ada/int_deref.exp: Convert the addresses into long_integer
- rather than integer, as integer might not be big enough when
- on 64bit targets.
+ rather than integer, as integer might not be big enough when
+ on 64bit targets.
2008-11-27 Jerome Guitton <guitton@adacore.com>
diff --git a/gdb/testsuite/gdb.threads/tls.c b/gdb/testsuite/gdb.threads/tls.c
index 9b2145e..8f2443c 100644
--- a/gdb/testsuite/gdb.threads/tls.c
+++ b/gdb/testsuite/gdb.threads/tls.c
@@ -20,6 +20,9 @@
__thread int a_thread_local;
__thread int another_thread_local;
+/* psymtabs->symtabs resolving check. */
+extern __thread int file2_thread_local;
+
/* Global variable just for info addr in gdb. */
int a_global;
@@ -119,6 +122,12 @@ void *spin( vp )
}
void
+function_referencing_file2_thread_local (void)
+{
+ file2_thread_local = file2_thread_local;
+}
+
+void
do_pass()
{
int i;
diff --git a/gdb/testsuite/gdb.threads/tls.exp b/gdb/testsuite/gdb.threads/tls.exp
index 614c06e..ead852a 100644
--- a/gdb/testsuite/gdb.threads/tls.exp
+++ b/gdb/testsuite/gdb.threads/tls.exp
@@ -15,7 +15,9 @@
# along with this program. If not, see <http://www.gnu.org/licenses/>. */
set testfile tls
+set testfile2 tls2
set srcfile ${testfile}.c
+set srcfile2 ${testfile2}.c
set binfile ${objdir}/${subdir}/${testfile}
if [istarget "*-*-linux"] then {
@@ -24,7 +26,7 @@ if [istarget "*-*-linux"] then {
set target_cflags ""
}
-if {[gdb_compile_pthreads "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable [list debug "incdir=${objdir}"]] != "" } {
+if {[gdb_compile_pthreads "${srcdir}/${subdir}/${srcfile} ${srcdir}/${subdir}/${srcfile2}" "${binfile}" executable [list debug "incdir=${objdir}"]] != "" } {
return -1
}
@@ -284,6 +286,20 @@ gdb_test "info address a_global" \
setup_kfail "gdb/1294" "*-*-*"
gdb_test "info address me" ".*me.*is a variable at offset.*" "info address me"
+
+# Test LOC_UNRESOLVED references resolving for `extern' TLS variables.
+
+gdb_test "p a_thread_local" " = \[0-9\]+"
+# Here it could crash with: Cannot access memory at address 0x0
+gdb_test "p file2_thread_local" " = \[0-9\]+"
+# Depending on the current lookup scope we get LOC_UNRESOLVED or LOC_COMPUTED
+# both printing:
+# Symbol "file2_thread_local" is a thread-local variable at offset 8 in the thread-local storage for `.../gdb.threads/tls'.
+gdb_test "info address file2_thread_local" "Symbol \"file2_thread_local\" is a thread-local variable.*"
+# Here it could also crash with: Cannot access memory at address 0x0
+gdb_test "p a_thread_local" " = \[0-9\]+" "p a_thread_local second time"
+gdb_test "info address a_thread_local" "Symbol \"a_thread_local\" is a thread-local variable.*"
+
# Done!
#
gdb_exit
diff --git a/gdb/testsuite/gdb.threads/tls2.c b/gdb/testsuite/gdb.threads/tls2.c
new file mode 100644
index 0000000..f87ec2f
--- /dev/null
+++ b/gdb/testsuite/gdb.threads/tls2.c
@@ -0,0 +1,28 @@
+/* This testcase is part of GDB, the GNU debugger.
+
+ Copyright 2008 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/>.
+
+ Please email any bugs, comments, and/or additions to this file to:
+ bug-gdb@prep.ai.mit.edu */
+
+extern __thread int a_thread_local;
+__thread int file2_thread_local;
+
+void
+function_referencing_a_thread_local (void)
+{
+ a_thread_local = a_thread_local;
+}