linux-perf-users.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH 0/8] perf build: Support building with Clang
@ 2025-09-25 10:26 Leo Yan
  2025-09-25 10:26 ` [PATCH 1/8] tools build: Align warning options with perf Leo Yan
                   ` (7 more replies)
  0 siblings, 8 replies; 15+ messages in thread
From: Leo Yan @ 2025-09-25 10:26 UTC (permalink / raw)
  To: Arnaldo Carvalho de Melo, Namhyung Kim, Jiri Olsa, Ian Rogers,
	Adrian Hunter, Quentin Monnet, Andrii Nakryiko, Nathan Chancellor,
	Nick Desaulniers, Bill Wendling, Justin Stitt, Alexei Starovoitov,
	Daniel Borkmann, Martin KaFai Lau, Eduard Zingerman, Song Liu,
	Yonghong Song, John Fastabend, KP Singh, Stanislav Fomichev,
	Hao Luo, James Clark
  Cc: linux-kernel, linux-perf-users, llvm, bpf, Leo Yan

This series adds support for building perf with Clang, following the
discussion in [1]. Because the Android NDK uses Clang by default,
enabling Clang builds naturally covers Android as well.

The series is organized as follows:

  - Patches 1–2: Fix two bugs found with Clang.
  - Patches 3–6: Address Clang build warnings. Because these warnings
    do not break the build, no Fixes tag is added to avoid backporting.
  - Patches 7–8: Enable Clang in the Makefile and update the
    documentation.

Testing:

  - Clang 15.0.7 on Ubuntu 22.04.5: native and cross-compiling (aarch64)
  - Clang 18.1.3 on Ubuntu 24.04.2: native and cross-compiling (aarch64)
  - Android NDK r27d (latest LTS): cross-compiling (aarch64)

[1] https://lore.kernel.org/linux-perf-users/20240715143342.52236-1-leo.yan@arm.com/

Signed-off-by: Leo Yan <leo.yan@arm.com>
---
Leo Yan (8):
      tools build: Align warning options with perf
      perf python: split Clang options when invoking Popen
      bpftool: Conditionally add -Wformat-signedness flag
      perf test coresight: Dismiss clang warning for memcpy thread
      perf test coresight: Dismiss clang warning for thread loop
      perf test coresight: Dismiss clang warning for unroll loop thread
      perf build: Support build with clang
      perf docs: Document building with Clang

 tools/bpf/bpftool/Makefile                         | 12 +++-
 tools/build/feature/Makefile                       |  4 +-
 tools/perf/Documentation/Build.txt                 | 18 +++++
 tools/perf/Documentation/android.txt               | 82 +++-------------------
 tools/perf/Makefile.config                         | 32 ++++++++-
 .../shell/coresight/memcpy_thread/memcpy_thread.c  |  2 +
 .../shell/coresight/thread_loop/thread_loop.c      |  4 +-
 .../unroll_loop_thread/unroll_loop_thread.c        |  4 +-
 tools/perf/util/setup.py                           |  5 +-
 9 files changed, 81 insertions(+), 82 deletions(-)
---
base-commit: c17dda8013495d8132c976cbf349be9949d0fbd1
change-id: 20250915-perf_build_android_ndk-500b53bea895

Best regards,
-- 
Leo Yan <leo.yan@arm.com>


^ permalink raw reply	[flat|nested] 15+ messages in thread

* [PATCH 1/8] tools build: Align warning options with perf
  2025-09-25 10:26 [PATCH 0/8] perf build: Support building with Clang Leo Yan
@ 2025-09-25 10:26 ` Leo Yan
  2025-09-25 10:26 ` [PATCH 2/8] perf python: split Clang options when invoking Popen Leo Yan
                   ` (6 subsequent siblings)
  7 siblings, 0 replies; 15+ messages in thread
From: Leo Yan @ 2025-09-25 10:26 UTC (permalink / raw)
  To: Arnaldo Carvalho de Melo, Namhyung Kim, Jiri Olsa, Ian Rogers,
	Adrian Hunter, Quentin Monnet, Andrii Nakryiko, Nathan Chancellor,
	Nick Desaulniers, Bill Wendling, Justin Stitt, Alexei Starovoitov,
	Daniel Borkmann, Martin KaFai Lau, Eduard Zingerman, Song Liu,
	Yonghong Song, John Fastabend, KP Singh, Stanislav Fomichev,
	Hao Luo, James Clark
  Cc: linux-kernel, linux-perf-users, llvm, bpf, Leo Yan

The feature test programs are built without enabling '-Wall -Werror'
options. As a result, a feature may appear to be available, but later
building in perf can fail with stricter checks.

Make the feature test program use the same warning options as perf.

Fixes: 1925459b4d92 ("tools build: Fix feature Makefile issues with 'O='")
Signed-off-by: Leo Yan <leo.yan@arm.com>
---
 tools/build/feature/Makefile | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/tools/build/feature/Makefile b/tools/build/feature/Makefile
index b41a42818d8ac232ade78ecb41363d26ce2a9471..bd615a708a0aa89ddbe87401f04bd736e384a9c4 100644
--- a/tools/build/feature/Makefile
+++ b/tools/build/feature/Makefile
@@ -316,10 +316,10 @@ $(OUTPUT)test-libcapstone.bin:
 	$(BUILD) # -lcapstone provided by $(FEATURE_CHECK_LDFLAGS-libcapstone)
 
 $(OUTPUT)test-compile-32.bin:
-	$(CC) -m32 -o $@ test-compile.c
+	$(CC) -m32 -Wall -Werror -o $@ test-compile.c
 
 $(OUTPUT)test-compile-x32.bin:
-	$(CC) -mx32 -o $@ test-compile.c
+	$(CC) -mx32 -Wall -Werror -o $@ test-compile.c
 
 $(OUTPUT)test-zlib.bin:
 	$(BUILD) -lz

-- 
2.34.1


^ permalink raw reply related	[flat|nested] 15+ messages in thread

* [PATCH 2/8] perf python: split Clang options when invoking Popen
  2025-09-25 10:26 [PATCH 0/8] perf build: Support building with Clang Leo Yan
  2025-09-25 10:26 ` [PATCH 1/8] tools build: Align warning options with perf Leo Yan
@ 2025-09-25 10:26 ` Leo Yan
  2025-09-25 10:26 ` [PATCH 3/8] bpftool: Conditionally add -Wformat-signedness flag Leo Yan
                   ` (5 subsequent siblings)
  7 siblings, 0 replies; 15+ messages in thread
From: Leo Yan @ 2025-09-25 10:26 UTC (permalink / raw)
  To: Arnaldo Carvalho de Melo, Namhyung Kim, Jiri Olsa, Ian Rogers,
	Adrian Hunter, Quentin Monnet, Andrii Nakryiko, Nathan Chancellor,
	Nick Desaulniers, Bill Wendling, Justin Stitt, Alexei Starovoitov,
	Daniel Borkmann, Martin KaFai Lau, Eduard Zingerman, Song Liu,
	Yonghong Song, John Fastabend, KP Singh, Stanislav Fomichev,
	Hao Luo, James Clark
  Cc: linux-kernel, linux-perf-users, llvm, bpf, Leo Yan

When passing a list to subprocess.Popen, each element maps to one argv
token. Current code bundles multiple Clang flags into a single element,
something like:

  cmd = ['clang',
         '--target=x86_64-linux-gnu -fintegrated-as -Wno-cast-function-type-mismatch',
	 'test-hello.c']

So Clang only sees one long, invalid option instead of separate flags,
as a result, the script cannot capture any log via PIPE.

Fix this by using shlex.split() to separate the string so each option
becomes its own argv element. The fixed list will be:

  cmd = ['clang',
         '--target=x86_64-linux-gnu',
	 '-fintegrated-as',
	 '-Wno-cast-function-type-mismatch',
	 'test-hello.c']

Fixes: 09e6f9f98370 ("perf python: Fix splitting CC into compiler and options")
Signed-off-by: Leo Yan <leo.yan@arm.com>
---
 tools/perf/util/setup.py | 5 ++++-
 1 file changed, 4 insertions(+), 1 deletion(-)

diff --git a/tools/perf/util/setup.py b/tools/perf/util/setup.py
index dd289d15acfd62ff058bbaed7e565bb958e3a3c8..9cae2c472f4ad4d9579e8528b8bb0152df6fe20e 100644
--- a/tools/perf/util/setup.py
+++ b/tools/perf/util/setup.py
@@ -1,6 +1,7 @@
 from os import getenv, path
 from subprocess import Popen, PIPE
 from re import sub
+import shlex
 
 cc = getenv("CC")
 assert cc, "Environment variable CC not set"
@@ -22,7 +23,9 @@ assert srctree, "Environment variable srctree, for the Linux sources, not set"
 src_feature_tests  = f'{srctree}/tools/build/feature'
 
 def clang_has_option(option):
-    cc_output = Popen([cc, cc_options + option, path.join(src_feature_tests, "test-hello.c") ], stderr=PIPE).stderr.readlines()
+    cmd = shlex.split(f"{cc} {cc_options} {option}")
+    cmd.append(path.join(src_feature_tests, "test-hello.c"))
+    cc_output = Popen(cmd, stderr=PIPE).stderr.readlines()
     return [o for o in cc_output if ((b"unknown argument" in o) or (b"is not supported" in o) or (b"unknown warning option" in o))] == [ ]
 
 if cc_is_clang:

-- 
2.34.1


^ permalink raw reply related	[flat|nested] 15+ messages in thread

* [PATCH 3/8] bpftool: Conditionally add -Wformat-signedness flag
  2025-09-25 10:26 [PATCH 0/8] perf build: Support building with Clang Leo Yan
  2025-09-25 10:26 ` [PATCH 1/8] tools build: Align warning options with perf Leo Yan
  2025-09-25 10:26 ` [PATCH 2/8] perf python: split Clang options when invoking Popen Leo Yan
@ 2025-09-25 10:26 ` Leo Yan
  2025-09-25 10:42   ` Quentin Monnet
  2025-09-25 10:26 ` [PATCH 4/8] perf test coresight: Dismiss clang warning for memcpy thread Leo Yan
                   ` (4 subsequent siblings)
  7 siblings, 1 reply; 15+ messages in thread
From: Leo Yan @ 2025-09-25 10:26 UTC (permalink / raw)
  To: Arnaldo Carvalho de Melo, Namhyung Kim, Jiri Olsa, Ian Rogers,
	Adrian Hunter, Quentin Monnet, Andrii Nakryiko, Nathan Chancellor,
	Nick Desaulniers, Bill Wendling, Justin Stitt, Alexei Starovoitov,
	Daniel Borkmann, Martin KaFai Lau, Eduard Zingerman, Song Liu,
	Yonghong Song, John Fastabend, KP Singh, Stanislav Fomichev,
	Hao Luo, James Clark
  Cc: linux-kernel, linux-perf-users, llvm, bpf, Leo Yan

clang-18.1.3 on Ubuntu 24.04.2 reports warning:

  warning: unknown warning option '-Wformat-signedness' [-Wunknown-warning-option]

Conditionally add the option only when it is supported by compiler.

Signed-off-by: Leo Yan <leo.yan@arm.com>
---
 tools/bpf/bpftool/Makefile | 12 +++++++++++-
 1 file changed, 11 insertions(+), 1 deletion(-)

diff --git a/tools/bpf/bpftool/Makefile b/tools/bpf/bpftool/Makefile
index 9e9a5f006cd2aabe1e89bd83e394455c0d4473e0..948a0cc98b39d3f9afa0de73643eab04e8798ff5 100644
--- a/tools/bpf/bpftool/Makefile
+++ b/tools/bpf/bpftool/Makefile
@@ -64,11 +64,21 @@ $(LIBBPF_BOOTSTRAP)-clean: FORCE | $(LIBBPF_BOOTSTRAP_OUTPUT)
 prefix ?= /usr/local
 bash_compdir ?= /usr/share/bash-completion/completions
 
+try-run = $(shell set -e;		\
+	if ($(1)) >/dev/null 2>&1;	\
+	then echo "$(2)";		\
+	else echo "$(3)";		\
+	fi)
+
+__cc-option = $(call try-run,\
+	$(1) -Werror $(2) -c -x c /dev/null -o /dev/null,$(2),)
+cc-option = $(call __cc-option, $(CC),$(1))
+
 CFLAGS += -O2
 CFLAGS += -W
 CFLAGS += -Wall
 CFLAGS += -Wextra
-CFLAGS += -Wformat-signedness
+CFLAGS += $(call cc-option,-Wformat-signedness)
 CFLAGS += -Wno-unused-parameter
 CFLAGS += -Wno-missing-field-initializers
 CFLAGS += $(filter-out -Wswitch-enum -Wnested-externs,$(EXTRA_WARNINGS))

-- 
2.34.1


^ permalink raw reply related	[flat|nested] 15+ messages in thread

* [PATCH 4/8] perf test coresight: Dismiss clang warning for memcpy thread
  2025-09-25 10:26 [PATCH 0/8] perf build: Support building with Clang Leo Yan
                   ` (2 preceding siblings ...)
  2025-09-25 10:26 ` [PATCH 3/8] bpftool: Conditionally add -Wformat-signedness flag Leo Yan
@ 2025-09-25 10:26 ` Leo Yan
  2025-09-25 19:38   ` Ian Rogers
  2025-09-25 10:26 ` [PATCH 5/8] perf test coresight: Dismiss clang warning for thread loop Leo Yan
                   ` (3 subsequent siblings)
  7 siblings, 1 reply; 15+ messages in thread
From: Leo Yan @ 2025-09-25 10:26 UTC (permalink / raw)
  To: Arnaldo Carvalho de Melo, Namhyung Kim, Jiri Olsa, Ian Rogers,
	Adrian Hunter, Quentin Monnet, Andrii Nakryiko, Nathan Chancellor,
	Nick Desaulniers, Bill Wendling, Justin Stitt, Alexei Starovoitov,
	Daniel Borkmann, Martin KaFai Lau, Eduard Zingerman, Song Liu,
	Yonghong Song, John Fastabend, KP Singh, Stanislav Fomichev,
	Hao Luo, James Clark
  Cc: linux-kernel, linux-perf-users, llvm, bpf, Leo Yan

clang-18.1.3 on Ubuntu 24.04.2 reports warning:

  memcpy_thread.c:30:1: warning: non-void function does not return a value in all control paths [-Wreturn-type]
     30 | }
        | ^

Dismiss the warning with returning NULL from the thread function.

Signed-off-by: Leo Yan <leo.yan@arm.com>
---
 tools/perf/tests/shell/coresight/memcpy_thread/memcpy_thread.c | 2 ++
 1 file changed, 2 insertions(+)

diff --git a/tools/perf/tests/shell/coresight/memcpy_thread/memcpy_thread.c b/tools/perf/tests/shell/coresight/memcpy_thread/memcpy_thread.c
index 5f886cd09e6b3a62b5690dade94f1f8cae3279d2..7e879217be30a86431989dbf1f36d2134ef259cc 100644
--- a/tools/perf/tests/shell/coresight/memcpy_thread/memcpy_thread.c
+++ b/tools/perf/tests/shell/coresight/memcpy_thread/memcpy_thread.c
@@ -27,6 +27,8 @@ static void *thrfn(void *arg)
 	}
 	for (i = 0; i < len; i++)
 		memcpy(dst, src, a->size * 1024);
+
+	return NULL;
 }
 
 static pthread_t new_thr(void *(*fn) (void *arg), void *arg)

-- 
2.34.1


^ permalink raw reply related	[flat|nested] 15+ messages in thread

* [PATCH 5/8] perf test coresight: Dismiss clang warning for thread loop
  2025-09-25 10:26 [PATCH 0/8] perf build: Support building with Clang Leo Yan
                   ` (3 preceding siblings ...)
  2025-09-25 10:26 ` [PATCH 4/8] perf test coresight: Dismiss clang warning for memcpy thread Leo Yan
@ 2025-09-25 10:26 ` Leo Yan
  2025-09-25 10:26 ` [PATCH 6/8] perf test coresight: Dismiss clang warning for unroll loop thread Leo Yan
                   ` (2 subsequent siblings)
  7 siblings, 0 replies; 15+ messages in thread
