[CLASSES]: Introduce struct lexblock

To represent DW_TAG_lexical_block, for now just group the lists of
labels, inline expansions and variables, struct function now has
the root of the tree as ->lexblock.

Signed-off-by: Arnaldo Carvalho de Melo <acme@mandriva.com>
This commit is contained in:
Arnaldo Carvalho de Melo 2006-11-20 16:38:47 -02:00
parent 460c5d91f4
commit 6a3cc448d1
4 changed files with 39 additions and 35 deletions

View File

@ -600,10 +600,10 @@ static struct function *function__new(uint64_t id, uint64_t type,
tag__init(&self->tag, DW_TAG_subprogram,
id, type, decl_file, decl_line);
INIT_LIST_HEAD(&self->labels);
INIT_LIST_HEAD(&self->lexblock.labels);
INIT_LIST_HEAD(&self->parameters);
INIT_LIST_HEAD(&self->variables);
INIT_LIST_HEAD(&self->inline_expansions);
INIT_LIST_HEAD(&self->lexblock.variables);
INIT_LIST_HEAD(&self->lexblock.inline_expansions);
self->name = strings__add(name);
self->inlined = inlined;
@ -626,22 +626,22 @@ static void function__add_parameter(struct function *self,
static void function__add_inline_expansion(struct function *self,
struct inline_expansion *exp)
{
++self->nr_inline_expansions;
++self->lexblock.nr_inline_expansions;
exp->function = self;
self->size_inline_expansions += exp->size;
list_add_tail(&exp->tag.node, &self->inline_expansions);
list_add_tail(&exp->tag.node, &self->lexblock.inline_expansions);
}
static void function__add_variable(struct function *self, struct variable *var)
{
++self->nr_variables;
list_add_tail(&var->tag.node, &self->variables);
++self->lexblock.nr_variables;
list_add_tail(&var->tag.node, &self->lexblock.variables);
}
static void function__add_label(struct function *self, struct label *label)
{
++self->nr_labels;
list_add_tail(&label->tag.node, &self->labels);
++self->lexblock.nr_labels;
list_add_tail(&label->tag.node, &self->lexblock.labels);
}
void class__find_holes(struct class *self)
@ -706,10 +706,10 @@ static void function__account_inline_expansions(struct function *self)
struct function *type;
struct inline_expansion *pos;
if (self->nr_inline_expansions == 0)
if (self->lexblock.nr_inline_expansions == 0)
return;
list_for_each_entry(pos, &self->inline_expansions, tag.node) {
list_for_each_entry(pos, &self->lexblock.inline_expansions, tag.node) {
type = cu__find_function_by_id(self->cu, pos->tag.type);
if (type != NULL) {
type->cu_total_nr_inline_expansions++;
@ -725,7 +725,7 @@ void cu__account_inline_expansions(struct cu *self)
list_for_each_entry(pos, &self->functions, tag.node) {
function__account_inline_expansions(pos);
self->nr_inline_expansions += pos->nr_inline_expansions;
self->nr_inline_expansions += pos->lexblock.nr_inline_expansions;
self->size_inline_expansions += pos->size_inline_expansions;
}
}
@ -808,21 +808,21 @@ static void function__print_body(const struct function *self,
struct tag *pos;
if (show_variables)
list_for_each_entry(pos, &self->variables, node) {
list_for_each_entry(pos, &self->lexblock.variables, node) {
/* FIXME! this test shouln't be needed at all */
if (pos->decl_line >= self->tag.decl_line)
tags__add(&tags, pos);
}
if (show_inline_expansions)
list_for_each_entry(pos, &self->inline_expansions, node) {
list_for_each_entry(pos, &self->lexblock.inline_expansions, node) {
/* FIXME! this test shouln't be needed at all */
if (pos->decl_line >= self->tag.decl_line)
tags__add(&tags, pos);
}
if (show_labels)
list_for_each_entry(pos, &self->labels, node) {
list_for_each_entry(pos, &self->lexblock.labels, node) {
/* FIXME! this test shouln't be needed at all */
if (pos->decl_line >= self->tag.decl_line)
tags__add(&tags, pos);
@ -881,13 +881,13 @@ void function__print(const struct function *self, int show_stats,
if (show_stats) {
printf("/* size: %llu", self->high_pc - self->low_pc);
if (self->nr_variables > 0)
printf(", variables: %u", self->nr_variables);
if (self->nr_labels > 0)
printf(", goto labels: %u", self->nr_labels);
if (self->nr_inline_expansions > 0)
if (self->lexblock.nr_variables > 0)
printf(", variables: %u", self->lexblock.nr_variables);
if (self->lexblock.nr_labels > 0)
printf(", goto labels: %u", self->lexblock.nr_labels);
if (self->lexblock.nr_inline_expansions > 0)
printf(", inline expansions: %u (%u bytes)",
self->nr_inline_expansions, self->size_inline_expansions);
self->lexblock.nr_inline_expansions, self->size_inline_expansions);
fputs(" */\n\n", stdout);
}
}

View File

@ -72,21 +72,25 @@ struct class_member {
one (or the end of the struct) */
};
struct lexblock {
struct list_head inline_expansions;
struct list_head labels;
struct list_head variables;
unsigned short nr_inline_expansions;
unsigned short nr_labels;
unsigned short nr_variables;
};
struct function {
struct tag tag;
struct cu *cu;
struct lexblock lexblock;
struct list_head parameters;
struct list_head inline_expansions;
struct list_head variables;
struct list_head labels;
const char *name;
uint64_t low_pc;
uint64_t high_pc;
unsigned short nr_parameters;
unsigned short nr_labels;
unsigned short nr_variables;
unsigned short inlined;
unsigned short nr_inline_expansions;
unsigned char external:1;
unsigned char unspecified_parameters;
unsigned int refcnt;

View File

@ -202,9 +202,9 @@ static int cu_externals_iterator(struct cu *cu, void *cookie)
static int variables_iterator(struct function *function, void *cookie)
{
if (function->nr_variables > 0)
if (function->lexblock.nr_variables > 0)
printf("%s: %u\n", function->name ?: "",
function->nr_variables);
function->lexblock.nr_variables);
return 0;
}
@ -218,8 +218,8 @@ static int goto_labels_iterator(struct function *function, void *cookie)
if (function->inlined)
return 0;
if (function->nr_labels > 0)
printf("%s: %u\n", function->name ?: "", function->nr_labels);
if (function->lexblock.nr_labels > 0)
printf("%s: %u\n", function->name ?: "", function->lexblock.nr_labels);
return 0;
}
@ -231,9 +231,9 @@ static int cu_goto_labels_iterator(struct cu *cu, void *cookie)
static int function_iterator(struct function *function, void *cookie)
{
if (cookie == NULL) {
if (function->nr_inline_expansions > 0)
if (function->lexblock.nr_inline_expansions > 0)
printf("%s: %u %u\n", function->name ?: "",
function->nr_inline_expansions,
function->lexblock.nr_inline_expansions,
function->size_inline_expansions);
} else if (function->name != NULL &&
strcmp(function->name, cookie) == 0) {

View File

@ -103,10 +103,10 @@ static void refcnt_function(struct function *function)
list_for_each_entry(parameter, &function->parameters, tag.node)
refcnt_parameter(parameter);
list_for_each_entry(variable, &function->variables, tag.node)
list_for_each_entry(variable, &function->lexblock.variables, tag.node)
refcnt_variable(variable);
list_for_each_entry(exp, &function->inline_expansions, tag.node)
list_for_each_entry(exp, &function->lexblock.inline_expansions, tag.node)
refcnt_inline_expansion(exp);
}