Received: by 2002:a05:6a10:8c0a:0:0:0:0 with SMTP id go10csp2121160pxb; Thu, 11 Feb 2021 05:05:24 -0800 (PST) X-Google-Smtp-Source: ABdhPJx/ncPw0keytzZl13riN0WLDBWczlYWCrO+3q7N/26FgrA2cEpXhzuQOxQkJWPXV0M60Y0q X-Received: by 2002:a17:906:17da:: with SMTP id u26mr8497675eje.281.1613048724646; Thu, 11 Feb 2021 05:05:24 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1613048724; cv=none; d=google.com; s=arc-20160816; b=euR2vnsSBhHtNw+sYycvYgK6j1vpB7NGFiMryh6cSiBYCuVvIKeYtVclYKoOf7kAaY NBGT7bd4hLJcjdJPbR25KD/q3gLksR26nDqZU6HLbZOfcmZb7cQvw3ZPtJEiVnpNkgyF B4QXxuRoUHMwnJZNeof2PbmP6brTWv3ztBr5C+CChdmvaNMD626wercwtgQKHrGYe+A4 /cbzpueACnEPvyh6W3SgZpiutISaLS3+PRmODPE2npOoFHhFCFZ8qPkB3s6j9ZM5YN5c CMECn8mKra9OB6aHrn6z+87+lmC6j9j/XSybUskQicv+eVDtufj5uYSguaIQ4JyXGvCM ljZQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:content-transfer-encoding:content-language :mime-version:user-agent:date:message-id:cc:to:subject:from; bh=cGuFmatRFj/NzVCaLfhP9PuVKkGiYJjIniajNmykmsE=; b=fdvHXG1fQoGPshpM8+S5wqRhEzkiJTzl4X+QtgLbZZ3CSmWZslkdPPXxZFGbnXmEV7 rAthouVmc2Q6Vvl66XzfO4pV9U4q6Rev6wNENOmojPkV5JIfF/h2HJSdcW4ILubMSWm7 pCVcQQ/rN/VT+HtzbRAWfuxYF26F0EQPAgB0giN1X4trwBOMYHytSg3kevavwKLOGdm9 Wyn0U4wC/vgzi6ZefPHgoSW8dcAScPeYYyGKjaQaiUDkHqQADcT/Zzw7I5ElG+muYWCn b9K1QjKWFmybHB9JZiZBMI79g3tK935G9yW1bTp4cwKtiI7OLWmlrsXYf824J2rxel7l W+eQ== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [23.128.96.18]) by mx.google.com with ESMTP id n2si4463991ejl.444.2021.02.11.05.04.48; Thu, 11 Feb 2021 05:05:24 -0800 (PST) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) client-ip=23.128.96.18; Authentication-Results: mx.google.com; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S231196AbhBKNDa (ORCPT + 99 others); Thu, 11 Feb 2021 08:03:30 -0500 Received: from mx2.suse.de ([195.135.220.15]:36424 "EHLO mx2.suse.de" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S230482AbhBKMij (ORCPT ); Thu, 11 Feb 2021 07:38:39 -0500 X-Virus-Scanned: by amavisd-new at test-mx.suse.de Received: from relay2.suse.de (unknown [195.135.221.27]) by mx2.suse.de (Postfix) with ESMTP id 78231AD29; Thu, 11 Feb 2021 12:37:56 +0000 (UTC) From: =?UTF-8?Q?Martin_Li=c5=a1ka?= Subject: [PATCH] Fix jump parsing for C++ code. To: linux-kernel@vger.kernel.org Cc: Jiri Slaby , linux-perf-users@vger.kernel.org Message-ID: <13e1a405-edf9-e4c2-4327-a9b454353730@suse.cz> Date: Thu, 11 Feb 2021 13:37:55 +0100 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:78.0) Gecko/20100101 Thunderbird/78.7.0 MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8; format=flowed Content-Language: en-US Content-Transfer-Encoding: 8bit Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Considering the following testcase: int foo(int a, int b) { for (unsigned i = 0; i < 1000000000; i++) a += b; return a; } int main() { foo (3, 4); return 0; } perf annotate displays: 86.52 │40055e: → ja 40056c 13.37 │400560: mov -0x18(%rbp),%eax │400563: add %eax,-0x14(%rbp) │400566: addl $0x1,-0x4(%rbp) 0.11 │40056a: → jmp 400557 │40056c: mov -0x14(%rbp),%eax │40056f: pop %rbp and the 'ja 40056c' does not link to the location in the function. It's caused by fact that comma is wrongly parsed, it's part of function signature. With my patch I see: 86.52 │ ┌──ja 26 13.37 │ │ mov -0x18(%rbp),%eax │ │ add %eax,-0x14(%rbp) │ │ addl $0x1,-0x4(%rbp) 0.11 │ │↑ jmp 11 │26:└─→mov -0x14(%rbp),%eax and 'o' output prints: 86.52 │4005┌── ↓ ja 40056c 13.37 │4005│0: mov -0x18(%rbp),%eax │4005│3: add %eax,-0x14(%rbp) │4005│6: addl $0x1,-0x4(%rbp) 0.11 │4005│a: ↑ jmp 400557 │4005└─→ mov -0x14(%rbp),%eax On the contrary, compiling the very same file with gcc -x c, the parsing is fine because function arguments are not displyed: jmp 400543 Signed-off-by: Martin Liška --- tools/perf/util/annotate.c | 6 ++++++ tools/perf/util/annotate.h | 1 + 2 files changed, 7 insertions(+) diff --git a/tools/perf/util/annotate.c b/tools/perf/util/annotate.c index ce8c07bc8c56..e3eae646be3e 100644 --- a/tools/perf/util/annotate.c +++ b/tools/perf/util/annotate.c @@ -321,11 +321,16 @@ bool ins__is_call(const struct ins *ins) /* * Prevents from matching commas in the comment section, e.g.: * ffff200008446e70: b.cs ffff2000084470f4 // b.hs, b.nlast + * + * and skip comma as part of function arguments, e.g.: + * 1d8b4ac */ static inline const char *validate_comma(const char *c, struct ins_operands *ops) { if (ops->raw_comment && c > ops->raw_comment) return NULL; + else if (ops->raw_func_start && c > ops->raw_func_start) + return NULL; return c; } @@ -341,6 +346,7 @@ static int jump__parse(struct arch *arch, struct ins_operands *ops, struct map_s u64 start, end; ops->raw_comment = strchr(ops->raw, arch->objdump.comment_char); + ops->raw_func_start = strchr(ops->raw, '<'); c = validate_comma(c, ops); /* diff --git a/tools/perf/util/annotate.h b/tools/perf/util/annotate.h index 0a0cd4f32175..096cdaf21b01 100644 --- a/tools/perf/util/annotate.h +++ b/tools/perf/util/annotate.h @@ -32,6 +32,7 @@ struct ins { struct ins_operands { char *raw; char *raw_comment; + char *raw_func_start; struct { char *raw; char *name; -- 2.30.0