Re: [PATCH v1 1/4] perf parse-events: Remove BPF event support

From: Manu Bretelle
Date: Thu Oct 19 2023 - 15:45:37 EST


cc @quentin

On Fri, Aug 11, 2023 at 12:41:36PM -0300, Arnaldo Carvalho de Melo wrote:
> Em Fri, Aug 11, 2023 at 11:43:22AM -0300, Arnaldo Carvalho de Melo escreveu:
> > Right now it is not applying due to some clash with other changes and
> > when I tried to apply it manually there were some formatting issues:
> >
> > ⬢[acme@toolbox perf-tools-next]$ head ~/wb/1.patch
> > From SRS0=EALy=D3=flex--irogers.bounces.google.com=3IDHVZAcKBAUnwtljwxlttlqj.htrfhrjpjwsjq.twl@xxxxxxxxxx Thu Aug 10 17:53:46 2023
> > Delivered-To: arnaldo.melo@xxxxxxxxx
> > Received: from imap.gmail.com [64.233.186.109]
> > by quaco with IMAP (fetchmail-6.4.37)
> > for <acme@localhost> (single-drop); Thu, 10 Aug 2023 17:53:46 -0300 (-03)
> > Received: by 2002:a0c:ab03:0:b0:63d:780e:9480 with SMTP id h3csp908198qvb;
> > Thu, 10 Aug 2023 11:49:52 -0700 (PDT)
> > X-Google-Smtp-Source: AGHT+IH9N/knUCyQ0tQ2Q0XBH0gqf8A8DB8/37YHWAJDKBmz7AGSV9CvCKYDuE3EwxriZFBwtZMs
> > X-Received: by 2002:a4a:6b4f:0:b0:56c:b2ab:9820 with SMTP id
> > h15-20020a4a6b4f000000b0056cb2ab9820mr2695332oof.8.1691693392493; Thu, 10 Aug
> > ⬢[acme@toolbox perf-tools-next]$ patch -p1 < ~/wb/1.patch
> > patching file tools/perf/Documentation/perf-config.txt
> > patch: **** malformed patch at line 234: ith
> >
> > ⬢[acme@toolbox perf-tools-next]$
> >
> > I'm trying to apply it manually.
>
> I have this extracted from this patch as the first patch in the series:
>
> >From adc61b5774a9de62f34d593f164ca02daa6fb44c Mon Sep 17 00:00:00 2001
> From: Ian Rogers <irogers@xxxxxxxxxx>
> Date: Fri, 11 Aug 2023 12:19:48 -0300
> Subject: [PATCH 1/1] perf bpf: Remove support for embedding clang for
> compiling BPF events (-e foo.c)
>
> This never was in the default build for perf, is difficult to maintain
> as it uses clang/llvm internals so ditch it, keeping, for now, the
> external compilation of .c BPF into .o bytecode and its subsequent
> loading, that is also going to be removed, do it separately to help
> bisection and to properly document what is being removed and why.
>
> Committer notes:
>
> Extracted from a larger patch and removed some leftovers, namely
> deleting these now unused feature tests:
>
> tools/build/feature/test-clang.cpp
> tools/build/feature/test-cxx.cpp
> tools/build/feature/test-llvm-version.cpp
> tools/build/feature/test-llvm.cpp
>

This seem to have broken `llvm` feature detection for `bpftool`.

The feature detections are still available in `tools/build/Makefile.feature` [0]
but the .cpp files are gone.

`bpftool` still rely on the `llvm` feature:

$ git --no-pager grep 'feature-llvm'
tools/bpf/bpftool/Makefile:ifeq ($(feature-llvm),1)

The result of testing llvm feature is:

$ cat tools/build/feature/test-llvm.make.output
cc1plus: fatal error: test-llvm.cpp: No such file or directory
compilation terminated.

With current head:

make -j $((4*$(nproc))) -C tools/bpf/bpftool && ./tools/bpf/bpftool/bpftool --version
...
Auto-detecting system features:
... clang-bpf-co-re: [ on ]
... llvm: [ OFF ]
... libcap: [ on ]
... libbfd: [ on ]
...
...
...
bpftool v7.3.0
using libbpf v1.3
features: libbfd, skeletons

After applying

git show 56b11a2126bf2f422831ecf6112b87a4485b221b tools/build/feature | \
patch -p1 -R

The feature gets properly detected again by:

make -j $((4*$(nproc))) -C tools/bpf/bpftool && ./tools/bpf/bpftool/bpftool --version
...
Auto-detecting system features:
... clang-bpf-co-re: [ on ]
... llvm: [ on ]
... libcap: [ on ]
... libbfd: [ on ]
...
...
bpftool v7.3.0
using libbpf v1.3
features: llvm, skeletons

make -C tools/bpf/bpftool

[0] https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/tree/tools/build/Makefile.feature?id=74e9347ebc5be452935fe4f3eddb150aa5a6f4fe#n99

