On Mon, Nov 2, 2020 at 9:35 PM Song Liu <songliubraving@xxxxxx> wrote: > > > > > On Oct 28, 2020, at 5:59 PM, Andrii Nakryiko <andrii@xxxxxxxxxx> wrote: > > > > Add selftests validating BTF deduplication for split BTF case. Add a helper > > macro that allows to validate entire BTF with raw BTF dump, not just > > type-by-type. This saves tons of code and complexity. > > > > Signed-off-by: Andrii Nakryiko <andrii@xxxxxxxxxx> > > Acked-by: Song Liu <songliubraving@xxxxxx> > > with a couple nits: > > [...] > > > > > int fprintf_btf_type_raw(FILE *out, const struct btf *btf, __u32 id); > > const char *btf_type_raw_dump(const struct btf *btf, int type_id); > > +int btf_validate_raw(struct btf *btf, int nr_types, const char *exp_types[]); > > > > +#define VALIDATE_RAW_BTF(btf, raw_types...) \ > > + btf_validate_raw(btf, \ > > + sizeof((const char *[]){raw_types})/sizeof(void *),\ > > + (const char *[]){raw_types}) > > + > > +const char *btf_type_c_dump(const struct btf *btf); > > #endif > > diff --git a/tools/testing/selftests/bpf/prog_tests/btf_dedup_split.c b/tools/testing/selftests/bpf/prog_tests/btf_dedup_split.c > > new file mode 100644 > > index 000000000000..097370a41b60 > > --- /dev/null > > +++ b/tools/testing/selftests/bpf/prog_tests/btf_dedup_split.c > > @@ -0,0 +1,326 @@ > > +// SPDX-License-Identifier: GPL-2.0 > > +/* Copyright (c) 2020 Facebook */ > > +#include <test_progs.h> > > +#include <bpf/btf.h> > > +#include "btf_helpers.h" > > + > > + > > +static void test_split_simple() { > > + const struct btf_type *t; > > + struct btf *btf1, *btf2 = NULL; > > + int str_off, err; > > + > > + btf1 = btf__new_empty(); > > + if (!ASSERT_OK_PTR(btf1, "empty_main_btf")) > > + return; > > + > > + btf__set_pointer_size(btf1, 8); /* enforce 64-bit arch */ > > + > > + btf__add_int(btf1, "int", 4, BTF_INT_SIGNED); /* [1] int */ > > + btf__add_ptr(btf1, 1); /* [2] ptr to int */ > > + btf__add_struct(btf1, "s1", 4); /* [3] struct s1 { */ > > + btf__add_field(btf1, "f1", 1, 0, 0); /* int f1; */ > > + /* } */ > > + > > nit: two empty lines. There is a comment on one of them, so I figured it's not an empty line? > > > + VALIDATE_RAW_BTF( > > + btf1, > > + "[1] INT 'int' size=4 bits_offset=0 nr_bits=32 encoding=SIGNED", > > + "[2] PTR '(anon)' type_id=1", > > + "[3] STRUCT 's1' size=4 vlen=1\n" > > + "\t'f1' type_id=1 bits_offset=0"); > > + > > [...] > > > + > > +cleanup: > > + btf__free(btf2); > > + btf__free(btf1); > > +} > > + > > +static void test_split_struct_duped() { > > + struct btf *btf1, *btf2 = NULL; > > nit: No need to initialize btf2, for all 3 tests. yep, fixed all three > > > + int err; > > + > [...] >