summaryrefslogtreecommitdiff
path: root/gcc/fortran/frontend-passes.c
diff options
context:
space:
mode:
authortkoenig <tkoenig@138bc75d-0d04-0410-961f-82ee72b054a4>2011-04-26 18:39:55 +0000
committertkoenig <tkoenig@138bc75d-0d04-0410-961f-82ee72b054a4>2011-04-26 18:39:55 +0000
commitd9ef40e7dd15dea814507f014a7384205e8fb93a (patch)
tree7735356f62f3cd1621a936bc0deec5e47d8f610b /gcc/fortran/frontend-passes.c
parentd958c180406fa6e5f27cba1d799750bc470f1c32 (diff)
downloadgcc-d9ef40e7dd15dea814507f014a7384205e8fb93a.tar.gz
2011-04-26 Thomas Koenig <tkoenig@gcc.gnu.org>
* frontend-passes.c (inserted_block): New variable. (changed_statement): Likewise. (create_var): Encase statement to be operated on in a BLOCK. Adjust code insertion for BLOCK. (cfe_code): Set inserted_block and changed_statement to NULL. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@172983 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc/fortran/frontend-passes.c')
-rw-r--r--gcc/fortran/frontend-passes.c40
1 files changed, 35 insertions, 5 deletions
diff --git a/gcc/fortran/frontend-passes.c b/gcc/fortran/frontend-passes.c
index fbe5d1c0fee..85af45eec6f 100644
--- a/gcc/fortran/frontend-passes.c
+++ b/gcc/fortran/frontend-passes.c
@@ -48,10 +48,15 @@ static gfc_expr ***expr_array;
static int expr_size, expr_count;
/* Pointer to the gfc_code we currently work on - to be able to insert
- a statement before. */
+ a block before the statement. */
static gfc_code **current_code;
+/* Pointer to the block to be inserted, and the statement we are
+ changing within the block. */
+
+static gfc_code *inserted_block, **changed_statement;
+
/* The namespace we are currently dealing with. */
gfc_namespace *current_ns;
@@ -203,7 +208,9 @@ cfe_register_funcs (gfc_expr **e, int *walk_subtrees ATTRIBUTE_UNUSED,
/* Returns a new expression (a variable) to be used in place of the old one,
with an an assignment statement before the current statement to set
- the value of the variable. */
+ the value of the variable. Creates a new BLOCK for the statement if
+ that hasn't already been done and puts the statement, plus the
+ newly created variables, in that block. */
static gfc_expr*
create_var (gfc_expr * e)
@@ -214,10 +221,31 @@ create_var (gfc_expr * e)
gfc_symbol *symbol;
gfc_expr *result;
gfc_code *n;
+ gfc_namespace *ns;
int i;
+ /* If the block hasn't already been created, do so. */
+ if (inserted_block == NULL)
+ {
+ inserted_block = XCNEW (gfc_code);
+ inserted_block->op = EXEC_BLOCK;
+ inserted_block->loc = (*current_code)->loc;
+ ns = gfc_build_block_ns (current_ns);
+ inserted_block->ext.block.ns = ns;
+ inserted_block->ext.block.assoc = NULL;
+
+ ns->code = *current_code;
+ inserted_block->next = (*current_code)->next;
+ changed_statement = &(inserted_block->ext.block.ns->code);
+ (*current_code)->next = NULL;
+ /* Insert the BLOCK at the right position. */
+ *current_code = inserted_block;
+ }
+ else
+ ns = inserted_block->ext.block.ns;
+
sprintf(name, "__var_%d",num++);
- if (gfc_get_sym_tree (name, current_ns, &symtree, false) != 0)
+ if (gfc_get_sym_tree (name, ns, &symtree, false) != 0)
gcc_unreachable ();
symbol = symtree->n.sym;
@@ -267,10 +295,10 @@ create_var (gfc_expr * e)
n = XCNEW (gfc_code);
n->op = EXEC_ASSIGN;
n->loc = (*current_code)->loc;
- n->next = *current_code;
+ n->next = *changed_statement;
n->expr1 = gfc_copy_expr (result);
n->expr2 = e;
- *current_code = n;
+ *changed_statement = n;
return result;
}
@@ -347,6 +375,8 @@ cfe_code (gfc_code **c, int *walk_subtrees ATTRIBUTE_UNUSED,
void *data ATTRIBUTE_UNUSED)
{
current_code = c;
+ inserted_block = NULL;
+ changed_statement = NULL;
return 0;
}