Add test simulating ambiguous field size relocation, while fields themselves
are at the exact same offset.

Signed-off-by: Andrii Nakryiko <andr...@fb.com>
---
 .../selftests/bpf/prog_tests/core_reloc.c     |  1 +
 .../btf__core_reloc_size___err_ambiguous.c    |  4 +++
 .../selftests/bpf/progs/core_reloc_types.h    | 25 +++++++++++++++++++
 3 files changed, 30 insertions(+)
 create mode 100644 
tools/testing/selftests/bpf/progs/btf__core_reloc_size___err_ambiguous.c

diff --git a/tools/testing/selftests/bpf/prog_tests/core_reloc.c 
b/tools/testing/selftests/bpf/prog_tests/core_reloc.c
index 084ed26a7d78..7d8f3645c330 100644
--- a/tools/testing/selftests/bpf/prog_tests/core_reloc.c
+++ b/tools/testing/selftests/bpf/prog_tests/core_reloc.c
@@ -452,6 +452,7 @@ static struct core_reloc_test_case test_cases[] = {
        /* size relocation checks */
        SIZE_CASE(size),
        SIZE_CASE(size___diff_sz),
+       SIZE_ERR_CASE(size___err_ambiguous),
 };
 
 struct data {
diff --git 
a/tools/testing/selftests/bpf/progs/btf__core_reloc_size___err_ambiguous.c 
b/tools/testing/selftests/bpf/progs/btf__core_reloc_size___err_ambiguous.c
new file mode 100644
index 000000000000..f3e9904df9c2
--- /dev/null
+++ b/tools/testing/selftests/bpf/progs/btf__core_reloc_size___err_ambiguous.c
@@ -0,0 +1,4 @@
+#include "core_reloc_types.h"
+
+void f(struct core_reloc_size___err_ambiguous1 x,
+       struct core_reloc_size___err_ambiguous2 y) {}
diff --git a/tools/testing/selftests/bpf/progs/core_reloc_types.h 
b/tools/testing/selftests/bpf/progs/core_reloc_types.h
index 34d84717c946..29fa901b72d8 100644
--- a/tools/testing/selftests/bpf/progs/core_reloc_types.h
+++ b/tools/testing/selftests/bpf/progs/core_reloc_types.h
@@ -804,3 +804,28 @@ struct core_reloc_size___diff_sz {
        void *ptr_field;
        enum { OTHER_VALUE = 0xFFFFFFFFFFFFFFFF } enum_field;
 };
+
+/* Error case of two candidates with the fields (int_field) at the same
+ * offset, but with differing final relocation values: size 4 vs size 1
+ */
+struct core_reloc_size___err_ambiguous1 {
+       /* int at offset 0 */
+       int int_field;
+
+       struct { int x; } struct_field;
+       union { int x; } union_field;
+       int arr_field[4];
+       void *ptr_field;
+       enum { VALUE___1 = 123 } enum_field;
+};
+
+struct core_reloc_size___err_ambiguous2 {
+       /* char at offset 0 */
+       char int_field;
+
+       struct { int x; } struct_field;
+       union { int x; } union_field;
+       int arr_field[4];
+       void *ptr_field;
+       enum { VALUE___2 = 123 } enum_field;
+};
-- 
2.24.1

Reply via email to