diff options
author | rsandifo <rsandifo@138bc75d-0d04-0410-961f-82ee72b054a4> | 2005-09-09 06:22:28 +0000 |
---|---|---|
committer | rsandifo <rsandifo@138bc75d-0d04-0410-961f-82ee72b054a4> | 2005-09-09 06:22:28 +0000 |
commit | f45a476ed4224bc7b246cbafd9c47115cf1c08fd (patch) | |
tree | ca11fbf9511e837a2b37b79ebad342b1aacc05a1 /gcc/fortran/trans.h | |
parent | 9e1839e269e680c073d3e12a93b7848d0d27f0ca (diff) | |
download | gcc-f45a476ed4224bc7b246cbafd9c47115cf1c08fd.tar.gz |
PR fortran/21104
* trans.h (gfc_interface_sym_mapping, gfc_interface_mapping): Moved
from trans-expr.c.
(gfc_init_interface_mapping, gfc_free_interface_mapping)
(gfc_add_interface_mapping, gfc_finish_interface_mapping)
(gfc_apply_interface_mapping): Declare.
* trans-array.h (gfc_set_loop_bounds_from_array_spec): Declare.
(gfc_trans_allocate_temp_array): Add pre and post block arguments.
* trans-array.c (gfc_set_loop_bounds_from_array_spec): New function.
(gfc_trans_allocate_array_storage): Replace loop argument with
separate pre and post blocks.
(gfc_trans_allocate_temp_array): Add pre and post block arguments.
Update call to gfc_trans_allocate_array_storage.
(gfc_trans_array_constructor, gfc_conv_loop_setup): Adjust for new
interface to gfc_trans_allocate_temp_array.
* trans-expr.c (gfc_interface_sym_mapping, gfc_interface_mapping):
Moved to trans.h.
(gfc_init_interface_mapping, gfc_free_interface_mapping)
(gfc_add_interface_mapping, gfc_finish_interface_mapping)
(gfc_apply_interface_mapping): Make extern.
(gfc_conv_function_call): Build an interface mapping for array
return values too. Call gfc_set_loop_bounds_from_array_spec.
Adjust call to gfc_trans_allocate_temp_array so that code is
added to SE rather than LOOP.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@104075 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc/fortran/trans.h')
-rw-r--r-- | gcc/fortran/trans.h | 70 |
1 files changed, 70 insertions, 0 deletions
diff --git a/gcc/fortran/trans.h b/gcc/fortran/trans.h index 5c27fa77c10..e2f252629cf 100644 --- a/gcc/fortran/trans.h +++ b/gcc/fortran/trans.h @@ -572,4 +572,74 @@ struct lang_decl GTY(()) arg1, arg2) #define build3_v(code, arg1, arg2, arg3) build3(code, void_type_node, \ arg1, arg2, arg3) + +/* This group of functions allows a caller to evaluate an expression from + the callee's interface. It establishes a mapping between the interface's + dummy arguments and the caller's actual arguments, then applies that + mapping to a given gfc_expr. + + You can initialize a mapping structure like so: + + gfc_interface_mapping mapping; + ... + gfc_init_interface_mapping (&mapping); + + You should then evaluate each actual argument into a temporary + gfc_se structure, here called "se", and map the result to the + dummy argument's symbol, here called "sym": + + gfc_add_interface_mapping (&mapping, sym, &se); + + After adding all mappings, you should call: + + gfc_finish_interface_mapping (&mapping, pre, post); + + where "pre" and "post" are statement blocks for initialization + and finalization code respectively. You can then evaluate an + interface expression "expr" as follows: + + gfc_apply_interface_mapping (&mapping, se, expr); + + Once you've evaluated all expressions, you should free + the mapping structure with: + + gfc_free_interface_mapping (&mapping); */ + + +/* This structure represents a mapping from OLD to NEW, where OLD is a + dummy argument symbol and NEW is a symbol that represents the value + of an actual argument. Mappings are linked together using NEXT + (in no particular order). */ +typedef struct gfc_interface_sym_mapping +{ + struct gfc_interface_sym_mapping *next; + gfc_symbol *old; + gfc_symtree *new; +} +gfc_interface_sym_mapping; + + +/* This structure is used by callers to evaluate an expression from + a callee's interface. */ +typedef struct gfc_interface_mapping +{ + /* Maps the interface's dummy arguments to the values that the caller + is passing. The whole list is owned by this gfc_interface_mapping. */ + gfc_interface_sym_mapping *syms; + + /* A list of gfc_charlens that were needed when creating copies of + expressions. The whole list is owned by this gfc_interface_mapping. */ + gfc_charlen *charlens; +} +gfc_interface_mapping; + +void gfc_init_interface_mapping (gfc_interface_mapping *); +void gfc_free_interface_mapping (gfc_interface_mapping *); +void gfc_add_interface_mapping (gfc_interface_mapping *, + gfc_symbol *, gfc_se *); +void gfc_finish_interface_mapping (gfc_interface_mapping *, + stmtblock_t *, stmtblock_t *); +void gfc_apply_interface_mapping (gfc_interface_mapping *, + gfc_se *, gfc_expr *); + #endif /* GFC_TRANS_H */ |