diff options
Diffstat (limited to 'tools/testing/selftests/bpf/test_btf.c')
| -rw-r--r-- | tools/testing/selftests/bpf/test_btf.c | 91 | 
1 files changed, 91 insertions, 0 deletions
| diff --git a/tools/testing/selftests/bpf/test_btf.c b/tools/testing/selftests/bpf/test_btf.c index 38797aa627a7..ec5794e4205b 100644 --- a/tools/testing/selftests/bpf/test_btf.c +++ b/tools/testing/selftests/bpf/test_btf.c @@ -5777,6 +5777,53 @@ const struct btf_dedup_test dedup_tests[] = {  	},  },  { +	.descr = "dedup: void equiv check", +	/* +	 * // CU 1: +	 * struct s { +	 *	struct {} *x; +	 * }; +	 * // CU 2: +	 * struct s { +	 *	int *x; +	 * }; +	 */ +	.input = { +		.raw_types = { +			/* CU 1 */ +			BTF_STRUCT_ENC(0, 0, 1),				/* [1] struct {}  */ +			BTF_PTR_ENC(1),						/* [2] ptr -> [1] */ +			BTF_STRUCT_ENC(NAME_NTH(1), 1, 8),			/* [3] struct s   */ +				BTF_MEMBER_ENC(NAME_NTH(2), 2, 0), +			/* CU 2 */ +			BTF_PTR_ENC(0),						/* [4] ptr -> void */ +			BTF_STRUCT_ENC(NAME_NTH(1), 1, 8),			/* [5] struct s   */ +				BTF_MEMBER_ENC(NAME_NTH(2), 4, 0), +			BTF_END_RAW, +		}, +		BTF_STR_SEC("\0s\0x"), +	}, +	.expect = { +		.raw_types = { +			/* CU 1 */ +			BTF_STRUCT_ENC(0, 0, 1),				/* [1] struct {}  */ +			BTF_PTR_ENC(1),						/* [2] ptr -> [1] */ +			BTF_STRUCT_ENC(NAME_NTH(1), 1, 8),			/* [3] struct s   */ +				BTF_MEMBER_ENC(NAME_NTH(2), 2, 0), +			/* CU 2 */ +			BTF_PTR_ENC(0),						/* [4] ptr -> void */ +			BTF_STRUCT_ENC(NAME_NTH(1), 1, 8),			/* [5] struct s   */ +				BTF_MEMBER_ENC(NAME_NTH(2), 4, 0), +			BTF_END_RAW, +		}, +		BTF_STR_SEC("\0s\0x"), +	}, +	.opts = { +		.dont_resolve_fwds = false, +		.dedup_table_size = 1, /* force hash collisions */ +	}, +}, +{  	.descr = "dedup: all possible kinds (no duplicates)",  	.input = {  		.raw_types = { @@ -5874,6 +5921,50 @@ const struct btf_dedup_test dedup_tests[] = {  		.dont_resolve_fwds = false,  	},  }, +{ +	.descr = "dedup: enum fwd resolution", +	.input = { +		.raw_types = { +			/* [1] fwd enum 'e1' before full enum */ +			BTF_TYPE_ENC(NAME_NTH(1), BTF_INFO_ENC(BTF_KIND_ENUM, 0, 0), 4), +			/* [2] full enum 'e1' after fwd */ +			BTF_TYPE_ENC(NAME_NTH(1), BTF_INFO_ENC(BTF_KIND_ENUM, 0, 1), 4), +				BTF_ENUM_ENC(NAME_NTH(2), 123), +			/* [3] full enum 'e2' before fwd */ +			BTF_TYPE_ENC(NAME_NTH(3), BTF_INFO_ENC(BTF_KIND_ENUM, 0, 1), 4), +				BTF_ENUM_ENC(NAME_NTH(4), 456), +			/* [4] fwd enum 'e2' after full enum */ +			BTF_TYPE_ENC(NAME_NTH(3), BTF_INFO_ENC(BTF_KIND_ENUM, 0, 0), 4), +			/* [5] incompatible fwd enum with different size */ +			BTF_TYPE_ENC(NAME_NTH(1), BTF_INFO_ENC(BTF_KIND_ENUM, 0, 0), 1), +			/* [6] incompatible full enum with different value */ +			BTF_TYPE_ENC(NAME_NTH(1), BTF_INFO_ENC(BTF_KIND_ENUM, 0, 1), 4), +				BTF_ENUM_ENC(NAME_NTH(2), 321), +			BTF_END_RAW, +		}, +		BTF_STR_SEC("\0e1\0e1_val\0e2\0e2_val"), +	}, +	.expect = { +		.raw_types = { +			/* [1] full enum 'e1' */ +			BTF_TYPE_ENC(NAME_NTH(1), BTF_INFO_ENC(BTF_KIND_ENUM, 0, 1), 4), +				BTF_ENUM_ENC(NAME_NTH(2), 123), +			/* [2] full enum 'e2' */ +			BTF_TYPE_ENC(NAME_NTH(3), BTF_INFO_ENC(BTF_KIND_ENUM, 0, 1), 4), +				BTF_ENUM_ENC(NAME_NTH(4), 456), +			/* [3] incompatible fwd enum with different size */ +			BTF_TYPE_ENC(NAME_NTH(1), BTF_INFO_ENC(BTF_KIND_ENUM, 0, 0), 1), +			/* [4] incompatible full enum with different value */ +			BTF_TYPE_ENC(NAME_NTH(1), BTF_INFO_ENC(BTF_KIND_ENUM, 0, 1), 4), +				BTF_ENUM_ENC(NAME_NTH(2), 321), +			BTF_END_RAW, +		}, +		BTF_STR_SEC("\0e1\0e1_val\0e2\0e2_val"), +	}, +	.opts = { +		.dont_resolve_fwds = false, +	}, +},  }; |