[LIB]: Introduce type__for_each_member
Will be useful to show that the intent is to traverse just the DW_TAG_member entries in the type list. Right now there are both DW_TAG_inheritance and DW_TAG_member entries in the ->members type list. But there will be many more tags, like enumerations, classes, etc, that are defined inside classes, a C++ feature. This will also help with DW_TAG_namespace support. Signed-off-by: Arnaldo Carvalho de Melo <acme@ghostprotocols.net>
This commit is contained in:
parent
f359e784af
commit
c0cbf4fa94
6
codiff.c
6
codiff.c
|
@ -165,7 +165,7 @@ static int check_print_members_changes(const struct class *structure,
|
|||
int changes = 0;
|
||||
struct class_member *member;
|
||||
|
||||
list_for_each_entry(member, &structure->type.members, tag.node) {
|
||||
type__for_each_member(&structure->type, member) {
|
||||
struct class_member *twin =
|
||||
class__find_member_by_name(new_structure, member->name);
|
||||
if (twin != NULL)
|
||||
|
@ -371,7 +371,7 @@ static void show_nr_members_changes(const struct class *structure,
|
|||
struct class_member *member;
|
||||
|
||||
/* Find the removed ones */
|
||||
list_for_each_entry(member, &structure->type.members, tag.node) {
|
||||
type__for_each_member(&structure->type, member) {
|
||||
struct class_member *twin =
|
||||
class__find_member_by_name(new_structure, member->name);
|
||||
if (twin == NULL)
|
||||
|
@ -379,7 +379,7 @@ static void show_nr_members_changes(const struct class *structure,
|
|||
}
|
||||
|
||||
/* Find the new ones */
|
||||
list_for_each_entry(member, &new_structure->type.members, tag.node) {
|
||||
type__for_each_member(&new_structure->type, member) {
|
||||
struct class_member *twin =
|
||||
class__find_member_by_name(structure, member->name);
|
||||
if (twin == NULL)
|
||||
|
|
|
@ -179,7 +179,7 @@ static size_t class__find_biggest_member_name(const struct class *self)
|
|||
struct class_member *pos;
|
||||
size_t biggest_name_len = 0;
|
||||
|
||||
list_for_each_entry(pos, &self->type.members, tag.node) {
|
||||
type__for_each_member(&self->type, pos) {
|
||||
const size_t len = strlen(pos->name);
|
||||
|
||||
if (len > biggest_name_len)
|
||||
|
@ -201,10 +201,9 @@ static void class__emit_class_state_collector(const struct class *self,
|
|||
"\tconst struct %s *obj = from;\n"
|
||||
"\tstruct %s *mini_obj = to;\n\n",
|
||||
class__name(self), class__name(clone));
|
||||
list_for_each_entry(pos, &clone->type.members, tag.node) {
|
||||
type__for_each_member(&clone->type, pos)
|
||||
fprintf(fp_methods, "\tmini_obj->%-*s = obj->%s;\n",
|
||||
len, pos->name, pos->name);
|
||||
}
|
||||
fputs("}\n\n", fp_methods);
|
||||
}
|
||||
|
||||
|
@ -318,7 +317,7 @@ static int class__emit_ostra_converter(const struct tag *tag_self,
|
|||
"\t\t\t\":",
|
||||
fp_converter);
|
||||
|
||||
list_for_each_entry(pos, &type->members, tag.node) {
|
||||
type__for_each_member(type, pos) {
|
||||
if (first)
|
||||
first = 0;
|
||||
else {
|
||||
|
|
16
dwarves.c
16
dwarves.c
|
@ -1284,7 +1284,7 @@ static size_t union__fprintf(const struct type *self, const struct cu *cu,
|
|||
|
||||
uconf = *conf;
|
||||
uconf.indent = indent + 1;
|
||||
list_for_each_entry(pos, &self->members, tag.node) {
|
||||
type__for_each_member(self, pos) {
|
||||
struct tag *type = cu__find_tag_by_id(cu, pos->tag.type);
|
||||
|
||||
printed += fprintf(fp, "%.*s", uconf.indent, tabs);
|
||||
|
@ -1330,7 +1330,7 @@ static int type__clone_members(struct type *self, const struct type *from)
|
|||
self->nr_members = 0;
|
||||
INIT_LIST_HEAD(&self->members);
|
||||
|
||||
list_for_each_entry(pos, &from->members, tag.node) {
|
||||
type__for_each_member(from, pos) {
|
||||
struct class_member *member_clone = class_member__clone(pos);
|
||||
|
||||
if (member_clone == NULL)
|
||||
|
@ -1515,7 +1515,7 @@ const struct class_member *class__find_bit_hole(const struct class *self,
|
|||
struct class_member *pos;
|
||||
const size_t byte_hole_size = bit_hole_size / 8;
|
||||
|
||||
list_for_each_entry(pos, &self->type.members, tag.node)
|
||||
type__for_each_member(&self->type, pos)
|
||||
if (pos == trailer)
|
||||
break;
|
||||
else if (pos->hole >= byte_hole_size ||
|
||||
|
@ -1535,7 +1535,7 @@ void class__find_holes(struct class *self, const struct cu *cu)
|
|||
self->nr_holes = 0;
|
||||
self->nr_bit_holes = 0;
|
||||
|
||||
list_for_each_entry(pos, &ctype->members, tag.node) {
|
||||
type__for_each_member(ctype, pos) {
|
||||
if (last != NULL) {
|
||||
const ssize_t cc_last_size = pos->offset - last->offset;
|
||||
|
||||
|
@ -1606,7 +1606,7 @@ int class__has_hole_ge(const struct class *self, const uint16_t size)
|
|||
if (self->nr_holes == 0)
|
||||
return 0;
|
||||
|
||||
list_for_each_entry(pos, &self->type.members, tag.node)
|
||||
type__for_each_member(&self->type, pos)
|
||||
if (pos->hole >= size)
|
||||
return 1;
|
||||
|
||||
|
@ -1618,7 +1618,7 @@ struct class_member *type__find_member_by_name(const struct type *self,
|
|||
{
|
||||
if (name != NULL) {
|
||||
struct class_member *pos;
|
||||
list_for_each_entry(pos, &self->members, tag.node)
|
||||
type__for_each_member(self, pos)
|
||||
if (pos->name != NULL && strcmp(pos->name, name) == 0)
|
||||
return pos;
|
||||
}
|
||||
|
@ -1631,7 +1631,7 @@ uint32_t type__nr_members_of_type(const struct type *self, const Dwarf_Off type)
|
|||
struct class_member *pos;
|
||||
uint32_t nr_members_of_type = 0;
|
||||
|
||||
list_for_each_entry(pos, &self->members, tag.node)
|
||||
type__for_each_member(self, pos)
|
||||
if (pos->tag.type == type)
|
||||
++nr_members_of_type;
|
||||
|
||||
|
@ -1943,7 +1943,7 @@ size_t class__fprintf(const struct class *self, const struct cu *cu,
|
|||
|
||||
cconf.indent = indent + 1;
|
||||
|
||||
list_for_each_entry(pos, &tself->members, tag.node) {
|
||||
type__for_each_member(tself, pos) {
|
||||
struct tag *type;
|
||||
|
||||
if ((int)pos->offset != last_offset)
|
||||
|
|
|
@ -69,6 +69,9 @@ struct type {
|
|||
uint8_t fwd_decl_emitted:1;
|
||||
};
|
||||
|
||||
#define type__for_each_member(self, pos) \
|
||||
list_for_each_entry(pos, &(self)->members, tag.node)
|
||||
|
||||
static inline struct type *tag__type(const struct tag *self)
|
||||
{
|
||||
return (struct type *)self;
|
||||
|
|
|
@ -275,7 +275,7 @@ int cus__emit_type_definitions(struct cus *self, struct cu *cu,
|
|||
|
||||
cus__add_definition(self, ctype);
|
||||
|
||||
list_for_each_entry(pos, &ctype->members, tag.node)
|
||||
type__for_each_member(ctype, pos)
|
||||
if (cus__emit_tag_definitions(self, cu, &pos->tag, fp))
|
||||
printed = 1;
|
||||
|
||||
|
|
|
@ -393,7 +393,7 @@ static int class__demote_bitfields(struct class *class, const struct cu *cu,
|
|||
size_t current_bitfield_size = 0, size, bytes_needed, new_size;
|
||||
int some_was_demoted = 0;
|
||||
|
||||
list_for_each_entry(member, &class->type.members, tag.node) {
|
||||
type__for_each_member(&class->type, member) {
|
||||
/*
|
||||
* Check if we are moving away from a bitfield
|
||||
*/
|
||||
|
@ -528,7 +528,7 @@ static void class__reorganize_bitfields(struct class *class,
|
|||
{
|
||||
struct class_member *member, *brother;
|
||||
restart:
|
||||
list_for_each_entry(member, &class->type.members, tag.node) {
|
||||
type__for_each_member(&class->type, member) {
|
||||
/* See if we have a hole after this member */
|
||||
if (member->bit_hole != 0) {
|
||||
/*
|
||||
|
@ -593,7 +593,7 @@ static void class__fixup_member_types(struct class *self, const struct cu *cu,
|
|||
struct class_member *pos, *bitfield_head = NULL;
|
||||
uint8_t fixup_was_done = 0;
|
||||
|
||||
list_for_each_entry(pos, &self->type.members, tag.node) {
|
||||
type__for_each_member(&self->type, pos) {
|
||||
/*
|
||||
* Is this bitfield member?
|
||||
*/
|
||||
|
@ -660,7 +660,7 @@ restart:
|
|||
struct class_member, tag.node);
|
||||
last_member_size = class_member__size(last_member, cu);
|
||||
|
||||
list_for_each_entry(member, &self->type.members, tag.node) {
|
||||
type__for_each_member(&self->type, member) {
|
||||
/* See if we have a hole after this member */
|
||||
if (member->hole != 0) {
|
||||
/*
|
||||
|
@ -710,7 +710,7 @@ restart:
|
|||
if (self->nr_holes == 0)
|
||||
goto out;
|
||||
|
||||
list_for_each_entry(member, &self->type.members, tag.node) {
|
||||
type__for_each_member(&self->type, member) {
|
||||
/* See if we have a hole after this member */
|
||||
if (member->hole != 0) {
|
||||
brother = class__find_last_member_of_size(self, member,
|
||||
|
|
|
@ -67,7 +67,7 @@ static void refcnt_tag(struct tag *tag, const struct cu *cu)
|
|||
|
||||
if (tag->tag == DW_TAG_structure_type ||
|
||||
tag->tag == DW_TAG_union_type)
|
||||
list_for_each_entry(member, &tag__type(tag)->members, tag.node)
|
||||
type__for_each_member(tag__type(tag), member)
|
||||
refcnt_member(member, cu);
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue