bpf.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [RFC dwarves 0/6] prep for compiler-generated BTF
@ 2025-08-07 14:42 Alan Maguire
  2025-08-07 14:42 ` [RFC dwarves 1/6] btf_loader: Make BTF representation match DWARF Alan Maguire
                   ` (5 more replies)
  0 siblings, 6 replies; 12+ messages in thread
From: Alan Maguire @ 2025-08-07 14:42 UTC (permalink / raw)
  To: dwarves; +Cc: bpf, Alan Maguire

This series is intended to help pave the way to allow pahole to
handle compiler-generated BTF as input to its encoding process.

The BTF loader currently supports loading BTF for data structure
and function query but not for BTF generation.  [1] describes how
gcc can generate (and the linker deduplicate) BTF but even there
we will need pahole to post-process the results so it is valuable
to support reading BTF in pahole as input to start exploring how
to handle cases like [1].

The intention of this series is not yet to fully support
linker-deduplicated BTF, but to start down that road by supporting
reading BTF from (multiple) object files and support its deduplication
and BTF output.  To that end a few changes are needed in the
intermediate representation generated by the BTF loader; these are
done in patch 1.  Patch 2 then fixes up a few cases where we needed
to special-case the intermediate representation when it came from
BTF.  Patches 3/4 ensure that we retrieve ELF info when loading BTF
for encoding.  Patch 5 is intended to support cases where we read BTF from
multiple objects and - if the "encode_force" BTF feature is specified -
we continue as long as BTF is found in at least one of those sources.
Finally patch 6 tests pahole when BTF is used as input.

This allows us to experiment with "gcc -gbtf".  For example adding
-gbtf to the KCFLAGS environment variable for a kernel build, we can
then run pahole across the set of vmlinux objects via

pahole --format_path=btf -J --btf_features=encode_force \
        --btf_encode_detached=/tmp/vmlinux.btf $(ar t vmlinux.a)

This is clearly not the right way to do this for kernel builds -
we want to make use of linker deduplication as in [1] - but the fact
that even a hack like this works does demonstrate the viability of
handling BTF as input to vmlinux BTF encoding.  It also allows us
to provide a comparison between compiler-generated BTF with pahole
deduplication and compiler-generated BTF with linker deduplication
when the latter becomes available.

[1] https://lore.kernel.org/dwarves/87ldqf1i19.fsf@esperi.org.uk/

Alan Maguire (6):
  btf_loader: Make BTF representation match DWARF
  pfunct: Fix up function display with updated prototype representation
  pahole: Add btf_encode to conf_load
  btf_loader: read ELF for BTF encoding
  btf_encoder: Do not error out if BTF is not found in some input files
  tests: Add test of pahole using BTF as input to BTF generation

 btf_loader.c       |  36 +++++++++++--
 dwarves.c          |  14 +++++-
 dwarves.h          |   1 +
 dwarves_fprintf.c  |   2 +-
 pahole.c           |  15 +++---
 pfunct.c           |   2 +-
 tests/btf_2_btf.sh | 122 +++++++++++++++++++++++++++++++++++++++++++++
 7 files changed, 176 insertions(+), 16 deletions(-)
 create mode 100755 tests/btf_2_btf.sh

-- 
2.43.5


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

* [RFC dwarves 1/6] btf_loader: Make BTF representation match DWARF
  2025-08-07 14:42 [RFC dwarves 0/6] prep for compiler-generated BTF Alan Maguire
@ 2025-08-07 14:42 ` Alan Maguire
  2025-08-07 14:42 ` [RFC dwarves 2/6] pfunct: Fix up function display with updated prototype representation Alan Maguire
                   ` (4 subsequent siblings)
  5 siblings, 0 replies; 12+ messages in thread
From: Alan Maguire @ 2025-08-07 14:42 UTC (permalink / raw)
  To: dwarves; +Cc: bpf, Alan Maguire

The function prototype representation for BTF needs to be modified to
fit with the DWARF-generated one.

Signed-off-by: Alan Maguire <alan.maguire@oracle.com>
---
 btf_loader.c | 7 ++++++-
 1 file changed, 6 insertions(+), 1 deletion(-)

diff --git a/btf_loader.c b/btf_loader.c
index 64ea680..42bca92 100644
--- a/btf_loader.c
+++ b/btf_loader.c
@@ -84,6 +84,8 @@ out_free_parameters:
 static int create_new_function(struct cu *cu, const struct btf_type *tp, uint32_t id)
 {
 	struct function *func = tag__alloc(sizeof(*func));
+	struct btf *btf = cu->priv;
+	const struct btf_type *t;
 
 	if (func == NULL)
 		return -ENOMEM;
@@ -95,7 +97,9 @@ static int create_new_function(struct cu *cu, const struct btf_type *tp, uint32_
 	func->proto.tag.type = tp->type;
 	func->name = cu__btf_str(cu, tp->name_off);
 	INIT_LIST_HEAD(&func->lexblock.tags);
-	cu__add_tag_with_id(cu, &func->proto.tag, id);
+	INIT_LIST_HEAD(&func->annots);
+	t = btf__type_by_id(btf, tp->type);
+	cu__load_ftype(cu, &func->proto, DW_TAG_subprogram, t, id);
 
 	return 0;
 }
@@ -124,6 +128,7 @@ static void type__init(struct type *type, uint32_t tag, const char *name, size_t
 	type->size = size;
 	type->namespace.tag.tag = tag;
 	type->namespace.name = name;
+	INIT_LIST_HEAD(&type->namespace.annots);
 	type->template_parameter_pack = NULL;
 }
 
-- 
2.43.5


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

* [RFC dwarves 2/6] pfunct: Fix up function display with updated prototype representation
  2025-08-07 14:42 [RFC dwarves 0/6] prep for compiler-generated BTF Alan Maguire
  2025-08-07 14:42 ` [RFC dwarves 1/6] btf_loader: Make BTF representation match DWARF Alan Maguire
@ 2025-08-07 14:42 ` Alan Maguire
  2025-08-07 14:42 ` [RFC dwarves 3/6] pahole: Add btf_encode to conf_load Alan Maguire
                   ` (3 subsequent siblings)
  5 siblings, 0 replies; 12+ messages in thread
From: Alan Maguire @ 2025-08-07 14:42 UTC (permalink / raw)
  To: dwarves; +Cc: bpf, Alan Maguire

Now that the function prototype representation has been updated
in the BTF-derived ftype, no special handling is needed for printing
BTF functions.

Signed-off-by: Alan Maguire <alan.maguire@oracle.com>
---
 dwarves_fprintf.c | 2 +-
 pfunct.c          | 2 +-
 2 files changed, 2 insertions(+), 2 deletions(-)

diff --git a/dwarves_fprintf.c b/dwarves_fprintf.c
index 1ec478c..557fe7a 100644
--- a/dwarves_fprintf.c
+++ b/dwarves_fprintf.c
@@ -1402,7 +1402,7 @@ static size_t function__fprintf(const struct tag *tag, const struct cu *cu,
 				const struct conf_fprintf *conf, FILE *fp)
 {
 	struct function *func = tag__function(tag);
-	struct ftype *ftype = func->btf ? tag__ftype(cu__type(cu, func->proto.tag.type)) : &func->proto;
+	struct ftype *ftype = &func->proto;
 	size_t printed = 0;
 	bool inlined = !conf->strip_inline && function__declared_inline(func);
 	int i;
diff --git a/pfunct.c b/pfunct.c
index 5a6dd59..61cefd5 100644
--- a/pfunct.c
+++ b/pfunct.c
@@ -326,7 +326,7 @@ static int function__emit_type_definitions(struct function *func,
 					   struct cu *cu, FILE *fp)
 {
 	struct parameter *pos;
-	struct ftype *proto = func->btf ? tag__ftype(cu__type(cu, func->proto.tag.type)) : &func->proto;
+	struct ftype *proto = &func->proto;
 	struct tag *type = cu__type(cu, proto->tag.type);
 
 retry_return_type:
-- 
2.43.5


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

* [RFC dwarves 3/6] pahole: Add btf_encode to conf_load
  2025-08-07 14:42 [RFC dwarves 0/6] prep for compiler-generated BTF Alan Maguire
  2025-08-07 14:42 ` [RFC dwarves 1/6] btf_loader: Make BTF representation match DWARF Alan Maguire
  2025-08-07 14:42 ` [RFC dwarves 2/6] pfunct: Fix up function display with updated prototype representation Alan Maguire
@ 2025-08-07 14:42 ` Alan Maguire
  2025-08-07 14:42 ` [RFC dwarves 4/6] btf_loader: read ELF for BTF encoding Alan Maguire
                   ` (2 subsequent siblings)
  5 siblings, 0 replies; 12+ messages in thread
From: Alan Maguire @ 2025-08-07 14:42 UTC (permalink / raw)
  To: dwarves; +Cc: bpf, Alan Maguire

This will allow us to take BTF encoding-specific actions in
the btf_loader.

Signed-off-by: Alan Maguire <alan.maguire@oracle.com>
---
 dwarves.h |  1 +
 pahole.c  | 15 +++++++--------
 2 files changed, 8 insertions(+), 8 deletions(-)

diff --git a/dwarves.h b/dwarves.h
index 21d4166..feb7402 100644
--- a/dwarves.h
+++ b/dwarves.h
@@ -87,6 +87,7 @@ struct conf_load {
 	bool			ignore_inline_expansions;
 	bool			ignore_labels;
 	bool			ptr_table_stats;
+	bool			btf_encode;
 	bool			skip_encoding_btf_decl_tag;
 	bool			skip_missing;
 	bool			skip_encoding_btf_type_tag;
diff --git a/pahole.c b/pahole.c
index ef01e58..96c748b 100644
--- a/pahole.c
+++ b/pahole.c
@@ -32,7 +32,6 @@
 static struct btf_encoder *btf_encoder;
 static char *detached_btf_filename;
 struct cus *cus;
-static bool btf_encode;
 static bool ctf_encode;
 static bool sort_output;
 static bool need_resort;
@@ -1864,7 +1863,7 @@ static error_t pahole__options_parser(int key, char *arg,
 							break;
 	case ARGP_btf_encode_detached:
 		  detached_btf_filename = arg; // fallthru
-	case 'J': btf_encode = 1;
+	case 'J': conf_load.btf_encode = true;
 		  conf_load.get_addr_info = true;
 		  conf_load.ignore_alignment_attr = true;
 		  // XXX for now, test this more thoroughly
@@ -3217,7 +3216,7 @@ static enum load_steal_kind pahole_stealer(struct cu *cu, struct conf_load *conf
 	    print_enumeration_with_enumerator(cu, enumerator_name))
 		return LSK__DELETE; // Maybe we can find this in several CUs, so don't stop it
 
-	if (btf_encode) {
+	if (conf_load->btf_encode) {
 		return pahole_stealer__btf_encode(cu, conf_load);
 	}
 #if 0
@@ -3530,7 +3529,7 @@ int main(int argc, char *argv[])
 	// and as this is at this point unintended, avoid that.
 	// Next we need to just skip object files that don't have the format we
 	// expect as the source for BTF encoding, i.e. no DWARF, no BTF, no problema.
-	if (btf_encode && conf_load.format_path == NULL)
+	if (conf_load.btf_encode && conf_load.format_path == NULL)
 		conf_load.format_path = "dwarf";
 
 	if (show_running_kernel_vmlinux) {
@@ -3593,7 +3592,7 @@ int main(int argc, char *argv[])
 				base_btf_file, libbpf_get_error(conf_load.base_btf));
 			goto out;
 		}
-		if (!btf_encode && !ctf_encode) {
+		if (!conf_load.btf_encode && !ctf_encode) {
 			// Force "btf" since a btf_base is being informed
 			conf_load.format_path = "btf";
 		}
@@ -3641,7 +3640,7 @@ try_sole_arg_as_class_names:
 
 	err = cus__load_files(cus, &conf_load, argv + remaining);
 	if (err != 0) {
-		if (class_name == NULL && !btf_encode && !ctf_encode) {
+		if (class_name == NULL && !conf_load.btf_encode && !ctf_encode) {
 			class_name = argv[remaining];
 
 			if (class_name == NULL) {
@@ -3658,7 +3657,7 @@ try_sole_arg_as_class_names:
 			goto try_sole_arg_as_class_names;
 		}
 
-		if (btf_encode || ctf_encode) {
+		if (conf_load.btf_encode || ctf_encode) {
 			// If encoding is asked for and there is no DEBUG info to encode from,
 			// there are no errors, continue...
 			goto out_ok;
@@ -3717,7 +3716,7 @@ try_sole_arg_as_class_names:
 	type_instance__delete(header);
 	header = NULL;
 
-	if (btf_encode && btf_encoder) { // maybe all CUs were filtered out and thus we don't have an encoder?
+	if (conf_load.btf_encode && btf_encoder) { // maybe all CUs were filtered out and thus we don't have an encoder?
 		err = btf_encoder__encode(btf_encoder, &conf_load);
 		btf_encoder__delete(btf_encoder);
 		if (err) {
-- 
2.43.5


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

* [RFC dwarves 4/6] btf_loader: read ELF for BTF encoding
  2025-08-07 14:42 [RFC dwarves 0/6] prep for compiler-generated BTF Alan Maguire
                   ` (2 preceding siblings ...)
  2025-08-07 14:42 ` [RFC dwarves 3/6] pahole: Add btf_encode to conf_load Alan Maguire
@ 2025-08-07 14:42 ` Alan Maguire
  2025-08-07 14:42 ` [RFC dwarves 5/6] btf_encoder: Do not error out if BTF is not found in some input files Alan Maguire
  2025-08-07 14:42 ` [RFC dwarves 6/6] tests: Add test of pahole using BTF as input to BTF generation Alan Maguire
  5 siblings, 0 replies; 12+ messages in thread
From: Alan Maguire @ 2025-08-07 14:42 UTC (permalink / raw)
  To: dwarves; +Cc: bpf, Alan Maguire

When encoding BTF we need ELF information also; read it for BTF encoding case.

Signed-off-by: Alan Maguire <alan.maguire@oracle.com>
---
 btf_loader.c | 29 ++++++++++++++++++++++++++---
 1 file changed, 26 insertions(+), 3 deletions(-)

diff --git a/btf_loader.c b/btf_loader.c
index 42bca92..504a07d 100644
--- a/btf_loader.c
+++ b/btf_loader.c
@@ -735,7 +735,7 @@ struct debug_fmt_ops btf__ops;
 
 static int cus__load_btf(struct cus *cus, struct conf_load *conf, const char *filename)
 {
-	int err = -1;
+	int fd = -1, err = -1;
 
 	// Pass a zero for addr_size, we'll get it after we load via btf__pointer_size()
 	struct cu *cu = cu__new(filename, 0, NULL, 0, filename, false);
@@ -746,6 +746,23 @@ static int cus__load_btf(struct cus *cus, struct conf_load *conf, const char *fi
 	cu->uses_global_strings = false;
 	cu->dfops = &btf__ops;
 
+	/* Need ELF information for BTF encoding also */
+	if (conf->btf_encode) {
+		fd = open(filename, O_RDONLY), err = -1;
+		if (fd >= 0) {
+			if (elf_version(EV_CURRENT) == EV_NONE) {
+				fprintf(stderr, "%s: cannot set libelf version.\n", __func__);
+				goto out_free;
+			}
+			cu->elf = elf_begin(fd, ELF_C_READ_MMAP, NULL);
+			if (cu->elf == NULL) {
+				fprintf(stderr, "%s: cannot read %s ELF file.\n",
+					__func__, filename);
+				goto out_free;
+			}
+		}
+	}
+
 	libbpf_set_print(libbpf_log);
 
 	struct btf *btf = btf__parse_split(filename, conf->base_btf);
@@ -771,10 +788,16 @@ static int cus__load_btf(struct cus *cus, struct conf_load *conf, const char *fi
 		return 0;
 
 	cus__add(cus, cu);
-	return err;
 
 out_free:
-	cu__delete(cu); // will call btf__free(cu->priv);
+	if (cu->elf) {
+		elf_end(cu->elf);
+		cu->elf = NULL;
+	}
+	if (fd != -1)
+		close(fd);
+	if (err)
+		cu__delete(cu); // will call btf__free(cu->priv);
 	return err;
 }
 
-- 
2.43.5


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

* [RFC dwarves 5/6] btf_encoder: Do not error out if BTF is not found in some input files
  2025-08-07 14:42 [RFC dwarves 0/6] prep for compiler-generated BTF Alan Maguire
                   ` (3 preceding siblings ...)
  2025-08-07 14:42 ` [RFC dwarves 4/6] btf_loader: read ELF for BTF encoding Alan Maguire
@ 2025-08-07 14:42 ` Alan Maguire
  2025-08-07 15:59   ` Alexei Starovoitov
  2025-08-07 14:42 ` [RFC dwarves 6/6] tests: Add test of pahole using BTF as input to BTF generation Alan Maguire
  5 siblings, 1 reply; 12+ messages in thread
From: Alan Maguire @ 2025-08-07 14:42 UTC (permalink / raw)
  To: dwarves; +Cc: bpf, Alan Maguire

When encoding from a lot of object file sources, it is possible some
will not contain BTF, so if --btf_features=encode_force is set, drive
on as long as at least one _does_ contain a .BTF section.

With this in place, we can test how gcc -gbtf generation across vmlinux
works in a simple manner by doing the following on a kernel build which
specified -gbtf in the KCFLAGS environment variable (tested with gcc 14):

 pahole --format_path=btf -J --btf_features=encode_force \
        --btf_encode_detached=/tmp/vmlinux.btf $(ar t vmlinux.a)

("ar t vmlinux.a" gives a list of the object files comprising vmlinux)

This is no substitute for link-time BTF deduplication of course, but
it does provide a simple way to see the BTF that gcc generates for vmlinux.

The idea is that we can explore differences in BTF generation across
the various combinations

1. debug info source: DWARF; dedup done via pahole (traditional)
2. debug info source: compiler-generated BTF; dedup done via pahole (above)
3. debug info source: compiler-generated BTF; dedup done via linker (TBD)

Handling 3 - linker-based dedup - will require BTF archives so that is the
next step we need to explore.

Signed-off-by: Alan Maguire <alan.maguire@oracle.com>
---
 dwarves.c | 14 ++++++++++++--
 1 file changed, 12 insertions(+), 2 deletions(-)

diff --git a/dwarves.c b/dwarves.c
index ef93239..8b37b13 100644
--- a/dwarves.c
+++ b/dwarves.c
@@ -2948,17 +2948,27 @@ try_elf:
 int cus__load_files(struct cus *cus, struct conf_load *conf,
 		    char *filenames[])
 {
-	int i = 0;
+	int i = 0, loaded = 0, failed = 0;
 
 	while (filenames[i] != NULL) {
 		int err = cus__load_file(cus, conf, filenames[i]);
 		if (err) {
 			errno = -err;
-			return -++i;
+			if (conf->btf_encode_force)
+				failed = -(i + 1);
+			else
+				return -++i;
+		} else {
+			loaded++;
 		}
 		++i;
 	}
 
+	if (conf->btf_encode_force) {
+		/* If no files loaded, error out, otherwise return success */
+		if (loaded == 0)
+			return failed;
+	}
 	return i ? 0 : cus__load_running_kernel(cus, conf);
 }
 
-- 
2.43.5


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

* [RFC dwarves 6/6] tests: Add test of pahole using BTF as input to BTF generation
  2025-08-07 14:42 [RFC dwarves 0/6] prep for compiler-generated BTF Alan Maguire
                   ` (4 preceding siblings ...)
  2025-08-07 14:42 ` [RFC dwarves 5/6] btf_encoder: Do not error out if BTF is not found in some input files Alan Maguire
@ 2025-08-07 14:42 ` Alan Maguire
  5 siblings, 0 replies; 12+ messages in thread
From: Alan Maguire @ 2025-08-07 14:42 UTC (permalink / raw)
  To: dwarves; +Cc: bpf, Alan Maguire

Create two .o files containing BTF as a result of passing -gbtf
and ensure that we can run BTF generation (and dedup) on them
to get a valid detached BTF output.

Signed-off-by: Alan Maguire <alan.maguire@oracle.com>
---
 tests/btf_2_btf.sh | 122 +++++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 122 insertions(+)
 create mode 100755 tests/btf_2_btf.sh

diff --git a/tests/btf_2_btf.sh b/tests/btf_2_btf.sh
new file mode 100755
index 0000000..dbc4f34
--- /dev/null
+++ b/tests/btf_2_btf.sh
@@ -0,0 +1,122 @@
+#!/bin/bash
+# SPDX-License-Identifier: GPL-2.0-only
+#
+# Copyright (c) 2025, Oracle and/or its affiliates.
+#
+# Use -gbtf to compile objects with BTF and combine/dedup the
+# BTF using pahole; this tests the ability to take BTF as
+# input for BTF encoding as well as DWARF.
+#
+
+outdir=
+
+fail()
+{
+	# Do not remove test dir; might be useful for analysis
+	trap - EXIT
+	if [[ -d "$outdir" ]]; then
+		echo "Test data is in $outdir"
+	fi
+	exit 1
+}
+
+cleanup()
+{
+	rm ${outdir}/*
+	rmdir $outdir
+}
+
+outdir=$(mktemp -d /tmp/btf_2_btf.sh.XXXXXX)
+
+trap cleanup EXIT
+
+echo -n "Validation of BTF encoding from cc-generated BTF: "
+
+cat <<EOF > ${outdir}/f1.c
+#include <stdlib.h>
+
+enum foo {
+	E1,
+	E2,
+	E3
+};
+
+struct bar {
+	enum foo f1;
+	int f2;
+	char *f3;
+	void *f4;
+};
+
+int baz(struct bar *b)
+{
+	return b->f2++;
+}
+EOF
+gcc -gbtf -c ${outdir}/f1.c -o ${outdir}/f1.o
+if [[ $? -ne 0 ]]; then
+	echo "skip: -gbtf not supported or gcc not present"
+	exit 1
+fi
+
+cat <<EOF > ${outdir}/f2.c
+#include <stdlib.h>
+
+enum foo {
+        E1,
+        E2,
+        E3
+};
+
+struct bar {
+        enum foo f1;
+        int f2;
+        char *f3;
+        void *f4;
+};
+
+struct bar2 {
+	void *f1;
+	int f2[3];
+};
+
+int othervar;
+
+void *baz2(struct bar2 *b2, char *o)
+{
+	if (b2->f2[0] > 2)
+		return NULL;
+	return o;
+}
+EOF
+gcc -gbtf -c ${outdir}/f2.c -o ${outdir}/f2.o
+
+pahole -J --format_path=btf --btf_features=default --lang_exclude=rust \
+	--btf_encode_detached=${outdir}/cc.btf ${outdir}/f1.o ${outdir}/f2.o
+
+for f in ${outdir}/f1.o ${outdir}/cc.btf ; do
+	struct=$(pahole $f |grep "struct bar" 2>/dev/null)
+	if [[ -z "$struct" ]]; then
+		echo "struct bar not found in '$f'"
+		fail
+	fi
+	fns=$(pfunct --all $f |grep baz 2>/dev/null)
+	if [[ -z "$fns" ]]; then
+		echo "function baz not found in '$f'"
+		fail
+	fi
+done
+struct=$(pahole $f |grep "struct bar2" 2>/dev/null)
+if [[ -z "$struct" ]]; then
+	echo "struct bar2 not found in '$f'"
+	fail
+fi
+fn=$(pfunct --all $f |grep "baz2" 2>/dev/null)
+if [[ -z "$fn" ]]; then
+	echo "function baz2 not found in '$f'"
+	fail
+fi
+
+echo "Ok"
+
+exit 0
-- 
2.43.5


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

* Re: [RFC dwarves 5/6] btf_encoder: Do not error out if BTF is not found in some input files
  2025-08-07 14:42 ` [RFC dwarves 5/6] btf_encoder: Do not error out if BTF is not found in some input files Alan Maguire
@ 2025-08-07 15:59   ` Alexei Starovoitov
  2025-08-07 16:36     ` Jose E. Marchesi
  0 siblings, 1 reply; 12+ messages in thread
From: Alexei Starovoitov @ 2025-08-07 15:59 UTC (permalink / raw)
  To: Alan Maguire; +Cc: dwarves, bpf

On Thu, Aug 7, 2025 at 7:42 AM Alan Maguire <alan.maguire@oracle.com> wrote:
>
> This is no substitute for link-time BTF deduplication of course, but
> it does provide a simple way to see the BTF that gcc generates for vmlinux.
>
> The idea is that we can explore differences in BTF generation across
> the various combinations
>
> 1. debug info source: DWARF; dedup done via pahole (traditional)
> 2. debug info source: compiler-generated BTF; dedup done via pahole (above)
> 3. debug info source: compiler-generated BTF; dedup done via linker (TBD)
>
> Handling 3 - linker-based dedup - will require BTF archives so that is the
> next step we need to explore.

Overall, the patch set makes sense and we need to make this step in pahole,
but before we start any discussion about 3 and BTF archives
the 1 and 2 above need to reach parity.
Not just being close enough, but an exact equivalence.

But, frankly, gcc support for btf_decl_tags is much much higher priority
than any of this.
We're tired of adding hacks through the bpf subsystem, because
gcc cannot do decl_tags.
Here are the hacks that will be removed:
1. BTF_TYPE_SAFE*
2. raw_tp_null_args[]
3. KF_ARENA_ARG
and probably other cases.

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

* Re: [RFC dwarves 5/6] btf_encoder: Do not error out if BTF is not found in some input files
  2025-08-07 15:59   ` Alexei Starovoitov
@ 2025-08-07 16:36     ` Jose E. Marchesi
  2025-08-07 17:12       ` Alexei Starovoitov
  0 siblings, 1 reply; 12+ messages in thread
From: Jose E. Marchesi @ 2025-08-07 16:36 UTC (permalink / raw)
  To: Alexei Starovoitov; +Cc: Alan Maguire, dwarves, bpf


> On Thu, Aug 7, 2025 at 7:42 AM Alan Maguire <alan.maguire@oracle.com> wrote:
>>
>> This is no substitute for link-time BTF deduplication of course, but
>> it does provide a simple way to see the BTF that gcc generates for vmlinux.
>>
>> The idea is that we can explore differences in BTF generation across
>> the various combinations
>>
>> 1. debug info source: DWARF; dedup done via pahole (traditional)
>> 2. debug info source: compiler-generated BTF; dedup done via pahole (above)
>> 3. debug info source: compiler-generated BTF; dedup done via linker (TBD)
>>
>> Handling 3 - linker-based dedup - will require BTF archives so that is the
>> next step we need to explore.
>
> Overall, the patch set makes sense and we need to make this step in pahole,
> but before we start any discussion about 3 and BTF archives
> the 1 and 2 above need to reach parity.
> Not just being close enough, but an exact equivalence.
>
> But, frankly, gcc support for btf_decl_tags is much much higher priority
> than any of this.
>
> We're tired of adding hacks through the bpf subsystem, because
> gcc cannot do decl_tags.
> Here are the hacks that will be removed:
> 1. BTF_TYPE_SAFE*
> 2. raw_tp_null_args[]
> 3. KF_ARENA_ARG
> and probably other cases.

We are getting there.  The C front-end maintainer just looked at the
latest version of the series [1] and, other than a small observation
concerning wide char strings, he seems to be ok with the attributes.

[1] https://gcc.gnu.org/pipermail/gcc-patches/2025-August/692057.html

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

* Re: [RFC dwarves 5/6] btf_encoder: Do not error out if BTF is not found in some input files
  2025-08-07 16:36     ` Jose E. Marchesi
@ 2025-08-07 17:12       ` Alexei Starovoitov
  2025-08-07 19:18         ` Eduard Zingerman
  0 siblings, 1 reply; 12+ messages in thread
From: Alexei Starovoitov @ 2025-08-07 17:12 UTC (permalink / raw)
  To: Jose E. Marchesi, Yonghong Song; +Cc: Alan Maguire, dwarves, bpf

On Thu, Aug 7, 2025 at 9:37 AM Jose E. Marchesi
<jose.marchesi@oracle.com> wrote:
>
>
> > On Thu, Aug 7, 2025 at 7:42 AM Alan Maguire <alan.maguire@oracle.com> wrote:
> >>
> >> This is no substitute for link-time BTF deduplication of course, but
> >> it does provide a simple way to see the BTF that gcc generates for vmlinux.
> >>
> >> The idea is that we can explore differences in BTF generation across
> >> the various combinations
> >>
> >> 1. debug info source: DWARF; dedup done via pahole (traditional)
> >> 2. debug info source: compiler-generated BTF; dedup done via pahole (above)
> >> 3. debug info source: compiler-generated BTF; dedup done via linker (TBD)
> >>
> >> Handling 3 - linker-based dedup - will require BTF archives so that is the
> >> next step we need to explore.
> >
> > Overall, the patch set makes sense and we need to make this step in pahole,
> > but before we start any discussion about 3 and BTF archives
> > the 1 and 2 above need to reach parity.
> > Not just being close enough, but an exact equivalence.
> >
> > But, frankly, gcc support for btf_decl_tags is much much higher priority
> > than any of this.
> >
> > We're tired of adding hacks through the bpf subsystem, because
> > gcc cannot do decl_tags.
> > Here are the hacks that will be removed:
> > 1. BTF_TYPE_SAFE*
> > 2. raw_tp_null_args[]
> > 3. KF_ARENA_ARG
> > and probably other cases.
>
> We are getting there.  The C front-end maintainer just looked at the
> latest version of the series [1] and, other than a small observation
> concerning wide char strings, he seems to be ok with the attributes.
>
> [1] https://gcc.gnu.org/pipermail/gcc-patches/2025-August/692057.html

Good to know.

Yonghong, what does llvm do with wchar?

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

* Re: [RFC dwarves 5/6] btf_encoder: Do not error out if BTF is not found in some input files
  2025-08-07 17:12       ` Alexei Starovoitov
@ 2025-08-07 19:18         ` Eduard Zingerman
  2025-08-08  5:39           ` Yonghong Song
  0 siblings, 1 reply; 12+ messages in thread
From: Eduard Zingerman @ 2025-08-07 19:18 UTC (permalink / raw)
  To: Alexei Starovoitov, Jose E. Marchesi, Yonghong Song
  Cc: Alan Maguire, dwarves, bpf

On Thu, 2025-08-07 at 10:12 -0700, Alexei Starovoitov wrote:
> On Thu, Aug 7, 2025 at 9:37 AM Jose E. Marchesi
> <jose.marchesi@oracle.com> wrote:
> >
> >
> > > On Thu, Aug 7, 2025 at 7:42 AM Alan Maguire <alan.maguire@oracle.com> wrote:
> > > >
> > > > This is no substitute for link-time BTF deduplication of course, but
> > > > it does provide a simple way to see the BTF that gcc generates for vmlinux.
> > > >
> > > > The idea is that we can explore differences in BTF generation across
> > > > the various combinations
> > > >
> > > > 1. debug info source: DWARF; dedup done via pahole (traditional)
> > > > 2. debug info source: compiler-generated BTF; dedup done via pahole (above)
> > > > 3. debug info source: compiler-generated BTF; dedup done via linker (TBD)
> > > >
> > > > Handling 3 - linker-based dedup - will require BTF archives so that is the
> > > > next step we need to explore.
> > >
> > > Overall, the patch set makes sense and we need to make this step in pahole,
> > > but before we start any discussion about 3 and BTF archives
> > > the 1 and 2 above need to reach parity.
> > > Not just being close enough, but an exact equivalence.
> > >
> > > But, frankly, gcc support for btf_decl_tags is much much higher priority
> > > than any of this.
> > >
> > > We're tired of adding hacks through the bpf subsystem, because
> > > gcc cannot do decl_tags.
> > > Here are the hacks that will be removed:
> > > 1. BTF_TYPE_SAFE*
> > > 2. raw_tp_null_args[]
> > > 3. KF_ARENA_ARG
> > > and probably other cases.
> >
> > We are getting there.  The C front-end maintainer just looked at the
> > latest version of the series [1] and, other than a small observation
> > concerning wide char strings, he seems to be ok with the attributes.
> >
> > [1] https://gcc.gnu.org/pipermail/gcc-patches/2025-August/692057.html
>
> Good to know.
>
> Yonghong, what does llvm do with wchar?

The literal is copied as-is with a warning.

  $ cat wide-string-test.c
  __attribute__((btf_decl_tag(u8"üüü")))
  int foo(void) { return 42; }

  $ clang --target=bpf -O2 -g wide-string-test.c -c -o wide-string-test.o
  wide-string-test.c:1:29: warning: encoding prefix 'u8' on an unevaluated string literal has no effect [-Winvalid-unevaluated-string]
      1 | __attribute__((btf_decl_tag(u8"üüü")))
        |                             ^~
  1 warning generated.

  $ bpftool btf dump file wide-string-test.o
  [1] FUNC_PROTO '(anon)' ret_type_id=2 vlen=0
  [2] INT 'int' size=4 bits_offset=0 nr_bits=32 encoding=SIGNED
  [3] FUNC 'foo' type_id=1 linkage=global
  [4] DECL_TAG 'üüü' type_id=3 component_idx=-1

"As-is" means using compiler internal encoding (UTF8),
e.g. above u8"üüü" is encoded as "c3 bc c3 bc c3 bc" in the final .BTF
section, same happens for UTF32 literal U"üüü".

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

* Re: [RFC dwarves 5/6] btf_encoder: Do not error out if BTF is not found in some input files
  2025-08-07 19:18         ` Eduard Zingerman
@ 2025-08-08  5:39           ` Yonghong Song
  0 siblings, 0 replies; 12+ messages in thread
From: Yonghong Song @ 2025-08-08  5:39 UTC (permalink / raw)
  To: Eduard Zingerman, Alexei Starovoitov, Jose E. Marchesi
  Cc: Alan Maguire, dwarves, bpf



On 8/7/25 12:18 PM, Eduard Zingerman wrote:
> On Thu, 2025-08-07 at 10:12 -0700, Alexei Starovoitov wrote:
>> On Thu, Aug 7, 2025 at 9:37 AM Jose E. Marchesi
>> <jose.marchesi@oracle.com> wrote:
>>>
>>>> On Thu, Aug 7, 2025 at 7:42 AM Alan Maguire <alan.maguire@oracle.com> wrote:
>>>>> This is no substitute for link-time BTF deduplication of course, but
>>>>> it does provide a simple way to see the BTF that gcc generates for vmlinux.
>>>>>
>>>>> The idea is that we can explore differences in BTF generation across
>>>>> the various combinations
>>>>>
>>>>> 1. debug info source: DWARF; dedup done via pahole (traditional)
>>>>> 2. debug info source: compiler-generated BTF; dedup done via pahole (above)
>>>>> 3. debug info source: compiler-generated BTF; dedup done via linker (TBD)
>>>>>
>>>>> Handling 3 - linker-based dedup - will require BTF archives so that is the
>>>>> next step we need to explore.
>>>> Overall, the patch set makes sense and we need to make this step in pahole,
>>>> but before we start any discussion about 3 and BTF archives
>>>> the 1 and 2 above need to reach parity.
>>>> Not just being close enough, but an exact equivalence.
>>>>
>>>> But, frankly, gcc support for btf_decl_tags is much much higher priority
>>>> than any of this.
>>>>
>>>> We're tired of adding hacks through the bpf subsystem, because
>>>> gcc cannot do decl_tags.
>>>> Here are the hacks that will be removed:
>>>> 1. BTF_TYPE_SAFE*
>>>> 2. raw_tp_null_args[]
>>>> 3. KF_ARENA_ARG
>>>> and probably other cases.
>>> We are getting there.  The C front-end maintainer just looked at the
>>> latest version of the series [1] and, other than a small observation
>>> concerning wide char strings, he seems to be ok with the attributes.
>>>
>>> [1] https://gcc.gnu.org/pipermail/gcc-patches/2025-August/692057.html
>> Good to know.
>>
>> Yonghong, what does llvm do with wchar?
> The literal is copied as-is with a warning.
>
>    $ cat wide-string-test.c
>    __attribute__((btf_decl_tag(u8"üüü")))
>    int foo(void) { return 42; }
>
>    $ clang --target=bpf -O2 -g wide-string-test.c -c -o wide-string-test.o
>    wide-string-test.c:1:29: warning: encoding prefix 'u8' on an unevaluated string literal has no effect [-Winvalid-unevaluated-string]
>        1 | __attribute__((btf_decl_tag(u8"üüü")))
>          |                             ^~
>    1 warning generated.
>
>    $ bpftool btf dump file wide-string-test.o
>    [1] FUNC_PROTO '(anon)' ret_type_id=2 vlen=0
>    [2] INT 'int' size=4 bits_offset=0 nr_bits=32 encoding=SIGNED
>    [3] FUNC 'foo' type_id=1 linkage=global
>    [4] DECL_TAG 'üüü' type_id=3 component_idx=-1
>
> "As-is" means using compiler internal encoding (UTF8),
> e.g. above u8"üüü" is encoded as "c3 bc c3 bc c3 bc" in the final .BTF
> section, same happens for UTF32 literal U"üüü".

If we remove 'u8' prefix, there will be no warnings. For example,

$ cat wide-string-test.c
__attribute__((btf_decl_tag("üüü")))
int foo(void) { return 42; }
$ clang --target=bpf -O2 -g wide-string-test.c -c -o wide-string-test.o
$

"üüü" will be treated similar to other ascii strings w.r.t. decl/type tag.


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

end of thread, other threads:[~2025-08-08  5:39 UTC | newest]

Thread overview: 12+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2025-08-07 14:42 [RFC dwarves 0/6] prep for compiler-generated BTF Alan Maguire
2025-08-07 14:42 ` [RFC dwarves 1/6] btf_loader: Make BTF representation match DWARF Alan Maguire
2025-08-07 14:42 ` [RFC dwarves 2/6] pfunct: Fix up function display with updated prototype representation Alan Maguire
2025-08-07 14:42 ` [RFC dwarves 3/6] pahole: Add btf_encode to conf_load Alan Maguire
2025-08-07 14:42 ` [RFC dwarves 4/6] btf_loader: read ELF for BTF encoding Alan Maguire
2025-08-07 14:42 ` [RFC dwarves 5/6] btf_encoder: Do not error out if BTF is not found in some input files Alan Maguire
2025-08-07 15:59   ` Alexei Starovoitov
2025-08-07 16:36     ` Jose E. Marchesi
2025-08-07 17:12       ` Alexei Starovoitov
2025-08-07 19:18         ` Eduard Zingerman
2025-08-08  5:39           ` Yonghong Song
2025-08-07 14:42 ` [RFC dwarves 6/6] tests: Add test of pahole using BTF as input to BTF generation Alan Maguire

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).