From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 13308 invoked by alias); 1 Dec 2008 14:15:32 -0000 Received: (qmail 13278 invoked by uid 22791); 1 Dec 2008 14:15:27 -0000 X-Spam-Check-By: sourceware.org Received: from mx1.redhat.com (HELO mx1.redhat.com) (66.187.233.31) by sourceware.org (qpsmtpd/0.43rc1) with ESMTP; Mon, 01 Dec 2008 14:14:29 +0000 Received: from int-mx1.corp.redhat.com (int-mx1.corp.redhat.com [172.16.52.254]) by mx1.redhat.com (8.13.8/8.13.8) with ESMTP id mB1EERre010089; Mon, 1 Dec 2008 09:14:27 -0500 Received: from pobox.stuttgart.redhat.com (pobox.stuttgart.redhat.com [172.16.2.10]) by int-mx1.corp.redhat.com (8.13.1/8.13.1) with ESMTP id mB1EEPDp015376; Mon, 1 Dec 2008 09:14:26 -0500 Received: from host0.dyn.jankratochvil.net (sebastian-int.corp.redhat.com [172.16.52.221]) by pobox.stuttgart.redhat.com (8.13.1/8.13.1) with ESMTP id mB1EECh0023246; Mon, 1 Dec 2008 09:14:19 -0500 Received: from host0.dyn.jankratochvil.net (localhost [127.0.0.1]) by host0.dyn.jankratochvil.net (8.14.3/8.14.2) with ESMTP id mB1EEBoK010755; Mon, 1 Dec 2008 15:14:12 +0100 Received: (from jkratoch@localhost) by host0.dyn.jankratochvil.net (8.14.3/8.14.2/Submit) id mB1EE81m010749; Mon, 1 Dec 2008 15:14:08 +0100 Date: Mon, 01 Dec 2008 14:15:00 -0000 From: Jan Kratochvil To: Gary Funck Cc: Vinay Sridhar , gdb-patches@sources.redhat.com, Daniel Jacobowitz , luisgpm@linux.vnet.ibm.com, uweigand@de.ibm.com Subject: Re: [patch] Accessing tls variables across files causes a bug Message-ID: <20081201141408.GA10447@host0.dyn.jankratochvil.net> References: <1221019993.4923.3.camel@localhost.localdomain> <20081126172332.GE19317@intrepid.com> <20081126204316.GA11366@host0.dyn.jankratochvil.net> MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="/9DWx/yDrRhgMJTb" Content-Disposition: inline In-Reply-To: <20081126204316.GA11366@host0.dyn.jankratochvil.net> User-Agent: Mutt/1.5.18 (2008-05-17) X-IsSubscribed: yes Mailing-List: contact gdb-patches-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: gdb-patches-owner@sourceware.org X-SW-Source: 2008-12/txt/msg00003.txt.bz2 --/9DWx/yDrRhgMJTb Content-Type: text/plain; charset=us-ascii Content-Disposition: inline Content-length: 406 Hi, (re)patched. GDB misses getters to do it universally. Testsuite addition, no regressions (x86_64-unknown-linux-gnu): +PASS: gdb.threads/tls.exp: p a_thread_local +PASS: gdb.threads/tls.exp: p file2_thread_local +PASS: gdb.threads/tls.exp: info address file2_thread_local +PASS: gdb.threads/tls.exp: p a_thread_local second time +PASS: gdb.threads/tls.exp: info address a_thread_local Regards, Jan --/9DWx/yDrRhgMJTb Content-Type: text/plain; charset=us-ascii Content-Disposition: inline; filename="gdb-extern-tls.patch" Content-length: 6500 2008-11-29 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 ): New variable `obj_section'. Handle SEC_THREAD_LOCAL variables. 2008-11-29 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. --- gdb/findvar.c 5 Sep 2008 11:37:17 -0000 1.118 +++ gdb/findvar.c 30 Nov 2008 21:10:02 -0000 @@ -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, stru 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,12 @@ read_var_value (struct symbol *var, stru SYMBOL_OBJ_SECTION (msym)); else addr = SYMBOL_VALUE_ADDRESS (msym); + + /* SYMBOL_VALUE_ADDRESS should return the translated address. */ + 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; --- gdb/printcmd.c 20 Nov 2008 16:13:11 -0000 1.138 +++ gdb/printcmd.c 30 Nov 2008 21:10:06 -0000 @@ -1234,6 +1234,7 @@ address_info (char *exp, int from_tty) case LOC_UNRESOLVED: { struct minimal_symbol *msym; + struct obj_section *obj_section; msym = lookup_minimal_symbol (SYMBOL_LINKAGE_NAME (sym), NULL, NULL); if (msym == NULL) @@ -1241,8 +1242,19 @@ 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); + + /* SYMBOL_VALUE_ADDRESS should return the translated address. */ + if (section + && (section->the_bfd_section->flags & SEC_THREAD_LOCAL) != 0) + { + printf_filtered (_("a thread-local variable at offset %s " + "at final address "), paddr_nz (load_addr)); + load_addr = target_translate_tls_address (section->objfile, + load_addr); + } + else + printf_filtered (_("static storage at address ")); fputs_filtered (paddress (load_addr), gdb_stdout); if (section_is_overlay (section)) { --- gdb/testsuite/gdb.threads/tls.c 29 Jul 2003 21:51:25 -0000 1.2 +++ gdb/testsuite/gdb.threads/tls.c 30 Nov 2008 21:10:09 -0000 @@ -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; --- gdb/testsuite/gdb.threads/tls.exp 6 Aug 2008 12:52:08 -0000 1.9 +++ gdb/testsuite/gdb.threads/tls.exp 30 Nov 2008 21:10:09 -0000 @@ -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 may get two answers: +# LOC_UNRESOLVED: Symbol "file2_thread_local" is a thread-local variable at offset 8 at final address 0x7ffff7fdb94c. +# LOC_COMPUTED: 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 --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ gdb/testsuite/gdb.threads/tls2.c 30 Nov 2008 21:10:09 -0000 @@ -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; +} --/9DWx/yDrRhgMJTb--