From: Arnaldo Carvalho de Melo <acme@xxxxxxxxxx> We want to cache that info, look if there are embedded fields of structs with flexible arrays, etc. Cc: "Gustavo A. R. Silva" <gustavoars@xxxxxxxxxx> Cc: Willy Tarreau <w@xxxxxx> Signed-off-by: Arnaldo Carvalho de Melo <acme@xxxxxxxxxx> --- dwarves.c | 23 +++++++++++++++++++++++ dwarves.h | 1 + pahole.c | 23 ----------------------- 3 files changed, 24 insertions(+), 23 deletions(-) diff --git a/dwarves.c b/dwarves.c index 6e6a9e69a61d1e37..3d91e629277a329f 100644 --- a/dwarves.c +++ b/dwarves.c @@ -1575,6 +1575,29 @@ void lexblock__add_label(struct lexblock *block, struct label *label) lexblock__add_tag(block, &label->ip.tag); } +bool class__has_flexible_array(struct class *class, const struct cu *cu) +{ + struct class_member *member = type__last_member(&class->type); + + if (member == NULL) + return false; + + struct tag *type = cu__type(cu, member->tag.type); + + if (type->tag != DW_TAG_array_type) + return false; + + struct array_type *array = tag__array_type(type); + + if (array->dimensions > 1) + return false; + + if (array->nr_entries == NULL || array->nr_entries[0] == 0) + return true; + + return false; +} + const struct class_member *class__find_bit_hole(const struct class *class, const struct class_member *trailer, const uint16_t bit_hole_size) diff --git a/dwarves.h b/dwarves.h index 2bb0eed461d08d51..757fc05dd3363bf1 100644 --- a/dwarves.h +++ b/dwarves.h @@ -1454,6 +1454,7 @@ static inline int class__is_struct(const struct class *cls) return tag__is_struct(&cls->type.namespace.tag); } +bool class__has_flexible_array(struct class *class, const struct cu *cu); void class__find_holes(struct class *cls); int class__has_hole_ge(const struct class *cls, const uint16_t size); diff --git a/pahole.c b/pahole.c index 766835d93a1f3d1e..8bdfaf3e84c407d7 100644 --- a/pahole.c +++ b/pahole.c @@ -725,29 +725,6 @@ static int class__packable(struct class *class, struct cu *cu) return 0; } -static bool class__has_flexible_array(struct class *class, struct cu *cu) -{ - struct class_member *member = type__last_member(&class->type); - - if (member == NULL) - return false; - - struct tag *type = cu__type(cu, member->tag.type); - - if (type->tag != DW_TAG_array_type) - return false; - - struct array_type *array = tag__array_type(type); - - if (array->dimensions > 1) - return false; - - if (array->nr_entries == NULL || array->nr_entries[0] == 0) - return true; - - return false; -} - static struct class *class__filter(struct class *class, struct cu *cu, uint32_t tag_id) { -- 2.46.2