From e0740f779c1471fbc565ceedae93dea09bc0eadf Mon Sep 17 00:00:00 2001 From: Jan Kratochvil Date: Tue, 2 Dec 2008 14:51:01 +0000 Subject: [PATCH] gdb/ Fix resolving external references to TLS variables. * findvar.c: Include `objfiles.h'. (read_var_value ): New variable `obj_section'. Handle SEC_THREAD_LOCAL variables. * printcmd.c (address_info ): 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 | 9 +++++++++ gdb/findvar.c | 7 +++++++ gdb/printcmd.c | 23 ++++++++++++++++------- gdb/testsuite/ChangeLog | 14 ++++++++++++-- gdb/testsuite/gdb.threads/tls.c | 9 +++++++++ gdb/testsuite/gdb.threads/tls.exp | 18 +++++++++++++++++- gdb/testsuite/gdb.threads/tls2.c | 28 ++++++++++++++++++++++++++++ 7 files changed, 98 insertions(+), 10 deletions(-) create mode 100644 gdb/testsuite/gdb.threads/tls2.c diff --git a/gdb/ChangeLog b/gdb/ChangeLog index abdfc91..345766f 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,12 @@ +2008-12-02 Jan Kratochvil + + Fix resolving external references to TLS variables. + * findvar.c: Include `objfiles.h'. + (read_var_value ): New variable `obj_section'. Handle + SEC_THREAD_LOCAL variables. + * printcmd.c (address_info ): Handle SEC_THREAD_LOCAL + variables. + 2008-12-02 Doug Evans * infrun.c (handle_inferior_event): Delete unused local tp. diff --git a/gdb/findvar.c b/gdb/findvar.c index 4796721..f7b6e63 100644 --- a/gdb/findvar.c +++ b/gdb/findvar.c @@ -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; diff --git a/gdb/printcmd.c b/gdb/printcmd.c index 81638fb..6d6b915 100644 --- a/gdb/printcmd.c +++ b/gdb/printcmd.c @@ -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); + } } } } 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 + + 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 * 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 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 . */ 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 . + + 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; +} -- 2.7.4