summaryrefslogtreecommitdiff
path: root/dev-util/perf
diff options
context:
space:
mode:
Diffstat (limited to 'dev-util/perf')
-rw-r--r--dev-util/perf/Manifest9
-rw-r--r--dev-util/perf/files/perf-6.0-c++17.patch39
-rw-r--r--dev-util/perf/files/perf-6.0-clang.patch44
-rw-r--r--dev-util/perf/files/perf-6.11-bpf-capstone.patch469
-rw-r--r--dev-util/perf/metadata.xml1
-rw-r--r--dev-util/perf/perf-6.11.ebuild (renamed from dev-util/perf/perf-6.3.ebuild)206
6 files changed, 607 insertions, 161 deletions
diff --git a/dev-util/perf/Manifest b/dev-util/perf/Manifest
index 7fb1e325b8fd..bff145b2d825 100644
--- a/dev-util/perf/Manifest
+++ b/dev-util/perf/Manifest
@@ -1,16 +1,15 @@
-AUX perf-6.0-c++17.patch 1127 BLAKE2B 923390f761b588a01935e2b36ff25f916f91e752f76fc6e02999ddc51e297a13798b38a9d3523deab327c8fd6ee2ea02e93f454a4b799f61552c11c1cad574aa SHA512 add3956108a83fd58ca949f6f6a611c44a0f29a4b4eef28c4883a1ba6058b66203064837878becbd64d8afebef57beb1cefcfcedb2a95c221f6792dffcaf38cb
-AUX perf-6.0-clang.patch 1862 BLAKE2B e88655e51cb785b80cd44fefb73bb7668bf6d57205e478b106a0d0fbbee4e7089850c2328e796530347c354eb8e7e46e947c18e03ded488bede41de5f74f0b8e SHA512 0e92ba2e878b2b20f6d7c30ba5fde43388378c7f8e752a7c07dd65abc66e576be8f74cf9c06abb79713cc8c1cab37c9cd678f4e5bba8bb99ed1020317f278eb2
AUX perf-6.10-bpf-capstone.patch 11805 BLAKE2B 5e4f2942b6ab4e7c3e149b86dab9515b0a60ab73e003b59bb2623288896f4db3bd80f372110e9ef7f2da49641c925fe60989fb5e21dd5e2e13409fc7e60b3722 SHA512 ac5270276552b934736dd111eefe7019cfe091a14ed7e2fe107527b69652e82415f4142a1199db5e3a1a3e0b48b7ee0166f650bfe0fb25bdc69908b376baf3d3
AUX perf-6.10-expr.patch 1355 BLAKE2B d4dcb3b8b79944f304fd8789cd680e91e2fb1deffaa0ac108e200130f9ab669bea6a8ad65efc66b730b3282d523f839812cc4de6861b665c86bf2ba400645743 SHA512 0b031a675c49149b0f7623c0e663e4b6c2866ab4fa7e7e29712a55ebbceccef68bdde8ebe1f70a0f3e035e75e6e8e6fb90c06d0c16d39d2866ecbded4ff0c5cc
AUX perf-6.10.3-bpf-capstone.patch 11856 BLAKE2B 17f3d66a4fd0508f3ac89d4c9d18341dac97cf4b753bde85887a1b9ee79c10a3e1e94d28bb2c77a69dd35c5db21ef7ffe83314c8adca95dcc3ca353829eff139 SHA512 c41dcee2e85676a56178a0cb9998f1a56dab1aba8c49cdac506fd05bf72065a6dc51a46d48fe968a45ab5a872235f6839aab93b3464e6cf25aa66580b92ac652
+AUX perf-6.11-bpf-capstone.patch 12796 BLAKE2B 8d99c9bf701589c025886ff64a3591537676ac6f8f0dc56693d2542f95ceb8ec575c8c5724dc9dfa1eee0253e71efbe304f8b5457b1323a54d10f0cdf9659203 SHA512 b6ee9c74d3839febb90c86ed58f6162b268e06ab2c545e840e5a62cf062f1f6e5d2d8fca978ef6092572c61e168301984fb3ddf27bc02ed9351b01dc5558fe4e
AUX perf-6.4-libtracefs.patch 780 BLAKE2B dc97e42f1d3ece03722441b5a2c1f87ab9871ca92b9cf9f57b2e44627fddfcedaf6d7f64ddf74fd103c23aa0db71c4d147f7841743eb5c5a466c9bbb150597ea SHA512 da1b69c190491dd926ba1e98a43965a5ffd543df4134e6a10d187ab544695617fcffede3190bce4cbef13b897d113dee743f67a98ff249a486f8de2d49e62f9f
AUX perf-6.7-expr.patch 1257 BLAKE2B 1ff41975d84f835a343d2b2f9f049edd817bf80ca576879c7f819608506341b5d19147cf3ecd67a731ab6ecf9a45ce494a8a665aa1bff86cc14f3967a6dd12a0 SHA512 8f1a5a8412464f7623b10da562552b2ac17ca8e70eb4507a3751493662e64066828f2b7a73f1bc7546f463d8d21919f59622b978a6bacafed6a93f232a15ff0b
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
EBUILD perf-6.10.4.ebuild 9495 BLAKE2B 90bf673dcd8c94531bd534e520077c5a049abca75edea00a85c21e96cffc69a449c9c1eca24072f0ea9e00c192e21fd32fd9407829001168d101e9ef6cb0695f SHA512 3aa795231a233cbc85d1dcb8e0bec426b6ffa42dca128d264f64e15b93dd6fbff83d59c1b4b66fad4b4806783dcc76bb1711a2c2dc26bfa328b3b9d349a13f28
EBUILD perf-6.10.ebuild 9289 BLAKE2B 31127f741e6ec0ab27723ba29b54d1e6e6da2005a6be2e2ec742f03f377473ba0bdbdd309bdce61b767b737fe665b6fe4bdcb44eb46e92ad073a16e5e991b65f SHA512 a338e422d8fde71bce6e680992901fdf2008ea12e4e2bb7e06e5a135d3d61b6c7dbc74f61d1e4c5b72ee57c3bf4f86443a407b77f3d6f9fc556012f53d528d82
-EBUILD perf-6.3.ebuild 7879 BLAKE2B 8c0a0d871ba9892559e6a7456d65f3e428dc447c956e59f885c5a3690317c613c35de24e0c2638fb820d7635a291c85f4a36ce6f303e694c2895fa9e79922734 SHA512 929c052bcd742009aea8157c8316c52daa02f8fd36894df743d5a942f776ef13f683e04bb63b8568c20dbfa1b2a360e7189a99d67e8d4ad7458db790e221d50c
+EBUILD perf-6.11.ebuild 9483 BLAKE2B 39154089a2bd3de3e4f0dfbf1e96dcee10160dab0fca9d9a9acf31e7a94a421a078f8baa593581ab045256f1dfa16abb9ac00896da70bf6fa6db911127326d42 SHA512 d4eb50d0e524b8d11ec034f1bdac2c4cd58ff77cea72f74040c24248b4415905a2d7a9cbec0d55930c944bc5a7694d8d3b1b15587c7ac52bcd53b4709673a2aa
EBUILD perf-6.7.ebuild 9089 BLAKE2B 22ca5977135f8b1f411c423697a61e0a4a4582fb9e470c4e816d7a8022f4f90088f640ff5fb4352c963805d3ab5ff9de003f6aa0d0d7b541bc4d788c17ed3df5 SHA512 3d822becfa8100be4e597082cadd51d817358344e79ff65c722c5d1f904cc34fdda0b01ae1ff9417e5b1132b7e13a9271ac21560538bb775b30ef3d5bdd4d247
-MISC metadata.xml 1732 BLAKE2B 03176060a38c63b19df545d60440a68581f637aa5533a8cf31ac1aa0412d30e73ac1fd65bd13e50d731fc2a028dda5fbe3eac92d85fa7acefb3884fb3cf490dd SHA512 2910d91429859d9ac69d275422239341dcbbd24b0010d716ee9de52272b817e72e59af0c7b524404366140e55491d3fe3b3abe14ec6df98ca064e91eab51b923
+MISC metadata.xml 1664 BLAKE2B fd151376545e542f591d4a0b06f7a3e51a5e3844a613035fabbeb770a58781ed29cd5d7614560d0f7473b2dec3636e1ca0f736259091371baad96d1bc2ef5d8f SHA512 96d8b853e38317bb526d5d5888b04e706df8dcc37c2ef26a3b047b861f86e33406071d8cebc287fbd09e6e33a2b5e72872b41c3ceb247392adc310f8389c1a26
diff --git a/dev-util/perf/files/perf-6.0-c++17.patch b/dev-util/perf/files/perf-6.0-c++17.patch
deleted file mode 100644
index 08c34bc552ca..000000000000
--- a/dev-util/perf/files/perf-6.0-c++17.patch
+++ /dev/null
@@ -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) \
-
diff --git a/dev-util/perf/files/perf-6.0-clang.patch b/dev-util/perf/files/perf-6.0-clang.patch
deleted file mode 100644
index 65b38c8d399b..000000000000
--- a/dev-util/perf/files/perf-6.0-clang.patch
+++ /dev/null
@@ -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
diff --git a/dev-util/perf/files/perf-6.11-bpf-capstone.patch b/dev-util/perf/files/perf-6.11-bpf-capstone.patch
new file mode 100644
index 000000000000..7d8b376869f3
--- /dev/null
+++ b/dev-util/perf/files/perf-6.11-bpf-capstone.patch
@@ -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 */
diff --git a/dev-util/perf/metadata.xml b/dev-util/perf/metadata.xml
index 89fef8ad07ac..2a4e4eada619 100644
--- a/dev-util/perf/metadata.xml
+++ b/dev-util/perf/metadata.xml
@@ -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
diff --git a/dev-util/perf/perf-6.3.ebuild b/dev-util/perf/perf-6.11.ebuild
index 9d36b0ce8ca7..b523d8477bf6 100644
--- a/dev-util/perf/perf-6.3.ebuild
+++ b/dev-util/perf/perf-6.11.ebuild
@@ -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
}