dev-util/perf: Sync with Gentoo

It's from Gentoo commit 082517b39188d4ac99b349cc7367e1653194b513.
This commit is contained in:
Flatcar Buildbot 2024-10-07 07:05:27 +00:00 committed by Krzesimir Nowak
parent cc9a283b53
commit ad1d785847
6 changed files with 604 additions and 157 deletions

View File

@ -1,4 +1,4 @@
DIST linux-6.10.tar.xz 145142812 BLAKE2B bb243ea7493b9d63aa2df2050a3f1ae2b89ee84a20015239cf157e3f4f51c7ac5efedc8a51132b2d7482f9276ac418de6624831c8a3b806130d9c2d2124c539b SHA512 baa2487954044f991d2ae254d77d14a1f0185dd62c9f0fcaff69f586c9f906823017b8db1c4588f27b076dfa3ebb606929fec859f60ea419e7974330b9289cc2
DIST linux-6.3.tar.xz 136891752 BLAKE2B f1887c8924efa8d0cb14c4e604affd0b0168bcf20f56a37c027405c7bc11aba822a43fcb38ccb55a81a26f747d00e1ab5a6554818affbf1e1c7ef5220150fc69 SHA512 768979440f4907ba64d4481b383d6101faf208f27a0b897156123aa278c5743fe3c4f61945b2541429c532d45382aaee8899ea9d44a1d2895bfbb79bfd937f65
DIST linux-6.11.tar.xz 146900704 BLAKE2B e7750c0878d71a56a0ce52d4c4c912199dad5bf5e2e8f872585a6494afbb37cbd852e612a6858936d2dc9b7776a3933818f540db408d57e90d18ea5249bba7ab SHA512 329c1f94008742e3f0c2ce7e591a16316d1b2cb9ea4596d4f45604097e07b7aa2f64afa40630a07f321a858455c77aa32ba57b271932ddcf4dc27863f9081cea
DIST linux-6.7.tar.xz 141406528 BLAKE2B cecdbd19905e43e485ab73b352ced18b37f2a138c97a6956cadcda5d3d271001117dc1cf896b166ff019fc7f405f9539e2ed0d6112b0890efb04d182adf4fd0e SHA512 de06de556191614bd9daf077ae239360352a402bab407748e67f1e5108c92fd933e451707840ab22fe0f9976db3d1e1b60ca9d41cf894f015ca09b3f652b74ad
DIST patch-6.10.4.xz 303168 BLAKE2B d38bbcdd2f730a030add5b38c1ab09c7081c311ed716d3ae976a058dd34b235078700cdff05d79dc93d9badb75c95566a3bdfc39dfa045d54857d82ee2c92e9d SHA512 5f5e8b19d114fed733c8c98a581fe339f8896e05e5da6a37deb1d7d8aa9dd83b3c80a97b1c6f3f51b6f20cca9c435b20c28c2c511da2026980d9fa72624cf420

View File

@ -1,39 +0,0 @@
https://bugs.gentoo.org/904169
--- a/tools/perf/Makefile.config
+++ b/tools/perf/Makefile.config
@@ -309,7 +309,7 @@
CORE_CFLAGS += -Wextra
CORE_CFLAGS += -std=gnu11
-CXXFLAGS += -std=gnu++14 -fno-exceptions -fno-rtti
+CXXFLAGS += -std=gnu++17 -fno-exceptions -fno-rtti
CXXFLAGS += -Wall
CXXFLAGS += -fno-omit-frame-pointer
CXXFLAGS += -ggdb3
--- a/tools/build/feature/Makefile
+++ b/tools/build/feature/Makefile
@@ -339,7 +339,7 @@
$(BUILD)
$(OUTPUT)test-llvm.bin:
- $(BUILDXX) -std=gnu++14 \
+ $(BUILDXX) -std=gnu++17 \
-I$(shell $(LLVM_CONFIG) --includedir) \
-L$(shell $(LLVM_CONFIG) --libdir) \
$(shell $(LLVM_CONFIG) --libs) \
@@ -347,12 +347,12 @@
> $(@:.bin=.make.output) 2>&1
$(OUTPUT)test-llvm-version.bin:
- $(BUILDXX) -std=gnu++14 \
+ $(BUILDXX) -std=gnu++17 \
-I$(shell $(LLVM_CONFIG) --includedir) \
> $(@:.bin=.make.output) 2>&1
$(OUTPUT)test-clang.bin:
- $(BUILDXX) -std=gnu++14 \
+ $(BUILDXX) -std=gnu++17 \
-I$(shell $(LLVM_CONFIG) --includedir) \
-L$(shell $(LLVM_CONFIG) --libdir) \
-lclang-cpp $(shell $(LLVM_CONFIG) --libs) \

View File

