frontend-passes.c (inserted_block): New variable.

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.

From-SVN: r172983
This commit is contained in:
Thomas Koenig 2011-04-26 18:39:55 +00:00
parent 6d7b45ad64
commit 5a87ca71c8
2 changed files with 43 additions and 5 deletions

View File

@ -1,3 +1,11 @@
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.
2011-04-23 Tobias Burnus <burnus@net-b.de>
PR fortran/18918

View File

@ -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;
}