From patchwork Tue Nov 1 13:14:10 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Masami Hiramatsu (Google)" X-Patchwork-Id: 13659 Return-Path: Delivered-To: ouuuleilei@gmail.com Received: by 2002:a5d:6687:0:0:0:0:0 with SMTP id l7csp2961763wru; Tue, 1 Nov 2022 06:22:02 -0700 (PDT) X-Google-Smtp-Source: AMsMyM4YRkb3NmmUsgLk7V+Sly27x3coIHEoB8unlI/l4osqVpy0MF+WmMrS6lYQCIQp70VWRPhN X-Received: by 2002:a65:480c:0:b0:458:88cd:f48 with SMTP id h12-20020a65480c000000b0045888cd0f48mr16466497pgs.529.1667308921960; Tue, 01 Nov 2022 06:22:01 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1667308921; cv=none; d=google.com; s=arc-20160816; b=Ig9jLOS8OHLhvlfUk3Hii3yO8JhuLuIztG3Q85dOAmytNF4DNTyb/otTxckt3htESf h3LA5qZt0Ri/paSnCqU00zTJykEH+J+ZGANZskeVZZU6LIo+IpqqmZOAJzil3v4pbLTg NeGHES2mff42bEYhMGQ4Pd4Pxj489ql5Cvg1eArWjJO9CifTOo/OZSQvlBb2+EvEUd6a NyM/6hFlRCCbj/coQbTqxUDd3cHRUSR7ptlXRrQsx62qtewFFw7sDc5YYGnuVOrcZs4T P5H3amB4j+XxkrRDv2ehGwdNeqONOnyUv1M1KQ5q2oVLtx5WlSzXEVCNeZcj6TSpH/2V SjGA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:content-transfer-encoding:mime-version :user-agent:references:in-reply-to:message-id:date:subject:cc:to :from:dkim-signature; bh=SKLWgq7Z8Iivsuz+F5GQUruEZ6afH/uiIoygS9vwhNs=; b=06GKVQC28qSgTsAMtUQxXhgmpxFd+krB3lbfA8JrqA4RjKMUNxyXeGf0SG2W9wzUl6 YQeMavxfHovyxKIF1XYYHD4RPm7eUBLd4m1Po3KG5piZcUjHCQ1Csxcfpw5GyegQzxYi oXLREylNGuZB2ZqAeg7q5Yd2CBRQkQcomRtNpqEiPoJ+tEtvICJlGe+VBZwsY/fAF1cK orP/H5N4Dr1SzvAP0tg2jGsidOFnEhu/lYvR5hI8I+pg4vs0fbzg27jhEjvL2ZLxWtkJ 3sFowF3t3sHrf/Rs+kNROcj8llNWN0tJ90g06Zoh6Yl/9nSYwE+T7sWVDZgpH30KiG+u uIBw== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@kernel.org header.s=k20201202 header.b=DcDnx4Uz; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=kernel.org Received: from out1.vger.email (out1.vger.email. [2620:137:e000::1:20]) by mx.google.com with ESMTP id g190-20020a636bc7000000b0042b6e87d126si12612947pgc.198.2022.11.01.06.21.38; Tue, 01 Nov 2022 06:22:01 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) client-ip=2620:137:e000::1:20; Authentication-Results: mx.google.com; dkim=pass header.i=@kernel.org header.s=k20201202 header.b=DcDnx4Uz; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S230088AbiKANOV (ORCPT + 99 others); Tue, 1 Nov 2022 09:14:21 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:47820 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S230231AbiKANOQ (ORCPT ); Tue, 1 Nov 2022 09:14:16 -0400 Received: from dfw.source.kernel.org (dfw.source.kernel.org [IPv6:2604:1380:4641:c500::1]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 58C0CF01F; Tue, 1 Nov 2022 06:14:15 -0700 (PDT) Received: from smtp.kernel.org (relay.kernel.org [52.25.139.140]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by dfw.source.kernel.org (Postfix) with ESMTPS id EBCFB60B08; Tue, 1 Nov 2022 13:14:14 +0000 (UTC) Received: by smtp.kernel.org (Postfix) with ESMTPSA id 99438C433C1; Tue, 1 Nov 2022 13:14:12 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1667308454; bh=U46a3SLwlMwx9pAdq41LegIEMThS9pVOwjO6c9lNEJ8=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=DcDnx4UzhU51Ju6kBzT4+f135a580ktM1D4JbgpMvFysPOrvT6sIXgqmHjleP5A3m Zx5M7f7aIbzKByO8vGJDmjCuXlkVKcuWoFf6A+ue8CSG37BktLSp78SZjzXghPZfsE od2qBaNQ9YMKXZeRUEa1303Ojdo1Z4qkrUZI/nL//ZsxmtzdzCHOdGCdjU7qvRa4Z8 AC18VOAvi6IvUKkxXeItoEOJ/qwSBn2fbP4Vwlf+7lzEYaGCsB5DQgg6OVB7AJAyry mReGvrLc2C6MEhCwDkPHa/zb5EpYis3+dIQR71hbKBwBImDz0xoEjKIBG/h2RrVGb6 WJFJ7nfFGaJ5g== From: "Masami Hiramatsu (Google)" To: Arnaldo Carvalho de Melo Cc: Peter Zijlstra , Ingo Molnar , Mark Rutland , Alexander Shishkin , Jiri Olsa , Namhyung Kim , linux-perf-users@vger.kernel.org, linux-kernel@vger.kernel.org, Masami Hiramatsu , Steven Rostedt Subject: [PATCH 1/3] tools/perf: Fix to avoid crashing with a broken DWARF file Date: Tue, 1 Nov 2022 22:14:10 +0900 Message-Id: <166730845060.2095228.2293443097705303723.stgit@devnote3> X-Mailer: git-send-email 2.38.1.273.g43a17bfeac-goog In-Reply-To: <166730844138.2095228.4225918836201778608.stgit@devnote3> References: <166730844138.2095228.4225918836201778608.stgit@devnote3> User-Agent: StGit/0.19 MIME-Version: 1.0 X-Spam-Status: No, score=-8.2 required=5.0 tests=BAYES_00,DKIMWL_WL_HIGH, DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF,RCVD_IN_DNSWL_HI, SPF_HELO_NONE,SPF_PASS autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on lindbergh.monkeyblade.net Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org X-getmail-retrieved-from-mailbox: =?utf-8?q?INBOX?= X-GMAIL-THRID: =?utf-8?q?1748300120089371593?= X-GMAIL-MSGID: =?utf-8?q?1748300120089371593?= From: Masami Hiramatsu (Google) Since Clang generates a wrong DWARF5 format, dwarf_decl_file() can return NULL. In that case the perf probe will crash by SIGSEGV. This adds checks of the return value of dwarf_decl_file() to avoid such SEGV on a broken DWARF file. Without this, perf probe crashes like below; $ ./perf probe -k $BIN_PATH/vmlinux -s $SRC_PATH -L vfs_read:10 Segmentation fault With this, perf probe just warns it; $ ./perf probe -k $BIN_PATH/vmlinux -s $SRC_PATH -L vfs_read:10 Debuginfo analysis failed. Error: Failed to show lines. Signed-off-by: Masami Hiramatsu (Google) --- tools/perf/util/dwarf-aux.c | 7 ++++++- tools/perf/util/probe-finder.c | 29 +++++++++++++++++++++-------- 2 files changed, 27 insertions(+), 9 deletions(-) diff --git a/tools/perf/util/dwarf-aux.c b/tools/perf/util/dwarf-aux.c index 609ca1671501..406b7bdc851a 100644 --- a/tools/perf/util/dwarf-aux.c +++ b/tools/perf/util/dwarf-aux.c @@ -137,7 +137,7 @@ int cu_find_lineinfo(Dwarf_Die *cu_die, Dwarf_Addr addr, } out: - return *lineno ?: -ENOENT; + return (*lineno && *fname) ? *lineno : -ENOENT; } static int __die_find_inline_cb(Dwarf_Die *die_mem, void *data); @@ -874,6 +874,11 @@ int die_walk_lines(Dwarf_Die *rt_die, line_walk_callback_t callback, void *data) cu_die = dwarf_diecu(rt_die, &die_mem, NULL, NULL); dwarf_decl_line(rt_die, &decl); decf = dwarf_decl_file(rt_die); + if (!decf) { + pr_debug2("Failed to get the declared file name of %s\n", + dwarf_diename(rt_die)); + return -EINVAL; + } } else cu_die = rt_die; if (!cu_die) { diff --git a/tools/perf/util/probe-finder.c b/tools/perf/util/probe-finder.c index 50d861a80f57..1aa8fcc41c76 100644 --- a/tools/perf/util/probe-finder.c +++ b/tools/perf/util/probe-finder.c @@ -1063,6 +1063,7 @@ static int probe_point_search_cb(Dwarf_Die *sp_die, void *data) struct dwarf_callback_param *param = data; struct probe_finder *pf = param->data; struct perf_probe_point *pp = &pf->pev->point; + const char *fname; /* Check tag and diename */ if (!die_is_func_def(sp_die) || @@ -1070,12 +1071,17 @@ static int probe_point_search_cb(Dwarf_Die *sp_die, void *data) return DWARF_CB_OK; /* Check declared file */ - if (pp->file && strtailcmp(pp->file, dwarf_decl_file(sp_die))) + fname = dwarf_decl_file(sp_die); + if (!fname) { + pr_warning("A function DIE doesn't have decl_line. Maybe broken DWARF?\n"); + return DWARF_CB_OK; + } + if (pp->file && fname && strtailcmp(pp->file, fname)) return DWARF_CB_OK; pr_debug("Matched function: %s [%lx]\n", dwarf_diename(sp_die), (unsigned long)dwarf_dieoffset(sp_die)); - pf->fname = dwarf_decl_file(sp_die); + pf->fname = fname; if (pp->line) { /* Function relative line */ dwarf_decl_line(sp_die, &pf->lno); pf->lno += pp->line; @@ -1134,6 +1140,7 @@ struct pubname_callback_param { static int pubname_search_cb(Dwarf *dbg, Dwarf_Global *gl, void *data) { struct pubname_callback_param *param = data; + const char *fname; if (dwarf_offdie(dbg, gl->die_offset, param->sp_die)) { if (dwarf_tag(param->sp_die) != DW_TAG_subprogram) @@ -1143,9 +1150,11 @@ static int pubname_search_cb(Dwarf *dbg, Dwarf_Global *gl, void *data) if (!dwarf_offdie(dbg, gl->cu_offset, param->cu_die)) return DWARF_CB_OK; - if (param->file && - strtailcmp(param->file, dwarf_decl_file(param->sp_die))) - return DWARF_CB_OK; + if (param->file) { + fname = dwarf_decl_file(param->sp_die); + if (!fname || strtailcmp(param->file, fname)) + return DWARF_CB_OK; + } param->found = 1; return DWARF_CB_ABORT; @@ -1779,7 +1788,7 @@ int debuginfo__find_probe_point(struct debuginfo *dbg, u64 addr, } /* Verify the lineno and baseline are in a same file */ tmp = dwarf_decl_file(&spdie); - if (!tmp || strcmp(tmp, fname) != 0) + if (!tmp || (fname && strcmp(tmp, fname) != 0)) lineno = 0; } @@ -1889,10 +1898,14 @@ static int line_range_search_cb(Dwarf_Die *sp_die, void *data) struct dwarf_callback_param *param = data; struct line_finder *lf = param->data; struct line_range *lr = lf->lr; + const char *fname; /* Check declared file */ - if (lr->file && strtailcmp(lr->file, dwarf_decl_file(sp_die))) - return DWARF_CB_OK; + if (lr->file) { + fname = dwarf_decl_file(sp_die); + if (!fname || strtailcmp(lr->file, fname)) + return DWARF_CB_OK; + } if (die_match_name(sp_die, lr->function) && die_is_func_def(sp_die)) { lf->fname = dwarf_decl_file(sp_die); From patchwork Tue Nov 1 13:14:19 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Masami Hiramatsu (Google)" X-Patchwork-Id: 13660 Return-Path: Delivered-To: ouuuleilei@gmail.com Received: by 2002:a5d:6687:0:0:0:0:0 with SMTP id l7csp2962005wru; Tue, 1 Nov 2022 06:22:21 -0700 (PDT) X-Google-Smtp-Source: AMsMyM7/wy51F965rh14le4j4Ce0ERtDJeA7JnwJwrioTV6w0QWyO1u/sMJ2ki0tsXabbu6ALm0y X-Received: by 2002:a63:4651:0:b0:43c:1cb7:5c09 with SMTP id v17-20020a634651000000b0043c1cb75c09mr17677126pgk.259.1667308941159; Tue, 01 Nov 2022 06:22:21 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1667308941; cv=none; d=google.com; s=arc-20160816; b=zvKPM8ioefkamnba4uIBsovG2JcNHbLdXQrDSSAHsqViThwNOqokGGlIxlk6EaiBwc nAHinJ6d8aPh9R1qGhx0QjZCsdKcB/mqpgoUrfZD1Y2TQMjf8qPYsMLoJ4Ipsz73FksV 2Wktt3yKo+b2f1XgStpL4z2MzfSPlGVR6o3EZSyqiTLrLwFC/3XlOl6aDaYuDgx6ltQa NjJt1zQVqNVixDenVMG/Ka8EfHGqKcbNTekG6G17qoZ0UidlBZMDyuzR5Qs0cxGw85bG yimbmQYgJVWg0SIe+H04lgbntIK1+7g1uBPYNX32LRRn1LTtRHwOjLfvfeQGHa6oGVVA 638A== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:content-transfer-encoding:mime-version :user-agent:references:in-reply-to:message-id:date:subject:cc:to :from:dkim-signature; bh=wWcmbp/YCO+j4LyJ9CnX/DhA6yih5L+CytKhaSWmHF8=; b=bC/GXDwgQn3ZsvFHPkFRziUk5ZciR25wACvTx7QYS3MI3HZLREVOfEdAlqN9viM6aM 31ddKvvYLBp96c+kvJU4w7dFgYQh/xx135ob9cfL8+X81G7rPn7pBWVboEmytaxN+qS1 LA3V0Ly2UFdAinSqNmc/PJ4kaQPzHs23AoIIFbKwUSfrUkZu9ffOpkayPXv3Boz56kGB xUjPqFM9G8d5Trm+ehJjUIoX5NToiPt6glF8pZqUPCBr6rZCS+BT34p7AHHily9hWBkT 9Uy/gWN2BvGWFiROC+zCz9RysoQZ5PZ2jOYrMiwwNj50X/3MqQjpt4VGRrFL7DSVyySj 6IoA== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@kernel.org header.s=k20201202 header.b="haNdp/Mo"; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=kernel.org Received: from out1.vger.email (out1.vger.email. [2620:137:e000::1:20]) by mx.google.com with ESMTP id h4-20020a170902f7c400b0017a07fc8d44si12901032plw.248.2022.11.01.06.21.57; Tue, 01 Nov 2022 06:22:21 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) client-ip=2620:137:e000::1:20; Authentication-Results: mx.google.com; dkim=pass header.i=@kernel.org header.s=k20201202 header.b="haNdp/Mo"; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S230350AbiKANOg (ORCPT + 99 others); Tue, 1 Nov 2022 09:14:36 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:48110 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S230376AbiKANOa (ORCPT ); Tue, 1 Nov 2022 09:14:30 -0400 Received: from ams.source.kernel.org (ams.source.kernel.org [IPv6:2604:1380:4601:e00::1]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 403D21B9C3; Tue, 1 Nov 2022 06:14:26 -0700 (PDT) Received: from smtp.kernel.org (relay.kernel.org [52.25.139.140]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ams.source.kernel.org (Postfix) with ESMTPS id DFB1CB81D5F; Tue, 1 Nov 2022 13:14:24 +0000 (UTC) Received: by smtp.kernel.org (Postfix) with ESMTPSA id B79BFC433C1; Tue, 1 Nov 2022 13:14:21 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1667308463; bh=nd0dM0YiGevMBmIw3JCc/91WirhrGmiigVH7OCr9EG8=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=haNdp/Mokinp3DXYASQOQZyi8n+1U33VpAEjOZ92rTuzqfZYCwiVTcVLZdyTLCejb YTqK/8nB1AJHckWRzX80TqVKFy2sAOQ6GqwuuhEpnpLTx8Xpmk8aRQvae7zf2YeHei WLQKbPfpP2LGLgfusExQ+K3suWfNgLl2mz2XhZPEjafQaihz+Ema1ffFnmDd4KGQ3x zmr6O8whgsWGoJKO3jak0g3I/+paPR9IsdORxDi1VTbE9m4OSFJJdNkys19JhQixvE K1TFa29Id1mUkVzJ1tE1C3qT6JhLhCpwSI5bVy+Fz5yiQJQTIp62eiCOV7Z61ThHbi SoSyLz3DezBNA== From: "Masami Hiramatsu (Google)" To: Arnaldo Carvalho de Melo Cc: Peter Zijlstra , Ingo Molnar , Mark Rutland , Alexander Shishkin , Jiri Olsa , Namhyung Kim , linux-perf-users@vger.kernel.org, linux-kernel@vger.kernel.org, Masami Hiramatsu , Steven Rostedt Subject: [PATCH 2/3] tools/perf: Fix to use dwarf_attr_integrate for generic attr accessor Date: Tue, 1 Nov 2022 22:14:19 +0900 Message-Id: <166730845967.2095228.7831422684261433316.stgit@devnote3> X-Mailer: git-send-email 2.38.1.273.g43a17bfeac-goog In-Reply-To: <166730844138.2095228.4225918836201778608.stgit@devnote3> References: <166730844138.2095228.4225918836201778608.stgit@devnote3> User-Agent: StGit/0.19 MIME-Version: 1.0 X-Spam-Status: No, score=-8.2 required=5.0 tests=BAYES_00,DKIMWL_WL_HIGH, DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF,RCVD_IN_DNSWL_HI, SPF_HELO_NONE,SPF_PASS autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on lindbergh.monkeyblade.net Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org X-getmail-retrieved-from-mailbox: =?utf-8?q?INBOX?= X-GMAIL-THRID: =?utf-8?q?1748300140147432374?= X-GMAIL-MSGID: =?utf-8?q?1748300140147432374?= From: Masami Hiramatsu (Google) Use dwarf_attr_integrate() instead of dwarf_attr() for generic attribute acccessor functions, so that it can find the specified attribute from abstact origin DIE etc. Signed-off-by: Masami Hiramatsu (Google) --- tools/perf/util/dwarf-aux.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tools/perf/util/dwarf-aux.c b/tools/perf/util/dwarf-aux.c index 406b7bdc851a..216fc3d959e8 100644 --- a/tools/perf/util/dwarf-aux.c +++ b/tools/perf/util/dwarf-aux.c @@ -308,7 +308,7 @@ static int die_get_attr_udata(Dwarf_Die *tp_die, unsigned int attr_name, { Dwarf_Attribute attr; - if (dwarf_attr(tp_die, attr_name, &attr) == NULL || + if (dwarf_attr_integrate(tp_die, attr_name, &attr) == NULL || dwarf_formudata(&attr, result) != 0) return -ENOENT; @@ -321,7 +321,7 @@ static int die_get_attr_sdata(Dwarf_Die *tp_die, unsigned int attr_name, { Dwarf_Attribute attr; - if (dwarf_attr(tp_die, attr_name, &attr) == NULL || + if (dwarf_attr_integrate(tp_die, attr_name, &attr) == NULL || dwarf_formsdata(&attr, result) != 0) return -ENOENT; From patchwork Tue Nov 1 13:14:28 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Masami Hiramatsu (Google)" X-Patchwork-Id: 13662 Return-Path: Delivered-To: ouuuleilei@gmail.com Received: by 2002:a5d:6687:0:0:0:0:0 with SMTP id l7csp2962221wru; Tue, 1 Nov 2022 06:22:40 -0700 (PDT) X-Google-Smtp-Source: AMsMyM4+/Kzjl5pZS86HLEvl/kNWr0iyTMn8dlS1tz8nKDuz2+uChpnuvwf2XrCUeeJwVt3jzZ2V X-Received: by 2002:a17:90a:4923:b0:213:79bf:8dc9 with SMTP id c32-20020a17090a492300b0021379bf8dc9mr29084536pjh.86.1667308960367; Tue, 01 Nov 2022 06:22:40 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1667308960; cv=none; d=google.com; s=arc-20160816; b=Ge6VD1TD2fLyTQgViTypC2qxdY1kF9m/DXtlpO3RfwqB+V7IKJ/AeWGE8yPSwXXYQW DtW27yDmNdCCNtZth4GJctBoemGT0dGa6UT06zicDy6o6qOAeVD7aUekUWaWTqSeLoZu lZV9e/p7kkbV+v/SNDlV0BZz23RR55XieVPVk0YViDxXCJm+2N6exF+PkBwWJnXlSCw5 htJZcJNmW2h+99qRKydbMKdJAGdl4oAuMdQM9I+8OWDM4VaDSM8i3CWnO5CwDxh1vr9j 38gYE7ne278JQmP+3jFUOZaIZVtgsPeEdCCIHFAXIXLbbRqadKG/nAHqwdeTNae5rjjc p1Vw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:content-transfer-encoding:mime-version :user-agent:references:in-reply-to:message-id:date:subject:cc:to :from:dkim-signature; bh=DuZQHyWLnhuD5Gxd6FDPJd2mBZTZ1Vczq84vQsp5gmg=; b=QbhrqMMgth/cpY09MNrYijrSNFblBc7xoOWocMcUXGD8FMm3ex6+zul4f0ZD4gDx2N Yu4yVS2QDj8BdbziThDfUYasHh68fN+adEZXvwPShoXwbREHdwd3lCrUC2ZCtwOhow19 TVX2ukWzWGo0ACFPhUwY1YZ+rdYnbtCDknMm0VzNpKxLelwTM9ZS4mUHhgIH8olww5B7 3gavW29bOw2SCgQ+KJWg2qxdcoo+CGe8SkWmJHYlRY0J1aKC2MBQG+eAjY0Ibbgaa+of DBZBZuOC+usQ9rj7AkPMG/TOG+jGNDcwNrrL5nAc3N7XxQ6a8UKXUqGTQX556WVAziKk jmrw== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@kernel.org header.s=k20201202 header.b=oMSog7nb; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=kernel.org Received: from out1.vger.email (out1.vger.email. [2620:137:e000::1:20]) by mx.google.com with ESMTP id u25-20020a62ed19000000b0056c8da80411si2681268pfh.43.2022.11.01.06.22.12; Tue, 01 Nov 2022 06:22:40 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) client-ip=2620:137:e000::1:20; Authentication-Results: mx.google.com; dkim=pass header.i=@kernel.org header.s=k20201202 header.b=oMSog7nb; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S230288AbiKANOm (ORCPT + 99 others); Tue, 1 Nov 2022 09:14:42 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:48110 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S230302AbiKANOg (ORCPT ); Tue, 1 Nov 2022 09:14:36 -0400 Received: from ams.source.kernel.org (ams.source.kernel.org [IPv6:2604:1380:4601:e00::1]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 09E0F10B61; Tue, 1 Nov 2022 06:14:35 -0700 (PDT) Received: from smtp.kernel.org (relay.kernel.org [52.25.139.140]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ams.source.kernel.org (Postfix) with ESMTPS id B55F7B81D14; Tue, 1 Nov 2022 13:14:33 +0000 (UTC) Received: by smtp.kernel.org (Postfix) with ESMTPSA id A75E9C433D6; Tue, 1 Nov 2022 13:14:30 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1667308472; bh=9E06RtiJ9dtL9/s+aaGy4XoeL9sxQERb4JUdC/8RtSg=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=oMSog7nbVsPVxYTsto0K8oI2cdVDOOSNnZK5grPh78JH5DOK1F89W4LHr5V4ZqiiD 36D4vGJM9Q4/kbjDuQ+z96uxfuc4YGixjUBG1sC2wRCgLsxTHKrcgjb00/s1D5+cCP Ib+FFM4jqmCbAMFRDe4dXdHUu3sOxFWBzImeU3X+IVsLffm08TOKoaSDt9MoILMZbn OfoVlfpoY/o75BbyBJj6DU5VuaRByuN5iW9ocLoM+D2FdCbdyzYMOoxOmtJbso6bhm q4n0Bc6tWdGGzjkQO2LndNwmi7fmoIaq9XDabfJbWqfVqhEwVNS9YUDoE25Ls5ie+/ ZIJaR7YsX6U/g== From: "Masami Hiramatsu (Google)" To: Arnaldo Carvalho de Melo Cc: Peter Zijlstra , Ingo Molnar , Mark Rutland , Alexander Shishkin , Jiri Olsa , Namhyung Kim , linux-perf-users@vger.kernel.org, linux-kernel@vger.kernel.org, Masami Hiramatsu , Steven Rostedt Subject: [PATCH 3/3] tools/perf: Fix to get declared file name from broken DWARF5 Date: Tue, 1 Nov 2022 22:14:28 +0900 Message-Id: <166730846871.2095228.62126794905076996.stgit@devnote3> X-Mailer: git-send-email 2.38.1.273.g43a17bfeac-goog In-Reply-To: <166730844138.2095228.4225918836201778608.stgit@devnote3> References: <166730844138.2095228.4225918836201778608.stgit@devnote3> User-Agent: StGit/0.19 MIME-Version: 1.0 X-Spam-Status: No, score=-8.2 required=5.0 tests=BAYES_00,DKIMWL_WL_HIGH, DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF,RCVD_IN_DNSWL_HI, SPF_HELO_NONE,SPF_PASS autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on lindbergh.monkeyblade.net Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org X-getmail-retrieved-from-mailbox: =?utf-8?q?INBOX?= X-GMAIL-THRID: =?utf-8?q?1748300160647588813?= X-GMAIL-MSGID: =?utf-8?q?1748300160647588813?= From: Masami Hiramatsu (Google) Fix to get the declared file name even if it uses index 0 in DWARF5 using custom die_get_decl_file() function. Actually, this is out of standard(*), but clang generates such DWARF5 file for the linux kernel. Thus it must be handled. Without this, the perf probe returns an error; $ ./perf probe -k $BIN_PATH/vmlinux -s $SRC_PATH -L vfs_read:10 Debuginfo analysis failed. Error: Failed to show lines. With this, it can handle the case correctly; $ ./perf probe -k $BIN_PATH/vmlinux -s $SRC_PATH -L vfs_read:10 11 ret = rw_verify_area(READ, file, pos, count); 12 if (ret) return ret; (* DWARF5 specification 2.14 says "The value 0 indicates that no source file has been specified.") Signed-off-by: Masami Hiramatsu (Google) --- tools/perf/util/dwarf-aux.c | 47 +++++++++++++++++++++++++++------------- tools/perf/util/dwarf-aux.h | 3 +++ tools/perf/util/probe-finder.c | 14 ++++++------ 3 files changed, 42 insertions(+), 22 deletions(-) diff --git a/tools/perf/util/dwarf-aux.c b/tools/perf/util/dwarf-aux.c index 216fc3d959e8..30b36b525681 100644 --- a/tools/perf/util/dwarf-aux.c +++ b/tools/perf/util/dwarf-aux.c @@ -123,7 +123,7 @@ int cu_find_lineinfo(Dwarf_Die *cu_die, Dwarf_Addr addr, if (die_find_realfunc(cu_die, addr, &die_mem) && die_entrypc(&die_mem, &faddr) == 0 && faddr == addr) { - *fname = dwarf_decl_file(&die_mem); + *fname = die_get_decl_file(&die_mem); dwarf_decl_line(&die_mem, lineno); goto out; } @@ -486,6 +486,19 @@ static int die_get_decl_fileno(Dwarf_Die *pdie) return -ENOENT; } +/* Return the file name by index */ +static const char *die_get_file_name(Dwarf_Die *dw_die, int idx) +{ + Dwarf_Die cu_die; + Dwarf_Files *files; + + if (idx < 0 || !dwarf_diecu(dw_die, &cu_die, NULL, NULL) || + dwarf_getsrcfiles(&cu_die, &files, NULL) != 0) + return NULL; + + return dwarf_filesrc(files, idx, NULL, NULL); +} + /** * die_get_call_file - Get callsite file name of inlined function instance * @in_die: a DIE of an inlined function instance @@ -495,18 +508,22 @@ static int die_get_decl_fileno(Dwarf_Die *pdie) */ const char *die_get_call_file(Dwarf_Die *in_die) { - Dwarf_Die cu_die; - Dwarf_Files *files; - int idx; - - idx = die_get_call_fileno(in_die); - if (idx < 0 || !dwarf_diecu(in_die, &cu_die, NULL, NULL) || - dwarf_getsrcfiles(&cu_die, &files, NULL) != 0) - return NULL; - - return dwarf_filesrc(files, idx, NULL, NULL); + return die_get_file_name(in_die, die_get_call_fileno(in_die)); } +/** + * die_get_decl_file - Find the declared file name of this DIE + * @dw_die: a DIE for something declared. + * + * Get declared file name of @dw_die. + * NOTE: Since some version of clang DWARF5 implementation incorrectly uses + * file index 0 for DW_AT_decl_file, die_get_decl_file() will return NULL for + * such cases. Use this function instead. + */ +const char *die_get_decl_file(Dwarf_Die *dw_die) +{ + return die_get_file_name(dw_die, die_get_decl_fileno(dw_die)); +} /** * die_find_child - Generic DIE search function in DIE tree @@ -790,7 +807,7 @@ static int __die_walk_funclines_cb(Dwarf_Die *in_die, void *data) } if (addr) { - fname = dwarf_decl_file(in_die); + fname = die_get_decl_file(in_die); if (fname && dwarf_decl_line(in_die, &lineno) == 0) { lw->retval = lw->callback(fname, lineno, addr, lw->data); if (lw->retval != 0) @@ -818,7 +835,7 @@ static int __die_walk_funclines(Dwarf_Die *sp_die, bool recursive, int lineno; /* Handle function declaration line */ - fname = dwarf_decl_file(sp_die); + fname = die_get_decl_file(sp_die); if (fname && dwarf_decl_line(sp_die, &lineno) == 0 && die_entrypc(sp_die, &addr) == 0) { lw.retval = callback(fname, lineno, addr, data); @@ -873,7 +890,7 @@ int die_walk_lines(Dwarf_Die *rt_die, line_walk_callback_t callback, void *data) if (dwarf_tag(rt_die) != DW_TAG_compile_unit) { cu_die = dwarf_diecu(rt_die, &die_mem, NULL, NULL); dwarf_decl_line(rt_die, &decl); - decf = dwarf_decl_file(rt_die); + decf = die_get_decl_file(rt_die); if (!decf) { pr_debug2("Failed to get the declared file name of %s\n", dwarf_diename(rt_die)); @@ -928,7 +945,7 @@ int die_walk_lines(Dwarf_Die *rt_die, line_walk_callback_t callback, void *data) dwarf_decl_line(&die_mem, &inl); if (inl != decl || - decf != dwarf_decl_file(&die_mem)) + decf != die_get_decl_file(&die_mem)) continue; } } diff --git a/tools/perf/util/dwarf-aux.h b/tools/perf/util/dwarf-aux.h index 7ee0fa19b5c4..7ec8bc1083bb 100644 --- a/tools/perf/util/dwarf-aux.h +++ b/tools/perf/util/dwarf-aux.h @@ -50,6 +50,9 @@ int die_get_call_lineno(Dwarf_Die *in_die); /* Get callsite file name of inlined function instance */ const char *die_get_call_file(Dwarf_Die *in_die); +/* Get declared file name of a DIE */ +const char *die_get_decl_file(Dwarf_Die *dw_die); + /* Get type die */ Dwarf_Die *die_get_type(Dwarf_Die *vr_die, Dwarf_Die *die_mem); diff --git a/tools/perf/util/probe-finder.c b/tools/perf/util/probe-finder.c index 1aa8fcc41c76..54b49ce85c9f 100644 --- a/tools/perf/util/probe-finder.c +++ b/tools/perf/util/probe-finder.c @@ -763,7 +763,7 @@ static int find_best_scope_cb(Dwarf_Die *fn_die, void *data) /* Skip if declared file name does not match */ if (fsp->file) { - file = dwarf_decl_file(fn_die); + file = die_get_decl_file(fn_die); if (!file || strcmp(fsp->file, file) != 0) return 0; } @@ -1071,7 +1071,7 @@ static int probe_point_search_cb(Dwarf_Die *sp_die, void *data) return DWARF_CB_OK; /* Check declared file */ - fname = dwarf_decl_file(sp_die); + fname = die_get_decl_file(sp_die); if (!fname) { pr_warning("A function DIE doesn't have decl_line. Maybe broken DWARF?\n"); return DWARF_CB_OK; @@ -1151,7 +1151,7 @@ static int pubname_search_cb(Dwarf *dbg, Dwarf_Global *gl, void *data) return DWARF_CB_OK; if (param->file) { - fname = dwarf_decl_file(param->sp_die); + fname = die_get_decl_file(param->sp_die); if (!fname || strtailcmp(param->file, fname)) return DWARF_CB_OK; } @@ -1750,7 +1750,7 @@ int debuginfo__find_probe_point(struct debuginfo *dbg, u64 addr, goto post; } - fname = dwarf_decl_file(&spdie); + fname = die_get_decl_file(&spdie); if (addr == baseaddr) { /* Function entry - Relative line number is 0 */ lineno = baseline; @@ -1787,7 +1787,7 @@ int debuginfo__find_probe_point(struct debuginfo *dbg, u64 addr, } } /* Verify the lineno and baseline are in a same file */ - tmp = dwarf_decl_file(&spdie); + tmp = die_get_decl_file(&spdie); if (!tmp || (fname && strcmp(tmp, fname) != 0)) lineno = 0; } @@ -1902,13 +1902,13 @@ static int line_range_search_cb(Dwarf_Die *sp_die, void *data) /* Check declared file */ if (lr->file) { - fname = dwarf_decl_file(sp_die); + fname = die_get_decl_file(sp_die); if (!fname || strtailcmp(lr->file, fname)) return DWARF_CB_OK; } if (die_match_name(sp_die, lr->function) && die_is_func_def(sp_die)) { - lf->fname = dwarf_decl_file(sp_die); + lf->fname = die_get_decl_file(sp_die); dwarf_decl_line(sp_die, &lr->offset); pr_debug("fname: %s, lineno:%d\n", lf->fname, lr->offset); lf->lno_s = lr->offset + lr->start;