[CLASSES] class_member: add backpointer to the class

Signed-off-by: Arnaldo Carvalho de Melo <acme@mandriva.com>
This commit is contained in:
Arnaldo Carvalho de Melo 2006-11-12 17:52:03 -02:00
parent 9490088ae0
commit c49c7c8bee
3 changed files with 15 additions and 21 deletions

View File

@ -313,19 +313,17 @@ static struct class_member *class_member__new(uint64_t type,
return self;
}
static int class_member__size(const struct class_member *self,
const struct cu *cu)
static int class_member__size(const struct class_member *self)
{
struct class *class = cu__find_class_by_id(cu, self->type);
struct class *class = cu__find_class_by_id(self->class->cu, self->type);
return class != NULL ? class__size(class) : -1;
}
uint64_t class_member__names(const struct class_member *self,
const struct cu *cu,
char *class_name, size_t class_name_size,
char *member_name, size_t member_name_size)
{
struct class *class = cu__find_class_by_id(cu, self->type);
struct class *class = cu__find_class_by_id(self->class->cu, self->type);
uint64_t size = -1;
snprintf(member_name, member_name_size, "%s;", self->name ?: "");
@ -339,7 +337,7 @@ uint64_t class_member__names(const struct class_member *self,
/* Is it a function pointer? */
if (class->tag == DW_TAG_pointer_type) {
struct class *ptr_class =
cu__find_class_by_id(cu, class->type);
cu__find_class_by_id(self->class->cu, class->type);
if (ptr_class != NULL &&
ptr_class->tag == DW_TAG_subroutine_type) {
@ -349,7 +347,7 @@ uint64_t class_member__names(const struct class_member *self,
class_name_size, "void");
else {
struct class *ret_class =
cu__find_class_by_id(cu,
cu__find_class_by_id(self->class->cu,
ptr_class->type);
if (ret_class != NULL)
@ -377,15 +375,13 @@ out:
return size;
}
static uint64_t class_member__print(struct class_member *self,
const struct cu *cu)
static uint64_t class_member__print(struct class_member *self)
{
uint64_t size;
char class_name[128];
char member_name[128];
size = class_member__names(self, cu,
class_name, sizeof(class_name),
size = class_member__names(self, class_name, sizeof(class_name),
member_name, sizeof(member_name));
printf(" %-26s %-21s /* %5llu %5llu */\n",
@ -450,6 +446,7 @@ static struct class *class__new(const unsigned int tag,
static void class__add_member(struct class *self, struct class_member *member)
{
++self->nr_members;
member->class = self;
list_add_tail(&member->node, &self->members);
}
@ -491,7 +488,7 @@ void class__find_holes(struct class *self)
}
}
size = class_member__size(pos, self->cu);
size = class_member__size(pos);
/*
* check for bitfields, accounting for only the biggest
* of the byte_size in the fields in each bitfield set.
@ -654,7 +651,7 @@ static void class__print_struct(struct class *self)
printf(" /* ---------- cacheline "
"%lu boundary ---------- */\n",
sum / cacheline_size);
size = class_member__print(pos, self->cu);
size = class_member__print(pos);
if (pos->hole > 0) {
printf("\n /* XXX %d bytes hole, "
"try to pack */\n\n", pos->hole);

View File

@ -68,6 +68,7 @@ struct class {
struct class_member {
struct list_head node;
char *name;
struct class *class;
uint64_t type;
uint64_t offset;
unsigned int bit_size;
@ -131,7 +132,6 @@ extern struct class_member *class__find_member_by_name(const struct class *self,
const char *name);
extern uint64_t class_member__names(const struct class_member *self,
const struct cu *cu,
char *class_name,
size_t class_name_size,
char *member_name,

View File

@ -98,13 +98,13 @@ static int check_print_change(const struct class_member *old,
uint64_t new_size;
int changes = 0;
old_size = class_member__names(old, old_cu, old_class_name,
old_size = class_member__names(old, old_class_name,
sizeof(old_class_name),
old_member_name,
sizeof(old_member_name));
if (old_size == (uint64_t)-1)
return 0;
new_size = class_member__names(new, new_cu, new_class_name,
new_size = class_member__names(new, new_class_name,
sizeof(new_class_name),
new_member_name,
sizeof(new_member_name));
@ -232,11 +232,8 @@ static void show_changed_member(char change,
char member_name[128];
uint64_t size;
size = class_member__names(member, cu,
class_name,
sizeof(class_name),
member_name,
sizeof(member_name));
size = class_member__names(member, class_name, sizeof(class_name),
member_name, sizeof(member_name));
printf(" %c%-26s %-21s /* %5llu %5llu */\n",
change, class_name, member_name, member->offset, size);
}