diff options
author | Søren Sandmann Pedersen <ssp@redhat.com> | 2012-06-16 16:30:42 -0400 |
---|---|---|
committer | Søren Sandmann Pedersen <ssp@redhat.com> | 2012-06-16 16:30:42 -0400 |
commit | c684ba9a5564edf5c43ce9bcae56b9b84df340c3 (patch) | |
tree | e577595e2cf0741b8709575b683f104469aa363e | |
parent | 7109fcbe8eba5fce5055d02e15aa1ba78f51037e (diff) |
Only allocate space for variables that are actually used
-rw-r--r-- | ast.h | 1 | ||||
-rw-r--r-- | offsets.c | 26 |
2 files changed, 26 insertions, 1 deletions
@@ -935,6 +935,7 @@ struct ast_variable_definition_t int level; gboolean field; + gboolean used; }; struct ast_label_definition_t @@ -19,6 +19,27 @@ #include "ast.h" static void +mark_used (node_t *node, gpointer data) +{ + if (node->common.type == NODE_LOAD) + { + node->load.definition->used = TRUE; + } + else if (node->common.type == NODE_STORE) + { + node->store.definition->used = TRUE; + } + else if (node->common.type == NODE_LOAD_IND) + { + node->load_ind.definition->used = TRUE; + } + else if (node->common.type == NODE_STORE_IND) + { + node->store_ind.definition->used = TRUE; + } +} + +static void list_def (gpointer key, gpointer value, gpointer data) { GPtrArray *array = data; @@ -38,7 +59,8 @@ assign_offsets (symbol_table_t *symbols, int offset, int *max) { ast_definition_t *definition = definitions->pdata[i]; - if (definition->common.type == AST_VARIABLE_DEFINITION) + if (definition->common.type == AST_VARIABLE_DEFINITION && + definition->variable.used) { int size = ast_type_spec_get_size (definition->variable.type_spec); @@ -123,6 +145,8 @@ do_offsets (ast_t *ast, int offset, int *max) gboolean offsets (ast_t *ast) { + node_breadth_first (ast->program.enter, mark_used, NULL); + do_offsets (ast, 0, NULL); /* The offsets pass can never fail */ |