> Testing the use of BPF events after applying this patch:
>
> To use the external clang/llvm toolchain to compile a .c event and then
> use libbpf to load it, to get the syscalls:sys_enter_open* tracepoints
> and read the filename pointer, putting it into the ring buffer right
> after the usual tracepoint payload for 'perf trace' to then print it:
>
> [root@quaco ~]# perf trace -e /home/acme/git/perf-tools-next/tools/perf/examples/bpf/augmented_raw_syscalls.c,open* --max-events=10
> 0.000 systemd-oomd/959 openat(dfd: CWD, filename: "/proc/meminfo", flags: RDONLY|CLOEXEC) = 12
> 0.083 abrt-dump-jour/1453 openat(dfd: CWD, filename: "/var/log/journal/d6a97235307247e09f13f326fb607e3c/system.journal", flags: RDONLY|CLOEXEC|NONBLOCK) = 4
> 0.063 abrt-dump-jour/1454 openat(dfd: CWD, filename: "/var/log/journal/d6a97235307247e09f13f326fb607e3c/system.journal", flags: RDONLY|CLOEXEC|NONBLOCK) = 4
> 0.082 abrt-dump-jour/1455 openat(dfd: CWD, filename: "/var/log/journal/d6a97235307247e09f13f326fb607e3c/system.journal", flags: RDONLY|CLOEXEC|NONBLOCK) = 4
> 250.124 systemd-oomd/959 openat(dfd: CWD, filename: "/proc/meminfo", flags: RDONLY|CLOEXEC) = 12
> 250.521 systemd-oomd/959 openat(dfd: CWD, filename: "/sys/fs/cgroup/user.slice/user-1000.slice/user@1000.service/app.slice/memory.pressure", flags: RDONLY|CLOEXEC) = 12
> 251.047 systemd-oomd/959 openat(dfd: CWD, filename: "/sys/fs/cgroup/user.slice/user-1000.slice/user@1000.service/app.slice/memory.current", flags: RDONLY|CLOEXEC) = 12
> 251.162 systemd-oomd/959 openat(dfd: CWD, filename: "/sys/fs/cgroup/user.slice/user-1000.slice/user@1000.service/app.slice/memory.min", flags: RDONLY|CLOEXEC) = 12
> 251.242 systemd-oomd/959 openat(dfd: CWD, filename: "/sys/fs/cgroup/user.slice/user-1000.slice/user@1000.service/app.slice/memory.low", flags: RDONLY|CLOEXEC) = 12
> 251.353 systemd-oomd/959 openat(dfd: CWD, filename: "/sys/fs/cgroup/user.slice/user-1000.slice/user@1000.service/app.slice/memory.swap.current", flags: RDONLY|CLOEXEC) = 12
> [root@quaco ~]#
>
> Same thing, but with a prebuilt .o BPF bytecode:
>
> [root@quaco ~]# perf trace -e /home/acme/git/perf-tools-next/tools/perf/examples/bpf/augmented_raw_syscalls.o,open* --max-events=10
> 0.000 systemd-oomd/959 openat(dfd: CWD, filename: "/proc/meminfo", flags: RDONLY|CLOEXEC) = 12
> 0.083 abrt-dump-jour/1453 openat(dfd: CWD, filename: "/var/log/journal/d6a97235307247e09f13f326fb607e3c/system.journal", flags: RDONLY|CLOEXEC|NONBLOCK) = 4
> 0.083 abrt-dump-jour/1455 openat(dfd: CWD, filename: "/var/log/journal/d6a97235307247e09f13f326fb607e3c/system.journal", flags: RDONLY|CLOEXEC|NONBLOCK) = 4
> 0.062 abrt-dump-jour/1454 openat(dfd: CWD, filename: "/var/log/journal/d6a97235307247e09f13f326fb607e3c/system.journal", flags: RDONLY|CLOEXEC|NONBLOCK) = 4
> 249.985 systemd-oomd/959 openat(dfd: CWD, filename: "/proc/meminfo", flags: RDONLY|CLOEXEC) = 12
> 466.763 thermald/1234 openat(dfd: CWD, filename: "/sys/class/powercap/intel-rapl/intel-rapl:0/intel-rapl:0:2/energy_uj") = 13
> 467.145 thermald/1234 openat(dfd: CWD, filename: "/sys/class/powercap/intel-rapl/intel-rapl:0/energy_uj") = 13
> 467.311 thermald/1234 openat(dfd: CWD, filename: "/sys/class/thermal/thermal_zone2/temp") = 13
> 500.040 cgroupify/24006 openat(dfd: 4, filename: ".", flags: RDONLY|CLOEXEC|DIRECTORY|NONBLOCK) = 5
> 500.295 cgroupify/24006 openat(dfd: 4, filename: "24616/cgroup.procs") = 5
> [root@quaco ~]#
>
> Signed-off-by: Ian Rogers <irogers@xxxxxxxxxx>
> Cc: Adrian Hunter <adrian.hunter@xxxxxxxxx>
> Cc: Alexander Shishkin <alexander.shishkin@xxxxxxxxxxxxxxx>
> Cc: Andi Kleen <ak@xxxxxxxxxxxxxxx>
> Cc: Andrii Nakryiko <andrii@xxxxxxxxxx>
> Cc: Anshuman Khandual <anshuman.khandual@xxxxxxx>
> Cc: Athira Rajeev <atrajeev@xxxxxxxxxxxxxxxxxx>
> Cc: Brendan Gregg <brendan.d.gregg@xxxxxxxxx>
> Cc: Carsten Haitzler <carsten.haitzler@xxxxxxx>
> Cc: Eduard Zingerman <eddyz87@xxxxxxxxx>
> Cc: Fangrui Song <maskray@xxxxxxxxxx>
> Cc: He Kuang <hekuang@xxxxxxxxxx>
> Cc: Ingo Molnar <mingo@xxxxxxxxxx>
> Cc: James Clark <james.clark@xxxxxxx>
> Cc: Jiri Olsa <jolsa@xxxxxxxxxx>
> Cc: Kan Liang <kan.liang@xxxxxxxxxxxxxxx>
> Cc: Leo Yan <leo.yan@xxxxxxxxxx>
> Cc: Madhavan Srinivasan <maddy@xxxxxxxxxxxxx>
> Cc: Mark Rutland <mark.rutland@xxxxxxx>
> Cc: Namhyung Kim <namhyung@xxxxxxxxxx>
> Cc: Nathan Chancellor <nathan@xxxxxxxxxx>
> Cc: "Naveen N. Rao" <naveen.n.rao@xxxxxxxxxxxxxxxxxx>
> Cc: Nick Desaulniers <ndesaulniers@xxxxxxxxxx>
> Cc: Peter Zijlstra <peterz@xxxxxxxxxxxxx>
> Cc: Ravi Bangoria <ravi.bangoria@xxxxxxx>
> Cc: Rob Herring <robh@xxxxxxxxxx>
> Cc: Tiezhu Yang <yangtiezhu@xxxxxxxxxxx>
> Cc: Tom Rix <trix@xxxxxxxxxx>
> Cc: Wang Nan <wangnan0@xxxxxxxxxx>
> Cc: Wang ShaoBo <bobo.shaobowang@xxxxxxxxxx>
> Cc: Yang Jihong <yangjihong1@xxxxxxxxxx>
> Cc: Yonghong Song <yhs@xxxxxx>
> Cc: YueHaibing <yuehaibing@xxxxxxxxxx>
> Link: https://lore.kernel.org/lkml/
> Signed-off-by: Arnaldo Carvalho de Melo <acme@xxxxxxxxxx>
> ---
> tools/build/feature/test-clang.cpp | 28 ---
> tools/build/feature/test-cxx.cpp | 16 --
> tools/build/feature/test-llvm-version.cpp | 12 --
> tools/build/feature/test-llvm.cpp | 14 --
> tools/perf/Makefile.config | 31 ---
> tools/perf/Makefile.perf | 17 --
> tools/perf/tests/Build | 1 -
> tools/perf/tests/builtin-test.c | 1 -
> tools/perf/tests/clang.c | 32 ---
> tools/perf/tests/make | 1 -
> tools/perf/util/Build | 2 -
> tools/perf/util/bpf-loader.c | 15 +-
> tools/perf/util/c++/Build | 5 -
> tools/perf/util/c++/clang-c.h | 43 -----
> tools/perf/util/c++/clang-test.cpp | 67 -------
> tools/perf/util/c++/clang.cpp | 225 ----------------------
> tools/perf/util/c++/clang.h | 27 ---
> 17 files changed, 4 insertions(+), 533 deletions(-)
> delete mode 100644 tools/build/feature/test-clang.cpp
> delete mode 100644 tools/build/feature/test-cxx.cpp
> delete mode 100644 tools/build/feature/test-llvm-version.cpp
> delete mode 100644 tools/build/feature/test-llvm.cpp
> delete mode 100644 tools/perf/tests/clang.c
> delete mode 100644 tools/perf/util/c++/Build
> delete mode 100644 tools/perf/util/c++/clang-c.h
> delete mode 100644 tools/perf/util/c++/clang-test.cpp
> delete mode 100644 tools/perf/util/c++/clang.cpp
> delete mode 100644 tools/perf/util/c++/clang.h
>
> diff --git a/tools/build/feature/test-clang.cpp b/tools/build/feature/test-clang.cpp
> deleted file mode 100644
> index 7d87075cd1c5dd6e..0000000000000000
> --- a/tools/build/feature/test-clang.cpp
> +++ /dev/null
> @@ -1,28 +0,0 @@
> -// SPDX-License-Identifier: GPL-2.0
> -#include "clang/Basic/Version.h"
> -#if CLANG_VERSION_MAJOR < 8
> -#include "clang/Basic/VirtualFileSystem.h"
> -#endif
> -#include "clang/Driver/Driver.h"
> -#include "clang/Frontend/TextDiagnosticPrinter.h"
> -#include "llvm/ADT/IntrusiveRefCntPtr.h"
> -#include "llvm/Support/ManagedStatic.h"
> -#if CLANG_VERSION_MAJOR >= 8
> -#include "llvm/Support/VirtualFileSystem.h"
> -#endif
> -#include "llvm/Support/raw_ostream.h"
> -
> -using namespace clang;
> -using namespace clang::driver;
> -
> -int main()
> -{
> - IntrusiveRefCntPtr<DiagnosticIDs> DiagID(new DiagnosticIDs());
> - IntrusiveRefCntPtr<DiagnosticOptions> DiagOpts = new DiagnosticOptions();
> -
> - DiagnosticsEngine Diags(DiagID, &*DiagOpts);
> - Driver TheDriver("test", "bpf-pc-linux", Diags);
> -
> - llvm::llvm_shutdown();
> - return 0;
> -}
> diff --git a/tools/build/feature/test-cxx.cpp b/tools/build/feature/test-cxx.cpp
> deleted file mode 100644
> index 396aaedd2418dd65..0000000000000000
> --- a/tools/build/feature/test-cxx.cpp
> +++ /dev/null
> @@ -1,16 +0,0 @@
> -// SPDX-License-Identifier: GPL-2.0
> -#include <iostream>
> -#include <memory>
> -
> -static void print_str(std::string s)
> -{
> - std::cout << s << std::endl;
> -}
> -
> -int main()
> -{
> - std::string s("Hello World!");
> - print_str(std::move(s));
> - std::cout << "|" << s << "|" << std::endl;
> - return 0;
> -}
> diff --git a/tools/build/feature/test-llvm-version.cpp b/tools/build/feature/test-llvm-version.cpp
> deleted file mode 100644
> index 8a091625446af985..0000000000000000
> --- a/tools/build/feature/test-llvm-version.cpp
> +++ /dev/null
> @@ -1,12 +0,0 @@
> -// SPDX-License-Identifier: GPL-2.0
> -#include <cstdio>
> -#include "llvm/Config/llvm-config.h"
> -
> -#define NUM_VERSION (((LLVM_VERSION_MAJOR) << 16) + (LLVM_VERSION_MINOR << 8) + LLVM_VERSION_PATCH)
> -#define pass int main() {printf("%x\n", NUM_VERSION); return 0;}
> -
> -#if NUM_VERSION >= 0x030900
> -pass
> -#else
> -# error This LLVM is not tested yet.
> -#endif
> diff --git a/tools/build/feature/test-llvm.cpp b/tools/build/feature/test-llvm.cpp
> deleted file mode 100644
> index 88a3d1bdd9f6978e..0000000000000000
> --- a/tools/build/feature/test-llvm.cpp
> +++ /dev/null
> @@ -1,14 +0,0 @@
> -// SPDX-License-Identifier: GPL-2.0
> -#include "llvm/Support/ManagedStatic.h"
> -#include "llvm/Support/raw_ostream.h"
> -#define NUM_VERSION (((LLVM_VERSION_MAJOR) << 16) + (LLVM_VERSION_MINOR << 8) + LLVM_VERSION_PATCH)
> -
> -#if NUM_VERSION < 0x030900
> -# error "LLVM version too low"
> -#endif
> -int main()
> -{
> - llvm::errs() << "Hello World!\n";
> - llvm::llvm_shutdown();
> - return 0;
> -}
> diff --git a/tools/perf/Makefile.config b/tools/perf/Makefile.config
> index 1bf8dc53641fa093..e0592ed4c10f5904 100644
> --- a/tools/perf/Makefile.config
> +++ b/tools/perf/Makefile.config
> @@ -1127,37 +1127,6 @@ ifndef NO_JVMTI
> endif
> endif
>
> -USE_CXX = 0
> -USE_CLANGLLVM = 0
> -ifdef LIBCLANGLLVM
> - $(call feature_check,cxx)
> - ifneq ($(feature-cxx), 1)
> - msg := $(warning No g++ found, disable clang and llvm support. Please install g++)
> - else
> - $(call feature_check,llvm)
> - $(call feature_check,llvm-version)
> - ifneq ($(feature-llvm), 1)
> - msg := $(warning No suitable libLLVM found, disabling builtin clang and LLVM support. Please install llvm-dev(el) (>= 3.9.0))
> - else
> - $(call feature_check,clang)
> - ifneq ($(feature-clang), 1)
> - msg := $(warning No suitable libclang found, disabling builtin clang and LLVM support. Please install libclang-dev(el) (>= 3.9.0))
> - else
> - CFLAGS += -DHAVE_LIBCLANGLLVM_SUPPORT
> - CXXFLAGS += -DHAVE_LIBCLANGLLVM_SUPPORT -I$(shell $(LLVM_CONFIG) --includedir)
> - $(call detected,CONFIG_CXX)
> - $(call detected,CONFIG_CLANGLLVM)
> - USE_CXX = 1
> - USE_LLVM = 1
> - USE_CLANG = 1
> - ifneq ($(feature-llvm-version),1)
> - msg := $(warning This version of LLVM is not tested. May cause build errors)
> - endif
> - endif
> - endif
> - endif
> -endif
> -
> ifndef NO_LIBPFM4
> $(call feature_check,libpfm4)
> ifeq ($(feature-libpfm4), 1)
> diff --git a/tools/perf/Makefile.perf b/tools/perf/Makefile.perf
> index 0ed7ee0c1665a8cf..5370d7bf123e76af 100644
> --- a/tools/perf/Makefile.perf
> +++ b/tools/perf/Makefile.perf
> @@ -99,10 +99,6 @@ include ../scripts/utilities.mak
> # Define NO_JVMTI_CMLR (debug only) if you do not want to process CMLR
> # data for java source lines.
> #
> -# Define LIBCLANGLLVM if you DO want builtin clang and llvm support.
> -# When selected, pass LLVM_CONFIG=/path/to/llvm-config to `make' if
> -# llvm-config is not in $PATH.
> -#
> # Define CORESIGHT if you DO WANT support for CoreSight trace decoding.
> #
> # Define NO_AIO if you do not want support of Posix AIO based trace
> @@ -425,19 +421,6 @@ endif
> 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)
> - LIBS += -L$(shell $(LLVM_CONFIG) --libdir) -lclang-cpp
> -endif
> -
> -ifeq ($(USE_LLVM), 1)
> - LIBLLVM = $(shell $(LLVM_CONFIG) --libs all) $(shell $(LLVM_CONFIG) --system-libs)
> - LIBS += -L$(shell $(LLVM_CONFIG) --libdir) $(LIBLLVM)
> -endif
> -
> -ifeq ($(USE_CXX), 1)
> - LIBS += -lstdc++
> -endif
> -
> export INSTALL SHELL_PATH
>
> ### Build rules
> diff --git a/tools/perf/tests/Build b/tools/perf/tests/Build
> index fb9ac5dc4079dab8..52df5923a8b9cc20 100644
> --- a/tools/perf/tests/Build
> +++ b/tools/perf/tests/Build
> @@ -51,7 +51,6 @@ perf-y += sdt.o
> perf-y += is_printable_array.o
> perf-y += bitmap.o
> perf-y += perf-hooks.o
> -perf-y += clang.o
> perf-y += unit_number__scnprintf.o
> perf-y += mem2node.o
> perf-y += maps.o
> diff --git a/tools/perf/tests/builtin-test.c b/tools/perf/tests/builtin-test.c
> index 6accb5442a731842..0f3691fd31c2536f 100644
> --- a/tools/perf/tests/builtin-test.c
> +++ b/tools/perf/tests/builtin-test.c
> @@ -108,7 +108,6 @@ static struct test_suite *generic_tests[] = {
> &suite__is_printable_array,
> &suite__bitmap_print,
> &suite__perf_hooks,
> - &suite__clang,
> &suite__unit_number__scnprint,
> &suite__mem2node,
> &suite__time_utils,
> diff --git a/tools/perf/tests/clang.c b/tools/perf/tests/clang.c
> deleted file mode 100644
> index a7111005d5b9f481..0000000000000000
> --- a/tools/perf/tests/clang.c
> +++ /dev/null
> @@ -1,32 +0,0 @@
> -// SPDX-License-Identifier: GPL-2.0
> -#include "tests.h"
> -#include "c++/clang-c.h"
> -#include <linux/kernel.h>
> -
> -#ifndef HAVE_LIBCLANGLLVM_SUPPORT
> -static int test__clang_to_IR(struct test_suite *test __maybe_unused,
> - int subtest __maybe_unused)
> -{
> - return TEST_SKIP;
> -}
> -
> -static int test__clang_to_obj(struct test_suite *test __maybe_unused,
> - int subtest __maybe_unused)
> -{
> - return TEST_SKIP;
> -}
> -#endif
> -
> -static struct test_case clang_tests[] = {
> - TEST_CASE_REASON("builtin clang compile C source to IR", clang_to_IR,
> - "not compiled in"),
> - TEST_CASE_REASON("builtin clang compile C source to ELF object",
> - clang_to_obj,
> - "not compiled in"),
> - { .name = NULL, }
> -};
> -
> -struct test_suite suite__clang = {
> - .desc = "builtin clang support",
> - .test_cases = clang_tests,
> -};
> diff --git a/tools/perf/tests/make b/tools/perf/tests/make
> index 58cf96d762d06a68..ea4c341f5af11741 100644
> --- a/tools/perf/tests/make
> +++ b/tools/perf/tests/make
> @@ -95,7 +95,6 @@ make_with_babeltrace:= LIBBABELTRACE=1
> make_with_coresight := CORESIGHT=1
> make_no_sdt := NO_SDT=1
> make_no_syscall_tbl := NO_SYSCALL_TABLE=1
> -make_with_clangllvm := LIBCLANGLLVM=1
> make_no_libpfm4 := NO_LIBPFM4=1
> make_with_gtk2 := GTK2=1
> make_refcnt_check := EXTRA_CFLAGS="-DREFCNT_CHECKING=1"
> diff --git a/tools/perf/util/Build b/tools/perf/util/Build
> index 9699e31ff4c04925..ff3b55c7ed43cdad 100644
> --- a/tools/perf/util/Build
> +++ b/tools/perf/util/Build
> @@ -232,8 +232,6 @@ perf-y += perf-hooks.o
> perf-$(CONFIG_LIBBPF) += bpf-event.o
> perf-$(CONFIG_LIBBPF) += bpf-utils.o
>
> -perf-$(CONFIG_CXX) += c++/
> -
> perf-$(CONFIG_LIBPFM4) += pfm.o
>
> CFLAGS_config.o += -DETC_PERFCONFIG="BUILD_STR($(ETC_PERFCONFIG_SQ))"
> diff --git a/tools/perf/util/bpf-loader.c b/tools/perf/util/bpf-loader.c
> index 50e42698cbb721d1..b54e42f17926b17e 100644
> --- a/tools/perf/util/bpf-loader.c
> +++ b/tools/perf/util/bpf-loader.c
> @@ -26,7 +26,6 @@
> #include "strfilter.h"
> #include "util.h"
> #include "llvm-utils.h"
> -#include "c++/clang-c.h"
> #include "util/hashmap.h"
> #include "asm/bug.h"
>
> @@ -220,16 +219,10 @@ struct bpf_object *bpf__prepare_load(const char *filename, bool source)
> void *obj_buf;
> size_t obj_buf_sz;
>
> - perf_clang__init();
> - err = perf_clang__compile_bpf(filename, &obj_buf, &obj_buf_sz);
> - perf_clang__cleanup();
> - if (err) {
> - pr_debug("bpf: builtin compilation failed: %d, try external compiler\n", err);
> - err = llvm__compile_bpf(filename, &obj_buf, &obj_buf_sz);
> - if (err)
> - return ERR_PTR(-BPF_LOADER_ERRNO__COMPILE);
> - } else
> - pr_debug("bpf: successful builtin compilation\n");
> + err = llvm__compile_bpf(filename, &obj_buf, &obj_buf_sz);
> + if (err)
> + return ERR_PTR(-BPF_LOADER_ERRNO__COMPILE);
> +
> obj = bpf_object__open_mem(obj_buf, obj_buf_sz, &opts);
>
> if (!IS_ERR_OR_NULL(obj) && llvm_param.dump_obj)
> diff --git a/tools/perf/util/c++/Build b/tools/perf/util/c++/Build
> deleted file mode 100644
> index 8610d032ac19d8c5..0000000000000000
> --- a/tools/perf/util/c++/Build
> +++ /dev/null
> @@ -1,5 +0,0 @@
> -perf-$(CONFIG_CLANGLLVM) += clang.o
> -perf-$(CONFIG_CLANGLLVM) += clang-test.o
> -
> -CXXFLAGS_clang.o += -Wno-unused-parameter
> -CXXFLAGS_clang-test.o += -Wno-unused-parameter
> diff --git a/tools/perf/util/c++/clang-c.h b/tools/perf/util/c++/clang-c.h
> deleted file mode 100644
> index d3731a876b6c10c5..0000000000000000
> --- a/tools/perf/util/c++/clang-c.h
> +++ /dev/null
> @@ -1,43 +0,0 @@
> -/* SPDX-License-Identifier: GPL-2.0 */
> -#ifndef PERF_UTIL_CLANG_C_H
> -#define PERF_UTIL_CLANG_C_H
> -
> -#include <stddef.h> /* for size_t */
> -
> -#ifdef __cplusplus
> -extern "C" {
> -#endif
> -
> -#ifdef HAVE_LIBCLANGLLVM_SUPPORT
> -extern void perf_clang__init(void);
> -extern void perf_clang__cleanup(void);
> -
> -struct test_suite;
> -extern int test__clang_to_IR(struct test_suite *test, int subtest);
> -extern int test__clang_to_obj(struct test_suite *test, int subtest);
> -
> -extern int perf_clang__compile_bpf(const char *filename,
> - void **p_obj_buf,
> - size_t *p_obj_buf_sz);
> -#else
> -
> -#include <errno.h>
> -#include <linux/compiler.h> /* for __maybe_unused */
> -
> -static inline void perf_clang__init(void) { }
> -static inline void perf_clang__cleanup(void) { }
> -
> -static inline int
> -perf_clang__compile_bpf(const char *filename __maybe_unused,
> - void **p_obj_buf __maybe_unused,
> - size_t *p_obj_buf_sz __maybe_unused)
> -{
> - return -ENOTSUP;
> -}
> -
> -#endif
> -
> -#ifdef __cplusplus
> -}
> -#endif
> -#endif
> diff --git a/tools/perf/util/c++/clang-test.cpp b/tools/perf/util/c++/clang-test.cpp
> deleted file mode 100644
> index a4683ca536973c04..0000000000000000
> --- a/tools/perf/util/c++/clang-test.cpp
> +++ /dev/null
> @@ -1,67 +0,0 @@
> -// SPDX-License-Identifier: GPL-2.0
> -#include "clang.h"
> -#include "clang-c.h"
> -extern "C" {
> -#include "../util.h"
> -}
> -#include "llvm/IR/Function.h"
> -#include "llvm/IR/LLVMContext.h"
> -
> -#include <tests/llvm.h>
> -#include <string>
> -
> -class perf_clang_scope {
> -public:
> - explicit perf_clang_scope() {perf_clang__init();}
> - ~perf_clang_scope() {perf_clang__cleanup();}
> -};
> -
> -static std::unique_ptr<llvm::Module>
> -__test__clang_to_IR(void)
> -{
> - unsigned int kernel_version;
> -
> - if (fetch_kernel_version(&kernel_version, NULL, 0))
> - return std::unique_ptr<llvm::Module>(nullptr);
> -
> - std::string cflag_kver("-DLINUX_VERSION_CODE=" +
> - std::to_string(kernel_version));
> -
> - std::unique_ptr<llvm::Module> M =
> - perf::getModuleFromSource({cflag_kver.c_str()},
> - "perf-test.c",
> - test_llvm__bpf_base_prog);
> - return M;
> -}
> -
> -extern "C" {
> -int test__clang_to_IR(struct test_suite *test __maybe_unused,
> - int subtest __maybe_unused)
> -{
> - perf_clang_scope _scope;
> -
> - auto M = __test__clang_to_IR();
> - if (!M)
> - return -1;
> - for (llvm::Function& F : *M)
> - if (F.getName() == "bpf_func__SyS_epoll_pwait")
> - return 0;
> - return -1;
> -}
> -
> -int test__clang_to_obj(struct test_suite *test __maybe_unused,
> - int subtest __maybe_unused)
> -{
> - perf_clang_scope _scope;
> -
> - auto M = __test__clang_to_IR();
> - if (!M)
> - return -1;
> -
> - auto Buffer = perf::getBPFObjectFromModule(&*M);
> - if (!Buffer)
> - return -1;
> - return 0;
> -}
> -
> -}
> diff --git a/tools/perf/util/c++/clang.cpp b/tools/perf/util/c++/clang.cpp
> deleted file mode 100644
> index 1aad7d6d34aaa639..0000000000000000
> --- a/tools/perf/util/c++/clang.cpp
> +++ /dev/null
> @@ -1,225 +0,0 @@
> -// SPDX-License-Identifier: GPL-2.0
> -/*
> - * llvm C frontend for perf. Support dynamically compile C file
> - *
> - * Inspired by clang example code:
> - * http://llvm.org/svn/llvm-project/cfe/trunk/examples/clang-interpreter/main.cpp
> - *
> - * Copyright (C) 2016 Wang Nan <wangnan0@xxxxxxxxxx>
> - * Copyright (C) 2016 Huawei Inc.
> - */
> -
> -#include "clang/Basic/Version.h"
> -#include "clang/CodeGen/CodeGenAction.h"
> -#include "clang/Frontend/CompilerInvocation.h"
> -#include "clang/Frontend/CompilerInstance.h"
> -#include "clang/Frontend/TextDiagnosticPrinter.h"
> -#include "clang/Tooling/Tooling.h"
> -#include "llvm/IR/LegacyPassManager.h"
> -#include "llvm/IR/Module.h"
> -#include "llvm/Option/Option.h"
> -#include "llvm/Support/FileSystem.h"
> -#include "llvm/Support/ManagedStatic.h"
> -#if CLANG_VERSION_MAJOR >= 14
> -#include "llvm/MC/TargetRegistry.h"
> -#else
> -#include "llvm/Support/TargetRegistry.h"
> -#endif
> -#include "llvm/Support/TargetSelect.h"
> -#include "llvm/Target/TargetMachine.h"
> -#include "llvm/Target/TargetOptions.h"
> -#include <memory>
> -
> -#include "clang.h"
> -#include "clang-c.h"
> -
> -namespace perf {
> -
> -static std::unique_ptr<llvm::LLVMContext> LLVMCtx;
> -
> -using namespace clang;
> -
> -static CompilerInvocation *
> -createCompilerInvocation(llvm::opt::ArgStringList CFlags, StringRef& Path,
> - DiagnosticsEngine& Diags)
> -{
> - llvm::opt::ArgStringList CCArgs {
> - "-cc1",
> - "-triple", "bpf-pc-linux",
> - "-fsyntax-only",
> - "-O2",
> - "-nostdsysteminc",
> - "-nobuiltininc",
> - "-vectorize-loops",
> - "-vectorize-slp",
> - "-Wno-unused-value",
> - "-Wno-pointer-sign",
> - "-x", "c"};
> -
> - CCArgs.append(CFlags.begin(), CFlags.end());
> - CompilerInvocation *CI = tooling::newInvocation(&Diags, CCArgs
> -#if CLANG_VERSION_MAJOR >= 11
> - ,/*BinaryName=*/nullptr
> -#endif
> - );
> -
> - FrontendOptions& Opts = CI->getFrontendOpts();
> - Opts.Inputs.clear();
> - Opts.Inputs.emplace_back(Path,
> - FrontendOptions::getInputKindForExtension("c"));
> - return CI;
> -}
> -
> -static std::unique_ptr<llvm::Module>
> -getModuleFromSource(llvm::opt::ArgStringList CFlags,
> - StringRef Path, IntrusiveRefCntPtr<vfs::FileSystem> VFS)
> -{
> - CompilerInstance Clang;
> - Clang.createDiagnostics();
> -
> -#if CLANG_VERSION_MAJOR < 9
> - Clang.setVirtualFileSystem(&*VFS);
> -#else
> - Clang.createFileManager(&*VFS);
> -#endif
> -
> -#if CLANG_VERSION_MAJOR < 4
> - IntrusiveRefCntPtr<CompilerInvocation> CI =
> - createCompilerInvocation(std::move(CFlags), Path,
> - Clang.getDiagnostics());
> - Clang.setInvocation(&*CI);
> -#else
> - std::shared_ptr<CompilerInvocation> CI(
> - createCompilerInvocation(std::move(CFlags), Path,
> - Clang.getDiagnostics()));
> - Clang.setInvocation(CI);
> -#endif
> -
> - std::unique_ptr<CodeGenAction> Act(new EmitLLVMOnlyAction(&*LLVMCtx));
> - if (!Clang.ExecuteAction(*Act))
> - return std::unique_ptr<llvm::Module>(nullptr);
> -
> - return Act->takeModule();
> -}
> -
> -std::unique_ptr<llvm::Module>
> -getModuleFromSource(llvm::opt::ArgStringList CFlags,
> - StringRef Name, StringRef Content)
> -{
> - using namespace vfs;
> -
> - llvm::IntrusiveRefCntPtr<OverlayFileSystem> OverlayFS(
> - new OverlayFileSystem(getRealFileSystem()));
> - llvm::IntrusiveRefCntPtr<InMemoryFileSystem> MemFS(
> - new InMemoryFileSystem(true));
> -
> - /*
> - * pushOverlay helps setting working dir for MemFS. Must call
> - * before addFile.
> - */
> - OverlayFS->pushOverlay(MemFS);
> - MemFS->addFile(Twine(Name), 0, llvm::MemoryBuffer::getMemBuffer(Content));
> -
> - return getModuleFromSource(std::move(CFlags), Name, OverlayFS);
> -}
> -
> -std::unique_ptr<llvm::Module>
> -getModuleFromSource(llvm::opt::ArgStringList CFlags, StringRef Path)
> -{
> - IntrusiveRefCntPtr<vfs::FileSystem> VFS(vfs::getRealFileSystem());
> - return getModuleFromSource(std::move(CFlags), Path, VFS);
> -}
> -
> -std::unique_ptr<llvm::SmallVectorImpl<char>>
> -getBPFObjectFromModule(llvm::Module *Module)
> -{
> - using namespace llvm;
> -
> - std::string TargetTriple("bpf-pc-linux");
> - std::string Error;
> - const Target* Target = TargetRegistry::lookupTarget(TargetTriple, Error);
> - if (!Target) {
> - llvm::errs() << Error;
> - return std::unique_ptr<llvm::SmallVectorImpl<char>>(nullptr);
> - }
> -
> - llvm::TargetOptions Opt;
> - TargetMachine *TargetMachine =
> - Target->createTargetMachine(TargetTriple,
> - "generic", "",
> - Opt, Reloc::Static);
> -
> - Module->setDataLayout(TargetMachine->createDataLayout());
> - Module->setTargetTriple(TargetTriple);
> -
> - std::unique_ptr<SmallVectorImpl<char>> Buffer(new SmallVector<char, 0>());
> - raw_svector_ostream ostream(*Buffer);
> -
> - legacy::PassManager PM;
> - bool NotAdded;
> - NotAdded = TargetMachine->addPassesToEmitFile(PM, ostream
> -#if CLANG_VERSION_MAJOR >= 7
> - , /*DwoOut=*/nullptr
> -#endif
> -#if CLANG_VERSION_MAJOR < 10
> - , TargetMachine::CGFT_ObjectFile
> -#else
> - , llvm::CGFT_ObjectFile
> -#endif
> - );
> - if (NotAdded) {
> - llvm::errs() << "TargetMachine can't emit a file of this type\n";
> - return std::unique_ptr<llvm::SmallVectorImpl<char>>(nullptr);
> - }
> - PM.run(*Module);
> -
> - return Buffer;
> -}
> -
> -}
> -
> -extern "C" {
> -void perf_clang__init(void)
> -{
> - perf::LLVMCtx.reset(new llvm::LLVMContext());
> - LLVMInitializeBPFTargetInfo();
> - LLVMInitializeBPFTarget();
> - LLVMInitializeBPFTargetMC();
> - LLVMInitializeBPFAsmPrinter();
> -}
> -
> -void perf_clang__cleanup(void)
> -{
> - perf::LLVMCtx.reset(nullptr);
> - llvm::llvm_shutdown();
> -}
> -
> -int perf_clang__compile_bpf(const char *filename,
> - void **p_obj_buf,
> - size_t *p_obj_buf_sz)
> -{
> - using namespace perf;
> -
> - if (!p_obj_buf || !p_obj_buf_sz)
> - return -EINVAL;
> -
> - llvm::opt::ArgStringList CFlags;
> - auto M = getModuleFromSource(std::move(CFlags), filename);
> - if (!M)
> - return -EINVAL;
> - auto O = getBPFObjectFromModule(&*M);
> - if (!O)
> - return -EINVAL;
> -
> - size_t size = O->size_in_bytes();
> - void *buffer;
> -
> - buffer = malloc(size);
> - if (!buffer)
> - return -ENOMEM;
> - memcpy(buffer, O->data(), size);
> - *p_obj_buf = buffer;
> - *p_obj_buf_sz = size;
> - return 0;
> -}
> -}
> diff --git a/tools/perf/util/c++/clang.h b/tools/perf/util/c++/clang.h
> deleted file mode 100644
> index 6ce33e22f23c084a..0000000000000000
> --- a/tools/perf/util/c++/clang.h
> +++ /dev/null
> @@ -1,27 +0,0 @@
> -/* SPDX-License-Identifier: GPL-2.0 */
> -#ifndef PERF_UTIL_CLANG_H
> -#define PERF_UTIL_CLANG_H
> -
> -#include "llvm/ADT/StringRef.h"
> -#include "llvm/IR/LLVMContext.h"
> -#include "llvm/IR/Module.h"
> -#include "llvm/Option/Option.h"
> -#include <memory>
> -
> -namespace perf {
> -
> -using namespace llvm;
> -
> -std::unique_ptr<Module>
> -getModuleFromSource(opt::ArgStringList CFlags,
> - StringRef Name, StringRef Content);
> -
> -std::unique_ptr<Module>
> -getModuleFromSource(opt::ArgStringList CFlags,
> - StringRef Path);
> -
> -std::unique_ptr<llvm::SmallVectorImpl<char>>
> -getBPFObjectFromModule(llvm::Module *Module);
> -
> -}
> -#endif
> --
> 2.37.1
>