@ -1,44 +0,0 @@
Adapt for building against LLVM/Clang with monolithic libraries.
--- a/tools/build/feature/Makefile
+++ b/tools/build/feature/Makefile
@@ -338,7 +338,7 @@ $(OUTPUT)test-llvm.bin:
$(BUILDXX) -std=gnu++14 \
-I$(shell $(LLVM_CONFIG) --includedir) \
-L$(shell $(LLVM_CONFIG) --libdir) \
- $(shell $(LLVM_CONFIG) --libs Core BPF) \
+ $(shell $(LLVM_CONFIG) --libs) \
$(shell $(LLVM_CONFIG) --system-libs) \
> $(@:.bin=.make.output) 2>&1
@@ -351,10 +351,7 @@ $(OUTPUT)test-clang.bin:
$(BUILDXX) -std=gnu++14 \
-I$(shell $(LLVM_CONFIG) --includedir) \
-L$(shell $(LLVM_CONFIG) --libdir) \
- -Wl,--start-group -lclangBasic -lclangDriver \
- -lclangFrontend -lclangEdit -lclangLex \
- -lclangAST -Wl,--end-group \
- $(shell $(LLVM_CONFIG) --libs Core option) \
+ -lclang-cpp $(shell $(LLVM_CONFIG) --libs) \
$(shell $(LLVM_CONFIG) --system-libs) \
> $(@:.bin=.make.output) 2>&1
--- a/tools/perf/Makefile.perf
+++ b/tools/perf/Makefile.perf
@@ -416,14 +416,11 @@ EXTLIBS := $(call filter-out,$(EXCLUDE_EXTLIBS),$(EXTLIBS))
LIBS = -Wl,--whole-archive $(PERFLIBS) $(EXTRA_PERFLIBS) -Wl,--no-whole-archive -Wl,--start-group $(EXTLIBS) -Wl,--end-group
ifeq ($(USE_CLANG), 1)
- CLANGLIBS_LIST = AST Basic CodeGen Driver Frontend Lex Tooling Edit Sema Analysis Parse Serialization
- CLANGLIBS_NOEXT_LIST = $(foreach l,$(CLANGLIBS_LIST),$(shell $(LLVM_CONFIG) --libdir)/libclang$(l))
- LIBCLANG = $(foreach l,$(CLANGLIBS_NOEXT_LIST),$(wildcard $(l).a $(l).so))
- LIBS += -Wl,--start-group $(LIBCLANG) -Wl,--end-group
+ LIBS += -lclang-cpp
endif
ifeq ($(USE_LLVM), 1)
- LIBLLVM = $(shell $(LLVM_CONFIG) --libs all) $(shell $(LLVM_CONFIG) --system-libs)
+ LIBLLVM = $(shell $(LLVM_CONFIG) --libs) $(shell $(LLVM_CONFIG) --system-libs)
LIBS += -L$(shell $(LLVM_CONFIG) --libdir) $(LIBLLVM)
endif

View File

