From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 45286 invoked by alias); 1 Feb 2017 09:12:37 -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 45275 invoked by uid 89); 1 Feb 2017 09:12:37 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=0.7 required=5.0 tests=AWL,BAYES_40,KAM_LAZY_DOMAIN_SECURITY,RP_MATCHES_RCVD autolearn=no version=3.3.2 spammy=1.8.3.1, 1831, unexplained, ftrace_debug X-HELO: mga14.intel.com Received: from mga14.intel.com (HELO mga14.intel.com) (192.55.52.115) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with ESMTP; Wed, 01 Feb 2017 09:12:26 +0000 Received: from orsmga005.jf.intel.com ([10.7.209.41]) by fmsmga103.fm.intel.com with ESMTP; 01 Feb 2017 01:12:25 -0800 X-ExtLoop1: 1 Received: from irvmail001.ir.intel.com ([163.33.26.43]) by orsmga005.jf.intel.com with ESMTP; 01 Feb 2017 01:12:24 -0800 Received: from ulvlx001.iul.intel.com (ulvlx001.iul.intel.com [172.28.207.17]) by irvmail001.ir.intel.com (8.14.3/8.13.6/MailSET/Hub) with ESMTP id v119CNXm023067; Wed, 1 Feb 2017 09:12:24 GMT Received: from ulvlx001.iul.intel.com (localhost [127.0.0.1]) by ulvlx001.iul.intel.com with ESMTP id v119CN2n029686; Wed, 1 Feb 2017 10:12:23 +0100 Received: (from mmetzger@localhost) by ulvlx001.iul.intel.com with œ id v119CNHd029682; Wed, 1 Feb 2017 10:12:23 +0100 From: Markus Metzger To: gdb-patches@sourceware.org Subject: [PATCH] btrace: preserve call stack on function switch Date: Wed, 01 Feb 2017 09:12:00 -0000 Message-Id: <1485940343-29405-1-git-send-email-markus.t.metzger@intel.com> X-IsSubscribed: yes X-SW-Source: 2017-02/txt/msg00010.txt.bz2 On 64-bit FC25, the _dl_runtime_resolve function uses a conditional branch to 'call' a particular variant optimized for that system: (gdb) disas _dl_runtime_resolve_avx_opt Dump of assembler code for function _dl_runtime_resolve_avx_opt: 0x00007ffff7deeb60 <+0>: push %rax 0x00007ffff7deeb61 <+1>: push %rcx 0x00007ffff7deeb62 <+2>: push %rdx 0x00007ffff7deeb63 <+3>: mov $0x1,%ecx 0x00007ffff7deeb68 <+8>: xgetbv 0x00007ffff7deeb6b <+11>: mov %eax,%r11d 0x00007ffff7deeb6e <+14>: pop %rdx 0x00007ffff7deeb6f <+15>: pop %rcx 0x00007ffff7deeb70 <+16>: pop %rax 0x00007ffff7deeb71 <+17>: and $0x4,%r11d 0x00007ffff7deeb75 <+21>: bnd je 0x7ffff7def4a0 <_dl_runtime_resolve_sse_vex> End of assembler dump. When computing the function-level trace, btrace treats this as a switch from _dl_runtime_resolve_avx_opt to _dl_runtime_resolve_sse_vex. We know that we switched functions but we can't really say in which caller/callee relationship those two functions are. In addition to preserving the indentaion level, also preserve the caller information. This is a heuristic since we don't really know. But at least in this case, this seems to be the right thing to do. This fixes a fail in gdb.btrace/rn-dl-bind.exp on 64-bit FC25. 2017-02-01 Markus Metzger * btrace.c (ftrace_new_switch): Preserve up link and flags. --- gdb/btrace.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/gdb/btrace.c b/gdb/btrace.c index 6d621e4..ddf6692 100644 --- a/gdb/btrace.c +++ b/gdb/btrace.c @@ -448,9 +448,11 @@ ftrace_new_switch (struct btrace_function *prev, { struct btrace_function *bfun; - /* This is an unexplained function switch. The call stack will likely - be wrong at this point. */ + /* This is an unexplained function switch. We can't really be sure about the + call stack, yet the best I can think of right now is to preserve it. */ bfun = ftrace_new_function (prev, mfun, fun); + bfun->up = prev->up; + bfun->flags = prev->flags; ftrace_debug (bfun, "new switch"); -- 1.8.3.1