From: Leo Yan @ 2025-09-25 10:26 UTC (permalink / raw)
  To: Arnaldo Carvalho de Melo, Namhyung Kim, Jiri Olsa, Ian Rogers,
	Adrian Hunter, Quentin Monnet, Andrii Nakryiko, Nathan Chancellor,
	Nick Desaulniers, Bill Wendling, Justin Stitt, Alexei Starovoitov,
	Daniel Borkmann, Martin KaFai Lau, Eduard Zingerman, Song Liu,
	Yonghong Song, John Fastabend, KP Singh, Stanislav Fomichev,
	Hao Luo, James Clark
  Cc: linux-kernel, linux-perf-users, llvm, bpf, Leo Yan

clang-18.1.3 on Ubuntu 24.04.2 reports warning:

  thread_loop.c:41:23: warning: value size does not match register size specified by the constraint and modifier [-Wasm-operand-widths]
     41 |                 : /* in */ [i] "r" (i), [len] "r" (len)
        |                                     ^
  thread_loop.c:37:8: note: use constraint modifier "w"
     37 |                 "add %[i], %[i], #1\n"
        |                      ^~~~
        |                      %w[i]
  thread_loop.c:41:23: warning: value size does not match register size specified by the constraint and modifier [-Wasm-operand-widths]
     41 |                 : /* in */ [i] "r" (i), [len] "r" (len)
        |                                     ^
  thread_loop.c:37:14: note: use constraint modifier "w"
     37 |                 "add %[i], %[i], #1\n"
        |                            ^~~~
        |                            %w[i]
  thread_loop.c:41:23: warning: value size does not match register size specified by the constraint and modifier [-Wasm-operand-widths]
     41 |                 : /* in */ [i] "r" (i), [len] "r" (len)
        |                                     ^
  thread_loop.c:38:8: note: use constraint modifier "w"
     38 |                 "cmp %[i], %[len]\n"
        |                      ^~~~
        |                      %w[i]
  thread_loop.c:41:38: warning: value size does not match register size specified by the constraint and modifier [-Wasm-operand-widths]
     41 |                 : /* in */ [i] "r" (i), [len] "r" (len)
        |                                                    ^
  thread_loop.c:38:14: note: use constraint modifier "w"
     38 |                 "cmp %[i], %[len]\n"
        |                            ^~~~~~
        |                            %w[len]

Use the modifier "w" for 32-bit register access.

Signed-off-by: Leo Yan <leo.yan@arm.com>
---
 tools/perf/tests/shell/coresight/thread_loop/thread_loop.c | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/tools/perf/tests/shell/coresight/thread_loop/thread_loop.c b/tools/perf/tests/shell/coresight/thread_loop/thread_loop.c
