[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;
|
int changes = 0;
|
||||||
struct class_member *member;
|
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 =
|
struct class_member *twin =
|
||||||
class__find_member_by_name(new_structure, member->name);
|
class__find_member_by_name(new_structure, member->name);
|
||||||
if (twin != NULL)
|
if (twin != NULL)
|
||||||
|
@ -371,7 +371,7 @@ static void show_nr_members_changes(const struct class *structure,
|
||||||
struct class_member *member;
|
struct class_member *member;
|
||||||
|
|
||||||
/* Find the removed ones */
|
/* 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 =
|
struct class_member *twin =
|
||||||
class__find_member_by_name(new_structure, member->name);
|
class__find_member_by_name(new_structure, member->name);
|
||||||
if (twin == NULL)
|
if (twin == NULL)
|
||||||
|
@ -379,7 +379,7 @@ static void show_nr_members_changes(const struct class *structure,
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Find the new ones */
|
/* 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 =
|
struct class_member *twin =
|
||||||
class__find_member_by_name(structure, member->name);
|
class__find_member_by_name(structure, member->name);
|
||||||
if (twin == NULL)
|
if (twin == NULL)
|
||||||
|
|
|
@ -179,7 +179,7 @@ static size_t class__find_biggest_member_name(const struct class *self)
|
||||||
struct class_member *pos;
|
struct class_member *pos;
|
||||||
size_t biggest_name_len = 0;
|
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);
|
const size_t len = strlen(pos->name);
|
||||||
|
|
||||||
if (len > biggest_name_len)
|
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"
|
"\tconst struct %s *obj = from;\n"
|
||||||
"\tstruct %s *mini_obj = to;\n\n",
|
"\tstruct %s *mini_obj = to;\n\n",
|
||||||
class__name(self), class__name(clone));
|
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",
|
fprintf(fp_methods, "\tmini_obj->%-*s = obj->%s;\n",
|
||||||
len, pos->name, pos->name);
|
len, pos->name, pos->name);
|
||||||
}
|
|
||||||
fputs("}\n\n", fp_methods);
|
fputs("}\n\n", fp_methods);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -318,7 +317,7 @@ static int class__emit_ostra_converter(const struct tag *tag_self,
|
||||||
"\t\t\t\":",
|
"\t\t\t\":",
|
||||||
fp_converter);
|
fp_converter);
|
||||||
|
|
||||||
list_for_each_entry(pos, &type->members, tag.node) {
|
type__for_each_member(type, pos) {
|
||||||
if (first)
|
if (first)
|
||||||
first = 0;
|
first = 0;
|
||||||
else {
|
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 = *conf;
|
||||||
uconf.indent = indent + 1;
|
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);
|
struct tag *type = cu__find_tag_by_id(cu, pos->tag.type);
|
||||||
|
|
||||||
printed += fprintf(fp, "%.*s", uconf.indent, tabs);
|
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;
|
self->nr_members = 0;
|
||||||
INIT_LIST_HEAD(&self->members);
|
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);
|
struct class_member *member_clone = class_member__clone(pos);
|
||||||
|
|
||||||
if (member_clone == NULL)
|
if (member_clone == NULL)
|
||||||
|
@ -1515,7 +1515,7 @@ const struct class_member *class__find_bit_hole(const struct class *self,
|
||||||
struct class_member *pos;
|
struct class_member *pos;
|
||||||
const size_t byte_hole_size = bit_hole_size / 8;
|
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)
|
if (pos == trailer)
|
||||||
break;
|
break;
|
||||||
else if (pos->hole >= byte_hole_size ||
|
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_holes = 0;
|
||||||
self->nr_bit_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) {
|
if (last != NULL) {
|
||||||
const ssize_t cc_last_size = pos->offset - last->offset;
|
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)
|
if (self->nr_holes == 0)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
list_for_each_entry(pos, &self->type.members, tag.node)
|
type__for_each_member(&self->type, pos)
|
||||||
if (pos->hole >= size)
|
if (pos->hole >= size)
|
||||||
return 1;
|
return 1;
|
||||||
|
|
||||||
|
@ -1618,7 +1618,7 @@ struct class_member *type__find_member_by_name(const struct type *self,
|
||||||
{
|
{
|
||||||
if (name != NULL) {
|
if (name != NULL) {
|
||||||
struct class_member *pos;
|
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)
|
if (pos->name != NULL && strcmp(pos->name, name) == 0)
|
||||||
return pos;
|
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;
|
struct class_member *pos;
|
||||||
uint32_t nr_members_of_type = 0;
|
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)
|
if (pos->tag.type == type)
|
||||||
++nr_members_of_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;
|
cconf.indent = indent + 1;
|
||||||
|
|
||||||
list_for_each_entry(pos, &tself->members, tag.node) {
|
type__for_each_member(tself, pos) {
|
||||||
struct tag *type;
|
struct tag *type;
|
||||||
|
|
||||||
if ((int)pos->offset != last_offset)
|
if ((int)pos->offset != last_offset)
|
||||||
|
|
|
@ -69,6 +69,9 @@ struct type {
|
||||||
uint8_t fwd_decl_emitted:1;
|
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)
|
static inline struct type *tag__type(const struct tag *self)
|
||||||
{
|
{
|
||||||
return (struct type *)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);
|
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))
|
if (cus__emit_tag_definitions(self, cu, &pos->tag, fp))
|
||||||
printed = 1;
|
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;
|
size_t current_bitfield_size = 0, size, bytes_needed, new_size;
|
||||||
int some_was_demoted = 0;
|
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
|
* 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;
|
struct class_member *member, *brother;
|
||||||
restart:
|
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 */
|
/* See if we have a hole after this member */
|
||||||
if (member->bit_hole != 0) {
|
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;
|
struct class_member *pos, *bitfield_head = NULL;
|
||||||
uint8_t fixup_was_done = 0;
|
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?
|
* Is this bitfield member?
|
||||||
*/
|
*/
|
||||||
|
@ -660,7 +660,7 @@ restart:
|
||||||
struct class_member, tag.node);
|
struct class_member, tag.node);
|
||||||
last_member_size = class_member__size(last_member, cu);
|
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 */
|
/* See if we have a hole after this member */
|
||||||
if (member->hole != 0) {
|
if (member->hole != 0) {
|
||||||
/*
|
/*
|
||||||
|
@ -710,7 +710,7 @@ restart:
|
||||||
if (self->nr_holes == 0)
|
if (self->nr_holes == 0)
|
||||||
goto out;
|
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 */
|
/* See if we have a hole after this member */
|
||||||
if (member->hole != 0) {
|
if (member->hole != 0) {
|
||||||
brother = class__find_last_member_of_size(self, member,
|
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 ||
|
if (tag->tag == DW_TAG_structure_type ||
|
||||||
tag->tag == DW_TAG_union_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);
|
refcnt_member(member, cu);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue