[CLASSES]: Save 12 bytes on struct class

With some tradeoff for the code size...

[acme@newtoy pahole]$ codiff build/libclasses.so.orig build/libclasses.so
/home/acme/pahole/classes.c:
  struct class            |  -12
 1 struct changed
  class__array_nr_entries |   +3
  class_member__names     |   +3
  parameter__names        |   +3
  class__find_holes       |   -8
  class__print_struct     |   -1
  cu__create_new_array    |  +48
 6 functions changed, 57 bytes added, 9 bytes removed
[acme@newtoy pahole]$

Signed-off-by: Arnaldo Carvalho de Melo <acme@mandriva.com>
This commit is contained in:
Arnaldo Carvalho de Melo 2006-12-28 12:00:21 -02:00
parent 43de2d269f
commit 594463f756
2 changed files with 20 additions and 22 deletions

View File

@ -540,8 +540,8 @@ static size_t class__array_nr_entries(const struct class *self)
int i;
size_t nr_entries = 1;
for (i = 0; i < self->array.dimensions; ++i)
nr_entries *= self->array.nr_entries[i];
for (i = 0; i < self->array_dimensions; ++i)
nr_entries *= self->array_nr_entries[i];
return nr_entries;
}
@ -743,10 +743,10 @@ size_t class_member__names(const struct class *type,
member_name += n;
member_name_size -= n;
for (i = 0; i < type->array.dimensions; ++i) {
for (i = 0; i < type->array_dimensions; ++i) {
n = snprintf(member_name, member_name_size,
"[%u]",
type->array.nr_entries[i]);
type->array_nr_entries[i]);
member_name += n;
member_name_size -= n;
}
@ -816,10 +816,10 @@ size_t parameter__names(const struct parameter *self,
parameter_name += n;
parameter_name_size -= n;
for (i = 0; i < class->array.dimensions; ++i) {
for (i = 0; i < class->array_dimensions; ++i) {
n = snprintf(parameter_name,
parameter_name_size, "[%u]",
class->array.nr_entries[i]);
class->array_nr_entries[i]);
parameter_name += n;
parameter_name_size -= n;
}
@ -1755,13 +1755,13 @@ static void cu__create_new_array(Dwarf *dwarf, Dwarf_Die *die, struct cu *cu,
}
die = &child;
class->array.dimensions = 0;
class->array_dimensions = 0;
do {
const uint16_t tag = dwarf_tag(die);
if (tag == DW_TAG_subrange_type) {
nr_entries[class->array.dimensions++] = attr_upper_bound(die);
if (class->array.dimensions == max_dimensions) {
nr_entries[class->array_dimensions++] = attr_upper_bound(die);
if (class->array_dimensions == max_dimensions) {
fprintf(stderr, "%s: only %u dimensions are "
"supported!\n",
__FUNCTION__, max_dimensions);
@ -1772,10 +1772,10 @@ static void cu__create_new_array(Dwarf *dwarf, Dwarf_Die *die, struct cu *cu,
__FUNCTION__, dwarf_tag_name(tag));
} while (dwarf_siblingof(die, die) == 0);
class->array.nr_entries = memdup(nr_entries,
(class->array.dimensions *
class->array_nr_entries = memdup(nr_entries,
(class->array_dimensions *
sizeof(uint32_t)));
if (class->array.nr_entries == NULL)
if (class->array_nr_entries == NULL)
oom("memdup(array.nr_entries)");
cu__add_class(cu, class);

View File

@ -58,21 +58,19 @@ struct class {
struct list_head node;
const char *name;
size_t size;
struct {
uint8_t dimensions;
uint32_t *nr_entries;
} array;
uint16_t nr_members;
uint16_t nr_holes;
uint16_t nr_bit_holes;
uint8_t nr_holes;
uint8_t nr_bit_holes;
uint16_t padding;
uint16_t bit_padding;
uint32_t refcnt;
int32_t diff;
struct class *class_to_diff;
uint8_t bit_padding;
uint8_t declaration:1;
uint8_t visited:1;
uint8_t fwd_decl_emitted:1;
uint8_t array_dimensions:5;
uint32_t refcnt;
uint32_t *array_nr_entries;
int32_t diff;
struct class *class_to_diff;
};
struct class_member {