selftests/bpf: Tests for enum fwd resolved as full enum64
authorEduard Zingerman <eddyz87@gmail.com>
Tue, 1 Nov 2022 23:54:13 +0000 (01:54 +0200)
committerAndrii Nakryiko <andrii@kernel.org>
Fri, 4 Nov 2022 20:10:48 +0000 (13:10 -0700)
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
tools/testing/selftests/bpf/prog_tests/btf.c

index 24dd621..c3e1cea 100644 (file)
@@ -7133,7 +7133,7 @@ static struct btf_dedup_test dedup_tests[] = {
                                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 */
+                       /* [5] fwd enum with different size, size does not matter for fwd */
                        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),
@@ -7150,9 +7150,7 @@ static struct btf_dedup_test dedup_tests[] = {
                        /* [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 */
+                       /* [3] 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,
@@ -7611,7 +7609,87 @@ static struct btf_dedup_test dedup_tests[] = {
                BTF_STR_SEC("\0e1\0e1_val"),
        },
 },
-
+{
+       .descr = "dedup: enum of different size: no dedup",
+       .input = {
+               .raw_types = {
+                       /* [1] enum 'e1' */
+                       BTF_TYPE_ENC(NAME_NTH(1), BTF_INFO_ENC(BTF_KIND_ENUM, 0, 1), 4),
+                               BTF_ENUM_ENC(NAME_NTH(2), 1),
+                       /* [2] enum 'e1' */
+                       BTF_TYPE_ENC(NAME_NTH(1), BTF_INFO_ENC(BTF_KIND_ENUM, 0, 1), 2),
+                               BTF_ENUM_ENC(NAME_NTH(2), 1),
+                       BTF_END_RAW,
+               },
+               BTF_STR_SEC("\0e1\0e1_val"),
+       },
+       .expect = {
+               .raw_types = {
+                       /* [1] enum 'e1' */
+                       BTF_TYPE_ENC(NAME_NTH(1), BTF_INFO_ENC(BTF_KIND_ENUM, 0, 1), 4),
+                               BTF_ENUM_ENC(NAME_NTH(2), 1),
+                       /* [2] enum 'e1' */
+                       BTF_TYPE_ENC(NAME_NTH(1), BTF_INFO_ENC(BTF_KIND_ENUM, 0, 1), 2),
+                               BTF_ENUM_ENC(NAME_NTH(2), 1),
+                       BTF_END_RAW,
+               },
+               BTF_STR_SEC("\0e1\0e1_val"),
+       },
+},
+{
+       .descr = "dedup: enum fwd to enum64",
+       .input = {
+               .raw_types = {
+                       /* [1] enum64 'e1' */
+                       BTF_TYPE_ENC(NAME_NTH(1), BTF_INFO_ENC(BTF_KIND_ENUM64, 0, 1), 8),
+                               BTF_ENUM64_ENC(NAME_NTH(2), 1, 0),
+                       /* [2] enum 'e1' fwd */
+                       BTF_TYPE_ENC(NAME_NTH(1), BTF_INFO_ENC(BTF_KIND_ENUM, 0, 0), 4),
+                       /* [3] typedef enum 'e1' td */
+                       BTF_TYPE_ENC(NAME_NTH(3), BTF_INFO_ENC(BTF_KIND_TYPEDEF, 0, 0), 2),
+                       BTF_END_RAW,
+               },
+               BTF_STR_SEC("\0e1\0e1_val\0td"),
+       },
+       .expect = {
+               .raw_types = {
+                       /* [1] enum64 'e1' */
+                       BTF_TYPE_ENC(NAME_NTH(1), BTF_INFO_ENC(BTF_KIND_ENUM64, 0, 1), 8),
+                               BTF_ENUM64_ENC(NAME_NTH(2), 1, 0),
+                       /* [2] typedef enum 'e1' td */
+                       BTF_TYPE_ENC(NAME_NTH(3), BTF_INFO_ENC(BTF_KIND_TYPEDEF, 0, 0), 1),
+                       BTF_END_RAW,
+               },
+               BTF_STR_SEC("\0e1\0e1_val\0td"),
+       },
+},
+{
+       .descr = "dedup: enum64 fwd to enum",
+       .input = {
+               .raw_types = {
+                       /* [1] enum 'e1' */
+                       BTF_TYPE_ENC(NAME_NTH(1), BTF_INFO_ENC(BTF_KIND_ENUM, 0, 1), 4),
+                               BTF_ENUM_ENC(NAME_NTH(2), 1),
+                       /* [2] enum64 'e1' fwd */
+                       BTF_TYPE_ENC(NAME_NTH(1), BTF_INFO_ENC(BTF_KIND_ENUM64, 0, 0), 8),
+                       /* [3] typedef enum 'e1' td */
+                       BTF_TYPE_ENC(NAME_NTH(3), BTF_INFO_ENC(BTF_KIND_TYPEDEF, 0, 0), 2),
+                       BTF_END_RAW,
+               },
+               BTF_STR_SEC("\0e1\0e1_val\0td"),
+       },
+       .expect = {
+               .raw_types = {
+                       /* [1] enum 'e1' */
+                       BTF_TYPE_ENC(NAME_NTH(1), BTF_INFO_ENC(BTF_KIND_ENUM, 0, 1), 4),
+                               BTF_ENUM_ENC(NAME_NTH(2), 1),
+                       /* [2] typedef enum 'e1' td */
+                       BTF_TYPE_ENC(NAME_NTH(3), BTF_INFO_ENC(BTF_KIND_TYPEDEF, 0, 0), 1),
+                       BTF_END_RAW,
+               },
+               BTF_STR_SEC("\0e1\0e1_val\0td"),
+       },
+},
 };
 
 static int btf_type_size(const struct btf_type *t)