Commit 3fcd50d6 authored by Ilya Leoshkevich's avatar Ilya Leoshkevich Committed by Alexei Starovoitov
Browse files

selftests/bpf: Add BTF_KIND_FLOAT to test_core_reloc_size



Verify that bpf_core_field_size() is working correctly with floats.
Also document the required clang version.

Suggested-by: default avatarJohn Fastabend <john.fastabend@gmail.com>
Signed-off-by: default avatarIlya Leoshkevich <iii@linux.ibm.com>
Signed-off-by: default avatarAlexei Starovoitov <ast@kernel.org>
Link: https://lore.kernel.org/bpf/20210309005649.162480-2-iii@linux.ibm.com
parent a0d73acc
Loading
Loading
Loading
Loading
+9 −0
Original line number Diff line number Diff line
@@ -170,3 +170,12 @@ failures:
.. _2: https://reviews.llvm.org/D85174
.. _3: https://reviews.llvm.org/D83878
.. _4: https://reviews.llvm.org/D83242

Floating-point tests and Clang version
======================================

Certain selftests, e.g. core_reloc, require support for the floating-point
types, which was introduced in `Clang 13`__. The older Clang versions will
either crash when compiling these tests, or generate an incorrect BTF.

__  https://reviews.llvm.org/D83289
+1 −0
Original line number Diff line number Diff line
@@ -266,6 +266,7 @@ static int duration = 0;
		.arr_elem_sz = sizeof(((type *)0)->arr_field[0]),	\
		.ptr_sz = 8, /* always 8-byte pointer for BPF */	\
		.enum_sz = sizeof(((type *)0)->enum_field),		\
		.float_sz = sizeof(((type *)0)->float_field),		\
	}

#define SIZE_CASE(name) {						\
+5 −0
Original line number Diff line number Diff line
@@ -807,6 +807,7 @@ struct core_reloc_size_output {
	int arr_elem_sz;
	int ptr_sz;
	int enum_sz;
	int float_sz;
};

struct core_reloc_size {
@@ -816,6 +817,7 @@ struct core_reloc_size {
	int arr_field[4];
	void *ptr_field;
	enum { VALUE = 123 } enum_field;
	float float_field;
};

struct core_reloc_size___diff_sz {
@@ -825,6 +827,7 @@ struct core_reloc_size___diff_sz {
	char arr_field[10];
	void *ptr_field;
	enum { OTHER_VALUE = 0xFFFFFFFFFFFFFFFF } enum_field;
	double float_field;
};

/* Error case of two candidates with the fields (int_field) at the same
@@ -839,6 +842,7 @@ struct core_reloc_size___err_ambiguous1 {
	int arr_field[4];
	void *ptr_field;
	enum { VALUE___1 = 123 } enum_field;
	float float_field;
};

struct core_reloc_size___err_ambiguous2 {
@@ -850,6 +854,7 @@ struct core_reloc_size___err_ambiguous2 {
	int arr_field[4];
	void *ptr_field;
	enum { VALUE___2 = 123 } enum_field;
	float float_field;
};

/*
+3 −0
Original line number Diff line number Diff line
@@ -21,6 +21,7 @@ struct core_reloc_size_output {
	int arr_elem_sz;
	int ptr_sz;
	int enum_sz;
	int float_sz;
};

struct core_reloc_size {
@@ -30,6 +31,7 @@ struct core_reloc_size {
	int arr_field[4];
	void *ptr_field;
	enum { VALUE = 123 } enum_field;
	float float_field;
};

SEC("raw_tracepoint/sys_enter")
@@ -45,6 +47,7 @@ int test_core_size(void *ctx)
	out->arr_elem_sz = bpf_core_field_size(in->arr_field[0]);
	out->ptr_sz = bpf_core_field_size(in->ptr_field);
	out->enum_sz = bpf_core_field_size(in->enum_field);
	out->float_sz = bpf_core_field_size(in->float_field);

	return 0;
}