@ -0,0 +1,469 @@
commit ea59b70a8418a313d6f2ab48a957de015fc33018
Author: Arnaldo Carvalho de Melo <acme@redhat.com>
Date: Wed Jul 31 11:58:56 2024 -0300
perf bpf: Move BPF disassembly routines to separate file to avoid clash with capstone bpf headers
There is a clash of the libbpf and capstone libraries, that ends up
with:
In file included from /usr/include/capstone/capstone.h:325,
from util/disasm.c:1513:
/usr/include/capstone/bpf.h:94:14: error: bpf_insn defined as wrong kind of tag
94 | typedef enum bpf_insn {
So far we're just trying to avoid this by not having both headers
included in the same .c or .h file, do it one more time by moving the
BPF diassembly routines from util/disasm.c to util/disasm_bpf.c.
This is only being hit when building with BUILD_NONDISTRO=1, i.e.
building with binutils-devel, that isn't the in the default build due to
a licencing clash. We need to reimplement what is now isolated in
util/disasm_bpf.c using some other library to have BPF annotation
feature that now only is available with BUILD_NONDISTRO=1.
Fixes: 6d17edc113de1e21 ("perf annotate: Use libcapstone to disassemble")
Cc: Adrian Hunter <adrian.hunter@intel.com>
Cc: Ian Rogers <irogers@google.com>
Cc: Jiri Olsa <jolsa@kernel.org>
Cc: Kan Liang <kan.liang@linux.intel.com>
Cc: Namhyung Kim <namhyung@kernel.org>
Link: https://lore.kernel.org/lkml/ZqpUSKPxMwaQKORr@x1
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
diff --git a/tools/perf/util/Build b/tools/perf/util/Build
index 0f18fe81ef0b..b24360c04aae 100644
--- a/tools/perf/util/Build
+++ b/tools/perf/util/Build
@@ -13,6 +13,7 @@ perf-util-y += copyfile.o
perf-util-y += ctype.o
perf-util-y += db-export.o
perf-util-y += disasm.o
+perf-util-y += disasm_bpf.o
perf-util-y += env.o
perf-util-y += event.o
perf-util-y += evlist.o
diff --git a/tools/perf/util/disasm.c b/tools/perf/util/disasm.c
index 410e52cd9cfd..85fb0cfedf94 100644
--- a/tools/perf/util/disasm.c
+++ b/tools/perf/util/disasm.c
@@ -16,6 +16,7 @@
#include "build-id.h"
#include "debug.h"
#include "disasm.h"
+#include "disasm_bpf.h"
#include "dso.h"
#include "env.h"
#include "evsel.h"
@@ -1323,192 +1324,6 @@ static int dso__disassemble_filename(struct dso *dso, char *filename, size_t fil
return 0;
}
-#if defined(HAVE_LIBBFD_SUPPORT) && defined(HAVE_LIBBPF_SUPPORT)
-#define PACKAGE "perf"
-#include <bfd.h>
-#include <dis-asm.h>
-#include <bpf/bpf.h>
-#include <bpf/btf.h>
-#include <bpf/libbpf.h>
-#include <linux/btf.h>
-#include <tools/dis-asm-compat.h>
-
-#include "bpf-event.h"
-#include "bpf-utils.h"
-
-static int symbol__disassemble_bpf(struct symbol *sym,
- struct annotate_args *args)
-{
- struct annotation *notes = symbol__annotation(sym);
- struct bpf_prog_linfo *prog_linfo = NULL;
- struct bpf_prog_info_node *info_node;
- int len = sym->end - sym->start;
- disassembler_ftype disassemble;
- struct map *map = args->ms.map;
- struct perf_bpil *info_linear;
- struct disassemble_info info;
- struct dso *dso = map__dso(map);
- int pc = 0, count, sub_id;
- struct btf *btf = NULL;
- char tpath[PATH_MAX];
- size_t buf_size;
- int nr_skip = 0;
- char *buf;
- bfd *bfdf;
- int ret;
- FILE *s;
-
- if (dso__binary_type(dso) != DSO_BINARY_TYPE__BPF_PROG_INFO)
- return SYMBOL_ANNOTATE_ERRNO__BPF_INVALID_FILE;
-
- pr_debug("%s: handling sym %s addr %" PRIx64 " len %" PRIx64 "\n", __func__,
- sym->name, sym->start, sym->end - sym->start);
-
- memset(tpath, 0, sizeof(tpath));
- perf_exe(tpath, sizeof(tpath));
-
- bfdf = bfd_openr(tpath, NULL);
- if (bfdf == NULL)
- abort();
-
- if (!bfd_check_format(bfdf, bfd_object))
- abort();
-
- s = open_memstream(&buf, &buf_size);
- if (!s) {
- ret = errno;
- goto out;
- }
- init_disassemble_info_compat(&info, s,
- (fprintf_ftype) fprintf,
- fprintf_styled);
- info.arch = bfd_get_arch(bfdf);
- info.mach = bfd_get_mach(bfdf);
-
- info_node = perf_env__find_bpf_prog_info(dso__bpf_prog(dso)->env,
- dso__bpf_prog(dso)->id);
- if (!info_node) {
- ret = SYMBOL_ANNOTATE_ERRNO__BPF_MISSING_BTF;
- goto out;
- }
- info_linear = info_node->info_linear;
- sub_id = dso__bpf_prog(dso)->sub_id;
-
- info.buffer = (void *)(uintptr_t)(info_linear->info.jited_prog_insns);
- info.buffer_length = info_linear->info.jited_prog_len;
-
- if (info_linear->info.nr_line_info)
- prog_linfo = bpf_prog_linfo__new(&info_linear->info);
-
- if (info_linear->info.btf_id) {
- struct btf_node *node;
-
- node = perf_env__find_btf(dso__bpf_prog(dso)->env,
- info_linear->info.btf_id);
- if (node)
- btf = btf__new((__u8 *)(node->data),
- node->data_size);
- }
-
- disassemble_init_for_target(&info);
-
-#ifdef DISASM_FOUR_ARGS_SIGNATURE
- disassemble = disassembler(info.arch,
- bfd_big_endian(bfdf),
- info.mach,
- bfdf);
-#else
- disassemble = disassembler(bfdf);
-#endif
- if (disassemble == NULL)
- abort();
-
- fflush(s);
- do {
- const struct bpf_line_info *linfo = NULL;
- struct disasm_line *dl;
- size_t prev_buf_size;
- const char *srcline;
- u64 addr;
-
- addr = pc + ((u64 *)(uintptr_t)(info_linear->info.jited_ksyms))[sub_id];
- count = disassemble(pc, &info);
-
- if (prog_linfo)
- linfo = bpf_prog_linfo__lfind_addr_func(prog_linfo,
- addr, sub_id,
- nr_skip);
-
- if (linfo && btf) {
- srcline = btf__name_by_offset(btf, linfo->line_off);
- nr_skip++;
- } else
- srcline = NULL;
-
- fprintf(s, "\n");
- prev_buf_size = buf_size;
- fflush(s);
-
- if (!annotate_opts.hide_src_code && srcline) {
- args->offset = -1;
- args->line = strdup(srcline);
- args->line_nr = 0;
- args->fileloc = NULL;
- args->ms.sym = sym;
- dl = disasm_line__new(args);
- if (dl) {
- annotation_line__add(&dl->al,
- &notes->src->source);
- }
- }
-
- args->offset = pc;
- args->line = buf + prev_buf_size;
- args->line_nr = 0;
- args->fileloc = NULL;
- args->ms.sym = sym;
- dl = disasm_line__new(args);
- if (dl)
- annotation_line__add(&dl->al, &notes->src->source);
-
- pc += count;
- } while (count > 0 && pc < len);
-
- ret = 0;
-out:
- free(prog_linfo);
- btf__free(btf);
- fclose(s);
- bfd_close(bfdf);
- return ret;
-}
-#else // defined(HAVE_LIBBFD_SUPPORT) && defined(HAVE_LIBBPF_SUPPORT)
-static int symbol__disassemble_bpf(struct symbol *sym __maybe_unused,
- struct annotate_args *args __maybe_unused)
-{
- return SYMBOL_ANNOTATE_ERRNO__NO_LIBOPCODES_FOR_BPF;
-}
-#endif // defined(HAVE_LIBBFD_SUPPORT) && defined(HAVE_LIBBPF_SUPPORT)
-
-static int
-symbol__disassemble_bpf_image(struct symbol *sym,
- struct annotate_args *args)
-{
- struct annotation *notes = symbol__annotation(sym);
- struct disasm_line *dl;
-
- args->offset = -1;
- args->line = strdup("to be implemented");
- args->line_nr = 0;
- args->fileloc = NULL;
- dl = disasm_line__new(args);
- if (dl)
- annotation_line__add(&dl->al, &notes->src->source);
-
- zfree(&args->line);
- return 0;
-}
-
#ifdef HAVE_LIBCAPSTONE_SUPPORT
#include <capstone/capstone.h>
diff --git a/tools/perf/util/disasm_bpf.c b/tools/perf/util/disasm_bpf.c
new file mode 100644
index 000000000000..1fee71c79b62
--- /dev/null
+++ b/tools/perf/util/disasm_bpf.c
@@ -0,0 +1,195 @@
+// SPDX-License-Identifier: GPL-2.0-only
+
+#include "util/annotate.h"
+#include "util/disasm_bpf.h"
+#include "util/symbol.h"
+#include <linux/zalloc.h>
+#include <string.h>
+
+#if defined(HAVE_LIBBFD_SUPPORT) && defined(HAVE_LIBBPF_SUPPORT)
+#define PACKAGE "perf"
+#include <bfd.h>
+#include <bpf/bpf.h>
+#include <bpf/btf.h>
+#include <bpf/libbpf.h>
+#include <dis-asm.h>
+#include <errno.h>
+#include <linux/btf.h>
+#include <tools/dis-asm-compat.h>
+
+#include "util/bpf-event.h"
+#include "util/bpf-utils.h"
+#include "util/debug.h"
+#include "util/dso.h"
+#include "util/map.h"
+#include "util/env.h"
+#include "util/util.h"
+
+int symbol__disassemble_bpf(struct symbol *sym, struct annotate_args *args)
+{
+ struct annotation *notes = symbol__annotation(sym);
+ struct bpf_prog_linfo *prog_linfo = NULL;
+ struct bpf_prog_info_node *info_node;
+ int len = sym->end - sym->start;
+ disassembler_ftype disassemble;
+ struct map *map = args->ms.map;
+ struct perf_bpil *info_linear;
+ struct disassemble_info info;
+ struct dso *dso = map__dso(map);
+ int pc = 0, count, sub_id;
+ struct btf *btf = NULL;
+ char tpath[PATH_MAX];
+ size_t buf_size;
+ int nr_skip = 0;
+ char *buf;
+ bfd *bfdf;
+ int ret;
+ FILE *s;
+
+ if (dso__binary_type(dso) != DSO_BINARY_TYPE__BPF_PROG_INFO)
+ return SYMBOL_ANNOTATE_ERRNO__BPF_INVALID_FILE;
+
+ pr_debug("%s: handling sym %s addr %" PRIx64 " len %" PRIx64 "\n", __func__,
+ sym->name, sym->start, sym->end - sym->start);
+
+ memset(tpath, 0, sizeof(tpath));
+ perf_exe(tpath, sizeof(tpath));
+
+ bfdf = bfd_openr(tpath, NULL);
+ if (bfdf == NULL)
+ abort();
+
+ if (!bfd_check_format(bfdf, bfd_object))
+ abort();
+
+ s = open_memstream(&buf, &buf_size);
+ if (!s) {
+ ret = errno;
+ goto out;
+ }
+ init_disassemble_info_compat(&info, s,
+ (fprintf_ftype) fprintf,
+ fprintf_styled);
+ info.arch = bfd_get_arch(bfdf);
+ info.mach = bfd_get_mach(bfdf);
+
+ info_node = perf_env__find_bpf_prog_info(dso__bpf_prog(dso)->env,
+ dso__bpf_prog(dso)->id);
+ if (!info_node) {
+ ret = SYMBOL_ANNOTATE_ERRNO__BPF_MISSING_BTF;
+ goto out;
+ }
+ info_linear = info_node->info_linear;
+ sub_id = dso__bpf_prog(dso)->sub_id;
+
+ info.buffer = (void *)(uintptr_t)(info_linear->info.jited_prog_insns);
+ info.buffer_length = info_linear->info.jited_prog_len;
+
+ if (info_linear->info.nr_line_info)
+ prog_linfo = bpf_prog_linfo__new(&info_linear->info);
+
+ if (info_linear->info.btf_id) {
+ struct btf_node *node;
+
+ node = perf_env__find_btf(dso__bpf_prog(dso)->env,
+ info_linear->info.btf_id);
+ if (node)
+ btf = btf__new((__u8 *)(node->data),
+ node->data_size);
+ }
+
+ disassemble_init_for_target(&info);
+
+#ifdef DISASM_FOUR_ARGS_SIGNATURE
+ disassemble = disassembler(info.arch,
+ bfd_big_endian(bfdf),
+ info.mach,
+ bfdf);
+#else
+ disassemble = disassembler(bfdf);
+#endif
+ if (disassemble == NULL)
+ abort();
+
+ fflush(s);
+ do {
+ const struct bpf_line_info *linfo = NULL;
+ struct disasm_line *dl;
+ size_t prev_buf_size;
+ const char *srcline;
+ u64 addr;
+
+ addr = pc + ((u64 *)(uintptr_t)(info_linear->info.jited_ksyms))[sub_id];
+ count = disassemble(pc, &info);
+
+ if (prog_linfo)
+ linfo = bpf_prog_linfo__lfind_addr_func(prog_linfo,
+ addr, sub_id,
+ nr_skip);
+
+ if (linfo && btf) {
+ srcline = btf__name_by_offset(btf, linfo->line_off);
+ nr_skip++;
+ } else
+ srcline = NULL;
+
+ fprintf(s, "\n");
+ prev_buf_size = buf_size;
+ fflush(s);
+
+ if (!annotate_opts.hide_src_code && srcline) {
+ args->offset = -1;
+ args->line = strdup(srcline);
+ args->line_nr = 0;
+ args->fileloc = NULL;
+ args->ms.sym = sym;
+ dl = disasm_line__new(args);
+ if (dl) {
+ annotation_line__add(&dl->al,
+ &notes->src->source);
+ }
+ }
+
+ args->offset = pc;
+ args->line = buf + prev_buf_size;
+ args->line_nr = 0;
+ args->fileloc = NULL;
+ args->ms.sym = sym;
+ dl = disasm_line__new(args);
+ if (dl)
+ annotation_line__add(&dl->al, &notes->src->source);
+
+ pc += count;
+ } while (count > 0 && pc < len);
+
+ ret = 0;
+out:
+ free(prog_linfo);
+ btf__free(btf);
+ fclose(s);
+ bfd_close(bfdf);
+ return ret;
+}
+#else // defined(HAVE_LIBBFD_SUPPORT) && defined(HAVE_LIBBPF_SUPPORT)
+int symbol__disassemble_bpf(struct symbol *sym __maybe_unused, struct annotate_args *args __maybe_unused)
+{
+ return SYMBOL_ANNOTATE_ERRNO__NO_LIBOPCODES_FOR_BPF;
+}
+#endif // defined(HAVE_LIBBFD_SUPPORT) && defined(HAVE_LIBBPF_SUPPORT)
+
+int symbol__disassemble_bpf_image(struct symbol *sym, struct annotate_args *args)
+{
+ struct annotation *notes = symbol__annotation(sym);
+ struct disasm_line *dl;
+
+ args->offset = -1;
+ args->line = strdup("to be implemented");
+ args->line_nr = 0;
+ args->fileloc = NULL;
+ dl = disasm_line__new(args);
+ if (dl)
+ annotation_line__add(&dl->al, &notes->src->source);
+
+ zfree(&args->line);
+ return 0;
+}
diff --git a/tools/perf/util/disasm_bpf.h b/tools/perf/util/disasm_bpf.h
new file mode 100644
index 000000000000..2ecb19545388
--- /dev/null
+++ b/tools/perf/util/disasm_bpf.h
@@ -0,0 +1,12 @@
+// SPDX-License-Identifier: GPL-2.0-only
+
+#ifndef __PERF_DISASM_BPF_H
+#define __PERF_DISASM_BPF_H
+
+struct symbol;
+struct annotate_args;
+
+int symbol__disassemble_bpf(struct symbol *sym, struct annotate_args *args);
+int symbol__disassemble_bpf_image(struct symbol *sym, struct annotate_args *args);
+
+#endif /* __PERF_DISASM_BPF_H */

View File

@ -17,7 +17,6 @@
<flag name="bpf">Enable support for eBPF features with <pkg>dev-libs/libbpf</pkg></flag>
<flag name="babeltrace">Enable <pkg>dev-util/babeltrace</pkg> support</flag>
<flag name="capstone">Use <pkg>dev-libs/capstone</pkg> for disassembly support</flag>
<flag name="clang">Enable builtin clang and LLVM support</flag>
<flag name="doc">
Build documentation and man pages. With this USE flag disabled,
the --help parameter for perf and its sub-tools will not be

View File

@ -1,10 +1,11 @@
# Copyright 1999-2024 Gentoo Authors
# Distributed under the terms of the GNU General Public License v2
EAPI=7
EAPI=8
PYTHON_COMPAT=( python3_{10..11} )
inherit bash-completion-r1 estack flag-o-matic llvm toolchain-funcs python-r1 linux-info
LLVM_COMPAT=( {16..19} )
PYTHON_COMPAT=( python3_{10..13} )
inherit bash-completion-r1 estack flag-o-matic linux-info llvm-r1 toolchain-funcs python-r1
DESCRIPTION="Userland tools for Linux Performance Counters"
HOMEPAGE="https://perf.wiki.kernel.org/"
@ -33,10 +34,12 @@ S="${S_K}/tools/perf"
LICENSE="GPL-2"
SLOT="0"
KEYWORDS="amd64 arm arm64 ppc ppc64 ~riscv x86 ~amd64-linux ~x86-linux"
IUSE="audit babeltrace clang crypt debug +doc gtk java libpfm lzma numa perl python slang systemtap unwind zlib zstd"
KEYWORDS="~alpha ~amd64 ~arm ~arm64 ~loong ~ppc ~ppc64 ~riscv ~x86 ~amd64-linux ~x86-linux"
IUSE="abi_mips_o32 abi_mips_n32 abi_mips_n64 audit babeltrace capstone big-endian bpf caps crypt debug +doc gtk java libpfm +libtraceevent +libtracefs lzma numa perl python slang systemtap tcmalloc unwind zstd"
REQUIRED_USE="${PYTHON_REQUIRED_USE}"
REQUIRED_USE="
${PYTHON_REQUIRED_USE}
"
# setuptools (and Python) are always needed even if not building Python bindings
BDEPEND="
@ -55,35 +58,46 @@ BDEPEND="
)
"
RDEPEND="audit? ( sys-process/audit )
babeltrace? ( dev-util/babeltrace )
crypt? ( virtual/libcrypt:= )
clang? (
sys-devel/clang:=
sys-devel/llvm:=
RDEPEND="
audit? ( sys-process/audit )
babeltrace? ( dev-util/babeltrace:0/1 )
bpf? (
dev-libs/libbpf
dev-util/bpftool
dev-util/pahole
$(llvm_gen_dep '
sys-devel/clang:${LLVM_SLOT}=
sys-devel/llvm:${LLVM_SLOT}=
')
)
caps? ( sys-libs/libcap )
capstone? ( dev-libs/capstone )
crypt? ( dev-libs/openssl:= )
gtk? ( x11-libs/gtk+:2 )
java? ( virtual/jre:* )
libpfm? ( dev-libs/libpfm )
libpfm? ( dev-libs/libpfm:= )
libtraceevent? ( dev-libs/libtraceevent )
libtracefs? ( dev-libs/libtracefs )
lzma? ( app-arch/xz-utils )
numa? ( sys-process/numactl )
perl? ( dev-lang/perl:= )
python? ( ${PYTHON_DEPS} )
slang? ( sys-libs/slang )
systemtap? ( dev-debug/systemtap )
unwind? ( sys-libs/libunwind )
zlib? ( sys-libs/zlib )
zstd? ( app-arch/zstd )
tcmalloc? ( dev-util/google-perftools )
unwind? ( sys-libs/libunwind:= )
zstd? ( app-arch/zstd:= )
dev-libs/elfutils
sys-libs/binutils-libs:="
sys-libs/binutils-libs:=
sys-libs/zlib
virtual/libcrypt
"
DEPEND="${RDEPEND}
>=sys-kernel/linux-headers-5.10
java? ( virtual/jdk )
"
CONFIG_CHECK="~PERF_EVENTS ~KALLSYMS"
QA_FLAGS_IGNORED=(
'usr/bin/perf-read-vdso32' # not linked with anything except for libc
'usr/libexec/perf-core/dlfilters/.*' # plugins
@ -98,18 +112,40 @@ pkg_pretend() {
}
pkg_setup() {
use clang && llvm_pkg_setup
local CONFIG_CHECK="
~DEBUG_INFO
~FTRACE
~FTRACE_SYSCALLS
~FUNCTION_TRACER
~KALLSYMS
~KALLSYMS_ALL
~KPROBES
~KPROBE_EVENTS
~PERF_EVENTS
~UPROBES
~UPROBE_EVENTS
"
use bpf && llvm-r1_pkg_setup
# We enable python unconditionally as libbpf always generates
# API headers using python script
python_setup
if use bpf ; then
CONFIG_CHECK+="~BPF ~BPF_EVENTS ~BPF_SYSCALL ~DEBUG_INFO_BTF ~HAVE_EBPF_JIT"
fi
linux-info_pkg_setup
}
# src_unpack and src_prepare are copied to dev-util/bpftool since
# it's building from the same tarball, please keep it in sync with bpftool
src_unpack() {
local paths=(
tools/arch tools/build tools/include tools/lib tools/perf tools/scripts
scripts include lib "arch/*/lib"
'arch/*/include/*' 'arch/*/lib/*' 'arch/*/tools/*' 'include/*'
'kernel/bpf/*' 'lib/*' 'scripts/*' 'tools/arch/*' 'tools/bpf/*'
'tools/build/*' 'tools/include/*' 'tools/lib/*' 'tools/perf/*'
'tools/scripts/*'
)
# We expect the tar implementation to support the -j option (both
@ -121,9 +157,10 @@ src_unpack() {
if [[ -n ${LINUX_PATCH} ]] ; then
eshopts_push -o noglob
ebegin "Filtering partial source patch"
filterdiff -p1 ${paths[@]/#/-i } -z "${DISTDIR}"/${LINUX_PATCH} \
> ${P}.patch
xzcat "${DISTDIR}"/${LINUX_PATCH} | filterdiff -p1 ${paths[@]/#/-i} > ${P}.patch
assert -n "Unpacking to ${P} from ${DISTDIR}/${LINUX_PATCH} failed"
eend $? || die "filterdiff failed"
test -s ${P}.patch || die "patch is empty?!"
eshopts_pop
fi
@ -144,8 +181,7 @@ src_prepare() {
fi
pushd "${S_K}" >/dev/null || die
eapply "${FILESDIR}"/perf-6.0-clang.patch
eapply "${FILESDIR}"/perf-6.0-c++17.patch
eapply "${FILESDIR}"/perf-6.11-bpf-capstone.patch
popd || die
# Drop some upstream too-developer-oriented flags and fix the
@ -166,7 +202,7 @@ src_prepare() {
find -name '*.S' -exec sed -i '$a.section .note.GNU-stack,"",%progbits' {} +
}
puse() { usex $1 "" no; }
puse() { usex $1 "" 1; }
perf_make() {
# The arch parsing is a bit funky. The perf tools package is integrated
# into the kernel, so it wants an ARCH that looks like the kernel arch,
@ -187,62 +223,88 @@ perf_make() {
! use arm64 && \
! use ppc && ! use ppc64 \
! use s390 && \
! use riscv
! use riscv && \
! use loong
then
disable_libdw=1
fi
# perf directly invokes LD for linking without going through CC, on mips
# it is required to specify the emulation. port of below buildroot patch
# https://patchwork.ozlabs.org/project/buildroot/patch/20170217105905.32151-1-Vincent.Riera@imgtec.com/
local linker="$(tc-getLD)"
if use mips
then
if use big-endian
then
use abi_mips_n64 && linker+=" -m elf64btsmip"
use abi_mips_n32 && linker+=" -m elf32btsmipn32"
use abi_mips_o32 && linker+=" -m elf32btsmip"
else
use abi_mips_n64 && linker+=" -m elf64ltsmip"
use abi_mips_n32 && linker+=" -m elf32ltsmipn32"
use abi_mips_o32 && linker+=" -m elf32ltsmip"
fi
fi
# FIXME: NO_CORESIGHT
emake V=1 VF=1 \
HOSTCC="$(tc-getBUILD_CC)" HOSTLD="$(tc-getBUILD_LD)" \
CC="$(tc-getCC)" CXX="$(tc-getCXX)" AR="$(tc-getAR)" LD="$(tc-getLD)" NM="$(tc-getNM)" \
CLANG="${CHOST}-clang" \
PKG_CONFIG="$(tc-getPKG_CONFIG)" \
prefix="${EPREFIX}/usr" bindir_relative="bin" \
tipdir="share/doc/${PF}" \
EXTRA_CFLAGS="${CFLAGS}" \
EXTRA_LDFLAGS="${LDFLAGS}" \
ARCH="${arch}" \
JDIR="${java_dir}" \
LIBCLANGLLVM=$(usex clang 1 "") \
LIBPFM4=$(usex libpfm 1 "") \
NO_AUXTRACE="" \
NO_BACKTRACE="" \
NO_CORESIGHT=1 \
NO_DEMANGLE= \
GTK2=$(usex gtk 1 "") \
feature-gtk2-infobar=$(usex gtk 1 "") \
NO_JVMTI=$(puse java) \
NO_LIBAUDIT=$(puse audit) \
NO_LIBBABELTRACE=$(puse babeltrace) \
NO_LIBBIONIC=1 \
NO_LIBBPF= \
NO_LIBCRYPTO=$(puse crypt) \
NO_LIBDW_DWARF_UNWIND="${disable_libdw}" \
NO_LIBELF= \
NO_LIBNUMA=$(puse numa) \
NO_LIBPERL=$(puse perl) \
NO_LIBPYTHON=$(puse python) \
NO_LIBUNWIND=$(puse unwind) \
NO_LIBZSTD=$(puse zstd) \
NO_SDT=$(puse systemtap) \
NO_SLANG=$(puse slang) \
NO_LZMA=$(puse lzma) \
NO_ZLIB=$(puse zlib) \
WERROR=0 \
LIBDIR="/usr/libexec/perf-core" \
libdir="${EPREFIX}/usr/$(get_libdir)" \
plugindir="${EPREFIX}/usr/$(get_libdir)/perf/plugins" \
local emakeargs=(
V=1 VF=1
HOSTCC="$(tc-getBUILD_CC)" HOSTLD="$(tc-getBUILD_LD)"
CC="$(tc-getCC)" CXX="$(tc-getCXX)" AR="$(tc-getAR)" LD="${linker}" NM="$(tc-getNM)"
CLANG="${CHOST}-clang"
PKG_CONFIG="$(tc-getPKG_CONFIG)"
prefix="${EPREFIX}/usr" bindir_relative="bin"
tipdir="share/doc/${PF}"
EXTRA_CFLAGS="${CFLAGS}"
EXTRA_LDFLAGS="${LDFLAGS}"
ARCH="${arch}"
BUILD_BPF_SKEL=$(usex bpf 1 "") \
BUILD_NONDISTRO=1
JDIR="${java_dir}"
CORESIGHT=
GTK2=$(usex gtk 1 "")
feature-gtk2-infobar=$(usex gtk 1 "")
NO_AUXTRACE=
NO_BACKTRACE=
NO_CAPSTONE=$(puse capstone)
NO_DEMANGLE=
NO_JEVENTS=$(puse python)
NO_JVMTI=$(puse java)
NO_LIBAUDIT=$(puse audit)
NO_LIBBABELTRACE=$(puse babeltrace)
NO_LIBBIONIC=1
NO_LIBBPF=$(puse bpf)
NO_LIBCAP=$(puse caps)
NO_LIBCRYPTO=$(puse crypt)
NO_LIBDW_DWARF_UNWIND="${disable_libdw}"
NO_LIBELF=
NO_LIBNUMA=$(puse numa)
NO_LIBPERL=$(puse perl)
NO_LIBPFM4=$(puse libpfm)
NO_LIBPYTHON=$(puse python)
NO_LIBTRACEEVENT=$(puse libtraceevent)
NO_LIBUNWIND=$(puse unwind)
NO_LIBZSTD=$(puse zstd)
NO_SDT=$(puse systemtap)
NO_SHELLCHECK=1
NO_SLANG=$(puse slang)
NO_LZMA=$(puse lzma)
NO_ZLIB=
TCMALLOC=$(usex tcmalloc 1 "")
WERROR=0
DEBUG=$(usex debug 1 "")
LIBDIR="/usr/libexec/perf-core"
libdir="${EPREFIX}/usr/$(get_libdir)"
plugindir="${EPREFIX}/usr/$(get_libdir)/perf/plugins"
"$@"
)
emake "${emakeargs[@]}"
}
src_compile() {
filter-lto
# test-clang.bin not build with g++
if use clang; then
make -C "${S_K}/tools/build/feature" V=1 CXX=${CHOST}-clang++ test-clang.bin || die
fi
perf_make -f Makefile.perf
use doc && perf_make -C Documentation man
}