index e05a559253ca9d9366ad321d520349042fb07fca..86f3f548b00631682767665fc5e9d5b8551a3634 100644
--- a/tools/perf/tests/shell/coresight/thread_loop/thread_loop.c
+++ b/tools/perf/tests/shell/coresight/thread_loop/thread_loop.c
@@ -34,8 +34,8 @@ static void *thrfn(void *arg)
 	}
 	asm volatile(
 		"loop:\n"
-		"add %[i], %[i], #1\n"
-		"cmp %[i], %[len]\n"
+		"add %w[i], %w[i], #1\n"
+		"cmp %w[i], %w[len]\n"
 		"blt loop\n"
 		: /* out */
 		: /* in */ [i] "r" (i), [len] "r" (len)

-- 
2.34.1


^ permalink raw reply related	[flat|nested] 15+ messages in thread

* [PATCH 6/8] perf test coresight: Dismiss clang warning for unroll loop thread
  2025-09-25 10:26 [PATCH 0/8] perf build: Support building with Clang Leo Yan
                   ` (4 preceding siblings ...)
  2025-09-25 10:26 ` [PATCH 5/8] perf test coresight: Dismiss clang warning for thread loop Leo Yan
@ 2025-09-25 10:26 ` Leo Yan
  2025-09-25 10:26 ` [PATCH 7/8] perf build: Support build with clang Leo Yan
  2025-09-25 10:26 ` [PATCH 8/8] perf docs: Document building with Clang Leo Yan
  7 siblings, 0 replies; 15+ messages in thread
From: Leo Yan @ 2025-09-25 10:26 UTC (permalink / raw)
  To: Arnaldo Carvalho de Melo, Namhyung Kim, Jiri Olsa, Ian Rogers,
	Adrian Hunter, Quentin Monnet, Andrii Nakryiko, Nathan Chancellor,
	Nick Desaulniers, Bill Wendling, Justin Stitt, Alexei Starovoitov,
	Daniel Borkmann, Martin KaFai Lau, Eduard Zingerman, Song Liu,
	Yonghong Song, John Fastabend, KP Singh, Stanislav Fomichev,
	Hao Luo, James Clark
  Cc: linux-kernel, linux-perf-users, llvm, bpf, Leo Yan

clang-18.1.3 on Ubuntu 24.04.2 reports warning:

  unroll_loop_thread.c:35:25: warning: value size does not match register size specified by the constraint and modifier [-Wasm-operand-widths]
     35 |                         : /* in */ [in] "r" (in)
        |                                              ^
  unroll_loop_thread.c:39:1: warning: non-void function does not return a value [-Wreturn-type]
     39 | }
        | ^

Use the modifier "w" for 32-bit register access and return NULL at the
end of thread function.

Signed-off-by: Leo Yan <leo.yan@arm.com>
---
 .../tests/shell/coresight/unroll_loop_thread/unroll_loop_thread.c     | 4 +++-
 1 file changed, 3 insertions(+), 1 deletion(-)

diff --git a/tools/perf/tests/shell/coresight/unroll_loop_thread/unroll_loop_thread.c b/tools/perf/tests/shell/coresight/unroll_loop_thread/unroll_loop_thread.c
index 0fc7bf1a25af3607b40f091f62176134ddb7f9f6..8f4e1c985ca38ab545a05189432a14a6d888d34c 100644
--- a/tools/perf/tests/shell/coresight/unroll_loop_thread/unroll_loop_thread.c
+++ b/tools/perf/tests/shell/coresight/unroll_loop_thread/unroll_loop_thread.c
@@ -20,7 +20,7 @@ static void *thrfn(void *arg)
 	for (i = 0; i < 10000; i++) {
 		asm volatile (
 // force an unroll of thia add instruction so we can test long runs of code
-#define SNIP1 "add %[in], %[in], #1\n"
+#define SNIP1 "add %w[in], %w[in], #1\n"
 // 10
 #define SNIP2 SNIP1 SNIP1 SNIP1 SNIP1 SNIP1 SNIP1 SNIP1 SNIP1 SNIP1 SNIP1
 // 100
@@ -36,6 +36,8 @@ static void *thrfn(void *arg)
 			: /* clobber */
 		);
 	}
+
+	return NULL;
 }
 
 static pthread_t new_thr(void *(*fn) (void *arg), void *arg)

-- 
2.34.1


^ permalink raw reply related	[flat|nested] 15+ messages in thread

* [PATCH 7/8] perf build: Support build with clang
  2025-09-25 10:26 [PATCH 0/8] perf build: Support building with Clang Leo Yan
                   ` (5 preceding siblings ...)
  2025-09-25 10:26 ` [PATCH 6/8] perf test coresight: Dismiss clang warning for unroll loop thread Leo Yan
@ 2025-09-25 10:26 ` Leo Yan
  2025-09-25 10:26 ` [PATCH 8/8] perf docs: Document building with Clang Leo Yan
  7 siblings, 0 replies; 15+ messages in thread
From: Leo Yan @ 2025-09-25 10:26 UTC (permalink / raw)
  To: Arnaldo Carvalho de Melo, Namhyung Kim, Jiri Olsa, Ian Rogers,
	Adrian Hunter, Quentin Monnet, Andrii Nakryiko, Nathan Chancellor,
	Nick Desaulniers, Bill Wendling, Justin Stitt, Alexei Starovoitov,
	Daniel Borkmann, Martin KaFai Lau, Eduard Zingerman, Song Liu,
	Yonghong Song, John Fastabend, KP Singh, Stanislav Fomichev,
	Hao Luo, James Clark
  Cc: linux-kernel, linux-perf-users, llvm, bpf, Leo Yan

Add support for building perf with clang. For cross compilation, the
Makefile dynamically selects target flag for corresponding arch.

This patch has been verified on x86_64 machine with Ubuntu distro, it
can build successfully for native target, and for cross building Arm64
and s390.

Example: native build on x86_64 / Ubuntu machine:

  $ HOSTCC=clang CC=clang CXX=clang++ make -C tools/perf

Example: cross building s390 target on x86_64 / Ubuntu machine:

  # Install x390x cross toolchain and headers
  $ sudo apt-get install gcc-s390x-linux-gnu g++-s390x-linux-gnu \
         libc6-dev-s390x-cross linux-libc-dev-s390x-cross

  # Build with clang
  $ HOSTCC=clang CC=clang CXX=clang++ \
    ARCH=s390 CROSS_COMPILE=s390x-linux-gnu- \
    make -C tools/perf NO_LIBELF=1 NO_LIBTRACEEVENT=1 NO_LIBPYTHON=1

Signed-off-by: Leo Yan <leo.yan@arm.com>
---
 tools/perf/Makefile.config | 32 +++++++++++++++++++++++++++++++-
 1 file changed, 31 insertions(+), 1 deletion(-)

diff --git a/tools/perf/Makefile.config b/tools/perf/Makefile.config
index 5a5832ee7b53c604ec0d90c5ca7e2bee5bfa6a17..a2b5c291a364cbf331c16384764520dfe330a04c 100644
--- a/tools/perf/Makefile.config
+++ b/tools/perf/Makefile.config
@@ -23,8 +23,38 @@ HOSTCFLAGS := $(filter-out -Wnested-externs,$(EXTRA_WARNINGS))
 # borrowed from kernel headers depends on it, e.g. put_unaligned_*().
 CFLAGS += -fno-strict-aliasing
 
-# Enabled Wthread-safety analysis for clang builds.
+# Set target flag and options when using clang as compiler.
 ifeq ($(CC_NO_CLANG), 0)
+  CLANG_TARGET_FLAGS_arm	:= arm-linux-gnueabi
+  CLANG_TARGET_FLAGS_arm64	:= aarch64-linux-gnu
+  CLANG_TARGET_FLAGS_m68k	:= m68k-linux-gnu
+  CLANG_TARGET_FLAGS_mips	:= mipsel-linux-gnu
+  CLANG_TARGET_FLAGS_powerpc	:= powerpc64le-linux-gnu
+  CLANG_TARGET_FLAGS_riscv	:= riscv64-linux-gnu
+  CLANG_TARGET_FLAGS_s390	:= s390x-linux-gnu
+  CLANG_TARGET_FLAGS_x86	:= x86_64-linux-gnu
+
+  # Default to host architecture if ARCH is not explicitly given.
+  ifeq ($(ARCH),)
+    CLANG_TARGET_FLAGS := $(shell $(CLANG) -print-target-triple)
+  else
+    CLANG_TARGET_FLAGS := $(CLANG_TARGET_FLAGS_$(ARCH))
+  endif
+
+  ifeq ($(CROSS_COMPILE),)
+    ifeq ($(CLANG_TARGET_FLAGS),)
+      $(error Specify CROSS_COMPILE or add CLANG_TARGET_FLAGS for $(ARCH))
+    else
+      CLANG_FLAGS += --target=$(CLANG_TARGET_FLAGS)
+    endif # CLANG_TARGET_FLAGS
+  else
+    CLANG_FLAGS += --target=$(notdir $(CROSS_COMPILE:%-=%))
+  endif # CROSS_COMPILE
+
+  CC := $(CLANG) $(CLANG_FLAGS) -fintegrated-as
+  CXX := $(CXX) $(CLANG_FLAGS) -fintegrated-as
+
+  # Enabled Wthread-safety analysis for clang builds.
   CFLAGS += -Wthread-safety
 endif
 

-- 
2.34.1


^ permalink raw reply related	[flat|nested] 15+ messages in thread

* [PATCH 8/8] perf docs: Document building with Clang
  2025-09-25 10:26 [PATCH 0/8] perf build: Support building with Clang Leo Yan
                   ` (6 preceding siblings ...)
  2025-09-25 10:26 ` [PATCH 7/8] perf build: Support build with clang Leo Yan
@ 2025-09-25 10:26 ` Leo Yan
  2025-09-25 19:43   ` Ian Rogers
  7 siblings, 1 reply; 15+ messages in thread
From: Leo Yan @ 2025-09-25 10:26 UTC (permalink / raw)
  To: Arnaldo Carvalho de Melo, Namhyung Kim, Jiri Olsa, Ian Rogers,
	Adrian Hunter, Quentin Monnet, Andrii Nakryiko, Nathan Chancellor,
	Nick Desaulniers, Bill Wendling, Justin Stitt, Alexei Starovoitov,
	Daniel Borkmann, Martin KaFai Lau, Eduard Zingerman, Song Liu,
	Yonghong Song, John Fastabend, KP Singh, Stanislav Fomichev,
	Hao Luo, James Clark
  Cc: linux-kernel, linux-perf-users, llvm, bpf, Leo Yan

Add example commands for building perf with Clang.

Since recent Android NDK releases use Clang as the default compiler, a
separate Android specific document is no longer needed; point to the
general build documentation instead.

Signed-off-by: Leo Yan <leo.yan@arm.com>
---
 tools/perf/Documentation/Build.txt   | 18 ++++++++
 tools/perf/Documentation/android.txt | 82 ++++--------------------------------
 2 files changed, 26 insertions(+), 74 deletions(-)

diff --git a/tools/perf/Documentation/Build.txt b/tools/perf/Documentation/Build.txt
index 83dc87c662b63ecc17553a15cc15a6b8d6f01d83..3e4104e605ac0d7d30b4408ef413cf1f90b034c1 100644
--- a/tools/perf/Documentation/Build.txt
+++ b/tools/perf/Documentation/Build.txt
@@ -99,3 +99,21 @@ configuration paths for cross building:
 In this case, the variable PKG_CONFIG_SYSROOT_DIR can be used alongside the
 variable PKG_CONFIG_LIBDIR or PKG_CONFIG_PATH to prepend the sysroot path to
 the library paths for cross compilation.
+
+5) Build with clang
+===================
+By default, the makefile uses GCC as compiler. With specifying environment
+variables HOSTCC, CC and CXX, it allows to build perf with clang.
+
+Using clang for native build:
+
+  $ HOSTCC=clang CC=clang CXX=clang++ make -C tools/perf
+
+Using clang for cross compilation:
+
+  $ HOSTCC=clang CC=clang CXX=clang++ \
+    make ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- -C tools/perf \
+    NO_LIBELF=1 NO_LIBTRACEEVENT=1 NO_JEVENTS=1
+
+In the example above, due to lack libelf, python and libtraceevent for
+cross comiplation, disable the features accordingly.
diff --git a/tools/perf/Documentation/android.txt b/tools/perf/Documentation/android.txt
index 24a59998fc91e814ad96f658d3481d88d798b60c..e65204cf2921f6bd8a79875784c5b3d5487ce05d 100644
--- a/tools/perf/Documentation/android.txt
+++ b/tools/perf/Documentation/android.txt
@@ -1,78 +1,12 @@
 How to compile perf for Android
-=========================================
+===============================
 
-I. Set the Android NDK environment
-------------------------------------------------
+There have two ways to build perf and run it on Android.
 
-(a). Use the Android NDK
-------------------------------------------------
-1. You need to download and install the Android Native Development Kit (NDK).
-Set the NDK variable to point to the path where you installed the NDK:
-  export NDK=/path/to/android-ndk
+- The first method is to build perf with static linking, please refer to
+  Build.txt, section "4) Cross compilation" for how to build a static
+  perf binary.
 
-2. Set cross-compiling environment variables for NDK toolchain and sysroot.
-For arm:
-  export NDK_TOOLCHAIN=${NDK}/toolchains/arm-linux-androideabi-4.9/prebuilt/linux-x86_64/bin/arm-linux-androideabi-
-  export NDK_SYSROOT=${NDK}/platforms/android-24/arch-arm
-For x86:
-  export NDK_TOOLCHAIN=${NDK}/toolchains/x86-4.9/prebuilt/linux-x86_64/bin/i686-linux-android-
-  export NDK_SYSROOT=${NDK}/platforms/android-24/arch-x86
-
-This method is only tested for Android NDK versions Revision 11b and later.
-perf uses some bionic enhancements that are not included in prior NDK versions.
-You can use method (b) described below instead.
-
-(b). Use the Android source tree
------------------------------------------------
-1. Download the master branch of the Android source tree.
-Set the environment for the target you want using:
-  source build/envsetup.sh
-  lunch
-
-2. Build your own NDK sysroot to contain latest bionic changes and set the
-NDK sysroot environment variable.
-  cd ${ANDROID_BUILD_TOP}/ndk
-For arm:
-  ./build/tools/build-ndk-sysroot.sh --abi=arm
-  export NDK_SYSROOT=${ANDROID_BUILD_TOP}/ndk/build/platforms/android-3/arch-arm
-For x86:
-  ./build/tools/build-ndk-sysroot.sh --abi=x86
-  export NDK_SYSROOT=${ANDROID_BUILD_TOP}/ndk/build/platforms/android-3/arch-x86
-
-3. Set the NDK toolchain environment variable.
-For arm:
-  export NDK_TOOLCHAIN=${ANDROID_TOOLCHAIN}/arm-linux-androideabi-
-For x86:
-  export NDK_TOOLCHAIN=${ANDROID_TOOLCHAIN}/i686-linux-android-
-
-II. Compile perf for Android
-------------------------------------------------
-You need to run make with the NDK toolchain and sysroot defined above:
-For arm:
-  make WERROR=0 ARCH=arm CROSS_COMPILE=${NDK_TOOLCHAIN} EXTRA_CFLAGS="-pie --sysroot=${NDK_SYSROOT}"
-For x86:
-  make WERROR=0 ARCH=x86 CROSS_COMPILE=${NDK_TOOLCHAIN} EXTRA_CFLAGS="-pie --sysroot=${NDK_SYSROOT}"
-
-III. Install perf
------------------------------------------------
-You need to connect to your Android device/emulator using adb.
-Install perf using:
-  adb push perf /data/perf
-
-If you also want to use perf-archive you need busybox tools for Android.
-For installing perf-archive, you first need to replace #!/bin/bash with #!/system/bin/sh:
-  sed 's/#!\/bin\/bash/#!\/system\/bin\/sh/g' perf-archive >> /tmp/perf-archive
-  chmod +x /tmp/perf-archive
-  adb push /tmp/perf-archive /data/perf-archive
-
-IV. Environment settings for running perf
-------------------------------------------------
-Some perf features need environment variables to run properly.
-You need to set these before running perf on the target:
-  adb shell
-  # PERF_PAGER=cat
-
-IV. Run perf
-------------------------------------------------
-Run perf on your device/emulator to which you previously connected using adb:
-  # ./data/perf
+- The second method is to download Android NDK, then use the contained
+  clang compiler for building perf. Please refer to Build.txt, section
+  "5) Build with clang" for details.

-- 
2.34.1


^ permalink raw reply related	[flat|nested] 15+ messages in thread

* Re: [PATCH 3/8] bpftool: Conditionally add -Wformat-signedness flag
  2025-09-25 10:26 ` [PATCH 3/8] bpftool: Conditionally add -Wformat-signedness flag Leo Yan
@ 2025-09-25 10:42   ` Quentin Monnet
  2025-09-25 12:43     ` Leo Yan
  0 siblings, 1 reply; 15+ messages in thread
From: Quentin Monnet @ 2025-09-25 10:42 UTC (permalink / raw)
  To: Leo Yan, Arnaldo Carvalho de Melo, Namhyung Kim, Jiri Olsa,
	Ian Rogers, Adrian Hunter, Andrii Nakryiko, Nathan Chancellor,
	Nick Desaulniers, Bill Wendling, Justin Stitt, Alexei Starovoitov,
	Daniel Borkmann, Martin KaFai Lau, Eduard Zingerman, Song Liu,
	Yonghong Song, John Fastabend, KP Singh, Stanislav Fomichev,
	Hao Luo, James Clark
  Cc: linux-kernel, linux-perf-users, llvm, bpf

2025-09-25 11:26 UTC+0100 ~ Leo Yan <leo.yan@arm.com>
> clang-18.1.3 on Ubuntu 24.04.2 reports warning:
> 
>   warning: unknown warning option '-Wformat-signedness' [-Wunknown-warning-option]
> 
> Conditionally add the option only when it is supported by compiler.
> 
> Signed-off-by: Leo Yan <leo.yan@arm.com>


Hi, how annoying is this warning? I'm asking because as far as I
understand, the option has been introduced in LLVM 19.1.0 [0] - the
latest being 21.1.0 already - so we won't need this check once distros
have transitioned, and I'm a bit reluctant to add it.

Quentin


[0]
https://github.com/llvm/llvm-project/commit/ea92b1f9d0fc31f1fd97ad04eb0412003a37cb0d

^ permalink raw reply	[flat|nested] 15+ messages in thread

* Re: [PATCH 3/8] bpftool: Conditionally add -Wformat-signedness flag
  2025-09-25 10:42   ` Quentin Monnet
@ 2025-09-25 12:43     ` Leo Yan
  0 siblings, 0 replies; 15+ messages in thread
From: Leo Yan @ 2025-09-25 12:43 UTC (permalink / raw)
  To: Quentin Monnet
  Cc: Arnaldo Carvalho de Melo, Namhyung Kim, Jiri Olsa, Ian Rogers,
	Adrian Hunter, Andrii Nakryiko, Nathan Chancellor,
	Nick Desaulniers, Bill Wendling, Justin Stitt, Alexei Starovoitov,
	Daniel Borkmann, Martin KaFai Lau, Eduard Zingerman, Song Liu,
	Yonghong Song, John Fastabend, KP Singh, Stanislav Fomichev,
	Hao Luo, James Clark, linux-kernel, linux-perf-users, llvm, bpf

On Thu, Sep 25, 2025 at 11:42:39AM +0100, Quentin Monnet wrote:
> 2025-09-25 11:26 UTC+0100 ~ Leo Yan <leo.yan@arm.com>
> > clang-18.1.3 on Ubuntu 24.04.2 reports warning:
> > 
> >   warning: unknown warning option '-Wformat-signedness' [-Wunknown-warning-option]
> > 
> > Conditionally add the option only when it is supported by compiler.
> > 
> > Signed-off-by: Leo Yan <leo.yan@arm.com>
> 
> 
> Hi, how annoying is this warning?

Not too bad, it prints out 5~6 times warnings (see the build log below).
Though the warnings are a bit noisy, they does not break the build.

> I'm asking because as far as I
> understand, the option has been introduced in LLVM 19.1.0 [0] - the
> latest being 21.1.0 already - so we won't need this check once distros
> have transitioned, and I'm a bit reluctant to add it.

I agree the warning likely won't affect distros, as package maintainers
will hide it. But it can annoy _paranoid_ developers in day-to-day
builds ;)

