From nobody Sat Feb 7 18:21:20 2026 Received: from mail-dl1-f73.google.com (mail-dl1-f73.google.com [74.125.82.73]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id DA26122157B for ; Sun, 11 Jan 2026 04:13:46 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=74.125.82.73 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1768104828; cv=none; b=osryVUt8oDWeGiExDfAKCwwl6Me53dhf9ASBe5iOzgR3mcIzu+YAe9TfYXjdHq0JVfJZ1tFtfNByd95cTFq8wERn69UtKmhiO1s4puWXeDb575LyVP8k7Q4czo44O2eyZYQGXKRux0nRsrMYSd3wJ8B8cHvq3tHrjA+s/BLd9pg= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1768104828; c=relaxed/simple; bh=LiM4wPnnfXt1IrKia0iYPEU/QsY83NzXUE/8uw4ggh4=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Content-Type; b=sobmfYTSRNW+TLSs146r4ovwk7BiCqbl32PXsj/P9x7uzNNJCJHQlAUhorRuC+6PijDKjGMogcYX35gJZWw5MXnxIQcqst8U3qoxfEnkf0DUTiHiDIx6yb+LL0VJ51iJpuxtgk8PeZ6ysfUd3g/qleq5e1KD8EqXw5UPxZ8E9aE= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com; spf=pass smtp.mailfrom=flex--irogers.bounces.google.com; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b=14NzTJmJ; arc=none smtp.client-ip=74.125.82.73 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=flex--irogers.bounces.google.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b="14NzTJmJ" Received: by mail-dl1-f73.google.com with SMTP id a92af1059eb24-121b1cb8377so7897468c88.0 for ; Sat, 10 Jan 2026 20:13:46 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20230601; t=1768104826; x=1768709626; darn=vger.kernel.org; h=to:from:subject:message-id:references:mime-version:in-reply-to:date :from:to:cc:subject:date:message-id:reply-to; bh=7WlJfatNqFviEdPO7ixNChUO369/E+qRmLtBoNvsLZg=; b=14NzTJmJItv9kX7LipISbRIaBlz+wnMuh/l7GoJsoWrD7CeCiZUADq7RudojUiUEX1 Hic2V1PysOQOFXa0HXdtkfcnR8/BgphbzfPygZ0APvSLSaS59HW4ln8fKEcVizjLuWk7 HE25OnmSWAIY6qlmYuwk/ZKioRsXW7Z6dgRbH1j++gAseGhE2NmpTaCCruqcW6Oqrsmp 74Q3WEGZ0u+I/jCY0czr0ydIGaOdMTLE0uTOgaUndj6ppiLc2/GSTPWP0twNeXVzbQp+ vmmQX2bt7B/seY67IqP/zBhDmJ4e3lGOfl7I03hOsDQM3YCdAW5z8m2ZZQS4nFHsPCyY Xmmg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1768104826; x=1768709626; h=to:from:subject:message-id:references:mime-version:in-reply-to:date :x-gm-message-state:from:to:cc:subject:date:message-id:reply-to; bh=7WlJfatNqFviEdPO7ixNChUO369/E+qRmLtBoNvsLZg=; b=tNHzTps/kvdkcks11jn+EzB15icNeeMQz5O8qg2A9Bap6fp0k7Iv+COSRxFmKMaXDV jn2+Cl8MMpyHbmPh8+fOeCXJk1o5mpfyrLpNVeEQoZElc/h3nXS3TASZrJs/a7wjYmlf yKWvYhyDXiENXgLRaM+N7/olG3F+8KxESV2udbBFSTXGbL6pEVo9QAMdV2nvwN+iVj4O 2PnmFS428bJuGznwv8PVVJr62P5qHy3tuVL3zgczTzxs1KcmUyIwO+nSgyfykO1DKENl 7EgvYRKhBOa6cMPOluHYuynpQ91MiX3o6K28NLiWW/qbQCCJo2ip5NiNUfAEQ7tLfr5b qklg== X-Forwarded-Encrypted: i=1; AJvYcCW+hQEAhonVWaBnPj5Su+Tut88eHwlT2YcEyQXCewbscWRISHv4tbArlAtMG+J8LsNtHm17Gvj19J7bdc0=@vger.kernel.org X-Gm-Message-State: AOJu0Yy9eEXQEqIcFYe5ijT3lB1DXGheaeODGkST2AlkBk4AXqMfNPf2 TAdSgEdZkzuyWh0oCitaZ54Xz/kdMfgtXeh/9TH/8EEGp7WtDuLjs/jC3p0YQQ6WzgXj1QFpib3 nIdkYO8qF9A== X-Google-Smtp-Source: AGHT+IEpwPdXc4Q3lwXPOPSrlts+LFdhUOl0o1F42tMjY39XaGnLW0K8ZwodeKhZ9IPGKj2hKxeB+uK2/M51 X-Received: from dlbeq5.prod.google.com ([2002:a05:7022:2605:b0:123:171f:e390]) (user=irogers job=prod-delivery.src-stubby-dispatcher) by 2002:a05:7022:62a0:b0:11f:3483:bbb2 with SMTP id a92af1059eb24-121f8b160a4mr14112685c88.12.1768104825871; Sat, 10 Jan 2026 20:13:45 -0800 (PST) Date: Sat, 10 Jan 2026 20:13:32 -0800 In-Reply-To: <20260111041338.1817056-1-irogers@google.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Mime-Version: 1.0 References: <20260111041338.1817056-1-irogers@google.com> X-Mailer: git-send-email 2.52.0.457.g6b5491de43-goog Message-ID: <20260111041338.1817056-2-irogers@google.com> Subject: [PATCH v3 1/7] perf unwind-libdw: Fix invalid reference counts From: Ian Rogers To: Tony Jones , Peter Zijlstra , Ingo Molnar , Arnaldo Carvalho de Melo , Namhyung Kim , Alexander Shishkin , Jiri Olsa , Ian Rogers , Adrian Hunter , James Clark , Howard Chu , Stephen Brennan , linux-kernel@vger.kernel.org, linux-perf-users@vger.kernel.org Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" The addition of addr_location__exit causes use-after put on the maps and map references in the unwind info. Add the gets and then add the map_symbol__exits. Fixes: 0dd5041c9a0e ("perf addr_location: Add init/exit/copy functions") Signed-off-by: Ian Rogers Reviewed-by: James Clark --- tools/perf/util/unwind-libdw.c | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/tools/perf/util/unwind-libdw.c b/tools/perf/util/unwind-libdw.c index ae70fb56a057..3ff427a49e4c 100644 --- a/tools/perf/util/unwind-libdw.c +++ b/tools/perf/util/unwind-libdw.c @@ -136,8 +136,8 @@ static int entry(u64 ip, struct unwind_info *ui) } =20 e->ip =3D ip; - e->ms.maps =3D al.maps; - e->ms.map =3D al.map; + e->ms.maps =3D maps__get(al.maps); + e->ms.map =3D map__get(al.map); e->ms.sym =3D al.sym; =20 pr_debug("unwind: %s:ip =3D 0x%" PRIx64 " (0x%" PRIx64 ")\n", @@ -325,6 +325,9 @@ int unwind__get_entries(unwind_entry_cb_t cb, void *arg, if (err) pr_debug("unwind: failed with '%s'\n", dwfl_errmsg(-1)); =20 + for (i =3D 0; i < ui->idx; i++) + map_symbol__exit(&ui->entries[i].ms); + dwfl_end(ui->dwfl); free(ui); return 0; --=20 2.52.0.457.g6b5491de43-goog From nobody Sat Feb 7 18:21:20 2026 Received: from mail-dl1-f74.google.com (mail-dl1-f74.google.com [74.125.82.74]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 7E4F722A7F9 for ; Sun, 11 Jan 2026 04:13:48 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=74.125.82.74 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1768104830; cv=none; b=YqJ9ZNYBCxydkHg52dweAJrm994GCNQrJxLkyAPamibu4yI44ACOFFgiPttEpYTHy2cP7Je+je8rDllzVq0D5UR5xTJ83uYxUWyJccJ1IrlZcifOCm0aO72IiOe7LKAzwRXucXyX2ejXKUsqzteTYoqN6obDnD8gjHSAWgSujSo= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1768104830; c=relaxed/simple; bh=vbotyXwHVaKQdR8kWhULvZX/q/Vx9nOv1N41aPN7mqg=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Content-Type; b=XNWYejiLZVqE/DdLnQVW20EM2+sKaiku2lJWMD/bdk0WRwtm3vZiw/FL72nf7M+pewY8pls5nFvmQWHPSoBeNT+J7ymVrWYOCPrA/stY/OazQUq4g0NAynDVjI9srGZ5MQacVGUN8TGLxfxnEeOw+TEsOJMJomrCs8uSsJ4yuB4= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com; spf=pass smtp.mailfrom=flex--irogers.bounces.google.com; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b=lcSGs09Y; arc=none smtp.client-ip=74.125.82.74 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=flex--irogers.bounces.google.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b="lcSGs09Y" Received: by mail-dl1-f74.google.com with SMTP id a92af1059eb24-11f44c1b352so25458462c88.0 for ; Sat, 10 Jan 2026 20:13:48 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20230601; t=1768104828; x=1768709628; darn=vger.kernel.org; h=to:from:subject:message-id:references:mime-version:in-reply-to:date :from:to:cc:subject:date:message-id:reply-to; bh=XX6WklKQED5MQz6zoFdrgpViZ0pRXopoy8NTHgEomUs=; b=lcSGs09Y3OB9qn9cD3IvlRhlG0pQIbvV/5ZLoPALVNBRRnj8BclZ59XOPvS+HTsM1e vZusKX6W0HMp1KGYmu1OXiGdUkYQHRmCqSoFQ8/vtPyynq+YA8uXSYsIk2LpQ5lw8D+8 LCkhkzcziNoI2HiCdfgiWoQWFJbwce4USqyrlSe4plowtKEnAPRTkv3sL/dud0E7Q0PL qZplsU3krKQ+phsBDAv/C895QH3pjqRQ62Q6KHF9uJhIs8pJhukO9KO4W0mEDw/xdzAt fepRM8k9jhCa8vq9DrwmsNifOPz+OT7ta8NaGdpt57ROUYDJjNYxzgQbgA30T2wZEjLP EbjA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1768104828; x=1768709628; h=to:from:subject:message-id:references:mime-version:in-reply-to:date :x-gm-message-state:from:to:cc:subject:date:message-id:reply-to; bh=XX6WklKQED5MQz6zoFdrgpViZ0pRXopoy8NTHgEomUs=; b=wjKboxvX6NrO+g5SwmwgZW0tfJV+1LZBKH2U9giGkPIPOGHiWpluENLLsUl2Tz/San pyuM3rTrfUcLie00V2MYU8jUeJm3EZ44FYUEMKF7BXAD+OdAHNx16YwWu1Ps6IgtG1R+ AK2hOMA/5ivaE4IV7glVibhn0S1FGj3rPcpJobXIGUW96/iAIBEuyIyhiSEmmIyLVmFp kcuCt2aMckzmEIKCPfoFMC20u/qQ9ZUhJdGImGasRseM8A1PTVdHBvrdd0QlmR+DBnTH 4SaDniAf5kdAJIWaU0Sm2e4R1d4OGTDXz4S/xQ8XytK+XNg0IOpFwc/vERfPIGqLxPIu fCWQ== X-Forwarded-Encrypted: i=1; AJvYcCWVUlZCJcQOCLGH1v8QfBZpQd42c2c34sA0eL5EMvbEMThyLFbWQJCJYibiY1fHjn5Ya9Mqxg8FkC5wQUI=@vger.kernel.org X-Gm-Message-State: AOJu0Yy97h61Kjryt2KKAA1VsIJvEHah5o1KyEG9iMu7j4qWiC0/R72n DteQ8hNhYylZrpTKiJQ8p+6HZL2hqsr8Q18iSnnlFBxUIw7MG1xof9ALzirl6vxHCfpCs2ebMYt U/cuwNnxbLw== X-Google-Smtp-Source: AGHT+IFK1G1xoON7/3F189m6pWX3kWwUZdKybhURrDnYvHvCLdlYAK8IVeveMfQnoxoCRj8Y2Xi+0z5koxvH X-Received: from dlbbz28.prod.google.com ([2002:a05:7022:239c:b0:11f:42e8:ad40]) (user=irogers job=prod-delivery.src-stubby-dispatcher) by 2002:a05:7022:248b:b0:119:e56b:c758 with SMTP id a92af1059eb24-121f8b43c16mr11028508c88.29.1768104827527; Sat, 10 Jan 2026 20:13:47 -0800 (PST) Date: Sat, 10 Jan 2026 20:13:33 -0800 In-Reply-To: <20260111041338.1817056-1-irogers@google.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Mime-Version: 1.0 References: <20260111041338.1817056-1-irogers@google.com> X-Mailer: git-send-email 2.52.0.457.g6b5491de43-goog Message-ID: <20260111041338.1817056-3-irogers@google.com> Subject: [PATCH v3 2/7] perf addr2line: Add a libdw implementation From: Ian Rogers To: Tony Jones , Peter Zijlstra , Ingo Molnar , Arnaldo Carvalho de Melo , Namhyung Kim , Alexander Shishkin , Jiri Olsa , Ian Rogers , Adrian Hunter , James Clark , Howard Chu , Stephen Brennan , linux-kernel@vger.kernel.org, linux-perf-users@vger.kernel.org Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Add an implementation of addr2line that uses libdw. Other addr2line implementations are slow, particularly in the case of forking addr2line. Add an implementation that caches the libdw information in the dso and uses it to find the file and line number information. Inline information is supported but because cu_walk_functions_at visits the leaf function last add a inline_list__append_tail to reverse the lists order. Signed-off-by: Ian Rogers Reviewed-by: James Clark --- tools/perf/util/Build | 1 + tools/perf/util/dso.c | 2 + tools/perf/util/dso.h | 11 +++ tools/perf/util/libdw.c | 153 ++++++++++++++++++++++++++++++++++++++ tools/perf/util/libdw.h | 60 +++++++++++++++ tools/perf/util/srcline.c | 24 ++++++ tools/perf/util/srcline.h | 1 + 7 files changed, 252 insertions(+) create mode 100644 tools/perf/util/libdw.c create mode 100644 tools/perf/util/libdw.h diff --git a/tools/perf/util/Build b/tools/perf/util/Build index 1c2a43e1dc68..2bed6274e248 100644 --- a/tools/perf/util/Build +++ b/tools/perf/util/Build @@ -224,6 +224,7 @@ perf-util-$(CONFIG_LIBDW) +=3D dwarf-regs-powerpc.o perf-util-$(CONFIG_LIBDW) +=3D dwarf-regs-x86.o perf-util-$(CONFIG_LIBDW) +=3D debuginfo.o perf-util-$(CONFIG_LIBDW) +=3D annotate-data.o +perf-util-$(CONFIG_LIBDW) +=3D libdw.o =20 perf-util-$(CONFIG_LIBDW_DWARF_UNWIND) +=3D unwind-libdw.o perf-util-$(CONFIG_LOCAL_LIBUNWIND) +=3D unwind-libunwind-local.o diff --git a/tools/perf/util/dso.c b/tools/perf/util/dso.c index 344e689567ee..06980844c014 100644 --- a/tools/perf/util/dso.c +++ b/tools/perf/util/dso.c @@ -32,6 +32,7 @@ #include "string2.h" #include "vdso.h" #include "annotate-data.h" +#include "libdw.h" =20 static const char * const debuglink_paths[] =3D { "%.0s%s", @@ -1605,6 +1606,7 @@ void dso__delete(struct dso *dso) auxtrace_cache__free(RC_CHK_ACCESS(dso)->auxtrace_cache); dso_cache__free(dso); dso__free_a2l(dso); + dso__free_a2l_libdw(dso); dso__free_symsrc_filename(dso); nsinfo__zput(RC_CHK_ACCESS(dso)->nsinfo); mutex_destroy(dso__lock(dso)); diff --git a/tools/perf/util/dso.h b/tools/perf/util/dso.h index f8ccb9816b89..4aee23775054 100644 --- a/tools/perf/util/dso.h +++ b/tools/perf/util/dso.h @@ -268,6 +268,7 @@ DECLARE_RC_STRUCT(dso) { const char *short_name; const char *long_name; void *a2l; + void *a2l_libdw; char *symsrc_filename; #if defined(__powerpc__) void *dwfl; /* DWARF debug info */ @@ -334,6 +335,16 @@ static inline void dso__set_a2l(struct dso *dso, void = *val) RC_CHK_ACCESS(dso)->a2l =3D val; } =20 +static inline void *dso__a2l_libdw(const struct dso *dso) +{ + return RC_CHK_ACCESS(dso)->a2l_libdw; +} + +static inline void dso__set_a2l_libdw(struct dso *dso, void *val) +{ + RC_CHK_ACCESS(dso)->a2l_libdw =3D val; +} + static inline unsigned int dso__a2l_fails(const struct dso *dso) { return RC_CHK_ACCESS(dso)->a2l_fails; diff --git a/tools/perf/util/libdw.c b/tools/perf/util/libdw.c new file mode 100644 index 000000000000..e4bfd52bd172 --- /dev/null +++ b/tools/perf/util/libdw.c @@ -0,0 +1,153 @@ +// SPDX-License-Identifier: GPL-2.0 +#include "dso.h" +#include "libdw.h" +#include "srcline.h" +#include "symbol.h" +#include "dwarf-aux.h" +#include +#include +#include + +void dso__free_a2l_libdw(struct dso *dso) +{ + Dwfl *dwfl =3D dso__a2l_libdw(dso); + + if (dwfl) { + dwfl_end(dwfl); + dso__set_a2l_libdw(dso, NULL); + } +} + +struct libdw_a2l_cb_args { + struct dso *dso; + struct symbol *sym; + struct inline_node *node; + char *leaf_srcline; + bool leaf_srcline_used; +}; + +static int libdw_a2l_cb(Dwarf_Die *die, void *_args) +{ + struct libdw_a2l_cb_args *args =3D _args; + struct symbol *inline_sym =3D new_inline_sym(args->dso, args->sym, dwarf_= diename(die)); + const char *call_fname =3D die_get_call_file(die); + char *call_srcline =3D srcline__unknown; + struct inline_list *ilist; + + if (!inline_sym) + return -ENOMEM; + + /* Assign caller information to the parent. */ + if (call_fname) + call_srcline =3D srcline_from_fileline(call_fname, die_get_call_lineno(d= ie)); + + list_for_each_entry(ilist, &args->node->val, list) { + ilist->srcline =3D call_srcline; + call_srcline =3D NULL; + break; + } + if (call_srcline && call_fname) + free(call_srcline); + + /* Add this symbol to the chain as the leaf. */ + inline_list__append_tail(inline_sym, args->leaf_srcline, args->node); + args->leaf_srcline_used =3D true; + return 0; +} + +int libdw__addr2line(const char *dso_name, u64 addr, + char **file, unsigned int *line_nr, + struct dso *dso, bool unwind_inlines, + struct inline_node *node, struct symbol *sym) +{ + static const Dwfl_Callbacks offline_callbacks =3D { + .find_debuginfo =3D dwfl_standard_find_debuginfo, + .section_address =3D dwfl_offline_section_address, + .find_elf =3D dwfl_build_id_find_elf, + }; + Dwfl *dwfl =3D dso__a2l_libdw(dso); + Dwfl_Module *mod; + Dwfl_Line *dwline; + Dwarf_Addr bias; + const char *src; + int lineno =3D 0; + + if (!dwfl) { + /* + * Initialize Dwfl session. + * We need to open the DSO file to report it to libdw. + */ + int fd; + + fd =3D open(dso_name, O_RDONLY); + if (fd < 0) + return 0; + + dwfl =3D dwfl_begin(&offline_callbacks); + if (!dwfl) { + close(fd); + return 0; + } + + /* + * If the report is successful, the file descriptor fd is consumed + * and closed by the Dwfl. If not, it is not closed. + */ + mod =3D dwfl_report_offline(dwfl, dso_name, dso_name, fd); + if (!mod) { + dwfl_end(dwfl); + close(fd); + return 0; + } + + dwfl_report_end(dwfl, /*removed=3D*/NULL, /*arg=3D*/NULL); + dso__set_a2l_libdw(dso, dwfl); + } else { + /* Dwfl session already initialized, get module for address. */ + mod =3D dwfl_addrmodule(dwfl, addr); + } + + if (!mod) + return 0; + + /* + * Get/ignore the dwarf information. Determine the bias, difference + * between the regular ELF addr2line addresses and those to use with + * libdw. + */ + if (!dwfl_module_getdwarf(mod, &bias)) + return 0; + + /* Find source line information for the address. */ + dwline =3D dwfl_module_getsrc(mod, addr + bias); + if (!dwline) + return 0; + + /* Get line information. */ + src =3D dwfl_lineinfo(dwline, /*addr=3D*/NULL, &lineno, /*col=3D*/NULL, /= *mtime=3D*/NULL, + /*length=3D*/NULL); + + if (file) + *file =3D src ? strdup(src) : NULL; + if (line_nr) + *line_nr =3D lineno; + + /* Optionally unwind inline function call chain. */ + if (unwind_inlines && node) { + Dwarf_Addr unused_bias; + Dwarf_Die *cudie =3D dwfl_module_addrdie(mod, addr + bias, &unused_bias); + struct libdw_a2l_cb_args args =3D { + .dso =3D dso, + .sym =3D sym, + .node =3D node, + .leaf_srcline =3D srcline_from_fileline(src ?: "", lineno), + }; + + /* Walk from the parent down to the leaf. */ + cu_walk_functions_at(cudie, addr, libdw_a2l_cb, &args); + + if (!args.leaf_srcline_used) + free(args.leaf_srcline); + } + return 1; +} diff --git a/tools/perf/util/libdw.h b/tools/perf/util/libdw.h new file mode 100644 index 000000000000..0f8d7b4a11a5 --- /dev/null +++ b/tools/perf/util/libdw.h @@ -0,0 +1,60 @@ +/* SPDX-License-Identifier: GPL-2.0 */ +#ifndef PERF_LIBDW_H +#define PERF_LIBDW_H + +#include + +struct dso; +struct inline_node; +struct symbol; + +#ifdef HAVE_LIBDW_SUPPORT +/* + * libdw__addr2line - Convert address to source location using libdw + * @dso_name: Name of the DSO + * @addr: Address to resolve + * @file: Pointer to return filename (caller must free) + * @line_nr: Pointer to return line number + * @dso: The dso struct + * @unwind_inlines: Whether to unwind inline function calls + * @node: Inline node list to append to + * @sym: The symbol associated with the address + * + * This function initializes a Dwfl context for the DSO if not already pre= sent, + * finds the source line information for the given address, and optionally + * resolves inline function call chains. + * + * Returns 1 on success (found), 0 on failure (not found). + */ +int libdw__addr2line(const char *dso_name, u64 addr, char **file, + unsigned int *line_nr, struct dso *dso, + bool unwind_inlines, struct inline_node *node, + struct symbol *sym); + +/* + * dso__free_a2l_libdw - Free libdw resources associated with the DSO + * @dso: The dso to free resources for + * + * This function cleans up the Dwfl context used for addr2line lookups. + */ +void dso__free_a2l_libdw(struct dso *dso); + +#else /* HAVE_LIBDW_SUPPORT */ + +static inline int libdw__addr2line(const char *dso_name __maybe_unused, + u64 addr __maybe_unused, char **file __maybe_unused, + unsigned int *line_nr __maybe_unused, + struct dso *dso __maybe_unused, + bool unwind_inlines __maybe_unused, + struct inline_node *node __maybe_unused, + struct symbol *sym __maybe_unused) +{ + return 0; +} + +static inline void dso__free_a2l_libdw(struct dso *dso __maybe_unused) +{ +} +#endif /* HAVE_LIBDW_SUPPORT */ + +#endif /* PERF_LIBDW_H */ diff --git a/tools/perf/util/srcline.c b/tools/perf/util/srcline.c index 27c0966611ab..e2d280678b02 100644 --- a/tools/perf/util/srcline.c +++ b/tools/perf/util/srcline.c @@ -6,6 +6,7 @@ #include "libbfd.h" #include "llvm.h" #include "symbol.h" +#include "libdw.h" =20 #include #include @@ -51,6 +52,25 @@ int inline_list__append(struct symbol *symbol, char *src= line, struct inline_node return 0; } =20 +int inline_list__append_tail(struct symbol *symbol, char *srcline, struct = inline_node *node) +{ + struct inline_list *ilist; + + ilist =3D zalloc(sizeof(*ilist)); + if (ilist =3D=3D NULL) + return -1; + + ilist->symbol =3D symbol; + ilist->srcline =3D srcline; + + if (callchain_param.order =3D=3D ORDER_CALLEE) + list_add(&ilist->list, &node->val); + else + list_add_tail(&ilist->list, &node->val); + + return 0; +} + /* basename version that takes a const input string */ static const char *gnu_basename(const char *path) { @@ -120,6 +140,10 @@ static int addr2line(const char *dso_name, u64 addr, c= har **file, unsigned int * { int ret; =20 + ret =3D libdw__addr2line(dso_name, addr, file, line_nr, dso, unwind_inlin= es, node, sym); + if (ret > 0) + return ret; + ret =3D llvm__addr2line(dso_name, addr, file, line_nr, dso, unwind_inline= s, node, sym); if (ret > 0) return ret; diff --git a/tools/perf/util/srcline.h b/tools/perf/util/srcline.h index c36f573cd339..be9f002bf234 100644 --- a/tools/perf/util/srcline.h +++ b/tools/perf/util/srcline.h @@ -57,6 +57,7 @@ struct inline_node *inlines__tree_find(struct rb_root_cac= hed *tree, u64 addr); void inlines__tree_delete(struct rb_root_cached *tree); =20 int inline_list__append(struct symbol *symbol, char *srcline, struct inlin= e_node *node); +int inline_list__append_tail(struct symbol *symbol, char *srcline, struct = inline_node *node); char *srcline_from_fileline(const char *file, unsigned int line); struct symbol *new_inline_sym(struct dso *dso, struct symbol *base_sym, --=20 2.52.0.457.g6b5491de43-goog From nobody Sat Feb 7 18:21:20 2026 Received: from mail-dy1-f201.google.com (mail-dy1-f201.google.com [74.125.82.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 2DDAE221723 for ; Sun, 11 Jan 2026 04:13:50 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=74.125.82.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1768104832; cv=none; b=Ki6XQIUzUb6a66RMu11rvYvOth+RUzFuC3/R8MTvYVSHgDtM2gh6VfAXg3108Ng6ski2bbSu/YVAG587g569tL3olXYWy9B2GqP0GM/3ZnPY1inWsClfaJkx+h8CFyDAg49vuLd8TXcOL8/pTEXb7jViouJro6RN/mu/ROenM7E= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1768104832; c=relaxed/simple; bh=X1MjIcGZucyzCm2r2IlBzTymaxjsdQoFFc+rtk3RK20=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Content-Type; b=GdYkEGHgMW9MastwHHu4DZzHwNSE96F0+A6dSRUrsK0xE8LYRNE+tWEKZYt9OfgN6zK34YowvcRT/G7ke0leqNhGxswYKm7dxEFAzkmKWgG16DwqEoVNziY7Ongh4y+nP5qidoPfApqKjtqoaGkrTGQzUBo5QAezPAurTbukGdE= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com; spf=pass smtp.mailfrom=flex--irogers.bounces.google.com; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b=qgQPifxI; arc=none smtp.client-ip=74.125.82.201 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=flex--irogers.bounces.google.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b="qgQPifxI" Received: by mail-dy1-f201.google.com with SMTP id 5a478bee46e88-2ae26a77b76so5867642eec.0 for ; Sat, 10 Jan 2026 20:13:50 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20230601; t=1768104829; x=1768709629; darn=vger.kernel.org; h=to:from:subject:message-id:references:mime-version:in-reply-to:date :from:to:cc:subject:date:message-id:reply-to; bh=GeyCcyFu8+y/NnCQ7WsdxHS48sCTNn9MjknKssLg0z0=; b=qgQPifxIhI4RueJYM5SAEnX48tZdoNJe6+coANDuTNBLU3i6qz/Bg+0WNOaLwfCvd5 bQFMepJ6PHhcD0tPiAK1xz7XIg+Hkf0K5HKZZkN1UNZWei7bBb3Edg4zXHCarTmzXeRF 3wFzUoDunA4sm4f0kZMWvGxDYhU8/7WU6EhHKU7VyU2FuBgL0BaaTXpqFRseclGmw/qZ xaXuld5ow+q1wIC61m+jhJK+B90ewlRZsojWwKFsFE6L1DHNB5E/RNCmT0msS403pvtL NFO1JhdZ/H6qQ/lMDeQE2gj+bH3W+Q8BBXzAmz/Vs4CBw0wC36eGZZSd/awLonIPGn5j LcIw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1768104829; x=1768709629; h=to:from:subject:message-id:references:mime-version:in-reply-to:date :x-gm-message-state:from:to:cc:subject:date:message-id:reply-to; bh=GeyCcyFu8+y/NnCQ7WsdxHS48sCTNn9MjknKssLg0z0=; b=nEU19kYH0GcTaNHbpc/kuG0v/dPqtUKOi7JZR6fM7KygFxy6LGfn6JBBaPAUowc25j UQg3aPSfhnrtapvGwaXakFCivj0ACpqM2WQZbmZmL7qT05ysM0nisFVs52sqBi+8sqOL UKLQBoflW8vOnPmUuU9wz6HS7t9xPEEEgja/1zR4F0FiefMroyLXOUC3gr1zEPRdl9br jyT37assV6MlIK3JMZ3qIol0wqCwn8XB79gcrjIf7rpd335MXhDGvzV9S1mpgBW/+xJh hz6UXs0WVffILHMIVGJOIxzE0FmW/MTO7/GU2Ebv3PEX3oYrjd2nLGwApuxPv0det7a2 FzjQ== X-Forwarded-Encrypted: i=1; AJvYcCUsKkXkNm1iGtN6rmMulpC+egdxZxA72LSh1YAVWCUtKjQJVrTuLWGd4SPJbAEb6N51obo1Xs6dGXdPcc8=@vger.kernel.org X-Gm-Message-State: AOJu0YxfBWfxmCFVZU2+FRg+xXsM4bNc95vsBh/JhZN2CCdmnZIf7LsO JqNpA0fQq+/oDkpmNyiIOD4bS4H9Xm5AVDs2eaUqdsQ/cLlpMUk0WqDFg/5Xp6bNbeHHrpodgdq h8D6s8wMyDA== X-Google-Smtp-Source: AGHT+IEOpSLg0Wg/xFruyE/3OQJpn0D12uVPbilAjvNA51c/zUib3AzwGvK2CWnUK7QZbSNCw1dFzUtvvSEe X-Received: from dlbcy9.prod.google.com ([2002:a05:7022:b89:b0:121:778d:9d5f]) (user=irogers job=prod-delivery.src-stubby-dispatcher) by 2002:a05:7023:b14:b0:11f:391c:d01f with SMTP id a92af1059eb24-121f8b8d709mr13112430c88.38.1768104829335; Sat, 10 Jan 2026 20:13:49 -0800 (PST) Date: Sat, 10 Jan 2026 20:13:34 -0800 In-Reply-To: <20260111041338.1817056-1-irogers@google.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Mime-Version: 1.0 References: <20260111041338.1817056-1-irogers@google.com> X-Mailer: git-send-email 2.52.0.457.g6b5491de43-goog Message-ID: <20260111041338.1817056-4-irogers@google.com> Subject: [PATCH v3 3/7] perf addr2line.c: Rename a2l_style to cmd_a2l_style From: Ian Rogers To: Tony Jones , Peter Zijlstra , Ingo Molnar , Arnaldo Carvalho de Melo , Namhyung Kim , Alexander Shishkin , Jiri Olsa , Ian Rogers , Adrian Hunter , James Clark , Howard Chu , Stephen Brennan , linux-kernel@vger.kernel.org, linux-perf-users@vger.kernel.org Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" The a2l_style is only relevant to the command line version, so rename to make this clearer. Signed-off-by: Ian Rogers Reviewed-by: James Clark --- tools/perf/util/addr2line.c | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/tools/perf/util/addr2line.c b/tools/perf/util/addr2line.c index f2d94a3272d7..0f1499350d47 100644 --- a/tools/perf/util/addr2line.c +++ b/tools/perf/util/addr2line.c @@ -90,16 +90,16 @@ static struct child_process *addr2line_subprocess_init(= const char *addr2line_pat return a2l; } =20 -enum a2l_style { +enum cmd_a2l_style { BROKEN, GNU_BINUTILS, LLVM, }; =20 -static enum a2l_style addr2line_configure(struct child_process *a2l, const= char *dso_name) +static enum cmd_a2l_style cmd_addr2line_configure(struct child_process *a2= l, const char *dso_name) { static bool cached; - static enum a2l_style style; + static enum cmd_a2l_style style; =20 if (!cached) { char buf[128]; @@ -149,7 +149,7 @@ static enum a2l_style addr2line_configure(struct child_= process *a2l, const char } =20 static int read_addr2line_record(struct io *io, - enum a2l_style style, + enum cmd_a2l_style style, const char *dso_name, u64 addr, bool first, @@ -298,7 +298,7 @@ int cmd__addr2line(const char *dso_name, u64 addr, char buf[128]; ssize_t written; struct io io =3D { .eof =3D false }; - enum a2l_style a2l_style; + enum cmd_a2l_style cmd_a2l_style; =20 if (!a2l) { if (!filename__has_section(dso_name, ".debug_line")) @@ -314,8 +314,8 @@ int cmd__addr2line(const char *dso_name, u64 addr, pr_warning("%s %s: addr2line_subprocess_init failed\n", __func__, dso_n= ame); goto out; } - a2l_style =3D addr2line_configure(a2l, dso_name); - if (a2l_style =3D=3D BROKEN) + cmd_a2l_style =3D cmd_addr2line_configure(a2l, dso_name); + if (cmd_a2l_style =3D=3D BROKEN) goto out; =20 /* @@ -336,7 +336,7 @@ int cmd__addr2line(const char *dso_name, u64 addr, } io__init(&io, a2l->out, buf, sizeof(buf)); io.timeout_ms =3D addr2line_timeout_ms; - switch (read_addr2line_record(&io, a2l_style, dso_name, addr, /*first=3D*= /true, + switch (read_addr2line_record(&io, cmd_a2l_style, dso_name, addr, /*first= =3D*/true, &record_function, &record_filename, &record_line_nr)) { case -1: if (!symbol_conf.disable_add2line_warn) @@ -351,7 +351,7 @@ int cmd__addr2line(const char *dso_name, u64 addr, * binutils, also force a non-zero address as we're no longer * reading that record. */ - switch (read_addr2line_record(&io, a2l_style, dso_name, + switch (read_addr2line_record(&io, cmd_a2l_style, dso_name, /*addr=3D*/1, /*first=3D*/true, NULL, NULL, NULL)) { case -1: @@ -397,7 +397,7 @@ int cmd__addr2line(const char *dso_name, u64 addr, * as we're reading records beyond the first. */ while ((record_status =3D read_addr2line_record(&io, - a2l_style, + cmd_a2l_style, dso_name, /*addr=3D*/1, /*first=3D*/false, --=20 2.52.0.457.g6b5491de43-goog From nobody Sat Feb 7 18:21:20 2026 Received: from mail-dl1-f74.google.com (mail-dl1-f74.google.com [74.125.82.74]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id DB2CA225788 for ; Sun, 11 Jan 2026 04:13:51 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=74.125.82.74 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1768104833; cv=none; b=IS4moGZ8Ph+1yuVUrqBOe5OYZwwtrICXJGQXh3k5y0aaXGwm6y1T1V+phACrXyJxL/trT++aEWKHG9/s8A7UMOgEWoV06pNwnXdihPrgauOOvR7OJruDHRuz14JGcg4r1Np5AF4zmfUXDJgo8VA9WVSisL+hMnm9jcYbobpL6q4= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1768104833; c=relaxed/simple; bh=pnkoaS3BDyegUiypzuayNhPPwN3jB4XGtFWuYD1ZLdE=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Content-Type; b=SDn6un3aG3JxFdounbpIyThSZsvf9eEdku/tIhhZWeTeQgJNYMQ+UkVC9UznqjQ5Zk9F51zhbPGgVW3I1C+5hyxyJTHif/Wja1q1peyA8u69BR/E5Nk64xlZxYj0G5c2+muVjr+gfyoRRlMZ2ERlCj5x8HcYBNqtklD0iNtKkXY= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com; spf=pass smtp.mailfrom=flex--irogers.bounces.google.com; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b=LrepVoXf; arc=none smtp.client-ip=74.125.82.74 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=flex--irogers.bounces.google.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b="LrepVoXf" Received: by mail-dl1-f74.google.com with SMTP id a92af1059eb24-11f3b5411c7so14261414c88.1 for ; Sat, 10 Jan 2026 20:13:51 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20230601; t=1768104831; x=1768709631; darn=vger.kernel.org; h=to:from:subject:message-id:references:mime-version:in-reply-to:date :from:to:cc:subject:date:message-id:reply-to; bh=79Lm5r+aff6tOMggRex7lERHHcu3vz/+dw8OY+TEe/4=; b=LrepVoXfGoFd2dOhKEVMwALNB+R1Zq56xMKJiqu9u4jAEt+WjzjwNW5it2iNmFZTR0 B2CtbDR3jJ2dbCZT0JSRR0HsDFzF0mUVYr7fi4G/hIX624NVUoGMPu/Q37h9V+nPaFzD no4bD1FJIf215uWz7QGyg264czw6fE8yj8w6MwokRCdBGTOKgtICLZqSi2dQ3tkoWV8f ksFTBegZwivSmZJg+pviD8+doKikxxWwi4AZ269kExM/4TXx1/O6iL/OtMZfvI2rdIB5 tuvs9aUDd+JsVA7Xh2Rh7TaNKbqfvyFERzVb178TwzwASWscCIVYxiZP4dCYo+4VliK4 +lwg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1768104831; x=1768709631; h=to:from:subject:message-id:references:mime-version:in-reply-to:date :x-gm-message-state:from:to:cc:subject:date:message-id:reply-to; bh=79Lm5r+aff6tOMggRex7lERHHcu3vz/+dw8OY+TEe/4=; b=M+j65cZ22TW5kedwsiW55F2bi6Ie6y8eHsbsr29zhNqmYbbOIZ2oNeMSbv8xdvm4Vb +quuW7u6eXwAGA/dRAGNxPGb5z6H4mY6ZtuahyAvrzs3909oeN/mNAAU2P2H15pIiUOO 95mtJtl7H7iJUvVFqkJkPGSz3k3Q/K/6I8VQlMk3Q39aEPbmiSiucqACxKPYOX8WknkV 7FX3ZMfIOgPi5Dk+wrFNzud333Jz7JRxU4WqHChq3gwOSpw81Gonk5YMpLaP2txD8Q23 EjkX6tgyQMTozPb5tYZMGSU2G1d3x0upBiD3Cdo7r04eG6O7e4vWbg0jIk7ht5seKw0i sP3A== X-Forwarded-Encrypted: i=1; AJvYcCX55JJnAo7oA+ObfEe7C2giY0to44Q7X1wofYjZ+HqVD/OicNfY0C/wo+PHXHAI5z97D5y7fi2qK7u79mE=@vger.kernel.org X-Gm-Message-State: AOJu0Yw7N6cmJWViymlnQsJVOmFD4UDCftR4WNnhWDjrduCBp3F8h6PM 4mWE9g0s2nkCjc+KIqcqc460xeYCnW+YRslszePS5E5D+EM6biXdRTAWaTrMLTOoMQoYP/gllb6 bYbqqv3zRtg== X-Google-Smtp-Source: AGHT+IExjh+icGjuEXfliQJ9KapJZef9WEJHe8V8zlsgQpc6W/MNOCCxaTHKhh88Wrjgkd9wUAI/2rl0W8L7 X-Received: from dlbbq37.prod.google.com ([2002:a05:7022:6725:b0:11f:45c3:e5f6]) (user=irogers job=prod-delivery.src-stubby-dispatcher) by 2002:a05:7022:f86:b0:119:e569:fb9a with SMTP id a92af1059eb24-121f8ab6642mr16108366c88.9.1768104830976; Sat, 10 Jan 2026 20:13:50 -0800 (PST) Date: Sat, 10 Jan 2026 20:13:35 -0800 In-Reply-To: <20260111041338.1817056-1-irogers@google.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Mime-Version: 1.0 References: <20260111041338.1817056-1-irogers@google.com> X-Mailer: git-send-email 2.52.0.457.g6b5491de43-goog Message-ID: <20260111041338.1817056-5-irogers@google.com> Subject: [PATCH v3 4/7] perf srcline: Add configuration support for the addr2line style From: Ian Rogers To: Tony Jones , Peter Zijlstra , Ingo Molnar , Arnaldo Carvalho de Melo , Namhyung Kim , Alexander Shishkin , Jiri Olsa , Ian Rogers , Adrian Hunter , James Clark , Howard Chu , Stephen Brennan , linux-kernel@vger.kernel.org, linux-perf-users@vger.kernel.org Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Allow the addr2line style to be specified on the `perf report` command line or in the .perfconfig file. Signed-off-by: Ian Rogers Reviewed-by: James Clark --- tools/perf/builtin-report.c | 10 ++++ tools/perf/util/config.c | 4 ++ tools/perf/util/srcline.c | 98 +++++++++++++++++++++++++++++++---- tools/perf/util/srcline.h | 2 + tools/perf/util/symbol_conf.h | 10 ++++ 5 files changed, 113 insertions(+), 11 deletions(-) diff --git a/tools/perf/builtin-report.c b/tools/perf/builtin-report.c index 6c2b4f93ec78..2e936928e8c0 100644 --- a/tools/perf/builtin-report.c +++ b/tools/perf/builtin-report.c @@ -1271,6 +1271,13 @@ parse_percent_limit(const struct option *opt, const = char *str, return 0; } =20 +static int +report_parse_addr2line_config(const struct option *opt __maybe_unused, + const char *arg, int unset __maybe_unused) +{ + return addr2line_configure("addr2line.style", arg, NULL); +} + static int process_attr(const struct perf_tool *tool __maybe_unused, union perf_event *event, struct evlist **pevlist) @@ -1447,6 +1454,9 @@ int cmd_report(int argc, const char **argv) "objdump binary to use for disassembly and annotations"), OPT_STRING(0, "addr2line", &addr2line_path, "path", "addr2line binary to use for line numbers"), + OPT_CALLBACK(0, "addr2line-style", NULL, "addr2line style", + "addr2line styles (libdw,llvm,libbfd,addr2line)", + report_parse_addr2line_config), OPT_BOOLEAN(0, "demangle", &symbol_conf.demangle, "Symbol demangling. Enabled by default, use --no-demangle to disable= ."), OPT_BOOLEAN(0, "demangle-kernel", &symbol_conf.demangle_kernel, diff --git a/tools/perf/util/config.c b/tools/perf/util/config.c index e0219bc6330a..0452fbc6c085 100644 --- a/tools/perf/util/config.c +++ b/tools/perf/util/config.c @@ -20,6 +20,7 @@ #include "util/stat.h" /* perf_stat__set_big_num */ #include "util/evsel.h" /* evsel__hw_names, evsel__use_bpf_counters */ #include "util/addr2line.h" /* addr2line_timeout_ms */ +#include "srcline.h" #include "build-id.h" #include "debug.h" #include "config.h" @@ -519,6 +520,9 @@ int perf_default_config(const char *var, const char *va= lue, if (strstarts(var, "stat.")) return perf_stat_config(var, value); =20 + if (strstarts(var, "addr2line.")) + return addr2line_configure(var, value, dummy); + /* Add other config variables here. */ return 0; } diff --git a/tools/perf/util/srcline.c b/tools/perf/util/srcline.c index e2d280678b02..28fa1abd1fd3 100644 --- a/tools/perf/util/srcline.c +++ b/tools/perf/util/srcline.c @@ -7,9 +7,11 @@ #include "llvm.h" #include "symbol.h" #include "libdw.h" +#include "debug.h" =20 #include #include +#include =20 bool srcline_full_filename; =20 @@ -138,21 +140,95 @@ static int addr2line(const char *dso_name, u64 addr, = char **file, unsigned int * struct dso *dso, bool unwind_inlines, struct inline_node *node, struct symbol *sym) { - int ret; + int ret =3D 0; + + if (symbol_conf.addr2line_style[0] =3D=3D A2L_STYLE_UNKNOWN) { + int i =3D 0; + + /* Default addr2line fallback order. */ +#ifdef HAVE_LIBDW_SUPPORT + symbol_conf.addr2line_style[i++] =3D A2L_STYLE_LIBDW; +#endif +#ifdef HAVE_LIBLLVM_SUPPORT + symbol_conf.addr2line_style[i++] =3D A2L_STYLE_LLVM; +#endif +#ifdef HAVE_LIBBFD_SUPPORT + symbol_conf.addr2line_style[i++] =3D A2L_STYLE_LIBBFD; +#endif + symbol_conf.addr2line_style[i++] =3D A2L_STYLE_CMD; + } + + for (size_t i =3D 0; i < ARRAY_SIZE(symbol_conf.addr2line_style); i++) { + switch (symbol_conf.addr2line_style[i]) { + case A2L_STYLE_LIBDW: + ret =3D libdw__addr2line(dso_name, addr, file, line_nr, dso, unwind_inl= ines, + node, sym); + break; + case A2L_STYLE_LLVM: + ret =3D llvm__addr2line(dso_name, addr, file, line_nr, dso, unwind_inli= nes, + node, sym); + break; + case A2L_STYLE_LIBBFD: + ret =3D libbfd__addr2line(dso_name, addr, file, line_nr, dso, unwind_in= lines, + node, sym); + break; + case A2L_STYLE_CMD: + ret =3D cmd__addr2line(dso_name, addr, file, line_nr, dso, unwind_inlin= es, + node, sym); + break; + case A2L_STYLE_UNKNOWN: + default: + break; + } + if (ret > 0) + return ret; + } + + return 0; +} + +int addr2line_configure(const char *var, const char *value, void *cb __may= be_unused) +{ + static const char * const a2l_style_names[] =3D { + [A2L_STYLE_LIBDW] =3D "libdw", + [A2L_STYLE_LLVM] =3D "llvm", + [A2L_STYLE_LIBBFD] =3D "libbfd", + [A2L_STYLE_CMD] =3D "addr2line", + NULL + }; + + char *s, *p, *saveptr; + size_t i =3D 0; =20 - ret =3D libdw__addr2line(dso_name, addr, file, line_nr, dso, unwind_inlin= es, node, sym); - if (ret > 0) - return ret; + if (strcmp(var, "addr2line.style")) + return 0; + + if (!value) + return -1; =20 - ret =3D llvm__addr2line(dso_name, addr, file, line_nr, dso, unwind_inline= s, node, sym); - if (ret > 0) - return ret; + s =3D strdup(value); + if (!s) + return -1; =20 - ret =3D libbfd__addr2line(dso_name, addr, file, line_nr, dso, unwind_inli= nes, node, sym); - if (ret > 0) - return ret; + p =3D strtok_r(s, ",", &saveptr); + while (p && i < ARRAY_SIZE(symbol_conf.addr2line_style)) { + bool found =3D false; + char *q =3D strim(p); + + for (size_t j =3D A2L_STYLE_LIBDW; j < MAX_A2L_STYLE; j++) { + if (!strcasecmp(q, a2l_style_names[j])) { + symbol_conf.addr2line_style[i++] =3D j; + found =3D true; + break; + } + } + if (!found) + pr_warning("Unknown addr2line style: %s\n", q); + p =3D strtok_r(NULL, ",", &saveptr); + } =20 - return cmd__addr2line(dso_name, addr, file, line_nr, dso, unwind_inlines,= node, sym); + free(s); + return 0; } =20 static struct inline_node *addr2inlines(const char *dso_name, u64 addr, diff --git a/tools/perf/util/srcline.h b/tools/perf/util/srcline.h index be9f002bf234..7c37b3bf9ce7 100644 --- a/tools/perf/util/srcline.h +++ b/tools/perf/util/srcline.h @@ -63,4 +63,6 @@ struct symbol *new_inline_sym(struct dso *dso, struct symbol *base_sym, const char *funcname); =20 +int addr2line_configure(const char *var, const char *value, void *cb); + #endif /* PERF_SRCLINE_H */ diff --git a/tools/perf/util/symbol_conf.h b/tools/perf/util/symbol_conf.h index 7a80d2c14d9b..71bb17372a6c 100644 --- a/tools/perf/util/symbol_conf.h +++ b/tools/perf/util/symbol_conf.h @@ -9,6 +9,15 @@ struct strlist; struct intlist; =20 +enum a2l_style { + A2L_STYLE_UNKNOWN =3D 0, + A2L_STYLE_LIBDW, + A2L_STYLE_LLVM, + A2L_STYLE_LIBBFD, + A2L_STYLE_CMD, +}; +#define MAX_A2L_STYLE (A2L_STYLE_CMD + 1) + struct symbol_conf { bool nanosecs; unsigned short priv_size; @@ -70,6 +79,7 @@ struct symbol_conf { *col_width_list_str, *bt_stop_list_str; const char *addr2line_path; + enum a2l_style addr2line_style[MAX_A2L_STYLE]; unsigned long time_quantum; struct strlist *dso_list, *comm_list, --=20 2.52.0.457.g6b5491de43-goog From nobody Sat Feb 7 18:21:20 2026 Received: from mail-dy1-f201.google.com (mail-dy1-f201.google.com [74.125.82.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id BB2B9221554 for ; Sun, 11 Jan 2026 04:13:53 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=74.125.82.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1768104844; cv=none; b=N2OzcHcyp3ioOOAdvjIZmOYm6kjGkP/V3/XgQ6WiX+rnKOrpT+L0NJxN6INvWkyC6gsLL2egdL1ci4R2knQiVif94C+VZ1zVtAKQZL1XiDHh3fGn+7nqbONJGxWko9U2byLCxoe7obeqyqcPiKDNZPnCh9kiJMxPe0RdNeiSbMA= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1768104844; c=relaxed/simple; bh=8YxkvOf7iZLK/BeDOIUdVZ3lYPXO263sBiceaqqTHTI=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Content-Type; b=eniyQUhIpvD/iS8SMv/EvQ2IjfLv6yXzPu6rsyz7T16I3ggwNkCGJ2sZjshSwlepllt4+454AP6LbjlvHmeeDK9jEGFKL32e/h7VFSeY7qPcWKmpaytAal6zh+2/3Xff7oSIOGSB431yibnkrPo0hzIt+1rzNnuuv/lueeq0GLw= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com; spf=pass smtp.mailfrom=flex--irogers.bounces.google.com; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b=Rd9nDtWm; arc=none smtp.client-ip=74.125.82.201 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=flex--irogers.bounces.google.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b="Rd9nDtWm" Received: by mail-dy1-f201.google.com with SMTP id 5a478bee46e88-2b04f8c5e84so5623443eec.1 for ; Sat, 10 Jan 2026 20:13:53 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20230601; t=1768104833; x=1768709633; darn=vger.kernel.org; h=to:from:subject:message-id:references:mime-version:in-reply-to:date :from:to:cc:subject:date:message-id:reply-to; bh=5BNHEFhnGGjed5J/YPDOkQnS/Jo2dAvhTiC7ye+dE4c=; b=Rd9nDtWmyE464BjjZcFJiK8Z4DS+jtqaNLPQUKVfKibIv0gGbUtYBZd253pAg0awLt 27BC0gypPxsWb5kM9cKFIxmR3fr+87/knrgXfbSi8GfskH9HT8/8SziMFTP6D2kvz5lc cMOifWM5CuAPk+/6DyP2dhKuqZovJdbZx+ow0Z4Hpk/6WSOsTMxiSLHfrFDVCl8fdWs8 0Pg2CW788RbeZx0vIg9+MNKMNwsfX5+yQgDVhpC7ybanPoPTOJDAwRuB6ud7GkeZx7HB SpziN4+reFUav4HbN4/92Mne3H2ioDiUZKJW3MoR39wqBcTBXQ+yNqz9wyvvaIpb34dR 5Xjw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1768104833; x=1768709633; h=to:from:subject:message-id:references:mime-version:in-reply-to:date :x-gm-message-state:from:to:cc:subject:date:message-id:reply-to; bh=5BNHEFhnGGjed5J/YPDOkQnS/Jo2dAvhTiC7ye+dE4c=; b=wo5Xdj4ahI2aFyeWHpya3/pCQyJtPDIUyLk6csvpURR2RgfGGfL6GdjBsMv1XehpRe xCfOuLxQn+n6aaExooWS0B5CCfDZeea6D5EM70pC+CgHR8oIKyreYv454XI0SFOYlnXf BaZ3pm3nFx51QynQ0ZULxZAkBixl5Yh8w5agDF+yWWdafsQQ2nL19zOCf/BhmbY8p4Gs 0k8SClXzSCTJeLMu6H/G+M5DuedE7p4pq+UvLFt8zveXaqD2x3dJ9y8EAHuZ7sAtSc1a mvsDfVhgPDChcH53Vn3hhpGqJerX0eArI+lE3XvEKoBlFGUyTaGBRprWjfxmitg7zkvS kYaw== X-Forwarded-Encrypted: i=1; AJvYcCUTHU9ME20cGkIFyp2y++AWK+N2VfevcJ6y9gOswrTVxliBqai7m7VcoE1uvhqFiCnXGZVxwtBfGfcsYHg=@vger.kernel.org X-Gm-Message-State: AOJu0YywNaXxbBUHo/AgYAZP0ADmR7Iq3s9IFVKaH7zzNSMH0dcOYLnv HNiQqwQwa8/AZ0+tWplM9CZegYHP491efFzqPhJ7B4nBGLJZdGDQNLuXrrijmhq6LX/MobUvi64 BeVr6og7g8w== X-Google-Smtp-Source: AGHT+IG3oJQa/osDAx4C4yoEYcgK5DMss7382VSjjjmLSJIiUVO5dapkoO2JxUJjE0I+441HEDp++UOmFH6O X-Received: from dybhf13.prod.google.com ([2002:a05:7301:2a0d:b0:2b0:4a35:713f]) (user=irogers job=prod-delivery.src-stubby-dispatcher) by 2002:a05:7301:1e8f:b0:2ae:5d3b:e1c6 with SMTP id 5a478bee46e88-2b17d31c5a3mr17709461eec.21.1768104832844; Sat, 10 Jan 2026 20:13:52 -0800 (PST) Date: Sat, 10 Jan 2026 20:13:36 -0800 In-Reply-To: <20260111041338.1817056-1-irogers@google.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Mime-Version: 1.0 References: <20260111041338.1817056-1-irogers@google.com> X-Mailer: git-send-email 2.52.0.457.g6b5491de43-goog Message-ID: <20260111041338.1817056-6-irogers@google.com> Subject: [PATCH v3 5/7] perf callchain: Fix srcline printing with inlines From: Ian Rogers To: Tony Jones , Peter Zijlstra , Ingo Molnar , Arnaldo Carvalho de Melo , Namhyung Kim , Alexander Shishkin , Jiri Olsa , Ian Rogers , Adrian Hunter , James Clark , Howard Chu , Stephen Brennan , linux-kernel@vger.kernel.org, linux-perf-users@vger.kernel.org Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" sample__fprintf_callchain was using map__fprintf_srcline which won't report inline line numbers. Fix by using the srcline from the callchain and falling back to the map variant. Signed-off-by: Ian Rogers Fixes: 25da4fab5f66 ("perf evsel: Move fprintf methods to separate source f= ile") Reviewed-by: James Clark --- tools/perf/util/evsel_fprintf.c | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/tools/perf/util/evsel_fprintf.c b/tools/perf/util/evsel_fprint= f.c index 10f1a03c2860..5521d00bff2c 100644 --- a/tools/perf/util/evsel_fprintf.c +++ b/tools/perf/util/evsel_fprintf.c @@ -185,8 +185,12 @@ int sample__fprintf_callchain(struct perf_sample *samp= le, int left_alignment, if (print_dso && (!sym || !sym->inlined)) printed +=3D map__fprintf_dsoname_dsoff(map, print_dsoff, addr, fp); =20 - if (print_srcline) - printed +=3D map__fprintf_srcline(map, addr, "\n ", fp); + if (print_srcline) { + if (node->srcline) + printed +=3D fprintf(fp, "\n %s", node->srcline); + else + printed +=3D map__fprintf_srcline(map, addr, "\n ", fp); + } =20 if (sym && sym->inlined) printed +=3D fprintf(fp, " (inlined)"); --=20 2.52.0.457.g6b5491de43-goog From nobody Sat Feb 7 18:21:20 2026 Received: from mail-dl1-f74.google.com (mail-dl1-f74.google.com [74.125.82.74]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 0552522A4E8 for ; Sun, 11 Jan 2026 04:13:56 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=74.125.82.74 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1768104840; cv=none; b=nMR07XxXuDxpXnwDcBt72v352OMJfQoD60/XnHRql90AgYhlZo4EWuAxeaJeO9NeKZXjAe6jR5SwygmJXoeRL05qhPEjWpoK4IOrpabIZfvIm8V+UTDO2uGuIuiJv299Tv9q6yAsyN7H2fnm8NLYLsDk0wNJ/Q8zdrKkvyrxJLY= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1768104840; c=relaxed/simple; bh=uzEtsFy0IeVG96C7cTzkE8RkZxzyVZ3pUWgMlhMyoDA=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Content-Type; b=Kw+9Ttp5kZhn/V+zvzY7f84OwGIKaA5neI38Opevx1+tcyGt9NvKmt0/jBbEYYeXwaf93ObZHadT31cxonYmbT/prwlYlkt0ikHrnI+e0UucMu+Qo6wg3Ukna96Pd6YVyR9Ceshu1kRxm1pCzM/B7AwolCt8+97i2G2IO5xf11o= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com; spf=pass smtp.mailfrom=flex--irogers.bounces.google.com; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b=TGBkBJFd; arc=none smtp.client-ip=74.125.82.74 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=flex--irogers.bounces.google.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b="TGBkBJFd" Received: by mail-dl1-f74.google.com with SMTP id a92af1059eb24-119e80a89b1so405710c88.0 for ; Sat, 10 Jan 2026 20:13:56 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20230601; t=1768104835; x=1768709635; darn=vger.kernel.org; h=to:from:subject:message-id:references:mime-version:in-reply-to:date :from:to:cc:subject:date:message-id:reply-to; bh=ocxcW+CrbKRyA7dscXnknw+e+BoFyfbyTfcxor6PA9I=; b=TGBkBJFdxrBFu+92SS/tX4RKMwD/i/W4i0pbuqFpVkt/QAhrM+xiOvKw+TDsM8y13A izKHGreNyd4/3r6ScsEn4pca8bvAjHQBp2ulyH0G414jJQVkGX9BERMlsRw89wTK6nmn p0qgSOIBbtXNPtjNrqWXFTINUOoiKG2kxtdXL1fdri/TnMOhxdOVid3moCSZSd5PPWbd imaQtGeTmbAAi5zVS2H7rle2WPez2GMdXKbCBxq9+ceTcrX87Lh+4TVAOLZL9tth2i9W KWGVvnduN935gwqFYRYpbnFERs13922i10HbiF3U6SSDH6nkknmp0jN6V1OlAwAAMUMF aVfQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1768104835; x=1768709635; h=to:from:subject:message-id:references:mime-version:in-reply-to:date :x-gm-message-state:from:to:cc:subject:date:message-id:reply-to; bh=ocxcW+CrbKRyA7dscXnknw+e+BoFyfbyTfcxor6PA9I=; b=LrjOSxb6sLo+iJYFbiW3blk5W2vVElwo0YVCsIzt6RQ/Z9Uu3cfMkTmwv5kBdgrqRb ZprwxKqrcmrJOgEj9i40Ksm9px7GsxsJDXyAxdRlcU55ESDB+tS1SvcYBnJkMgaaMs4K jE+hkQdzHYZmDnGDZEqygp96OLAFddWx46Qh0mxnRf5j6K1YIQB+xBLqlnbxpxgGp1/q ttUakYzMx+4XQ69EX/4yG0h0l5wQDkqlaxaebS20lH4Op2riQSBLt0sZf/dY4rQtb+8+ whW2K1IyM7YxU0ACd7TxjOOcnulVZOtthdcgwZzGfFZw+gq1jyilweuLsPvXs+GbGiDX /XZg== X-Forwarded-Encrypted: i=1; AJvYcCVVGwCfETj7HD7KndHnfMCJ4QrDgZ9FI5ou20Rdyw6c1lj/190oYGMlkBUAA+cJXZDx4lpcYFnKjRIWKXg=@vger.kernel.org X-Gm-Message-State: AOJu0YzPB2uNNESiJjZm1R0+jYSRa9uQAbEIPR9TccEpC1h3YAJTum1v fQTvIe4iozDbZM2M6fCSNvHiDEl3qTw+74mGoSuDTB6JIUxg5VtwdSPlLG3pGuRhKggXQhhK0Zt StkjzpjGgJQ== X-Google-Smtp-Source: AGHT+IHtQ5dHNzSN22wy2BFoSUc/G0rGe/XCGDJa1Gk7SFJy76Ug5vah4X2Q+c0F0Mhtu0OSHWM5rSiq9z7N X-Received: from dlbeg28.prod.google.com ([2002:a05:7022:f9c:b0:11f:3ccd:73d7]) (user=irogers job=prod-delivery.src-stubby-dispatcher) by 2002:a05:7022:305:b0:121:9f05:7e4c with SMTP id a92af1059eb24-121f8ae6090mr13455768c88.16.1768104835073; Sat, 10 Jan 2026 20:13:55 -0800 (PST) Date: Sat, 10 Jan 2026 20:13:37 -0800 In-Reply-To: <20260111041338.1817056-1-irogers@google.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Mime-Version: 1.0 References: <20260111041338.1817056-1-irogers@google.com> X-Mailer: git-send-email 2.52.0.457.g6b5491de43-goog Message-ID: <20260111041338.1817056-7-irogers@google.com> Subject: [PATCH v3 6/7] perf test workload: Add inlineloop test workload From: Ian Rogers To: Tony Jones , Peter Zijlstra , Ingo Molnar , Arnaldo Carvalho de Melo , Namhyung Kim , Alexander Shishkin , Jiri Olsa , Ian Rogers , Adrian Hunter , James Clark , Howard Chu , Stephen Brennan , linux-kernel@vger.kernel.org, linux-perf-users@vger.kernel.org Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" The purpose of this workload is to gather samples in an inlined function. This can be used to test whether inlined addr2line works correctly. Signed-off-by: Ian Rogers Reviewed-by: James Clark --- tools/perf/tests/builtin-test.c | 1 + tools/perf/tests/tests.h | 1 + tools/perf/tests/workloads/Build | 2 + tools/perf/tests/workloads/inlineloop.c | 52 +++++++++++++++++++++++++ 4 files changed, 56 insertions(+) create mode 100644 tools/perf/tests/workloads/inlineloop.c diff --git a/tools/perf/tests/builtin-test.c b/tools/perf/tests/builtin-tes= t.c index bd6ffa8e4578..e2490652f030 100644 --- a/tools/perf/tests/builtin-test.c +++ b/tools/perf/tests/builtin-test.c @@ -153,6 +153,7 @@ static struct test_workload *workloads[] =3D { &workload__datasym, &workload__landlock, &workload__traploop, + &workload__inlineloop, }; =20 #define workloads__for_each(workload) \ diff --git a/tools/perf/tests/tests.h b/tools/perf/tests/tests.h index cb67ddbd0375..1f0f8b267fb1 100644 --- a/tools/perf/tests/tests.h +++ b/tools/perf/tests/tests.h @@ -240,6 +240,7 @@ DECLARE_WORKLOAD(brstack); DECLARE_WORKLOAD(datasym); DECLARE_WORKLOAD(landlock); DECLARE_WORKLOAD(traploop); +DECLARE_WORKLOAD(inlineloop); =20 extern const char *dso_to_test; extern const char *test_objdump_path; diff --git a/tools/perf/tests/workloads/Build b/tools/perf/tests/workloads/= Build index fb1012cc4fc3..866a00bd14a0 100644 --- a/tools/perf/tests/workloads/Build +++ b/tools/perf/tests/workloads/Build @@ -8,9 +8,11 @@ perf-test-y +=3D brstack.o perf-test-y +=3D datasym.o perf-test-y +=3D landlock.o perf-test-y +=3D traploop.o +perf-test-y +=3D inlineloop.o =20 CFLAGS_sqrtloop.o =3D -g -O0 -fno-inline -U_FORTIFY_SOURCE CFLAGS_leafloop.o =3D -g -O0 -fno-inline -fno-omit-frame-pointer -= U_FORTIFY_SOURCE CFLAGS_brstack.o =3D -g -O0 -fno-inline -U_FORTIFY_SOURCE CFLAGS_datasym.o =3D -g -O0 -fno-inline -U_FORTIFY_SOURCE CFLAGS_traploop.o =3D -g -O0 -fno-inline -U_FORTIFY_SOURCE +CFLAGS_inlineloop.o =3D -g -O2 diff --git a/tools/perf/tests/workloads/inlineloop.c b/tools/perf/tests/wor= kloads/inlineloop.c new file mode 100644 index 000000000000..bc82dfc7c410 --- /dev/null +++ b/tools/perf/tests/workloads/inlineloop.c @@ -0,0 +1,52 @@ +// SPDX-License-Identifier: GPL-2.0 +#include +#include +#include +#include +#include +#include "../tests.h" + +static volatile int a; +static volatile sig_atomic_t done; + +static void sighandler(int sig __maybe_unused) +{ + done =3D 1; +} + +static inline void __attribute__((always_inline)) leaf(int b) +{ +again: + a +=3D b; + if (!done) + goto again; +} + +static inline void __attribute__((always_inline)) middle(int b) +{ + leaf(b); +} + +static noinline void parent(int b) +{ + middle(b); +} + +static int inlineloop(int argc, const char **argv) +{ + int sec =3D 1; + + pthread_setname_np(pthread_self(), "perf-inlineloop"); + if (argc > 0) + sec =3D atoi(argv[0]); + + signal(SIGINT, sighandler); + signal(SIGALRM, sighandler); + alarm(sec); + + parent(sec); + + return 0; +} + +DEFINE_WORKLOAD(inlineloop); --=20 2.52.0.457.g6b5491de43-goog From nobody Sat Feb 7 18:21:20 2026 Received: from mail-dl1-f73.google.com (mail-dl1-f73.google.com [74.125.82.73]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 87C8122068A for ; Sun, 11 Jan 2026 04:13:57 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=74.125.82.73 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1768104842; cv=none; b=reD44XPV8bKVuHOqbvagpORZ02uPY8tssbpVfXYZ5XrQbCU4kFK0HwxWs7J+jArlvCdC9k4zo/ieWZjzmei5jiLnRpNZw51zeqkCvu9n5qf8uJSnzLzYF2IZ4rPxGFuEkniYohz1pFL/LBBLWvmZHST11QjxMxPJUUx2vvwxBp0= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1768104842; c=relaxed/simple; bh=p9yZjdPOVlIsrzsRvdNrHY7nRPFeaZefQijhYmOqz0Q=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Content-Type; b=eSR8BEYdEY3z4UWdgYMH3z79hXXdjAPkY2Z48kQwCc6VYFzZpvNeoHFhGH/NLE3VSURXI8rACrtN3C/E69yM8Ody1ElhgVR6eVZvfmFTSL+4AIz9rr+uJkI1u+UoEQpxp0gp/NErmQ/2BVRMgsvWDbrk8BfWqT6TItbfsAlZ3V8= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com; spf=pass smtp.mailfrom=flex--irogers.bounces.google.com; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b=UdATJq/m; arc=none smtp.client-ip=74.125.82.73 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=flex--irogers.bounces.google.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b="UdATJq/m" Received: by mail-dl1-f73.google.com with SMTP id a92af1059eb24-11f3b54cfdeso3726495c88.1 for ; Sat, 10 Jan 2026 20:13:57 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20230601; t=1768104837; x=1768709637; darn=vger.kernel.org; h=to:from:subject:message-id:references:mime-version:in-reply-to:date :from:to:cc:subject:date:message-id:reply-to; bh=Y1L+OOdkfbYNneXDpVeIu9zEur50u8G+yPfcpgNFE0M=; b=UdATJq/mfhkTPY2vUbXCll4Y8SaP/zd75+og9dM3mLie9urL58/PMh6L8VlCWFZutD awe20MMQg85FFXaYSidki8cNuxuV1zuVtyLCplGBwiPArtoHV7Afl11OMbmVedrYJidX ZI+bPX4oYaEoSz/c+gBL4KuVFdg0J/ml1gJ/FEO3vcneuCerLpf00ikL01wBpG+0EY/7 gGMYxEhHDyqi8fiSqauKqWzCIdVX+oCts6pUT/jnECPOLKgoNDyVyc/bUBxw6Mu59MOr 3VUidQNW7vUdBH2vH5RP+DAVIu1xt4glFwfyFRfxCloEGCoAVNl3FMQV56/iGQlaMrt2 2+3g== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1768104837; x=1768709637; h=to:from:subject:message-id:references:mime-version:in-reply-to:date :x-gm-message-state:from:to:cc:subject:date:message-id:reply-to; bh=Y1L+OOdkfbYNneXDpVeIu9zEur50u8G+yPfcpgNFE0M=; b=XPuRifUvfpQ6wtl3vXfF74zTEJZy9Yb5s3E/ohr0WszWv5MWankq98Y+vDVLUaAUdO MCFu39ps2Kv+M/eP9Twx1CTfKvsd26CFlgIFokSZnablsLGyTscrG6VDuK+iK+liiLpb oB87FMaaXPnbVjIf8f9Da9Vxq2frSmrcdHBixbMC5Khk04kO6fqPcpqsnArTouzrSuVe BXTRoJ90xbSv+U4ferLlM1rmj9AjyQBxk32sizNo3NgXAKVErvcfKcNJQOv1Tq2ilCGN FTEPij0kGzjGVae9IgPxWIuspUZMuUtB+dzogFqPoYfZUuhwiRjNReT76pYFg3GqfPH6 xE6Q== X-Forwarded-Encrypted: i=1; AJvYcCUit3YpmchTTyw8/JJRMLdjjzh/o1Foh0VsP4Dp2RgnCSRBAMwBtgB91H+X+E1SShF0oJZyjE7ds/3cIIg=@vger.kernel.org X-Gm-Message-State: AOJu0YzntiR/OCTrRa45HsWE9SnwPjpWR79ycnxh9xC11UK4QnolxwJ3 sTjCjPRVNAY+VV+6ty86Yl2AMeYBb/AEeBMPx7ooxhPacN1KkVGWVWqt6Ntw73Px/hCaPq1Fb0d kHXEZUxPAiw== X-Google-Smtp-Source: AGHT+IG7oQJLlfvzPaq+7w4x6ycZ6l1X9tfmyrFcP81QUSW0dg2K1VCSEQsQrQ67Jgi2uDMIkWxDY+5WgVEl X-Received: from dyhb22.prod.google.com ([2002:a05:7300:1496:b0:2ac:2c66:7180]) (user=irogers job=prod-delivery.src-stubby-dispatcher) by 2002:a05:7022:160a:b0:11b:9386:8273 with SMTP id a92af1059eb24-121f8b9aa3amr13458538c88.48.1768104836720; Sat, 10 Jan 2026 20:13:56 -0800 (PST) Date: Sat, 10 Jan 2026 20:13:38 -0800 In-Reply-To: <20260111041338.1817056-1-irogers@google.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Mime-Version: 1.0 References: <20260111041338.1817056-1-irogers@google.com> X-Mailer: git-send-email 2.52.0.457.g6b5491de43-goog Message-ID: <20260111041338.1817056-8-irogers@google.com> Subject: [PATCH v3 7/7] perf test: Test addr2line unwinding works with inline functions From: Ian Rogers To: Tony Jones , Peter Zijlstra , Ingo Molnar , Arnaldo Carvalho de Melo , Namhyung Kim , Alexander Shishkin , Jiri Olsa , Ian Rogers , Adrian Hunter , James Clark , Howard Chu , Stephen Brennan , linux-kernel@vger.kernel.org, linux-perf-users@vger.kernel.org Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Add a test that seeks to see inline functions correctly displayed in perf script from the inlineloop workload. Signed-off-by: Ian Rogers Reviewed-by: James Clark --- tools/perf/tests/shell/addr2line_inlines.sh | 47 +++++++++++++++++++++ 1 file changed, 47 insertions(+) create mode 100755 tools/perf/tests/shell/addr2line_inlines.sh diff --git a/tools/perf/tests/shell/addr2line_inlines.sh b/tools/perf/tests= /shell/addr2line_inlines.sh new file mode 100755 index 000000000000..4a5b6f5be23d --- /dev/null +++ b/tools/perf/tests/shell/addr2line_inlines.sh @@ -0,0 +1,47 @@ +#!/bin/bash +# test addr2line inline unwinding +# SPDX-License-Identifier: GPL-2.0 + +set -e + +err=3D0 +test_dir=3D$(mktemp -d /tmp/perf-test-inline-addr2line.XXXXXXXXXX) +perf_data=3D"${test_dir}/perf.data" +perf_script_txt=3D"${test_dir}/perf_script.txt" + +cleanup() { + rm -rf "${test_dir}" + trap - EXIT TERM INT +} + +trap_cleanup() { + echo "Unexpected signal in ${FUNCNAME[1]}" + cleanup + exit 1 +} +trap trap_cleanup EXIT TERM INT + +test_inlinedloop() { + echo "Inline unwinding verification test" + # Record data. Currently only dwarf callchains support inlined functio= ns. + perf record --call-graph dwarf -e task-clock:u -o "${perf_data}" -- pe= rf test -w inlineloop 1 + + # Check output with inline (default) and srcline + perf script -i "${perf_data}" --fields +srcline > "${perf_script_txt}" + + # Expect the leaf and middle functions to occur on lines in the 20s, w= ith + # the non-inlined parent function on a line in the 30s. + if grep -q "inlineloop.c:2. (inlined)" "${perf_script_txt}" && + grep -q "inlineloop.c:3.$" "${perf_script_txt}" + then + echo "Inline unwinding verification test [Success]" + else + echo "Inline unwinding verification test [Failed missing inlined f= unctions]" + err=3D1 + fi +} + +test_inlinedloop + +cleanup +exit $err --=20 2.52.0.457.g6b5491de43-goog