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:
parent
f0435286c0
commit
19bbecf668
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
84
dwarves.c
84
dwarves.c
|
@ -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,
|
||||
|
|
20
dwarves.h
20
dwarves.h
|
@ -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);
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
10
pahole.c
10
pahole.c
|
@ -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,
|
||||
|
|
Loading…
Reference in New Issue