As the warning doesn't block anything, so I am fine with not merging
this patch.

Thanks,
Leo

> [0]
> https://github.com/llvm/llvm-project/commit/ea92b1f9d0fc31f1fd97ad04eb0412003a37cb0d


---8<---

Auto-detecting system features:
...                         clang-bpf-co-re: [ on  ]
...                                    llvm: [ OFF ]
...                                  libcap: [ on  ]
...                                  libbfd: [ OFF ]
...                          libbfd-liberty: [ OFF ]
...                        libbfd-liberty-z: [ OFF ]
...                  disassembler-four-args: [ OFF ]
...                disassembler-init-styled: [ OFF ]
...                             libelf-zstd: [ o
  MKDIR   /build/util/bpf_skel/.tmp/bootstrap/libbpf/include/bpf
  MKDIR   /build/util/bpf_skel/.tmp/bootstrap/libbpf/
  MKDIR   /build/util/bpf_skel/.tmp/bootstrap/
  INSTALL /build/util/bpf_skel/.tmp/bootstrap/libbpf/include/bpf/hashmap.h
  INSTALL /build/util/bpf_skel/.tmp/bootstrap/libbpf/include/bpf/relo_core.h
  INSTALL /build/util/bpf_skel/.tmp/bootstrap/libbpf/include/bpf/libbpf_internal.h
warning: unknown warning option '-Wformat-signedness' [-Wunknown-warning-option]
1 warning generated.
  GEN     /build/util/bpf_skel/.tmp/bootstrap/libbpf/bpf_helper_defs.h
  INSTALL /build/util/bpf_skel/.tmp/bootstrap/libbpf/include/bpf/bpf.h
  INSTALL /build/util/bpf_skel/.tmp/bootstrap/libbpf/include/bpf/libbpf.h
  INSTALL /build/util/bpf_skel/.tmp/bootstrap/libbpf/include/bpf/libbpf_legacy.h
  INSTALL /build/util/bpf_skel/.tmp/bootstrap/libbpf/include/bpf/btf.h
  INSTALL /build/util/bpf_skel/.tmp/bootstrap/libbpf/include/bpf/bpf_helpers.h
  INSTALL /build/util/bpf_skel/.tmp/bootstrap/libbpf/include/bpf/libbpf_common.h
  INSTALL /build/util/bpf_skel/.tmp/bootstrap/libbpf/include/bpf/bpf_tracing.h
  INSTALL /build/util/bpf_skel/.tmp/bootstrap/libbpf/include/bpf/bpf_core_read.h
  INSTALL /build/util/bpf_skel/.tmp/bootstrap/libbpf/include/bpf/bpf_endian.h
  INSTALL /build/util/bpf_skel/.tmp/bootstrap/libbpf/include/bpf/libbpf_version.h
  INSTALL /build/util/bpf_skel/.tmp/bootstrap/libbpf/include/bpf/skel_internal.h
  INSTALL /build/util/bpf_skel/.tmp/bootstrap/libbpf/include/bpf/usdt.bpf.h
  INSTALL /build/util/bpf_skel/.tmp/bootstrap/libbpf/include/bpf/bpf_helper_defs.h
  INSTALL libbpf_headers
  CC      /build/util/bpf_skel/.tmp/bootstrap/libbpf/staticobjs/libbpf.o
  CC      /build/util/bpf_skel/.tmp/bootstrap/libbpf/staticobjs/bpf.o
  CC      /build/util/bpf_skel/.tmp/bootstrap/libbpf/staticobjs/nlattr.o
  CC      /build/util/bpf_skel/.tmp/bootstrap/libbpf/staticobjs/btf.o
  CC      /build/util/bpf_skel/.tmp/bootstrap/libbpf/staticobjs/libbpf_errno.o
  CC      /build/util/bpf_skel/.tmp/bootstrap/libbpf/staticobjs/str_error.o
  CC      /build/util/bpf_skel/.tmp/bootstrap/libbpf/staticobjs/netlink.o
  CC      /build/util/bpf_skel/.tmp/bootstrap/libbpf/staticobjs/bpf_prog_linfo.o
  CC      /build/util/bpf_skel/.tmp/bootstrap/libbpf/staticobjs/libbpf_probes.o
  CC      /build/util/bpf_skel/.tmp/bootstrap/libbpf/staticobjs/hashmap.o
  CC      /build/util/bpf_skel/.tmp/bootstrap/libbpf/staticobjs/btf_dump.o
  CC      /build/util/bpf_skel/.tmp/bootstrap/libbpf/staticobjs/ringbuf.o
  CC      /build/util/bpf_skel/.tmp/bootstrap/libbpf/staticobjs/strset.o
  CC      /build/util/bpf_skel/.tmp/bootstrap/libbpf/staticobjs/gen_loader.o
  CC      /build/util/bpf_skel/.tmp/bootstrap/libbpf/staticobjs/relo_core.o
  CC      /build/util/bpf_skel/.tmp/bootstrap/libbpf/staticobjs/linker.o
  CC      /build/util/bpf_skel/.tmp/bootstrap/libbpf/staticobjs/usdt.o
  CC      /build/util/bpf_skel/.tmp/bootstrap/libbpf/staticobjs/zip.o
  CC      /build/util/bpf_skel/.tmp/bootstrap/libbpf/staticobjs/elf.o
  CC      /build/util/bpf_skel/.tmp/bootstrap/libbpf/staticobjs/features.o
  CC      /build/util/bpf_skel/.tmp/bootstrap/libbpf/staticobjs/btf_iter.o
  CC      /build/util/bpf_skel/.tmp/bootstrap/libbpf/staticobjs/btf_relocate.o
  LD      /build/util/bpf_skel/.tmp/bootstrap/libbpf/staticobjs/libbpf-in.o
  LINK    /build/util/bpf_skel/.tmp/bootstrap/libbpf/libbpf.a
  CC      /build/util/bpf_skel/.tmp/bootstrap/main.o
  CC      /build/util/bpf_skel/.tmp/bootstrap/common.o
  CC      /build/util/bpf_skel/.tmp/bootstrap/json_writer.o
  CC      /build/util/bpf_skel/.tmp/bootstrap/gen.o
  CC      /build/util/bpf_skel/.tmp/bootstrap/btf.o
warning: unknown warning option '-Wformat-signedness' [-Wunknown-warning-option]
warning: unknown warning option '-Wformat-signedness' [-Wunknown-warning-option]
warning: unknown warning option '-Wformat-signedness' [-Wunknown-warning-option]warning:
unknown warning option '-Wformat-signedness' [-Wunknown-warning-option]
warning: unknown warning option '-Wformat-signedness' [-Wunknown-warning-option]
1 warning generated.
1 warning generated.
1 warning generated.
1 warning generated.
1 warning generated.
  LINK    /build/util/bpf_skel/.tmp/bootstrap/bpftool

^ permalink raw reply	[flat|nested] 15+ messages in thread

* Re: [PATCH 4/8] perf test coresight: Dismiss clang warning for memcpy thread
  2025-09-25 10:26 ` [PATCH 4/8] perf test coresight: Dismiss clang warning for memcpy thread Leo Yan
@ 2025-09-25 19:38   ` Ian Rogers
  2025-09-26 16:19     ` Leo Yan
  0 siblings, 1 reply; 15+ messages in thread
From: Ian Rogers @ 2025-09-25 19:38 UTC (permalink / raw)
  To: Leo Yan
  Cc: Arnaldo Carvalho de Melo, Namhyung Kim, Jiri Olsa, Adrian Hunter,
	Quentin Monnet, Andrii Nakryiko, Nathan Chancellor,
	Nick Desaulniers, Bill Wendling, Justin Stitt, Alexei Starovoitov,
	Daniel Borkmann, Martin KaFai Lau, Eduard Zingerman, Song Liu,
	Yonghong Song, John Fastabend, KP Singh, Stanislav Fomichev,
	Hao Luo, James Clark, linux-kernel, linux-perf-users, llvm, bpf

On Thu, Sep 25, 2025 at 3:26 AM Leo Yan <leo.yan@arm.com> wrote:
>
> clang-18.1.3 on Ubuntu 24.04.2 reports warning:
>
>   memcpy_thread.c:30:1: warning: non-void function does not return a value in all control paths [-Wreturn-type]
>      30 | }
>         | ^
>
> Dismiss the warning with returning NULL from the thread function.
>
> Signed-off-by: Leo Yan <leo.yan@arm.com>

lgtm, should this be moved into being a perf test workload as in
tools/perf/tests/workloads/ ?
There doesn't seem to be anything overly arch specific in the test and
being a workload avoids a cc dependency in the test, as well as
meaning we test with our usual compiler flags, etc.

Thanks,
Ian

> ---
>  tools/perf/tests/shell/coresight/memcpy_thread/memcpy_thread.c | 2 ++
>  1 file changed, 2 insertions(+)
>
> diff --git a/tools/perf/tests/shell/coresight/memcpy_thread/memcpy_thread.c b/tools/perf/tests/shell/coresight/memcpy_thread/memcpy_thread.c
> index 5f886cd09e6b3a62b5690dade94f1f8cae3279d2..7e879217be30a86431989dbf1f36d2134ef259cc 100644
> --- a/tools/perf/tests/shell/coresight/memcpy_thread/memcpy_thread.c
> +++ b/tools/perf/tests/shell/coresight/memcpy_thread/memcpy_thread.c
> @@ -27,6 +27,8 @@ static void *thrfn(void *arg)
>         }
>         for (i = 0; i < len; i++)
>                 memcpy(dst, src, a->size * 1024);
> +
> +       return NULL;
>  }
>
>  static pthread_t new_thr(void *(*fn) (void *arg), void *arg)
>
> --
> 2.34.1
>

^ permalink raw reply	[flat|nested] 15+ messages in thread

* Re: [PATCH 8/8] perf docs: Document building with Clang
  2025-09-25 10:26 ` [PATCH 8/8] perf docs: Document building with Clang Leo Yan
@ 2025-09-25 19:43   ` Ian Rogers
  2025-09-26 15:41     ` Leo Yan
  0 siblings, 1 reply; 15+ messages in thread
From: Ian Rogers @ 2025-09-25 19:43 UTC (permalink / raw)
  To: Leo Yan
  Cc: Arnaldo Carvalho de Melo, Namhyung Kim, Jiri Olsa, Adrian Hunter,
	Quentin Monnet, Andrii Nakryiko, Nathan Chancellor,
	Nick Desaulniers, Bill Wendling, Justin Stitt, Alexei Starovoitov,
	Daniel Borkmann, Martin KaFai Lau, Eduard Zingerman, Song Liu,
	Yonghong Song, John Fastabend, KP Singh, Stanislav Fomichev,
	Hao Luo, James Clark, linux-kernel, linux-perf-users, llvm, bpf

On Thu, Sep 25, 2025 at 3:27 AM Leo Yan <leo.yan@arm.com> wrote:
>
> Add example commands for building perf with Clang.
>
> Since recent Android NDK releases use Clang as the default compiler, a
> separate Android specific document is no longer needed; point to the
> general build documentation instead.
>
> Signed-off-by: Leo Yan <leo.yan@arm.com>
> ---
>  tools/perf/Documentation/Build.txt   | 18 ++++++++
>  tools/perf/Documentation/android.txt | 82 ++++--------------------------------
>  2 files changed, 26 insertions(+), 74 deletions(-)
>
> diff --git a/tools/perf/Documentation/Build.txt b/tools/perf/Documentation/Build.txt
> index 83dc87c662b63ecc17553a15cc15a6b8d6f01d83..3e4104e605ac0d7d30b4408ef413cf1f90b034c1 100644
> --- a/tools/perf/Documentation/Build.txt
> +++ b/tools/perf/Documentation/Build.txt
> @@ -99,3 +99,21 @@ configuration paths for cross building:
>  In this case, the variable PKG_CONFIG_SYSROOT_DIR can be used alongside the
>  variable PKG_CONFIG_LIBDIR or PKG_CONFIG_PATH to prepend the sysroot path to
>  the library paths for cross compilation.
> +
> +5) Build with clang
> +===================
> +By default, the makefile uses GCC as compiler. With specifying environment
> +variables HOSTCC, CC and CXX, it allows to build perf with clang.
> +
> +Using clang for native build:
> +
> +  $ HOSTCC=clang CC=clang CXX=clang++ make -C tools/perf
> +
> +Using clang for cross compilation:
> +
> +  $ HOSTCC=clang CC=clang CXX=clang++ \
> +    make ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- -C tools/perf \
> +    NO_LIBELF=1 NO_LIBTRACEEVENT=1 NO_JEVENTS=1

