diff options
Diffstat (limited to 'dev-util/perf')
-rw-r--r-- | dev-util/perf/Manifest | 9 | ||||
-rw-r--r-- | dev-util/perf/files/perf-6.0-c++17.patch | 39 | ||||
-rw-r--r-- | dev-util/perf/files/perf-6.0-clang.patch | 44 | ||||
-rw-r--r-- | dev-util/perf/files/perf-6.11-bpf-capstone.patch | 469 | ||||
-rw-r--r-- | dev-util/perf/metadata.xml | 1 | ||||
-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, +- ¬es->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, ¬es->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, ¬es->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, ++ ¬es->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, ¬es->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, ¬es->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 } |