From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 80187 invoked by alias); 19 Mar 2018 19:36:57 -0000 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 Received: (qmail 79601 invoked by uid 89); 19 Mar 2018 19:36:56 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-25.4 required=5.0 tests=BAYES_00,GIT_PATCH_0,GIT_PATCH_1,GIT_PATCH_2,GIT_PATCH_3,KAM_STOCKGEN,T_FILL_THIS_FORM_SHORT,T_RP_MATCHES_RCVD autolearn=ham version=3.3.2 spammy= X-HELO: aserp2130.oracle.com Received: from aserp2130.oracle.com (HELO aserp2130.oracle.com) (141.146.126.79) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with ESMTP; Mon, 19 Mar 2018 19:36:55 +0000 Received: from pps.filterd (aserp2130.oracle.com [127.0.0.1]) by aserp2130.oracle.com (8.16.0.22/8.16.0.22) with SMTP id w2JJaiRr045835; Mon, 19 Mar 2018 19:36:50 GMT Received: from userv0022.oracle.com (userv0022.oracle.com [156.151.31.74]) by aserp2130.oracle.com with ESMTP id 2gtkh2800g-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Mon, 19 Mar 2018 19:36:50 +0000 Received: from aserv0122.oracle.com (aserv0122.oracle.com [141.146.126.236]) by userv0022.oracle.com (8.14.4/8.14.4) with ESMTP id w2JJanMe029460 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Mon, 19 Mar 2018 19:36:49 GMT Received: from abhmp0008.oracle.com (abhmp0008.oracle.com [141.146.116.14]) by aserv0122.oracle.com (8.14.4/8.14.4) with ESMTP id w2JJam7f010564; Mon, 19 Mar 2018 19:36:49 GMT Received: from [10.132.96.98] (/10.132.96.98) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Mon, 19 Mar 2018 12:36:48 -0700 Subject: Re: [PATCH PR gdb/18071] TLS variables can't be resolved on aarch64-linux-gnu To: Simon Marchi , gdb-patches@sourceware.org Cc: Yao Qi References: <1509669516-47946-1-git-send-email-weimin.pan@oracle.com> <402e4a8c-eaf9-a31e-9925-3125f8d149f9@simark.ca> From: Weimin Pan Message-ID: <6c9fb8cc-eb2a-86c3-9e34-fac7c97f6b2f@oracle.com> Date: Mon, 19 Mar 2018 19:36:00 -0000 User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:52.0) Gecko/20100101 Thunderbird/52.6.0 MIME-Version: 1.0 In-Reply-To: <402e4a8c-eaf9-a31e-9925-3125f8d149f9@simark.ca> Content-Type: text/plain; charset=utf-8; format=flowed Content-Transfer-Encoding: 8bit X-Proofpoint-Virus-Version: vendor=nai engine=5900 definitions=8836 signatures=668693 X-Proofpoint-Spam-Details: rule=notspam policy=default score=0 suspectscore=0 malwarescore=0 phishscore=0 bulkscore=0 spamscore=0 mlxscore=0 mlxlogscore=999 adultscore=0 classifier=spam adjust=0 reason=mlx scancount=1 engine=8.0.1-1711220000 definitions=main-1803190149 X-SW-Source: 2018-03/txt/msg00362.txt.bz2 On 3/17/2018 9:52 AM, Simon Marchi wrote: > On 2017-11-02 08:38 PM, Weimin Pan wrote: >> Running the test case with upstream gdb shows two failures: >> >> (1) Receiving different error messages when printing TLS variable before >> program runs - because the ARM compiler does not emit dwarf attribute >> DW_AT_location for TLS, the result is expected and the baseline may >> need to be changed for aarch64. >> >> (2) Using "info address" command on C++ static TLS object resulted in >> "symbol unresolved" error - below is a snippet from the test case: >> >> class K { >> public: >> static __thread int another_thread_local; >> }; >> >> __thread int K::another_thread_local; >> >> (gdb) info address K::another_thread_local >> Symbol "K::another_thread_local" is unresolved. >> >> This patch contains fix for (2). >> >> Function info_address_command() handles the "info address" command and >> calls lookup_minimal_symbol_and_objfile() to find sym's symbol entry in >> mininal symbol table if SYMBOL_COMPUTED_OPS (sym) is false. Problem is >> that function lookup_minimal_symbol_and_objfile() only looked up an >> objfile's minsym ordinary hash table, not its demangled hash table, which >> was the reason why the C++ name was not found. >> >> The fix is to call lookup_minimal_symbol(), which already looks up entries >> in both minsym's hash tables, to find names when traversing the object file >> list in lookup_minimal_symbol_and_objfile(). >> >> Tested in both aarch64-linux-gnu and amd64-linux-gnu. No regressions. > Hi Weimin, > > I would be ok with making lookup_minimal_symbol_and_objfile look through demangled > names as well, I don't see a need for it to only search through linkage names. > I don't think it should break any user of that function, since it would mean that > there is a clash between a mangled name and a demangled name, I don't think this is > likely. Hi Simon, Yes, you're right that a name clash is unlikely to happen. I think you have a better suggestion, at the end of your email, to leave this function alone. But it'd be good to update the doc for lookup_minimal_symbol_and_objfile(), where the term "linkage name" should be replaced with either "ordinary" or "demangled" because it seems to me that "linkage name" == "mangled name". > The doc of lookup_minimal_symbol_and_objfile in minsyms.h should be updated. > > So this now works: > > (gdb) info address K::another_thread_local2 > Symbol "K::another_thread_local2" is a thread-local variable at offset 0x4 in the thread-local storage for `/home/simark/build/binutils-gdb/gdb/test'. > > But printing the variable doesn't: > > (gdb) p K::another_thread_local2 > Cannot find thread-local storage for process 8959, executable file /home/simark/build/binutils-gdb/gdb/test: > Cannot find thread-local variables on this target > > Is this also what you see? If the scope of this patch is to only fix "info address", > could you change the title of the patch to reflect it? Otherwise it sounds like > it fixes actually accessing/printing the variable as well. Yes, printing of a TLS fails on all platforms, not just on aarch64. How about changing the title to:    [PATCH PR gdb/18071] aarch64: "info" command can't resolve TLS variables >> gdb/ChangeLog | 5 +++++ >> gdb/minsyms.c | 17 +++-------------- >> 2 files changed, 8 insertions(+), 14 deletions(-) >> >> diff --git a/gdb/ChangeLog b/gdb/ChangeLog >> index 4b292e0..2f630bc 100644 >> --- a/gdb/ChangeLog >> +++ b/gdb/ChangeLog >> @@ -1,3 +1,8 @@ >> +2017-11-01 Weimin Pan >> + >> + * minsyms.c (lookup_minimal_symbol_and_objfile): Use >> + lookup_minimal_symbol() to find symbol entry. >> + >> 2017-10-27 Keith Seitz >> >> * breakpoint.c (print_breakpoint_location): Use the symbol saved >> diff --git a/gdb/minsyms.c b/gdb/minsyms.c >> index 37edbd8..4edd8b1 100644 >> --- a/gdb/minsyms.c >> +++ b/gdb/minsyms.c >> @@ -881,23 +881,12 @@ lookup_minimal_symbol_and_objfile (const char *name) >> { >> struct bound_minimal_symbol result; >> struct objfile *objfile; >> - unsigned int hash = msymbol_hash (name) % MINIMAL_SYMBOL_HASH_SIZE; >> >> ALL_OBJFILES (objfile) >> { >> - struct minimal_symbol *msym; >> - >> - for (msym = objfile->per_bfd->msymbol_hash[hash]; >> - msym != NULL; >> - msym = msym->hash_next) >> - { >> - if (strcmp (MSYMBOL_LINKAGE_NAME (msym), name) == 0) >> - { >> - result.minsym = msym; >> - result.objfile = objfile; >> - return result; >> - } >> - } >> + result = lookup_minimal_symbol (name, NULL, objfile); >> + if (result.minsym != NULL) >> + return result; >> } > Is this code equivalent to calling lookup_minimal_symbol (name, NULL, NULL) ? If > so, there's already lookup_bound_minimal_symbol that does the same, so maybe we > can just drop lookup_minimal_symbol_and_objfile and use lookup_bound_minimal_symbol. Yes, it turns out lookup_minimal_symbol_and_objfile(name) is equivalent to calling lookup_minimal_symbol (name, NULL, NULL). We can replace the call in info_address_command() with either lookup_minimal_symbol (name, NULL, NULL) or lookup_bound_minimal_symbol(name). Calling either one looks like a better fix. > > We could also just have lookup_minimal_symbol with parameters that default to nullptr. > It is not clear at all to have lookup_bound_minimal_symbol and lookup_minimal_symbol > that both return a bound_minimal_symbol, that's quite misleading. I don't know the rational behind having these two functions which get called in quite a few places. Yes, having default arguments for lookup_minimal_symbol() will be another option. Thanks very much for your comments. Weimin > > Simon