From 10fef2916dce0e0732def9a0c7764a21b51c0783 Mon Sep 17 00:00:00 2001 From: Arnaldo Carvalho de Melo Date: Fri, 5 Apr 2019 15:58:49 -0300 Subject: [PATCH] reorganize: Introduce class__for_each_member_continue() To get a lot of boilerplate behind a nice helper. Signed-off-by: Arnaldo Carvalho de Melo --- dwarves.h | 7 +++++++ dwarves_reorganize.c | 36 ++++++++++++++---------------------- 2 files changed, 21 insertions(+), 22 deletions(-) diff --git a/dwarves.h b/dwarves.h index 4860e35..496233d 100644 --- a/dwarves.h +++ b/dwarves.h @@ -1127,6 +1127,13 @@ const struct class_member *class__find_bit_hole(const struct class *cls, continue; \ else +#define class__for_each_member_continue(cls, from, pos) \ + pos = list_prepare_entry(from, class__tags(cls), tag.node); \ + list_for_each_entry_continue(pos, class__tags(cls), tag.node) \ + if (!tag__is_class_member(&pos->tag)) \ + continue; \ + else + enum base_type_float_type { BT_FP_SINGLE = 1, BT_FP_DOUBLE, diff --git a/dwarves_reorganize.c b/dwarves_reorganize.c index a84b62e..25568df 100644 --- a/dwarves_reorganize.c +++ b/dwarves_reorganize.c @@ -21,14 +21,12 @@ void class__subtract_offsets_from(struct class *class, struct class_member *from, const uint16_t size) { - struct class_member *member = - list_prepare_entry(from, class__tags(class), tag.node); + struct class_member *member; - list_for_each_entry_continue(member, class__tags(class), tag.node) - if (member->tag.tag == DW_TAG_member) { - member->byte_offset -= size; - member->bit_offset -= size * 8; - } + class__for_each_member_continue(class, from, member) { + member->byte_offset -= size; + member->bit_offset -= size * 8; + } if (class->padding != 0) { struct class_member *last_member = @@ -46,14 +44,12 @@ void class__subtract_offsets_from(struct class *class, void class__add_offsets_from(struct class *class, struct class_member *from, const uint16_t size) { - struct class_member *member = - list_prepare_entry(from, class__tags(class), tag.node); + struct class_member *member; - list_for_each_entry_continue(member, class__tags(class), tag.node) - if (member->tag.tag == DW_TAG_member) { - member->byte_offset += size; - member->bit_offset += size * 8; - } + class__for_each_member_continue(class, from, member) { + member->byte_offset += size; + member->bit_offset += size * 8; + } } /* @@ -137,13 +133,10 @@ static struct class_member * class__find_next_hole_of_size(struct class *class, struct class_member *from, size_t size) { - struct class_member *member = - list_prepare_entry(from, class__tags(class), tag.node); struct class_member *bitfield_head = NULL; + struct class_member *member; - list_for_each_entry_continue(member, class__tags(class), tag.node) { - if (member->tag.tag != DW_TAG_member) - continue; + class__for_each_member_continue(class, from, member) { if (member->bitfield_size != 0) { if (bitfield_head == NULL) bitfield_head = member; @@ -197,10 +190,9 @@ static struct class_member * struct class_member *from, size_t size) { - struct class_member *member = - list_prepare_entry(from, class__tags(class), tag.node); + struct class_member *member; - list_for_each_entry_continue(member, class__tags(class), tag.node) { + class__for_each_member_continue(class, from, member) { if (member->tag.tag != DW_TAG_member) continue; if (member->bit_hole != 0 &&