The three NO_-s here are going to cripple the build quite a lot, I
wonder if we can list package dependencies to install and failing that
use the NO_-s.

> +
> +In the example above, due to lack libelf, python and libtraceevent for
> +cross comiplation, disable the features accordingly.

nit: s/comiplation/compilation/

> diff --git a/tools/perf/Documentation/android.txt b/tools/perf/Documentation/android.txt
> index 24a59998fc91e814ad96f658d3481d88d798b60c..e65204cf2921f6bd8a79875784c5b3d5487ce05d 100644
> --- a/tools/perf/Documentation/android.txt
> +++ b/tools/perf/Documentation/android.txt
> @@ -1,78 +1,12 @@
>  How to compile perf for Android
> -=========================================
> +===============================
>
> -I. Set the Android NDK environment
> -------------------------------------------------
> +There have two ways to build perf and run it on Android.

nit: s/There have/There are/

Thanks for doing this series!
Ian

>
> -(a). Use the Android NDK
> -------------------------------------------------
> -1. You need to download and install the Android Native Development Kit (NDK).
> -Set the NDK variable to point to the path where you installed the NDK:
> -  export NDK=/path/to/android-ndk
> +- The first method is to build perf with static linking, please refer to
> +  Build.txt, section "4) Cross compilation" for how to build a static
> +  perf binary.
>
> -2. Set cross-compiling environment variables for NDK toolchain and sysroot.
> -For arm:
> -  export NDK_TOOLCHAIN=${NDK}/toolchains/arm-linux-androideabi-4.9/prebuilt/linux-x86_64/bin/arm-linux-androideabi-
> -  export NDK_SYSROOT=${NDK}/platforms/android-24/arch-arm
> -For x86:
> -  export NDK_TOOLCHAIN=${NDK}/toolchains/x86-4.9/prebuilt/linux-x86_64/bin/i686-linux-android-
> -  export NDK_SYSROOT=${NDK}/platforms/android-24/arch-x86
> -
> -This method is only tested for Android NDK versions Revision 11b and later.
> -perf uses some bionic enhancements that are not included in prior NDK versions.
> -You can use method (b) described below instead.
> -
> -(b). Use the Android source tree
> ------------------------------------------------
> -1. Download the master branch of the Android source tree.
> -Set the environment for the target you want using:
> -  source build/envsetup.sh
> -  lunch
> -
> -2. Build your own NDK sysroot to contain latest bionic changes and set the
> -NDK sysroot environment variable.
> -  cd ${ANDROID_BUILD_TOP}/ndk
> -For arm:
> -  ./build/tools/build-ndk-sysroot.sh --abi=arm
> -  export NDK_SYSROOT=${ANDROID_BUILD_TOP}/ndk/build/platforms/android-3/arch-arm
> -For x86:
> -  ./build/tools/build-ndk-sysroot.sh --abi=x86
> -  export NDK_SYSROOT=${ANDROID_BUILD_TOP}/ndk/build/platforms/android-3/arch-x86
> -
> -3. Set the NDK toolchain environment variable.
> -For arm:
> -  export NDK_TOOLCHAIN=${ANDROID_TOOLCHAIN}/arm-linux-androideabi-
> -For x86:
> -  export NDK_TOOLCHAIN=${ANDROID_TOOLCHAIN}/i686-linux-android-
> -
> -II. Compile perf for Android
> -------------------------------------------------
> -You need to run make with the NDK toolchain and sysroot defined above:
> -For arm:
> -  make WERROR=0 ARCH=arm CROSS_COMPILE=${NDK_TOOLCHAIN} EXTRA_CFLAGS="-pie --sysroot=${NDK_SYSROOT}"
> -For x86:
> -  make WERROR=0 ARCH=x86 CROSS_COMPILE=${NDK_TOOLCHAIN} EXTRA_CFLAGS="-pie --sysroot=${NDK_SYSROOT}"
> -
> -III. Install perf
> ------------------------------------------------
> -You need to connect to your Android device/emulator using adb.
> -Install perf using:
> -  adb push perf /data/perf
> -
> -If you also want to use perf-archive you need busybox tools for Android.
> -For installing perf-archive, you first need to replace #!/bin/bash with #!/system/bin/sh:
> -  sed 's/#!\/bin\/bash/#!\/system\/bin\/sh/g' perf-archive >> /tmp/perf-archive
> -  chmod +x /tmp/perf-archive
> -  adb push /tmp/perf-archive /data/perf-archive
> -
> -IV. Environment settings for running perf
> -------------------------------------------------
> -Some perf features need environment variables to run properly.
> -You need to set these before running perf on the target:
> -  adb shell
> -  # PERF_PAGER=cat
> -
> -IV. Run perf
> -------------------------------------------------
> -Run perf on your device/emulator to which you previously connected using adb:
> -  # ./data/perf
> +- The second method is to download Android NDK, then use the contained
> +  clang compiler for building perf. Please refer to Build.txt, section
> +  "5) Build with clang" for details.
>
> --
> 2.34.1
>

^ permalink raw reply	[flat|nested] 15+ messages in thread

* Re: [PATCH 8/8] perf docs: Document building with Clang
  2025-09-25 19:43   ` Ian Rogers
@ 2025-09-26 15:41     ` Leo Yan
  0 siblings, 0 replies; 15+ messages in thread
From: Leo Yan @ 2025-09-26 15:41 UTC (permalink / raw)
  To: Ian Rogers
  Cc: Arnaldo Carvalho de Melo, Namhyung Kim, Jiri Olsa, Adrian Hunter,
	Quentin Monnet, Andrii Nakryiko, Nathan Chancellor,
	Nick Desaulniers, Bill Wendling, Justin Stitt, Alexei Starovoitov,
	Daniel Borkmann, Martin KaFai Lau, Eduard Zingerman, Song Liu,
	Yonghong Song, John Fastabend, KP Singh, Stanislav Fomichev,
	Hao Luo, James Clark, linux-kernel, linux-perf-users, llvm, bpf

Hi Ian,

On Thu, Sep 25, 2025 at 12:43:55PM -0700, Ian Rogers wrote:

[...]

> > +5) Build with clang
> > +===================
> > +By default, the makefile uses GCC as compiler. With specifying environment
> > +variables HOSTCC, CC and CXX, it allows to build perf with clang.
> > +
> > +Using clang for native build:
> > +
> > +  $ HOSTCC=clang CC=clang CXX=clang++ make -C tools/perf
> > +
> > +Using clang for cross compilation:
> > +
> > +  $ HOSTCC=clang CC=clang CXX=clang++ \
> > +    make ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- -C tools/perf \
> > +    NO_LIBELF=1 NO_LIBTRACEEVENT=1 NO_JEVENTS=1
> 
> The three NO_-s here are going to cripple the build quite a lot, I
> wonder if we can list package dependencies to install and failing that
> use the NO_-s.

