Commit a69e0982 authored by Paul Houssel's avatar Paul Houssel Committed by Andrii Nakryiko
Browse files

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: default avatarPaul Houssel <paul.houssel@orange.com>
Signed-off-by: default avatarAndrii Nakryiko <andrii@kernel.org>
Acked-by: default avatarEduard Zingerman <eddyz87@gmail.com>
Link: https://lore.kernel.org/bpf/9fac2f744089f6090257d4c881914b79f6cd6c6a.1763037045.git.paul.houssel@orange.com
parent 37814134
Loading
Loading
Loading
Loading
+65 −0
Original line number Diff line number Diff line
@@ -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 = {