dwarves: Pass the cu to destructors to free memory on the obstack

Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
This commit is contained in:
Arnaldo Carvalho de Melo 2009-08-18 18:21:20 -03:00
parent f0435286c0
commit 19bbecf668
7 changed files with 84 additions and 82 deletions

View File

@ -76,7 +76,7 @@ static int ctf__load_ftype(struct ctf *self, struct ftype *proto, uint16_t tag,
return vlen;
out_free_parameters:
ftype__delete(proto);
ftype__delete(proto, self->priv);
return -ENOMEM;
}
@ -341,7 +341,7 @@ static int create_new_class(struct ctf *self, void *ptr,
return (vlen * member_size);
out_free:
class__delete(class);
class__delete(class, self->priv);
return -ENOMEM;
}
@ -366,7 +366,7 @@ static int create_new_union(struct ctf *self, void *ptr,
return (vlen * member_size);
out_free:
type__delete(un);
type__delete(un, self->priv);
return -ENOMEM;
}
@ -412,7 +412,7 @@ static int create_new_enumeration(struct ctf *self, void *ptr,
return (vlen * sizeof(*ep));
out_free:
enumeration__delete(enumeration);
enumeration__delete(enumeration, self->priv);
return -ENOMEM;
}

View File

@ -366,12 +366,12 @@ static int tag__is_base_type(const struct tag *self, const struct cu *cu)
}
static struct class *class__clone_base_types(const struct tag *tag_self,
const struct cu *cu,
struct cu *cu,
const char *new_class_name)
{
struct class *self = tag__class(tag_self);
struct class_member *pos, *next;
struct class *clone = class__clone(self, new_class_name);
struct class *clone = class__clone(self, new_class_name, cu);
if (clone == NULL)
return NULL;
@ -382,7 +382,7 @@ static struct class *class__clone_base_types(const struct tag *tag_self,
tag__assert_search_result(member_type);
if (!tag__is_base_type(member_type, cu)) {
next = class__remove_member(clone, cu, pos);
class_member__delete(pos);
class_member__delete(pos, cu);
}
}
class__fixup_alignment(clone, cu);

View File

@ -616,7 +616,7 @@ int tag__recode_dwarf_bitfield(struct tag *self, struct cu *cu, uint16_t bit_siz
if (cu__add_tag(cu, recoded, &new_id) == 0)
return new_id;
free(recoded);
obstack_free(&cu->obstack, recoded);
return -ENOMEM;
}
@ -896,7 +896,7 @@ static struct tag *die__create_new_class(Dwarf_Die *die, struct cu *cu)
dwarf_haschildren(die) != 0 &&
dwarf_child(die, &child) == 0) {
if (die__process_class(&child, &class->type, cu) != 0) {
class__delete(class);
class__delete(class, cu);
class = NULL;
}
}
@ -916,7 +916,7 @@ static struct tag *die__create_new_namespace(Dwarf_Die *die, struct cu *cu)
dwarf_haschildren(die) != 0 &&
dwarf_child(die, &child) == 0) {
if (die__process_namespace(&child, namespace, cu) != 0) {
namespace__delete(namespace);
namespace__delete(namespace, cu);
namespace = NULL;
}
}
@ -933,7 +933,7 @@ static struct tag *die__create_new_union(Dwarf_Die *die, struct cu *cu)
dwarf_haschildren(die) != 0 &&
dwarf_child(die, &child) == 0) {
if (die__process_class(&child, utype, cu) != 0) {
type__delete(utype);
type__delete(utype, cu);
utype = NULL;
}
}
@ -1006,7 +1006,7 @@ static struct tag *die__create_new_array(Dwarf_Die *die, struct cu *cu)
return &array->tag;
out_free:
free(array);
obstack_free(&cu->obstack, array);
return NULL;
}
@ -1106,9 +1106,9 @@ hash:
out:
return &ftype->tag;
out_delete_tag:
tag__delete(tag);
tag__delete(tag, cu);
out_delete:
ftype__delete(ftype);
ftype__delete(ftype, cu);
return NULL;
}
@ -1148,7 +1148,7 @@ static struct tag *die__create_new_enumeration(Dwarf_Die *die, struct cu *cu)
out:
return &enumeration->namespace.tag;
out_delete:
enumeration__delete(enumeration);
enumeration__delete(enumeration, cu);
return NULL;
}
@ -1177,7 +1177,7 @@ static int die__process_class(Dwarf_Die *die, struct type *class,
long id = -1;
if (cu__table_add_tag(cu, tag, &id) < 0) {
tag__delete(tag);
tag__delete(tag, cu);
return -ENOMEM;
}
@ -1222,7 +1222,7 @@ static int die__process_namespace(Dwarf_Die *die, struct namespace *namespace,
return 0;
out_delete_tag:
tag__delete(tag);
tag__delete(tag, cu);
out_enomem:
return -ENOMEM;
}
@ -1243,7 +1243,7 @@ static int die__create_new_lexblock(Dwarf_Die *die,
lexblock__add_lexblock(father, lexblock);
return 0;
out_delete:
lexblock__delete(lexblock);
lexblock__delete(lexblock, cu);
return -ENOMEM;
}
@ -1307,7 +1307,7 @@ hash:
return 0;
out_delete_tag:
tag__delete(tag);
tag__delete(tag, cu);
out_enomem:
return -ENOMEM;
}
@ -1322,7 +1322,7 @@ static struct tag *die__create_new_inline_expansion(Dwarf_Die *die,
return NULL;
if (die__process_inline_expansion(die, cu) != 0) {
free(exp);
obstack_free(&cu->obstack, exp);
return NULL;
}
@ -1392,7 +1392,7 @@ hash:
return 0;
out_delete_tag:
tag__delete(tag);
tag__delete(tag, cu);
out_enomem:
return -ENOMEM;
}
@ -1404,7 +1404,7 @@ static struct tag *die__create_new_function(Dwarf_Die *die, struct cu *cu)
if (function != NULL &&
die__process_function(die, &function->proto,
&function->lexblock, cu) != 0) {
function__delete(function);
function__delete(function, cu);
function = NULL;
}

View File

@ -44,43 +44,43 @@ static inline const char *s(const struct cu *self, strings_t i)
return cu__string(self, i);
}
static void lexblock__delete_tags(struct tag *tself)
static void lexblock__delete_tags(struct tag *tself, struct cu *cu)
{
struct lexblock *self = tag__lexblock(tself);
struct tag *pos, *n;
list_for_each_entry_safe(pos, n, &self->tags, node) {
list_del_init(&pos->node);
tag__delete(pos);
tag__delete(pos, cu);
}
}
void lexblock__delete(struct lexblock *self)
void lexblock__delete(struct lexblock *self, struct cu *cu)
{
lexblock__delete_tags(&self->ip.tag);
free(self);
lexblock__delete_tags(&self->ip.tag, cu);
obstack_free(&cu->obstack, self);
}
void tag__delete(struct tag *self)
void tag__delete(struct tag *self, struct cu *cu)
{
assert(list_empty(&self->node));
switch (self->tag) {
case DW_TAG_union_type:
type__delete(tag__type(self)); break;
type__delete(tag__type(self), cu); break;
case DW_TAG_class_type:
case DW_TAG_structure_type:
class__delete(tag__class(self)); break;
class__delete(tag__class(self), cu); break;
case DW_TAG_enumeration_type:
enumeration__delete(tag__type(self)); break;
enumeration__delete(tag__type(self), cu); break;
case DW_TAG_subroutine_type:
ftype__delete(tag__ftype(self)); break;
ftype__delete(tag__ftype(self), cu); break;
case DW_TAG_subprogram:
function__delete(tag__function(self)); break;
function__delete(tag__function(self), cu); break;
case DW_TAG_lexical_block:
lexblock__delete(tag__lexblock(self)); break;
lexblock__delete(tag__lexblock(self), cu); break;
default:
free(self);
obstack_free(&cu->obstack, self);
}
}
@ -218,7 +218,7 @@ const char *base_type__name(const struct base_type *self, const struct cu *cu,
return bf;
}
void namespace__delete(struct namespace *self)
void namespace__delete(struct namespace *self, struct cu *cu)
{
struct tag *pos, *n;
@ -227,11 +227,11 @@ void namespace__delete(struct namespace *self)
/* Look for nested namespaces */
if (tag__has_namespace(pos))
namespace__delete(tag__namespace(pos));
tag__delete(pos);
namespace__delete(tag__namespace(pos), cu);
tag__delete(pos, cu);
}
tag__delete(&self->tag);
tag__delete(&self->tag, cu);
}
struct class_member *
@ -835,9 +835,9 @@ const char *variable__type_name(const struct variable *self,
return tag != NULL ? tag__name(tag, cu, bf, len) : NULL;
}
void class_member__delete(struct class_member *self)
void class_member__delete(struct class_member *self, struct cu *cu)
{
free(self);
obstack_free(&cu->obstack, self);
}
static struct class_member *class_member__clone(const struct class_member *from)
@ -850,41 +850,41 @@ static struct class_member *class_member__clone(const struct class_member *from)
return self;
}
static void type__delete_class_members(struct type *self)
static void type__delete_class_members(struct type *self, struct cu *cu)
{
struct class_member *pos, *next;
type__for_each_data_member_safe(self, pos, next) {
list_del_init(&pos->tag.node);
class_member__delete(pos);
class_member__delete(pos, cu);
}
}
void class__delete(struct class *self)
void class__delete(struct class *self, struct cu *cu)
{
if (self->type.namespace.sname != NULL)
free(self->type.namespace.sname);
type__delete_class_members(&self->type);
free(self);
type__delete_class_members(&self->type, cu);
obstack_free(&cu->obstack, self);
}
void type__delete(struct type *self)
void type__delete(struct type *self, struct cu *cu)
{
type__delete_class_members(self);
free(self);
type__delete_class_members(self, cu);
obstack_free(&cu->obstack, self);
}
static void enumerator__delete(struct enumerator *self)
static void enumerator__delete(struct enumerator *self, struct cu *cu)
{
free(self);
obstack_free(&cu->obstack, self);
}
void enumeration__delete(struct type *self)
void enumeration__delete(struct type *self, struct cu *cu)
{
struct enumerator *pos, *n;
type__for_each_enumerator_safe(self, pos, n) {
list_del_init(&pos->tag.node);
enumerator__delete(pos);
enumerator__delete(pos, cu);
}
}
@ -935,9 +935,9 @@ static int type__clone_members(struct type *self, const struct type *from)
}
struct class *class__clone(const struct class *from,
const char *new_class_name)
const char *new_class_name, struct cu *cu)
{
struct class *self = malloc(sizeof(*self));
struct class *self = obstack_alloc(&cu->obstack, sizeof(*self));
if (self != NULL) {
memcpy(self, from, sizeof(*self));
@ -950,7 +950,7 @@ struct class *class__clone(const struct class *from,
}
}
if (type__clone_members(&self->type, &from->type) != 0) {
class__delete(self);
class__delete(self, cu);
self = NULL;
}
}
@ -977,12 +977,12 @@ const char *function__name(struct function *self, const struct cu *cu)
return s(cu, self->name);
}
static void parameter__delete(struct parameter *self)
static void parameter__delete(struct parameter *self, struct cu *cu)
{
free(self);
obstack_free(&cu->obstack, self);
}
void ftype__delete(struct ftype *self)
void ftype__delete(struct ftype *self, struct cu *cu)
{
struct parameter *pos, *n;
@ -991,15 +991,15 @@ void ftype__delete(struct ftype *self)
ftype__for_each_parameter_safe(self, pos, n) {
list_del_init(&pos->tag.node);
parameter__delete(pos);
parameter__delete(pos, cu);
}
free(self);
obstack_free(&cu->obstack, self);
}
void function__delete(struct function *self)
void function__delete(struct function *self, struct cu *cu)
{
lexblock__delete_tags(&self->lexblock.ip.tag);
ftype__delete(&self->proto);
lexblock__delete_tags(&self->lexblock.ip.tag, cu);
ftype__delete(&self->proto, cu);
}
int ftype__has_parm_of_type(const struct ftype *self, const uint16_t target,

View File

@ -330,7 +330,7 @@ struct tag {
void *priv;
};
void tag__delete(struct tag *self);
void tag__delete(struct tag *self, struct cu *cu);
static inline int tag__is_enumeration(const struct tag *self)
{
@ -496,7 +496,7 @@ static inline struct namespace *tag__namespace(const struct tag *self)
return (struct namespace *)self;
}
void namespace__delete(struct namespace *self);
void namespace__delete(struct namespace *self, struct cu *cu);
/**
* namespace__for_each_tag - iterate thru all the tags
@ -593,7 +593,7 @@ static inline struct lexblock *tag__lexblock(const struct tag *self)
return (struct lexblock *)self;
}
void lexblock__delete(struct lexblock *self);
void lexblock__delete(struct lexblock *self, struct cu *cu);
struct function;
@ -638,7 +638,7 @@ static inline struct ftype *tag__ftype(const struct tag *self)
return (struct ftype *)self;
}
void ftype__delete(struct ftype *self);
void ftype__delete(struct ftype *self, struct cu *cu);
/**
* ftype__for_each_parameter - iterate thru all the parameters
@ -701,7 +701,7 @@ static inline struct tag *function__tag(const struct function *self)
return (struct tag *)self;
}
void function__delete(struct function *self);
void function__delete(struct function *self, struct cu *cu);
static __pure inline int tag__is_function(const struct tag *self)
{
@ -777,7 +777,7 @@ struct class_member {
uint16_t hole;
};
void class_member__delete(struct class_member *self);
void class_member__delete(struct class_member *self, struct cu *cu);
static inline struct class_member *tag__class_member(const struct tag *self)
{
@ -813,7 +813,7 @@ static inline struct class *type__class(const struct type *self)
return (struct class *)self;
}
void type__delete(struct type *self);
void type__delete(struct type *self, struct cu *cu);
/**
* type__for_each_tag - iterate thru all the tags
@ -935,8 +935,8 @@ static inline struct tag *class__tag(const struct class *self)
}
struct class *class__clone(const struct class *from,
const char *new_class_name);
void class__delete(struct class *self);
const char *new_class_name, struct cu *cu);
void class__delete(struct class *self, struct cu *cu);
static inline struct list_head *class__tags(struct class *self)
{
@ -1058,7 +1058,7 @@ struct enumerator {
uint32_t value;
};
void enumeration__delete(struct type *self);
void enumeration__delete(struct type *self, struct cu *cu);
void enumeration__add(struct type *self, struct enumerator *enumerator);
size_t enumeration__fprintf(const struct tag *tag_self, const struct cu *cu,
const struct conf_fprintf *conf, FILE *fp);

View File

@ -342,9 +342,11 @@ static const char *tag__ptr_name(const struct tag *self, const struct cu *cu,
snprintf(bf + l, len - l, " %s", ptr_suffix);
} else {
char tmpbf[1024];
snprintf(bf, len, "%s %s",
tag__name(type, cu,
tmpbf, sizeof(tmpbf)), ptr_suffix);
const char *stype = tag__name(type, cu, tmpbf, sizeof(tmpbf));
if (type->tag == DW_TAG_const_type)
snprintf(bf, len, "%s %s", ptr_suffix, stype);
else
snprintf(bf, len, "%s %s", stype, ptr_suffix);
}
}

View File

@ -328,14 +328,14 @@ static struct cu *cu__filter(struct cu *cu)
return cu;
}
static int class__packable(struct class *self, const struct cu *cu)
static int class__packable(struct class *self, struct cu *cu)
{
struct class *clone;
if (self->nr_holes == 0 && self->nr_bit_holes == 0)
return 0;
clone = class__clone(self, NULL);
clone = class__clone(self, NULL, cu);
if (clone == NULL)
return 0;
class__reorganize(clone, cu, 0, stdout);
@ -343,7 +343,7 @@ static int class__packable(struct class *self, const struct cu *cu)
self->priv = clone;
return 1;
}
class__delete(clone);
class__delete(clone, cu);
return 0;
}
@ -1034,7 +1034,7 @@ static void do_reorg(struct tag *class, struct cu *cu)
int savings;
const uint8_t reorg_verbose =
show_reorg_steps ? 2 : global_verbose;
struct class *clone = class__clone(tag__class(class), NULL);
struct class *clone = class__clone(tag__class(class), NULL, cu);
if (clone == NULL) {
fprintf(stderr, "pahole: out of memory!\n");
exit(EXIT_FAILURE);
@ -1063,7 +1063,7 @@ static void do_reorg(struct tag *class, struct cu *cu)
} else
putchar('\n');
class__delete(clone);
class__delete(clone, cu);
}
static enum load_steal_kind pahole_stealer(struct cu *cu,