diff options
author | Thomas Koenig <tkoenig@gcc.gnu.org> | 2006-03-22 19:09:11 +0000 |
---|---|---|
committer | Thomas Koenig <tkoenig@gcc.gnu.org> | 2006-03-22 19:09:11 +0000 |
commit | d67ab5eef80ed2d4891562bf5ff791c1b2af4a97 (patch) | |
tree | ddee91463b1c5b5ef8aaf5e8a3581d490478bed9 /gcc/fortran/trans-decl.c | |
parent | 4dc7782d15938a44634f16465a4dab55a25d70d2 (diff) | |
download | gcc-d67ab5eef80ed2d4891562bf5ff791c1b2af4a97.zip gcc-d67ab5eef80ed2d4891562bf5ff791c1b2af4a97.tar.gz gcc-d67ab5eef80ed2d4891562bf5ff791c1b2af4a97.tar.bz2 |
[multiple changes]
2006-03-22 Thomas Koenig <Thomas.Koenig@onlien.de>
PR fortran/19303
* gfortran.h (gfc_option_t): Add record_marker.
* lang.opt: Add -frecord-marker=4 and -frecord-marker=8.
* trans-decl.c: Add gfor_fndecl_set_record_marker.
(gfc_build_builtin_function_decls): Set
gfor_fndecl_set_record_marker.
(gfc_generate_function_code): If we are in the main program
and -frecord-marker was provided, call set_record_marker.
* options.c (gfc_handle_option): Add handling for
-frecord-marker=4 and -frecord-marker=8.
* invoke.texi: Document -frecord-marker.
2006-03-22 Thomas Koenig <Thomas.Koenig@onlien.de>
PR fortran/19303
* libgfortran.h (compile_options_t): Add record_marker.
* runtime/compile_options.c (set_record_marker):
New function.
* io/open.c: If we have four-byte record markers, use
GFC_INTEGER_4_HUGE as default record length.
* io/file_pos.c (unformatted_backspace): Handle
different size record markers.
* io/transfer.c (us_read): Likewise.
(us_write): Likewise.
(next_record_r): Likewise.
(write_us_marker): Likewise.
(next_record_w): Likewise.
2006-03-22 Thomas Koenig <Thomas.Koenig@online.de>
PR fortran/19303
* gfortran.dg/record_marker_1.f90: New test case.
* gfortran.dg/record_marker_2.f: New test case.
* gfortran.dg/record_marker_3.f90: New test case.
From-SVN: r112290
Diffstat (limited to 'gcc/fortran/trans-decl.c')
-rw-r--r-- | gcc/fortran/trans-decl.c | 20 |
1 files changed, 20 insertions, 0 deletions
diff --git a/gcc/fortran/trans-decl.c b/gcc/fortran/trans-decl.c index e8d2cd1..2a9c0db 100644 --- a/gcc/fortran/trans-decl.c +++ b/gcc/fortran/trans-decl.c @@ -93,6 +93,7 @@ tree gfor_fndecl_runtime_error; tree gfor_fndecl_set_fpe; tree gfor_fndecl_set_std; tree gfor_fndecl_set_convert; +tree gfor_fndecl_set_record_marker; tree gfor_fndecl_ctime; tree gfor_fndecl_fdate; tree gfor_fndecl_ttynam; @@ -2297,6 +2298,10 @@ gfc_build_builtin_function_decls (void) gfc_build_library_function_decl (get_identifier (PREFIX("set_convert")), void_type_node, 1, gfc_c_int_type_node); + gfor_fndecl_set_record_marker = + gfc_build_library_function_decl (get_identifier (PREFIX("set_record_marker")), + void_type_node, 1, gfc_c_int_type_node); + gfor_fndecl_in_pack = gfc_build_library_function_decl ( get_identifier (PREFIX("internal_pack")), pvoid_type_node, 1, pvoid_type_node); @@ -2943,6 +2948,21 @@ gfc_generate_function_code (gfc_namespace * ns) gfc_add_expr_to_block (&body, tmp); } + /* If this is the main program and an -frecord-marker option was provided, + add a call to set_record_marker. */ + + if (sym->attr.is_main_program && gfc_option.record_marker != 0) + { + tree arglist, gfc_c_int_type_node; + + gfc_c_int_type_node = gfc_get_int_type (gfc_c_int_kind); + arglist = gfc_chainon_list (NULL_TREE, + build_int_cst (gfc_c_int_type_node, + gfc_option.record_marker)); + tmp = build_function_call_expr (gfor_fndecl_set_record_marker, arglist); + gfc_add_expr_to_block (&body, tmp); + + } if (TREE_TYPE (DECL_RESULT (fndecl)) != void_type_node && sym->attr.subroutine) |