[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:
Arnaldo Carvalho de Melo 2007-05-23 21:43:01 -03:00
parent f359e784af
commit c0cbf4fa94
7 changed files with 24 additions and 22 deletions

View File

@ -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)

View File

@ -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 {

View File

@ -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)

View File

@ -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;

View File

@ -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;

View File

@ -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,

View File

@ -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);
}