gdb/
authorJan Kratochvil <jan.kratochvil@redhat.com>
Tue, 2 Dec 2008 14:51:01 +0000 (14:51 +0000)
committerJan Kratochvil <jan.kratochvil@redhat.com>
Tue, 2 Dec 2008 14:51:01 +0000 (14:51 +0000)
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.

gdb/ChangeLog
gdb/findvar.c
gdb/printcmd.c
gdb/testsuite/ChangeLog
gdb/testsuite/gdb.threads/tls.c
gdb/testsuite/gdb.threads/tls.exp
gdb/testsuite/gdb.threads/tls2.c [new file with mode: 0644]

index abdfc91edefa5e85411f812abdbfcc451fd13165..345766fbf2d8b2a403621ed3de9e5a420edd5219 100644 (file)
@@ -1,3 +1,12 @@
+2008-12-02  Jan Kratochvil  <jan.kratochvil@redhat.com>
+
+       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.
+
 2008-12-02  Doug Evans  <dje@google.com>
 
        * infrun.c (handle_inferior_event): Delete unused local tp.
index 4796721f4fa78b2de5f1a86ddcbd40f6d8ce2b7c..f7b6e63d4492fdb6074df52684ac32b8ee7a0944 100644 (file)
@@ -34,6 +34,7 @@
 #include "regcache.h"
 #include "user-regs.h"
 #include "block.h"
+#include "objfiles.h"
 
 /* Basic byte-swapping routines.  GDB has needed these for a long time...
    All extract a target-format integer at ADDR which is LEN bytes long.  */
@@ -536,6 +537,7 @@ read_var_value (struct symbol *var, struct frame_info *frame)
     case LOC_UNRESOLVED:
       {
        struct minimal_symbol *msym;
+       struct obj_section *obj_section;
 
        msym = lookup_minimal_symbol (SYMBOL_LINKAGE_NAME (var), NULL, NULL);
        if (msym == NULL)
@@ -545,6 +547,11 @@ read_var_value (struct symbol *var, struct frame_info *frame)
                                           SYMBOL_OBJ_SECTION (msym));
        else
          addr = SYMBOL_VALUE_ADDRESS (msym);
+
+       obj_section = SYMBOL_OBJ_SECTION (msym);
+       if (obj_section
+           && (obj_section->the_bfd_section->flags & SEC_THREAD_LOCAL) != 0)
+         addr = target_translate_tls_address (obj_section->objfile, addr);
       }
       break;
 
index 81638fbd2d5b0c699d05c9d2b26127a06ebae411..6d6b91580e90cacd8e0af091a4d25149ec4b0ee0 100644 (file)
@@ -1241,16 +1241,25 @@ address_info (char *exp, int from_tty)
        else
          {
            section = SYMBOL_OBJ_SECTION (msym);
-           printf_filtered (_("static storage at address "));
            load_addr = SYMBOL_VALUE_ADDRESS (msym);
-           fputs_filtered (paddress (load_addr), gdb_stdout);
-           if (section_is_overlay (section))
+
+           if (section
+               && (section->the_bfd_section->flags & SEC_THREAD_LOCAL) != 0)
+             printf_filtered (_("a thread-local variable at offset %s "
+                                "in the thread-local storage for `%s'"),
+                              paddr_nz (load_addr), section->objfile->name);
+           else
              {
-               load_addr = overlay_unmapped_address (load_addr, section);
-               printf_filtered (_(",\n -- loaded at "));
+               printf_filtered (_("static storage at address "));
                fputs_filtered (paddress (load_addr), gdb_stdout);
-               printf_filtered (_(" in overlay section %s"),
-                                section->the_bfd_section->name);
+               if (section_is_overlay (section))
+                 {
+                   load_addr = overlay_unmapped_address (load_addr, section);
+                   printf_filtered (_(",\n -- loaded at "));
+                   fputs_filtered (paddress (load_addr), gdb_stdout);
+                   printf_filtered (_(" in overlay section %s"),
+                                    section->the_bfd_section->name);
+                 }
              }
          }
       }
index ba8a24012726193564148be9da9ac54ad6ab1db4..f0dfcb5336bf3313f8af7cbbd8207ed49427ba4a 100644 (file)
@@ -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>
 
index 9b2145e652ff4c9de4eb549b29dfb060bca7882e..8f2443c074c4cb305fc1629e031d8dc83915482d 100644 (file)
@@ -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;
 
@@ -118,6 +121,12 @@ void *spin( vp )
 
 }
 
+void
+function_referencing_file2_thread_local (void)
+{
+  file2_thread_local = file2_thread_local;
+}
+
 void
 do_pass()
 {
index 614c06e06e6b6917ddc19d6150f3afee0886ff6b..ead852a5a876864d52883e993bdee6fea64ed647 100644 (file)
@@ -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 (file)
index 0000000..f87ec2f
--- /dev/null
@@ -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;
+}