Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

selftests/bpf: Tests for enum fwd resolved as full enum64

A set of test cases to verify enum fwd resolution logic:
- verify that enum fwd can be resolved as full enum64;
- verify that enum64 fwd can be resolved as full enum;
- verify that enum size is considered when enums are compared for
equivalence.

Signed-off-by: Eduard Zingerman <eddyz87@gmail.com>
Signed-off-by: Andrii Nakryiko <andrii@kernel.org>
Link: https://lore.kernel.org/bpf/20221101235413.1824260-2-eddyz87@gmail.com

authored by

Eduard Zingerman and committed by
Andrii Nakryiko
2e20f50f de048b6e

+83 -5
+83 -5
tools/testing/selftests/bpf/prog_tests/btf.c
··· 7133 7133 BTF_ENUM_ENC(NAME_NTH(4), 456), 7134 7134 /* [4] fwd enum 'e2' after full enum */ 7135 7135 BTF_TYPE_ENC(NAME_NTH(3), BTF_INFO_ENC(BTF_KIND_ENUM, 0, 0), 4), 7136 - /* [5] incompatible fwd enum with different size */ 7136 + /* [5] fwd enum with different size, size does not matter for fwd */ 7137 7137 BTF_TYPE_ENC(NAME_NTH(1), BTF_INFO_ENC(BTF_KIND_ENUM, 0, 0), 1), 7138 7138 /* [6] incompatible full enum with different value */ 7139 7139 BTF_TYPE_ENC(NAME_NTH(1), BTF_INFO_ENC(BTF_KIND_ENUM, 0, 1), 4), ··· 7150 7150 /* [2] full enum 'e2' */ 7151 7151 BTF_TYPE_ENC(NAME_NTH(3), BTF_INFO_ENC(BTF_KIND_ENUM, 0, 1), 4), 7152 7152 BTF_ENUM_ENC(NAME_NTH(4), 456), 7153 - /* [3] incompatible fwd enum with different size */ 7154 - BTF_TYPE_ENC(NAME_NTH(1), BTF_INFO_ENC(BTF_KIND_ENUM, 0, 0), 1), 7155 - /* [4] incompatible full enum with different value */ 7153 + /* [3] incompatible full enum with different value */ 7156 7154 BTF_TYPE_ENC(NAME_NTH(1), BTF_INFO_ENC(BTF_KIND_ENUM, 0, 1), 4), 7157 7155 BTF_ENUM_ENC(NAME_NTH(2), 321), 7158 7156 BTF_END_RAW, ··· 7609 7611 BTF_STR_SEC("\0e1\0e1_val"), 7610 7612 }, 7611 7613 }, 7612 - 7614 + { 7615 + .descr = "dedup: enum of different size: no dedup", 7616 + .input = { 7617 + .raw_types = { 7618 + /* [1] enum 'e1' */ 7619 + BTF_TYPE_ENC(NAME_NTH(1), BTF_INFO_ENC(BTF_KIND_ENUM, 0, 1), 4), 7620 + BTF_ENUM_ENC(NAME_NTH(2), 1), 7621 + /* [2] enum 'e1' */ 7622 + BTF_TYPE_ENC(NAME_NTH(1), BTF_INFO_ENC(BTF_KIND_ENUM, 0, 1), 2), 7623 + BTF_ENUM_ENC(NAME_NTH(2), 1), 7624 + BTF_END_RAW, 7625 + }, 7626 + BTF_STR_SEC("\0e1\0e1_val"), 7627 + }, 7628 + .expect = { 7629 + .raw_types = { 7630 + /* [1] enum 'e1' */ 7631 + BTF_TYPE_ENC(NAME_NTH(1), BTF_INFO_ENC(BTF_KIND_ENUM, 0, 1), 4), 7632 + BTF_ENUM_ENC(NAME_NTH(2), 1), 7633 + /* [2] enum 'e1' */ 7634 + BTF_TYPE_ENC(NAME_NTH(1), BTF_INFO_ENC(BTF_KIND_ENUM, 0, 1), 2), 7635 + BTF_ENUM_ENC(NAME_NTH(2), 1), 7636 + BTF_END_RAW, 7637 + }, 7638 + BTF_STR_SEC("\0e1\0e1_val"), 7639 + }, 7640 + }, 7641 + { 7642 + .descr = "dedup: enum fwd to enum64", 7643 + .input = { 7644 + .raw_types = { 7645 + /* [1] enum64 'e1' */ 7646 + BTF_TYPE_ENC(NAME_NTH(1), BTF_INFO_ENC(BTF_KIND_ENUM64, 0, 1), 8), 7647 + BTF_ENUM64_ENC(NAME_NTH(2), 1, 0), 7648 + /* [2] enum 'e1' fwd */ 7649 + BTF_TYPE_ENC(NAME_NTH(1), BTF_INFO_ENC(BTF_KIND_ENUM, 0, 0), 4), 7650 + /* [3] typedef enum 'e1' td */ 7651 + BTF_TYPE_ENC(NAME_NTH(3), BTF_INFO_ENC(BTF_KIND_TYPEDEF, 0, 0), 2), 7652 + BTF_END_RAW, 7653 + }, 7654 + BTF_STR_SEC("\0e1\0e1_val\0td"), 7655 + }, 7656 + .expect = { 7657 + .raw_types = { 7658 + /* [1] enum64 'e1' */ 7659 + BTF_TYPE_ENC(NAME_NTH(1), BTF_INFO_ENC(BTF_KIND_ENUM64, 0, 1), 8), 7660 + BTF_ENUM64_ENC(NAME_NTH(2), 1, 0), 7661 + /* [2] typedef enum 'e1' td */ 7662 + BTF_TYPE_ENC(NAME_NTH(3), BTF_INFO_ENC(BTF_KIND_TYPEDEF, 0, 0), 1), 7663 + BTF_END_RAW, 7664 + }, 7665 + BTF_STR_SEC("\0e1\0e1_val\0td"), 7666 + }, 7667 + }, 7668 + { 7669 + .descr = "dedup: enum64 fwd to enum", 7670 + .input = { 7671 + .raw_types = { 7672 + /* [1] enum 'e1' */ 7673 + BTF_TYPE_ENC(NAME_NTH(1), BTF_INFO_ENC(BTF_KIND_ENUM, 0, 1), 4), 7674 + BTF_ENUM_ENC(NAME_NTH(2), 1), 7675 + /* [2] enum64 'e1' fwd */ 7676 + BTF_TYPE_ENC(NAME_NTH(1), BTF_INFO_ENC(BTF_KIND_ENUM64, 0, 0), 8), 7677 + /* [3] typedef enum 'e1' td */ 7678 + BTF_TYPE_ENC(NAME_NTH(3), BTF_INFO_ENC(BTF_KIND_TYPEDEF, 0, 0), 2), 7679 + BTF_END_RAW, 7680 + }, 7681 + BTF_STR_SEC("\0e1\0e1_val\0td"), 7682 + }, 7683 + .expect = { 7684 + .raw_types = { 7685 + /* [1] enum 'e1' */ 7686 + BTF_TYPE_ENC(NAME_NTH(1), BTF_INFO_ENC(BTF_KIND_ENUM, 0, 1), 4), 7687 + BTF_ENUM_ENC(NAME_NTH(2), 1), 7688 + /* [2] typedef enum 'e1' td */ 7689 + BTF_TYPE_ENC(NAME_NTH(3), BTF_INFO_ENC(BTF_KIND_TYPEDEF, 0, 0), 1), 7690 + BTF_END_RAW, 7691 + }, 7692 + BTF_STR_SEC("\0e1\0e1_val\0td"), 7693 + }, 7694 + }, 7613 7695 }; 7614 7696 7615 7697 static int btf_type_size(const struct btf_type *t)