In the next version, I will drop NO_ options to avoid confusing.

Missing libraries can occur in both native build and cross build, so
this is not a specific issue for cross build. OTOH, the build logs
already provide clear reminders, here no need to bother readers for
these NO_ options.

> > +
> > +In the example above, due to lack libelf, python and libtraceevent for
> > +cross comiplation, disable the features accordingly.
> 
> nit: s/comiplation/compilation/
> 
> > diff --git a/tools/perf/Documentation/android.txt b/tools/perf/Documentation/android.txt
> > index 24a59998fc91e814ad96f658d3481d88d798b60c..e65204cf2921f6bd8a79875784c5b3d5487ce05d 100644
> > --- a/tools/perf/Documentation/android.txt
> > +++ b/tools/perf/Documentation/android.txt
> > @@ -1,78 +1,12 @@
> >  How to compile perf for Android
> > -=========================================
> > +===============================
> >
> > -I. Set the Android NDK environment
> > -------------------------------------------------
> > +There have two ways to build perf and run it on Android.
> 
> nit: s/There have/There are/

Will do.  Thanks a lot for review!

Leo

^ permalink raw reply	[flat|nested] 15+ messages in thread

* Re: [PATCH 4/8] perf test coresight: Dismiss clang warning for memcpy thread
  2025-09-25 19:38   ` Ian Rogers
@ 2025-09-26 16:19     ` Leo Yan
  0 siblings, 0 replies; 15+ messages in thread
From: Leo Yan @ 2025-09-26 16:19 UTC (permalink / raw)
  To: Ian Rogers
  Cc: Arnaldo Carvalho de Melo, Namhyung Kim, Jiri Olsa, Adrian Hunter,
	Quentin Monnet, Andrii Nakryiko, Nathan Chancellor,
	Nick Desaulniers, Bill Wendling, Justin Stitt, Alexei Starovoitov,
	Daniel Borkmann, Martin KaFai Lau, Eduard Zingerman, Song Liu,
	Yonghong Song, John Fastabend, KP Singh, Stanislav Fomichev,
	Hao Luo, James Clark, linux-kernel, linux-perf-users, llvm, bpf

On Thu, Sep 25, 2025 at 12:38:36PM -0700, Ian Rogers wrote:
> On Thu, Sep 25, 2025 at 3:26 AM Leo Yan <leo.yan@arm.com> wrote:
> >
> > clang-18.1.3 on Ubuntu 24.04.2 reports warning:
> >
> >   memcpy_thread.c:30:1: warning: non-void function does not return a value in all control paths [-Wreturn-type]
> >      30 | }
> >         | ^
> >
> > Dismiss the warning with returning NULL from the thread function.
> >
> > Signed-off-by: Leo Yan <leo.yan@arm.com>
> 
> lgtm, should this be moved into being a perf test workload as in
> tools/perf/tests/workloads/ ?

Now we have four programs under shell folder:

  $ cd linux/tools/perf/tests/shell
  $ find ./ -name *.c -o -name *.S
  ./coresight/unroll_loop_thread/unroll_loop_thread.c
  ./coresight/asm_pure_loop/asm_pure_loop.S
  ./coresight/thread_loop/thread_loop.c
  ./coresight/memcpy_thread/memcpy_thread.c
 
If really do this, can move all programs into folders?

  tools/perf/tests/workloads/       - Common programs
  tools/perf/tests/workloads/arm64  - Arch specific programs

Anyway, this should be a separate series to avoid complexity for
enabling Clang build.

Thanks,
Leo

^ permalink raw reply	[flat|nested] 15+ messages in thread

end of thread, other threads:[~2025-09-26 16:19 UTC | newest]

Thread overview: 15+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2025-09-25 10:26 [PATCH 0/8] perf build: Support building with Clang Leo Yan
2025-09-25 10:26 ` [PATCH 1/8] tools build: Align warning options with perf Leo Yan
2025-09-25 10:26 ` [PATCH 2/8] perf python: split Clang options when invoking Popen Leo Yan
2025-09-25 10:26 ` [PATCH 3/8] bpftool: Conditionally add -Wformat-signedness flag Leo Yan
2025-09-25 10:42   ` Quentin Monnet
2025-09-25 12:43     ` Leo Yan
2025-09-25 10:26 ` [PATCH 4/8] perf test coresight: Dismiss clang warning for memcpy thread Leo Yan
2025-09-25 19:38   ` Ian Rogers
2025-09-26 16:19     ` Leo Yan
2025-09-25 10:26 ` [PATCH 5/8] perf test coresight: Dismiss clang warning for thread loop Leo Yan
2025-09-25 10:26 ` [PATCH 6/8] perf test coresight: Dismiss clang warning for unroll loop thread Leo Yan
2025-09-25 10:26 ` [PATCH 7/8] perf build: Support build with clang Leo Yan
2025-09-25 10:26 ` [PATCH 8/8] perf docs: Document building with Clang Leo Yan
2025-09-25 19:43   ` Ian Rogers
2025-09-26 15:41     ` Leo Yan

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).