Commit 3f34855a by Tobias Burnus Committed by Tobias Burnus

re PR fortran/43665 (INTENT(IN) etc. optimization of calls: function annotations…

re PR fortran/43665 (INTENT(IN) etc. optimization of calls: function annotations for noclobber/noescape arguments)

2010-07-13  Tobias Burnus  <burnus@net-b.de>
            Daniel Franke  <franke.daniel@gmail.com>

        PR fortran/43665
        * trans.h (gfc_build_library_function_decl_with_spec): New
        prototype.
        * trans-decl.c (gfc_build_library_function_decl_with_spec):
        Removed static.
        * trans-io (gfc_build_io_library_fndecls): Add "fn spec"
        annotations.


Co-Authored-By: Daniel Franke <franke.daniel@gmail.com>

From-SVN: r162147
parent 8b3ea3a8
2010-07-13 Tobias Burnus <burnus@net-b.de>
Daniel Franke <franke.daniel@gmail.com>
PR fortran/43665
* trans.h (gfc_build_library_function_decl_with_spec): New prototype.
* trans-decl.c (gfc_build_library_function_decl_with_spec): Removed
static.
* trans-io (gfc_build_io_library_fndecls): Add "fn spec" annotations.
2010-07-13 Daniel Franke <franke.daniel@gmail.com> 2010-07-13 Daniel Franke <franke.daniel@gmail.com>
Tobias Burnus <burnus@net-b.de> Tobias Burnus <burnus@net-b.de>
......
...@@ -2388,7 +2388,7 @@ gfc_build_library_function_decl (tree name, tree rettype, int nargs, ...) ...@@ -2388,7 +2388,7 @@ gfc_build_library_function_decl (tree name, tree rettype, int nargs, ...)
The SPEC parameter specifies the function argument and return type The SPEC parameter specifies the function argument and return type
specification according to the fnspec function type attribute. */ specification according to the fnspec function type attribute. */
static tree tree
gfc_build_library_function_decl_with_spec (tree name, const char *spec, gfc_build_library_function_decl_with_spec (tree name, const char *spec,
tree rettype, int nargs, ...) tree rettype, int nargs, ...)
{ {
......
...@@ -303,132 +303,117 @@ gfc_build_io_library_fndecls (void) ...@@ -303,132 +303,117 @@ gfc_build_io_library_fndecls (void)
for (ptype = IOPARM_ptype_common; ptype < IOPARM_ptype_num; ptype++) for (ptype = IOPARM_ptype_common; ptype < IOPARM_ptype_num; ptype++)
gfc_build_st_parameter ((enum ioparam_type) ptype, types); gfc_build_st_parameter ((enum ioparam_type) ptype, types);
/* Define the transfer functions. */ /* Define the transfer functions.
TODO: Split them between READ and WRITE to allow further
optimizations, e.g. by using aliases? */
dt_parm_type = build_pointer_type (st_parameter[IOPARM_ptype_dt].type); dt_parm_type = build_pointer_type (st_parameter[IOPARM_ptype_dt].type);
iocall[IOCALL_X_INTEGER] = iocall[IOCALL_X_INTEGER] = gfc_build_library_function_decl_with_spec (
gfc_build_library_function_decl (get_identifier get_identifier (PREFIX("transfer_integer")), ".wW",
(PREFIX("transfer_integer")), void_type_node, 3, dt_parm_type, pvoid_type_node, gfc_int4_type_node);
void_type_node, 3, dt_parm_type,
pvoid_type_node, gfc_int4_type_node); iocall[IOCALL_X_LOGICAL] = gfc_build_library_function_decl_with_spec (
get_identifier (PREFIX("transfer_logical")), ".wW",
iocall[IOCALL_X_LOGICAL] = void_type_node, 3, dt_parm_type, pvoid_type_node, gfc_int4_type_node);
gfc_build_library_function_decl (get_identifier
(PREFIX("transfer_logical")), iocall[IOCALL_X_CHARACTER] = gfc_build_library_function_decl_with_spec (
void_type_node, 3, dt_parm_type, get_identifier (PREFIX("transfer_character")), ".wW",
pvoid_type_node, gfc_int4_type_node); void_type_node, 3, dt_parm_type, pvoid_type_node, gfc_int4_type_node);
iocall[IOCALL_X_CHARACTER] = iocall[IOCALL_X_CHARACTER_WIDE] = gfc_build_library_function_decl_with_spec (
gfc_build_library_function_decl (get_identifier get_identifier (PREFIX("transfer_character_wide")), ".wW",
(PREFIX("transfer_character")), void_type_node, 4, dt_parm_type, pvoid_type_node,
void_type_node, 3, dt_parm_type, gfc_charlen_type_node, gfc_int4_type_node);
pvoid_type_node, gfc_int4_type_node);
iocall[IOCALL_X_REAL] = gfc_build_library_function_decl_with_spec (
iocall[IOCALL_X_CHARACTER_WIDE] = get_identifier (PREFIX("transfer_real")), ".wW",
gfc_build_library_function_decl (get_identifier void_type_node, 3, dt_parm_type, pvoid_type_node, gfc_int4_type_node);
(PREFIX("transfer_character_wide")),
void_type_node, 4, dt_parm_type, iocall[IOCALL_X_COMPLEX] = gfc_build_library_function_decl_with_spec (
pvoid_type_node, gfc_charlen_type_node, get_identifier (PREFIX("transfer_complex")), ".wW",
gfc_int4_type_node); void_type_node, 3, dt_parm_type, pvoid_type_node, gfc_int4_type_node);
iocall[IOCALL_X_REAL] = iocall[IOCALL_X_ARRAY] = gfc_build_library_function_decl_with_spec (
gfc_build_library_function_decl (get_identifier (PREFIX("transfer_real")), get_identifier (PREFIX("transfer_array")), ".wW",
void_type_node, 3, dt_parm_type, void_type_node, 4, dt_parm_type, pvoid_type_node,
pvoid_type_node, gfc_int4_type_node); integer_type_node, gfc_charlen_type_node);
iocall[IOCALL_X_COMPLEX] =
gfc_build_library_function_decl (get_identifier
(PREFIX("transfer_complex")),
void_type_node, 3, dt_parm_type,
pvoid_type_node, gfc_int4_type_node);
iocall[IOCALL_X_ARRAY] =
gfc_build_library_function_decl (get_identifier
(PREFIX("transfer_array")),
void_type_node, 4, dt_parm_type,
pvoid_type_node, integer_type_node,
gfc_charlen_type_node);
/* Library entry points */ /* Library entry points */
iocall[IOCALL_READ] = iocall[IOCALL_READ] = gfc_build_library_function_decl_with_spec (
gfc_build_library_function_decl (get_identifier (PREFIX("st_read")), get_identifier (PREFIX("st_read")), ".w",
void_type_node, 1, dt_parm_type); void_type_node, 1, dt_parm_type);
iocall[IOCALL_WRITE] = iocall[IOCALL_WRITE] = gfc_build_library_function_decl_with_spec (
gfc_build_library_function_decl (get_identifier (PREFIX("st_write")), get_identifier (PREFIX("st_write")), ".w",
void_type_node, 1, dt_parm_type); void_type_node, 1, dt_parm_type);
parm_type = build_pointer_type (st_parameter[IOPARM_ptype_open].type); parm_type = build_pointer_type (st_parameter[IOPARM_ptype_open].type);
iocall[IOCALL_OPEN] = iocall[IOCALL_OPEN] = gfc_build_library_function_decl_with_spec (
gfc_build_library_function_decl (get_identifier (PREFIX("st_open")), get_identifier (PREFIX("st_open")), ".w",
void_type_node, 1, parm_type); void_type_node, 1, parm_type);
parm_type = build_pointer_type (st_parameter[IOPARM_ptype_close].type); parm_type = build_pointer_type (st_parameter[IOPARM_ptype_close].type);
iocall[IOCALL_CLOSE] = iocall[IOCALL_CLOSE] = gfc_build_library_function_decl_with_spec (
gfc_build_library_function_decl (get_identifier (PREFIX("st_close")), get_identifier (PREFIX("st_close")), ".w",
void_type_node, 1, parm_type); void_type_node, 1, parm_type);
parm_type = build_pointer_type (st_parameter[IOPARM_ptype_inquire].type); parm_type = build_pointer_type (st_parameter[IOPARM_ptype_inquire].type);
iocall[IOCALL_INQUIRE] = iocall[IOCALL_INQUIRE] = gfc_build_library_function_decl_with_spec (
gfc_build_library_function_decl (get_identifier (PREFIX("st_inquire")), get_identifier (PREFIX("st_inquire")), ".w",
gfc_int4_type_node, 1, parm_type); gfc_int4_type_node, 1, parm_type);
iocall[IOCALL_IOLENGTH] = iocall[IOCALL_IOLENGTH] = gfc_build_library_function_decl_with_spec(
gfc_build_library_function_decl(get_identifier (PREFIX("st_iolength")), get_identifier (PREFIX("st_iolength")), ".w",
void_type_node, 1, dt_parm_type); void_type_node, 1, dt_parm_type);
/* TODO: Change when asynchronous I/O is implemented. */
parm_type = build_pointer_type (st_parameter[IOPARM_ptype_wait].type); parm_type = build_pointer_type (st_parameter[IOPARM_ptype_wait].type);
iocall[IOCALL_WAIT] = iocall[IOCALL_WAIT] = gfc_build_library_function_decl_with_spec (
gfc_build_library_function_decl (get_identifier (PREFIX("st_wait")), get_identifier (PREFIX("st_wait")), ".X",
gfc_int4_type_node, 1, parm_type); gfc_int4_type_node, 1, parm_type);
parm_type = build_pointer_type (st_parameter[IOPARM_ptype_filepos].type); parm_type = build_pointer_type (st_parameter[IOPARM_ptype_filepos].type);
iocall[IOCALL_REWIND] = iocall[IOCALL_REWIND] = gfc_build_library_function_decl_with_spec (
gfc_build_library_function_decl (get_identifier (PREFIX("st_rewind")), get_identifier (PREFIX("st_rewind")), ".w",
gfc_int4_type_node, 1, parm_type); gfc_int4_type_node, 1, parm_type);
iocall[IOCALL_BACKSPACE] = iocall[IOCALL_BACKSPACE] = gfc_build_library_function_decl_with_spec (
gfc_build_library_function_decl (get_identifier (PREFIX("st_backspace")), get_identifier (PREFIX("st_backspace")), ".w",
gfc_int4_type_node, 1, parm_type); gfc_int4_type_node, 1, parm_type);
iocall[IOCALL_ENDFILE] = iocall[IOCALL_ENDFILE] = gfc_build_library_function_decl_with_spec (
gfc_build_library_function_decl (get_identifier (PREFIX("st_endfile")), get_identifier (PREFIX("st_endfile")), ".w",
gfc_int4_type_node, 1, parm_type); gfc_int4_type_node, 1, parm_type);
iocall[IOCALL_FLUSH] = iocall[IOCALL_FLUSH] = gfc_build_library_function_decl_with_spec (
gfc_build_library_function_decl (get_identifier (PREFIX("st_flush")), get_identifier (PREFIX("st_flush")), ".w",
gfc_int4_type_node, 1, parm_type); gfc_int4_type_node, 1, parm_type);
/* Library helpers */ /* Library helpers */
iocall[IOCALL_READ_DONE] = iocall[IOCALL_READ_DONE] = gfc_build_library_function_decl_with_spec (
gfc_build_library_function_decl (get_identifier (PREFIX("st_read_done")), get_identifier (PREFIX("st_read_done")), ".w",
gfc_int4_type_node, 1, dt_parm_type); gfc_int4_type_node, 1, dt_parm_type);
iocall[IOCALL_WRITE_DONE] =
gfc_build_library_function_decl (get_identifier (PREFIX("st_write_done")),
gfc_int4_type_node, 1, dt_parm_type);
iocall[IOCALL_IOLENGTH_DONE] = iocall[IOCALL_WRITE_DONE] = gfc_build_library_function_decl_with_spec (
gfc_build_library_function_decl (get_identifier (PREFIX("st_iolength_done")), get_identifier (PREFIX("st_write_done")), ".w",
gfc_int4_type_node, 1, dt_parm_type); gfc_int4_type_node, 1, dt_parm_type);
iocall[IOCALL_IOLENGTH_DONE] = gfc_build_library_function_decl_with_spec (
get_identifier (PREFIX("st_iolength_done")), ".w",
gfc_int4_type_node, 1, dt_parm_type);
iocall[IOCALL_SET_NML_VAL] = iocall[IOCALL_SET_NML_VAL] = gfc_build_library_function_decl_with_spec (
gfc_build_library_function_decl (get_identifier (PREFIX("st_set_nml_var")), get_identifier (PREFIX("st_set_nml_var")), ".w.R",
void_type_node, 6, dt_parm_type, void_type_node, 6, dt_parm_type, pvoid_type_node, pvoid_type_node,
pvoid_type_node, pvoid_type_node, gfc_int4_type_node, gfc_charlen_type_node, gfc_int4_type_node);
gfc_int4_type_node, gfc_charlen_type_node,
gfc_int4_type_node);
iocall[IOCALL_SET_NML_VAL_DIM] = iocall[IOCALL_SET_NML_VAL_DIM] = gfc_build_library_function_decl_with_spec (
gfc_build_library_function_decl (get_identifier (PREFIX("st_set_nml_var_dim")), get_identifier (PREFIX("st_set_nml_var_dim")), ".w",
void_type_node, 5, dt_parm_type, void_type_node, 5, dt_parm_type, gfc_int4_type_node,
gfc_int4_type_node, gfc_array_index_type, gfc_array_index_type, gfc_array_index_type, gfc_array_index_type);
gfc_array_index_type, gfc_array_index_type);
} }
......
...@@ -502,6 +502,8 @@ void gfc_trans_io_runtime_check (tree, tree, int, const char *, stmtblock_t *); ...@@ -502,6 +502,8 @@ void gfc_trans_io_runtime_check (tree, tree, int, const char *, stmtblock_t *);
void gfc_build_io_library_fndecls (void); void gfc_build_io_library_fndecls (void);
/* Build a function decl for a library function. */ /* Build a function decl for a library function. */
tree gfc_build_library_function_decl (tree, tree, int, ...); tree gfc_build_library_function_decl (tree, tree, int, ...);
tree gfc_build_library_function_decl_with_spec (tree name, const char *spec,
tree rettype, int nargs, ...);
/* Process the local variable decls of a block construct. */ /* Process the local variable decls of a block construct. */
void gfc_process_block_locals (gfc_namespace*); void gfc_process_block_locals (gfc_namespace*);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment