selftests/bpf: Add BTF dedup tests for recursive typedef definitions

Add several ./test_progs tests:
    1.  btf/dedup:recursive typedef ensures that deduplication no
	longer fails on recursive typedefs.
    2.  btf/dedup:typedef ensures that typedefs are deduplicated correctly
	just as they were before this patch.

Signed-off-by: Paul Houssel <paul.houssel@orange.com>
Signed-off-by: Andrii Nakryiko <andrii@kernel.org>
Acked-by: Eduard Zingerman <eddyz87@gmail.com>
Link: https://lore.kernel.org/bpf/9fac2f744089f6090257d4c881914b79f6cd6c6a.1763037045.git.paul.houssel@orange.com
This commit is contained in:
Paul Houssel 2025-11-13 13:39:51 +01:00 committed by Andrii Nakryiko
parent 3781413465
commit a69e09823e

View File

@ -7495,6 +7495,71 @@ static struct btf_dedup_test dedup_tests[] = {
BTF_STR_SEC("\0t\0m1\0m2\0tag1\0tag2\0tag3"),
},
},
{
.descr = "dedup: recursive typedef",
/*
* This test simulates a recursive typedef, which in GO is defined as such:
*
* type Foo func() Foo
*
* In BTF terms, this is represented as a TYPEDEF referencing
* a FUNC_PROTO that returns the same TYPEDEF.
*/
.input = {
.raw_types = {
/*
* [1] typedef Foo -> func() Foo
* [2] func_proto() -> Foo
* [3] typedef Foo -> func() Foo
* [4] func_proto() -> Foo
*/
BTF_TYPEDEF_ENC(NAME_NTH(1), 2), /* [1] */
BTF_FUNC_PROTO_ENC(1, 0), /* [2] */
BTF_TYPEDEF_ENC(NAME_NTH(1), 4), /* [3] */
BTF_FUNC_PROTO_ENC(3, 0), /* [4] */
BTF_END_RAW,
},
BTF_STR_SEC("\0Foo"),
},
.expect = {
.raw_types = {
BTF_TYPEDEF_ENC(NAME_NTH(1), 2), /* [1] */
BTF_FUNC_PROTO_ENC(1, 0), /* [2] */
BTF_END_RAW,
},
BTF_STR_SEC("\0Foo"),
},
},
{
.descr = "dedup: typedef",
/*
* // CU 1:
* typedef int foo;
*
* // CU 2:
* typedef int foo;
*/
.input = {
.raw_types = {
/* CU 1 */
BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4), /* [1] */
BTF_TYPEDEF_ENC(NAME_NTH(1), 1), /* [2] */
/* CU 2 */
BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4), /* [3] */
BTF_TYPEDEF_ENC(NAME_NTH(1), 3), /* [4] */
BTF_END_RAW,
},
BTF_STR_SEC("\0foo"),
},
.expect = {
.raw_types = {
BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4), /* [1] */
BTF_TYPEDEF_ENC(NAME_NTH(1), 1), /* [2] */
BTF_END_RAW,
},
BTF_STR_SEC("\0foo"),
},
},
{
.descr = "dedup: typedef tags",
.input = {