From 5a87ca71c875b5bc34b9b8bc0ef405cec9b51b51 Mon Sep 17 00:00:00 2001 From: Thomas Koenig Date: Tue, 26 Apr 2011 18:39:55 +0000 Subject: [PATCH] frontend-passes.c (inserted_block): New variable. 2011-04-26 Thomas Koenig * 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. From-SVN: r172983 --- gcc/fortran/ChangeLog | 8 +++++++ gcc/fortran/frontend-passes.c | 40 ++++++++++++++++++++++++++++++----- 2 files changed, 43 insertions(+), 5 deletions(-) diff --git a/gcc/fortran/ChangeLog b/gcc/fortran/ChangeLog index ec28bf4222d..f9425a9e16a 100644 --- a/gcc/fortran/ChangeLog +++ b/gcc/fortran/ChangeLog @@ -1,3 +1,11 @@ +2011-04-26 Thomas Koenig + + * 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. + 2011-04-23 Tobias Burnus PR fortran/18918 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; } -- 2.30.2