tools/perf/util/llvm.c | 9 +++++++++ 1 file changed, 9 insertions(+)
An error returned from a failed backend will cause perf to call the next
backend. If the error happens mid-function, e.g. due to an unrecognized
instruction, we will end up with duplicated instructions in the output
unless the backend that failed deletes any instructions that it created
before failing. The capstone backend was already doing this but the LLVM
backend was not; fix it.
Link: https://linux-review.googlesource.com/id/I377eef3cd662ab98fbcd69e5004a259fa3d7aa06
Signed-off-by: Peter Collingbourne <pcc@google.com>
---
tools/perf/util/llvm.c | 9 +++++++++
1 file changed, 9 insertions(+)
diff --git a/tools/perf/util/llvm.c b/tools/perf/util/llvm.c
index 0d126d233c019..87fceae8488a7 100644
--- a/tools/perf/util/llvm.c
+++ b/tools/perf/util/llvm.c
@@ -261,6 +261,15 @@ int symbol__disassemble_llvm(const char *filename, struct symbol *sym,
ret = 0;
err:
+ if (ret != 0) {
+ struct disasm_line *tmp;
+
+ list_for_each_entry_safe(dl, tmp, ¬es->src->source,
+ al.node) {
+ list_del(&dl->al.node);
+ disasm_line__free(dl);
+ }
+ }
LLVMDisasmDispose(disasm);
free(code_buf);
free(line_storage);
--
2.53.0.473.g4a7958ca14-goog
On Tue, Mar 3, 2026 at 3:00 PM Peter Collingbourne <pcc@google.com> wrote:
>
> An error returned from a failed backend will cause perf to call the next
> backend. If the error happens mid-function, e.g. due to an unrecognized
> instruction, we will end up with duplicated instructions in the output
> unless the backend that failed deletes any instructions that it created
> before failing. The capstone backend was already doing this but the LLVM
> backend was not; fix it.
>
> Link: https://linux-review.googlesource.com/id/I377eef3cd662ab98fbcd69e5004a259fa3d7aa06
> Signed-off-by: Peter Collingbourne <pcc@google.com>
Reviewed-by: Ian Rogers <irogers@google.com>
Thanks,
Ian
> ---
> tools/perf/util/llvm.c | 9 +++++++++
> 1 file changed, 9 insertions(+)
>
> diff --git a/tools/perf/util/llvm.c b/tools/perf/util/llvm.c
> index 0d126d233c019..87fceae8488a7 100644
> --- a/tools/perf/util/llvm.c
> +++ b/tools/perf/util/llvm.c
> @@ -261,6 +261,15 @@ int symbol__disassemble_llvm(const char *filename, struct symbol *sym,
> ret = 0;
>
> err:
> + if (ret != 0) {
> + struct disasm_line *tmp;
> +
> + list_for_each_entry_safe(dl, tmp, ¬es->src->source,
> + al.node) {
> + list_del(&dl->al.node);
> + disasm_line__free(dl);
> + }
> + }
> LLVMDisasmDispose(disasm);
> free(code_buf);
> free(line_storage);
> --
> 2.53.0.473.g4a7958ca14-goog
>
On Tue, Mar 3, 2026 at 3:29 PM Ian Rogers <irogers@google.com> wrote:
>
> On Tue, Mar 3, 2026 at 3:00 PM Peter Collingbourne <pcc@google.com> wrote:
> >
> > An error returned from a failed backend will cause perf to call the next
> > backend. If the error happens mid-function, e.g. due to an unrecognized
> > instruction, we will end up with duplicated instructions in the output
> > unless the backend that failed deletes any instructions that it created
> > before failing. The capstone backend was already doing this but the LLVM
> > backend was not; fix it.
> >
> > Link: https://linux-review.googlesource.com/id/I377eef3cd662ab98fbcd69e5004a259fa3d7aa06
> > Signed-off-by: Peter Collingbourne <pcc@google.com>
>
> Reviewed-by: Ian Rogers <irogers@google.com>
Thanks for the review. I guess this one should have also had
Fixes: 048856817888 ("perf annotate: LLVM-based disassembler")
Peter
On Wed, Mar 04, 2026 at 01:10:02PM -0800, Peter Collingbourne wrote:
> On Tue, Mar 3, 2026 at 3:29 PM Ian Rogers <irogers@google.com> wrote:
> >
> > On Tue, Mar 3, 2026 at 3:00 PM Peter Collingbourne <pcc@google.com> wrote:
> > >
> > > An error returned from a failed backend will cause perf to call the next
> > > backend. If the error happens mid-function, e.g. due to an unrecognized
> > > instruction, we will end up with duplicated instructions in the output
> > > unless the backend that failed deletes any instructions that it created
> > > before failing. The capstone backend was already doing this but the LLVM
> > > backend was not; fix it.
> > >
> > > Link: https://linux-review.googlesource.com/id/I377eef3cd662ab98fbcd69e5004a259fa3d7aa06
> > > Signed-off-by: Peter Collingbourne <pcc@google.com>
> >
> > Reviewed-by: Ian Rogers <irogers@google.com>
>
> Thanks for the review. I guess this one should have also had
>
> Fixes: 048856817888 ("perf annotate: LLVM-based disassembler")
Thanks, applied to perf-tools, for v7.0.
- Arnaldo
© 2016 - 2026 Red Hat, Inc.