aboutsummaryrefslogtreecommitdiff
path: root/libgfortran/io/unix.c
AgeCommit message (Collapse)AuthorFilesLines
2024-01-03Update copyright years.Jakub Jelinek1-1/+1
2023-12-11libgfortran: Replace mutex with rwlockLipeng Zhu1-8/+8
This patch try to introduce the rwlock and split the read/write to unit_root tree and unit_cache with rwlock instead of the mutex to increase CPU efficiency. In the get_gfc_unit function, the percentage to step into the insert_unit function is around 30%, in most instances, we can get the unit in the phase of reading the unit_cache or unit_root tree. So split the read/write phase by rwlock would be an approach to make it more parallel. BTW, the IPC metrics can gain around 9x in our test server with 220 cores. The benchmark we used is https://github.com/rwesson/NEAT libgcc/ChangeLog: * gthr-posix.h (__GTHREAD_RWLOCK_INIT): New macro. (__gthrw): New function. (__gthread_rwlock_rdlock): New function. (__gthread_rwlock_tryrdlock): New function. (__gthread_rwlock_wrlock): New function. (__gthread_rwlock_trywrlock): New function. (__gthread_rwlock_unlock): New function. libgfortran/ChangeLog: * io/async.c (DEBUG_LINE): New macro. * io/async.h (RWLOCK_DEBUG_ADD): New macro. (CHECK_RDLOCK): New macro. (CHECK_WRLOCK): New macro. (TAIL_RWLOCK_DEBUG_QUEUE): New macro. (IN_RWLOCK_DEBUG_QUEUE): New macro. (RDLOCK): New macro. (WRLOCK): New macro. (RWUNLOCK): New macro. (RD_TO_WRLOCK): New macro. (INTERN_RDLOCK): New macro. (INTERN_WRLOCK): New macro. (INTERN_RWUNLOCK): New macro. * io/io.h (struct gfc_unit): Change UNIT_LOCK to UNIT_RWLOCK in a comment. (unit_lock): Remove including associated internal_proto. (unit_rwlock): New declarations including associated internal_proto. (dec_waiting_unlocked): Use WRLOCK and RWUNLOCK on unit_rwlock instead of __gthread_mutex_lock and __gthread_mutex_unlock on unit_lock. * io/transfer.c (st_read_done_worker): Use WRLOCK and RWUNLOCK on unit_rwlock instead of LOCK and UNLOCK on unit_lock. (st_write_done_worker): Likewise. * io/unit.c: Change UNIT_LOCK to UNIT_RWLOCK in 'IO locking rules' comment. Use unit_rwlock variable instead of unit_lock variable. (get_gfc_unit_from_unit_root): New function. (get_gfc_unit): Use RDLOCK, WRLOCK and RWUNLOCK on unit_rwlock instead of LOCK and UNLOCK on unit_lock. (close_unit_1): Use WRLOCK and RWUNLOCK on unit_rwlock instead of LOCK and UNLOCK on unit_lock. (close_units): Likewise. (newunit_alloc): Use RWUNLOCK on unit_rwlock instead of UNLOCK on unit_lock. * io/unix.c (find_file): Use RDLOCK and RWUNLOCK on unit_rwlock instead of LOCK and UNLOCK on unit_lock. (flush_all_units): Use WRLOCK and RWUNLOCK on unit_rwlock instead of LOCK and UNLOCK on unit_lock.
2023-05-08fortran: Fix coding style around free()Bernhard Reutner-Fischer1-1/+1
Fix coding-style errors introduced in ca2f64d5d08c1699ca4b7cb2bf6a76692e809e0f gcc/fortran/ChangeLog: * resolve.cc (resolve_select_type): Fix coding style. libgfortran/ChangeLog: * caf/single.c (_gfortran_caf_register): Fix coding style. * io/async.c (update_pdt, async_io): Likewise. * io/format.c (free_format_data): Likewise. * io/transfer.c (st_read_done_worker, st_write_done_worker): Likewise. * io/unix.c (mem_close): Likewise.
2023-05-08fortran: Remove conditionals around free()Bernhard Reutner-Fischer1-2/+1
gcc/fortran/ChangeLog: * resolve.cc (resolve_select_type): Call free() unconditionally. libgfortran/ChangeLog: * caf/single.c (_gfortran_caf_register): Call free() unconditionally. * io/async.c (update_pdt, async_io): Likewise. * io/format.c (free_format_data): Likewise. * io/transfer.c (st_read_done_worker, st_write_done_worker): Likewise. * io/unix.c (mem_close): Likewise.
2023-01-16Update copyright years.Jakub Jelinek1-1/+1
2022-01-03Update copyright years.Jakub Jelinek1-1/+1
2021-01-04Update copyright years.Jakub Jelinek1-1/+1
2020-01-01Update copyright years.Jakub Jelinek1-1/+1
From-SVN: r279813
2019-07-21re PR libfortran/91030 (Poor performance of I/O -fconvert=big-endian)Thomas Koenig1-12/+35
2019-07-21 Thomas König <tkoenig@gcc.gnu.org> PR libfortran/91030 * gfortran.texi (GFORTRAN_FORMATTED_BUFFER_SIZE): Document (GFORTRAN_UNFORMATTED_BUFFER_SIZE): Likewise. 2019-07-21 Thomas König <tkoenig@gcc.gnu.org> PR libfortran/91030 * io/unix.c (BUFFER_SIZE): Delete. (BUFFER_FORMATTED_SIZE_DEFAULT): New variable. (BUFFER_UNFORMATTED_SIZE_DEFAULT): New variable. (unix_stream): Add buffer_size. (buf_read): Use s->buffer_size instead of BUFFER_SIZE. (buf_write): Likewise. (buf_init): Add argument unformatted. Handle block sizes for unformatted vs. formatted, using defaults if provided. (fd_to_stream): Add argument unformatted in call to buf_init. * libgfortran.h (options_t): Add buffer_size_formatted and buffer_size_unformatted. * runtime/environ.c (variable_table): Add GFORTRAN_UNFORMATTED_BUFFER_SIZE and GFORTRAN_FORMATTED_BUFFER_SIZE. From-SVN: r273643
2019-01-01Update copyright years.Jakub Jelinek1-1/+1
From-SVN: r267494
2018-10-06Use gfc_charlen_type instead of int for string lenghtsJanne Blomqvist1-9/+9
This patch cleans up a few places where I noticed the code was still using int instead gfc_charlen_type for string lengths. Regtested on x86_64-pc-linux-gnu, committed as obvious. libgfortran/ChangeLog: 2018-10-06 Janne Blomqvist <jb@gcc.gnu.org> * io/unix.c (compare_file_filename): Use gfc_charlen_type instead of int for string length. (inquire_sequential): Likewise. (inquire_direct): Likewise. (inquire_formatted): Likewise. (inquire_unformatted): Likewise. (inquire_access): Likewise. (inquire_read): Likewise. (inquire_write): Likewise. (inquire_readwrite): Likewise. * io/unix.h (compare_file_filename): Likewise. (inquire_sequential): Likewise. (inquire_direct): Likewise. (inquire_formatted): Likewise. (inquire_unformatted): Likewise. (inquire_read): Likewise. (inquire_write): Likewise. (inquire_readwrite): Likewise. From-SVN: r264901
2018-09-14[libgfortran] Fix uninitialized variable use in fallback_accessKyrylo Tkachov1-6/+14
I've been tracking down a bug in a Fortran program on a newlib target and it boils down to fallback_access doing something bad. The unconditional calls to close cause havoc when open doesn't get called due to the short-circuiting in the if-statement above because the fd is uninitialised. In my environment GCC ends up calling close on file descriptor 0, thus trying to close stdin. This patch tightens up the calling so that close is called only when the corresponding open call succeeded. With this my runtime failure disappears. Bootstrapped and tested on aarch64-none-linux-gnu. Though that doesn't exercise this call I hope it's an obviously correct change. * io/unix.c (fallback_access): Avoid calling close on uninitialized file descriptor. From-SVN: r264305
2018-08-21re PR fortran/25829 ([F03] Asynchronous IO support)Nicolas Koenig1-14/+15
2018-08-21 Nicolas Koenig <koenigni@gcc.gnu.org> Thomas Koenig <tkoenig@gcc.gnu.org> PR fortran/25829 * gfortran.texi: Add description of asynchronous I/O. * trans-decl.c (gfc_finish_var_decl): Treat asynchronous variables as volatile. * trans-io.c (gfc_build_io_library_fndecls): Rename st_wait to st_wait_async and change argument spec from ".X" to ".w". (gfc_trans_wait): Pass ID argument via reference. 2018-08-21 Nicolas Koenig <koenigni@gcc.gnu.org> Thomas Koenig <tkoenig@gcc.gnu.org> PR fortran/25829 * gfortran.dg/f2003_inquire_1.f03: Add write statement. * gfortran.dg/f2003_io_1.f03: Add wait statement. 2018-08-21 Nicolas Koenig <koenigni@gcc.gnu.org> Thomas Koenig <tkoenig@gcc.gnu.org> PR fortran/25829 * Makefile.am: Add async.c to gfor_io_src. Add async.h to gfor_io_headers. * Makefile.in: Regenerated. * gfortran.map: Add _gfortran_st_wait_async. * io/async.c: New file. * io/async.h: New file. * io/close.c: Include async.h. (st_close): Call async_wait for an asynchronous unit. * io/file_pos.c (st_backspace): Likewise. (st_endfile): Likewise. (st_rewind): Likewise. (st_flush): Likewise. * io/inquire.c: Add handling for asynchronous PENDING and ID arguments. * io/io.h (st_parameter_dt): Add async bit. (st_parameter_wait): Correct. (gfc_unit): Add au pointer. (st_wait_async): Add prototype. (transfer_array_inner): Likewise. (st_write_done_worker): Likewise. * io/open.c: Include async.h. (new_unit): Initialize asynchronous unit. * io/transfer.c (async_opt): New struct. (wrap_scalar_transfer): New function. (transfer_integer): Call wrap_scalar_transfer to do the work. (transfer_real): Likewise. (transfer_real_write): Likewise. (transfer_character): Likewise. (transfer_character_wide): Likewise. (transfer_complex): Likewise. (transfer_array_inner): New function. (transfer_array): Call transfer_array_inner. (transfer_derived): Call wrap_scalar_transfer. (data_transfer_init): Check for asynchronous I/O. Perform a wait operation on any pending asynchronous I/O if the data transfer is synchronous. Copy PDT and enqueue thread for data transfer. (st_read_done_worker): New function. (st_read_done): Enqueue transfer or call st_read_done_worker. (st_write_done_worker): New function. (st_write_done): Enqueue transfer or call st_read_done_worker. (st_wait): Document as no-op for compatibility reasons. (st_wait_async): New function. * io/unit.c (insert_unit): Use macros LOCK, UNLOCK and TRYLOCK; add NOTE where necessary. (get_gfc_unit): Likewise. (init_units): Likewise. (close_unit_1): Likewise. Call async_close if asynchronous. (close_unit): Use macros LOCK and UNLOCK. (finish_last_advance_record): Likewise. (newunit_alloc): Likewise. * io/unix.c (find_file): Likewise. (flush_all_units_1): Likewise. (flush_all_units): Likewise. * libgfortran.h (generate_error_common): Add prototype. * runtime/error.c: Include io.h and async.h. (generate_error_common): New function. 2018-08-21 Nicolas Koenig <koenigni@gcc.gnu.org> Thomas Koenig <tkoenig@gcc.gnu.org> PR fortran/25829 * testsuite/libgomp.fortran/async_io_1.f90: New test. * testsuite/libgomp.fortran/async_io_2.f90: New test. * testsuite/libgomp.fortran/async_io_3.f90: New test. * testsuite/libgomp.fortran/async_io_4.f90: New test. * testsuite/libgomp.fortran/async_io_5.f90: New test. * testsuite/libgomp.fortran/async_io_6.f90: New test. * testsuite/libgomp.fortran/async_io_7.f90: New test. Co-Authored-By: Thomas Koenig <tkoenig@gcc.gnu.org> From-SVN: r263750
2018-07-31Reverting 'AsyncI/O patch committed' as it is breaking bare-metal builds.Andre Vieira1-15/+14
2018-07-31 Andre Vieira <andre.simoesdiasvieira@arm.com> Revert 'AsyncI/O patch committed' 2018-07-25 Nicolas Koenig <koenigni@gcc.gnu.org> Thomas Koenig <tkoenig@gcc.gnu.org> PR fortran/25829 * gfortran.texi: Add description of asynchronous I/O. * trans-decl.c (gfc_finish_var_decl): Treat asynchronous variables as volatile. * trans-io.c (gfc_build_io_library_fndecls): Rename st_wait to st_wait_async and change argument spec from ".X" to ".w". (gfc_trans_wait): Pass ID argument via reference. 2018-07-31 Andre Vieira <andre.simoesdiasvieira@arm.com> Revert 'AsyncI/O patch committed' 2018-07-25 Nicolas Koenig <koenigni@gcc.gnu.org> Thomas Koenig <tkoenig@gcc.gnu.org> PR fortran/25829 * gfortran.dg/f2003_inquire_1.f03: Add write statement. * gfortran.dg/f2003_io_1.f03: Add wait statement. 2018-07-31 Andre Vieira <andre.simoesdiasvieira@arm.com> Revert 'AsyncI/O patch committed' 2018-07-25 Nicolas Koenig <koenigni@gcc.gnu.org> Thomas Koenig <tkoenig@gcc.gnu.org> PR fortran/25829 * Makefile.am: Add async.c to gfor_io_src. Add async.h to gfor_io_headers. * Makefile.in: Regenerated. * gfortran.map: Add _gfortran_st_wait_async. * io/async.c: New file. * io/async.h: New file. * io/close.c: Include async.h. (st_close): Call async_wait for an asynchronous unit. * io/file_pos.c (st_backspace): Likewise. (st_endfile): Likewise. (st_rewind): Likewise. (st_flush): Likewise. * io/inquire.c: Add handling for asynchronous PENDING and ID arguments. * io/io.h (st_parameter_dt): Add async bit. (st_parameter_wait): Correct. (gfc_unit): Add au pointer. (st_wait_async): Add prototype. (transfer_array_inner): Likewise. (st_write_done_worker): Likewise. * io/open.c: Include async.h. (new_unit): Initialize asynchronous unit. * io/transfer.c (async_opt): New struct. (wrap_scalar_transfer): New function. (transfer_integer): Call wrap_scalar_transfer to do the work. (transfer_real): Likewise. (transfer_real_write): Likewise. (transfer_character): Likewise. (transfer_character_wide): Likewise. (transfer_complex): Likewise. (transfer_array_inner): New function. (transfer_array): Call transfer_array_inner. (transfer_derived): Call wrap_scalar_transfer. (data_transfer_init): Check for asynchronous I/O. Perform a wait operation on any pending asynchronous I/O if the data transfer is synchronous. Copy PDT and enqueue thread for data transfer. (st_read_done_worker): New function. (st_read_done): Enqueue transfer or call st_read_done_worker. (st_write_done_worker): New function. (st_write_done): Enqueue transfer or call st_read_done_worker. (st_wait): Document as no-op for compatibility reasons. (st_wait_async): New function. * io/unit.c (insert_unit): Use macros LOCK, UNLOCK and TRYLOCK; add NOTE where necessary. (get_gfc_unit): Likewise. (init_units): Likewise. (close_unit_1): Likewise. Call async_close if asynchronous. (close_unit): Use macros LOCK and UNLOCK. (finish_last_advance_record): Likewise. (newunit_alloc): Likewise. * io/unix.c (find_file): Likewise. (flush_all_units_1): Likewise. (flush_all_units): Likewise. * libgfortran.h (generate_error_common): Add prototype. * runtime/error.c: Include io.h and async.h. (generate_error_common): New function. 2018-07-31 Andre Vieira <andre.simoesdiasvieira@arm.com> Revert 'AsyncI/O patch committed'. 2018-07-25 Nicolas Koenig <koenigni@gcc.gnu.org> Thomas Koenig <tkoenig@gcc.gnu.org> PR fortran/25829 * testsuite/libgomp.fortran/async_io_1.f90: New test. * testsuite/libgomp.fortran/async_io_2.f90: New test. * testsuite/libgomp.fortran/async_io_3.f90: New test. * testsuite/libgomp.fortran/async_io_4.f90: New test. * testsuite/libgomp.fortran/async_io_5.f90: New test. * testsuite/libgomp.fortran/async_io_6.f90: New test. * testsuite/libgomp.fortran/async_io_7.f90: New test. From-SVN: r263082
2018-07-25re PR fortran/25829 ([F03] Asynchronous IO support)Nicolas Koenig1-14/+15
2018-07-25 Nicolas Koenig <koenigni@gcc.gnu.org> Thomas Koenig <tkoenig@gcc.gnu.org> PR fortran/25829 * gfortran.texi: Add description of asynchronous I/O. * trans-decl.c (gfc_finish_var_decl): Treat asynchronous variables as volatile. * trans-io.c (gfc_build_io_library_fndecls): Rename st_wait to st_wait_async and change argument spec from ".X" to ".w". (gfc_trans_wait): Pass ID argument via reference. 2018-07-25 Nicolas Koenig <koenigni@gcc.gnu.org> Thomas Koenig <tkoenig@gcc.gnu.org> PR fortran/25829 * gfortran.dg/f2003_inquire_1.f03: Add write statement. * gfortran.dg/f2003_io_1.f03: Add wait statement. 2018-07-25 Nicolas Koenig <koenigni@gcc.gnu.org> Thomas Koenig <tkoenig@gcc.gnu.org> PR fortran/25829 * Makefile.am: Add async.c to gfor_io_src. Add async.h to gfor_io_headers. * Makefile.in: Regenerated. * gfortran.map: Add _gfortran_st_wait_async. * io/async.c: New file. * io/async.h: New file. * io/close.c: Include async.h. (st_close): Call async_wait for an asynchronous unit. * io/file_pos.c (st_backspace): Likewise. (st_endfile): Likewise. (st_rewind): Likewise. (st_flush): Likewise. * io/inquire.c: Add handling for asynchronous PENDING and ID arguments. * io/io.h (st_parameter_dt): Add async bit. (st_parameter_wait): Correct. (gfc_unit): Add au pointer. (st_wait_async): Add prototype. (transfer_array_inner): Likewise. (st_write_done_worker): Likewise. * io/open.c: Include async.h. (new_unit): Initialize asynchronous unit. * io/transfer.c (async_opt): New struct. (wrap_scalar_transfer): New function. (transfer_integer): Call wrap_scalar_transfer to do the work. (transfer_real): Likewise. (transfer_real_write): Likewise. (transfer_character): Likewise. (transfer_character_wide): Likewise. (transfer_complex): Likewise. (transfer_array_inner): New function. (transfer_array): Call transfer_array_inner. (transfer_derived): Call wrap_scalar_transfer. (data_transfer_init): Check for asynchronous I/O. Perform a wait operation on any pending asynchronous I/O if the data transfer is synchronous. Copy PDT and enqueue thread for data transfer. (st_read_done_worker): New function. (st_read_done): Enqueue transfer or call st_read_done_worker. (st_write_done_worker): New function. (st_write_done): Enqueue transfer or call st_read_done_worker. (st_wait): Document as no-op for compatibility reasons. (st_wait_async): New function. * io/unit.c (insert_unit): Use macros LOCK, UNLOCK and TRYLOCK; add NOTE where necessary. (get_gfc_unit): Likewise. (init_units): Likewise. (close_unit_1): Likewise. Call async_close if asynchronous. (close_unit): Use macros LOCK and UNLOCK. (finish_last_advance_record): Likewise. (newunit_alloc): Likewise. * io/unix.c (find_file): Likewise. (flush_all_units_1): Likewise. (flush_all_units): Likewise. * libgfortran.h (generate_error_common): Add prototype. * runtime/error.c: Include io.h and async.h. (generate_error_common): New function. 2018-07-25 Nicolas Koenig <koenigni@gcc.gnu.org> Thomas Koenig <tkoenig@gcc.gnu.org> PR fortran/25829 * testsuite/libgomp.fortran/async_io_1.f90: New test. * testsuite/libgomp.fortran/async_io_2.f90: New test. * testsuite/libgomp.fortran/async_io_3.f90: New test. * testsuite/libgomp.fortran/async_io_4.f90: New test. * testsuite/libgomp.fortran/async_io_5.f90: New test. * testsuite/libgomp.fortran/async_io_6.f90: New test. * testsuite/libgomp.fortran/async_io_7.f90: New test. Co-Authored-By: Thomas Koenig <tkoenig@gcc.gnu.org> From-SVN: r262978
2018-01-07PR 78534, 83704 Handle large formatted I/OJanne Blomqvist1-12/+12
In order to handle large characters when doing formatted I/O, use size_t and ptrdiff_t for lengths. Compared to the previous patch, based on discussions on IRC use size_t for sizes that don't need to be negative rather than ptrdiff_t everywhere. Regtested on x86_64-pc-linux-gnu, approved as part of the PR 78534 approval, committed to trunk. libgfortran/ChangeLog: 2018-01-07 Janne Blomqvist <jb@gcc.gnu.org> PR fortran/78534 PR fortran/83704 * io/fbuf.c (fbuf_init): Use size_t instead of int for length. (fbuf_debug): Convert debug output to unsigned long. (fbuf_reset): Use ptrdiff_t for return value. (fbuf_alloc): Use size_t for length argument. (fbuf_flush): Handle large buffers. (fbuf_flush_list): Likewise. (fbuf_seek): Use ptrdiff_t for offset and return value. (fbuf_read): Use size_t for length argument. (fbuf_getc_refill): Use size_t to match fbuf_read. * io/fbuf.h (struct fbuf): Use size_t for lengths. (fbuf_init): Use size_t instead of int for length. (fbuf_reset): Use ptrdiff_t for return value. (fbuf_alloc): Use size_t for length argument. (fbuf_seek): Use ptrdiff_t for offset and return value. (fbuf_read): Use size_t for length argument. * io/io.h (read_block_form): Likewise. (read_block_form4): Likewise. (write_block): Likewise. (read_a): Likewise. (read_a_char4): Likewise. (read_x): Likewise. (write_a): Likewise. (write_a_char4): Likewise. * io/list_read.c (list_formatted_read_scalar): Use size_t to handle large buffers. * io/read.c (read_l): Likewise. (read_utf8): Likewise. (read_utf8_char1): Likewise. (read_default_char1): Likewise. (read_utf8_char4): Likewise. (read_default_char4): Likewise. (read_a): Likewise. (read_a_char4): Likewise. (eat_leading_spaces): Likewise. (next_char): Likewise. (read_decimal): Likewise. (read_radix): Likewise. (read_f): Likewise. (read_x): Likewise. * io/transfer.c (read_sf_internal): Likewise. (read_sf): Likewise. (read_block_form): Likewise. (read_block_form4): Likewise. (write_block): Likewise. (formatted_transfer_scalar_write): Likewise. (next_record_w): Likewise. * io/unix.c (mem_alloc_r): Likewise. (mem_alloc_r4): Likewise. (mem_alloc_w): Likewise. (mem_alloc_w4): Likewise. (mem_read): Likewise. (mem_read4): Likewise. (mem_write): Likewise. (mem_write4): Likewise. (open_internal): Likewise. (open_internal4): Likewise. * io/unix.h (open_internal): Likewise. (open_internal4): Likewise. (mem_alloc_w): Likewise. (mem_alloc_r): Likewise. (mem_alloc_w4): Likewise. (mem_alloc_r4): Likewise. * io/write.c (write_check_cc): Likewise. (write_cc): Likewise. (write_a): Likewise. (write_a_char4): Likewise. From-SVN: r256322
2018-01-03Update copyright years.Jakub Jelinek1-1/+1
From-SVN: r256169
2018-01-02PR libgfortran/83649 Chunk large reads and writesJanne Blomqvist1-8/+42
It turns out that Linux never reads or writes more than 2147479552 bytes in a single syscall. For writes this is not a problem as libgfortran already contains a loop around write() to handle short writes. But for reads we cannot do this, since then read will hang if we have a short read when reading from the terminal. Also, there are reports that macOS fails I/O's larger than 2 GB. Thus, to work around these issues do large reads/writes in chunks. The testcase from the PR program largewr integer(kind=1) :: a(2_8**31+1) a = 0 a(size(a, kind=8)) = 1 open(10, file="largewr.dat", access="stream", form="unformatted") write (10) a close(10) a(size(a, kind=8)) = 2 open(10, file="largewr.dat", access="stream", form="unformatted") read (10) a if (a(size(a, kind=8)) == 1) then print *, "All is well" else print *, "Oh no" end if end program largewr fails on trunk but works with the patch. Regtested on x86_64-pc-linux-gnu, committed to trunk. libgfortran/ChangeLog: 2018-01-02 Janne Blomqvist <jb@gcc.gnu.org> PR libgfortran/83649 * io/unix.c (MAX_CHUNK): New define. (raw_read): For reads larger than MAX_CHUNK, loop. (raw_write): Write no more than MAX_CHUNK bytes per iteration. From-SVN: r256074
2017-12-14re PR libfortran/78549 (Very slow formatted internal file output)Jerry DeLisle1-2/+2
2017-12-12 Jerry DeLisle <jvdelisle@gcc.gnu.org> PR libgfortran/78549 * io/inquire.c (inquire_via_unit): Adjust test for existence for pre-connected internal units. * io/transfer.c (finalize_transfer): When done with a transfer to internal units, free the format buffer and close the stream. (st_read_done): Delete freeing the stream, now handled using sclose in finalize_transfer. (st_write_done): Likewise. * io/unit.c (get_unit): Return NULL for special reserved unit numbers, signifying not accessible to the user. (init_units): Insert the two special internal units into the unit treap. This makes these unit structures available without further allocations for later use by internal unit I/O. These units are automatically deleted by normal program termination. * io/unix.c (mem_close): Add a guard check to protect from double free. From-SVN: r255621
2017-07-24unix.c (buf_write): Return early if there is nothing to write.Thomas Koenig1-0/+3
2017-07-24 Thomas Koenig <tkoenig@gcc.gnu.org> * io/unix.c (buf_write): Return early if there is nothing to write. From-SVN: r250473
2017-04-11close.c: Fix white space in pointer declarations and comment formats where ↵Jerry DeLisle1-80/+80
applicable. 2017-04-11 Jerry DeLisle <jvdelisle@gcc.gnu.org> * close.c: Fix white space in pointer declarations and comment formats where applicable. * fbuf.c: Likewise. * fbuf.h: Likewise. * format.c: Likewise. * inquire.c: Likewise. * intrinsics.c: Likewise. * list_read.c: Likewise. * lock.c: Likewise. * open.c: Likewise. * read.c: Likewise. * transfer.c: Likewise. * unit.c: Likewise. * unix.c: Likewise. * unix.h: Likewise. * write.c: Likewise. From-SVN: r246842
2017-01-01Update copyright years.Jakub Jelinek1-1/+1
From-SVN: r243994
2016-12-21libgfortran.h: Include <stdlib.h> header.Francois-Xavier Coudert1-1/+0
* libgfortran.h: Include <stdlib.h> header. * intrinsics/access.c: Do not include <stdlib.h> header. * intrinsics/chdir.c: Do not include <stdlib.h> header. * intrinsics/chmod.c: Do not include <stdlib.h> header. * intrinsics/date_and_time.c: Do not include <stdlib.h> header. * intrinsics/env.c: Do not include <stdlib.h> header. * intrinsics/execute_command_line.c: Do not include <stdlib.h> header. * intrinsics/exit.c: Do not include <stdlib.h> header. * intrinsics/getcwd.c: Do not include <stdlib.h> header. * intrinsics/getlog.c: Do not include <stdlib.h> header. * intrinsics/link.c: Do not include <stdlib.h> header. * intrinsics/move_alloc.c: Do not include <stdlib.h> header. * intrinsics/perror.c: Do not include <stdlib.h> header. * intrinsics/random.c: Do not include <stdlib.h> header. * intrinsics/rename.c: Do not include <stdlib.h> header. * intrinsics/reshape_generic.c: Do not include <stdlib.h> header. * intrinsics/stat.c: Do not include <stdlib.h> header. * intrinsics/symlnk.c: Do not include <stdlib.h> header. * intrinsics/system.c: Do not include <stdlib.h> header. * intrinsics/unlink.c: Do not include <stdlib.h> header. * io/fbuf.c: Do not include <stdlib.h> header. * io/format.c: Do not include <stdlib.h> header. * io/intrinsics.c: Do not include <stdlib.h> header. * io/list_read.c: Do not include <stdlib.h> header. * io/lock.c: Do not include <stdlib.h> header. * io/open.c: Do not include <stdlib.h> header. * io/read.c: Do not include <stdlib.h> header. * io/transfer.c: Do not include <stdlib.h> header. * io/unit.c: Do not include <stdlib.h> header. * io/unix.c: Do not include <stdlib.h> header. * io/write.c: Do not include <stdlib.h> header. * m4/all.m4: Do not include <stdlib.h> header. * m4/any.m4: Do not include <stdlib.h> header. * m4/bessel.m4: Do not include <stdlib.h> header. * m4/count.m4: Do not include <stdlib.h> header. * m4/cshift0.m4: Do not include <stdlib.h> header. * m4/cshift1.m4: Do not include <stdlib.h> header. * m4/eoshift1.m4: Do not include <stdlib.h> header. * m4/eoshift3.m4: Do not include <stdlib.h> header. * m4/iall.m4: Do not include <stdlib.h> header. * m4/iany.m4: Do not include <stdlib.h> header. * m4/in_pack.m4: Do not include <stdlib.h> header. * m4/in_unpack.m4: Do not include <stdlib.h> header. * m4/iparity.m4: Do not include <stdlib.h> header. * m4/matmul.m4: Do not include <stdlib.h> header. * m4/matmull.m4: Do not include <stdlib.h> header. * m4/maxloc0.m4: Do not include <stdlib.h> header. * m4/maxloc1.m4: Do not include <stdlib.h> header. * m4/maxval.m4: Do not include <stdlib.h> header. * m4/minloc0.m4: Do not include <stdlib.h> header. * m4/minloc1.m4: Do not include <stdlib.h> header. * m4/minval.m4: Do not include <stdlib.h> header. * m4/norm2.m4: Do not include <stdlib.h> header. * m4/pack.m4: Do not include <stdlib.h> header. * m4/parity.m4: Do not include <stdlib.h> header. * m4/product.m4: Do not include <stdlib.h> header. * m4/reshape.m4: Do not include <stdlib.h> header. * m4/shape.m4: Do not include <stdlib.h> header. * m4/spread.m4: Do not include <stdlib.h> header. * m4/sum.m4: Do not include <stdlib.h> header. * m4/unpack.m4: Do not include <stdlib.h> header. * runtime/environ.c: Do not include <stdlib.h> header. * runtime/error.c: Do not include <stdlib.h> header. * runtime/memory.c: Do not include <stdlib.h> header. * runtime/minimal.c: Do not include <stdlib.h> header. * runtime/string.c: Do not include <stdlib.h> header. * generated/all_l1.c: Regenerate. * generated/all_l16.c: Regenerate. * generated/all_l2.c: Regenerate. * generated/all_l4.c: Regenerate. * generated/all_l8.c: Regenerate. * generated/any_l1.c: Regenerate. * generated/any_l16.c: Regenerate. * generated/any_l2.c: Regenerate. * generated/any_l4.c: Regenerate. * generated/any_l8.c: Regenerate. * generated/bessel_r10.c: Regenerate. * generated/bessel_r16.c: Regenerate. * generated/bessel_r4.c: Regenerate. * generated/bessel_r8.c: Regenerate. * generated/count_16_l.c: Regenerate. * generated/count_1_l.c: Regenerate. * generated/count_2_l.c: Regenerate. * generated/count_4_l.c: Regenerate. * generated/count_8_l.c: Regenerate. * generated/cshift0_c10.c: Regenerate. * generated/cshift0_c16.c: Regenerate. * generated/cshift0_c4.c: Regenerate. * generated/cshift0_c8.c: Regenerate. * generated/cshift0_i1.c: Regenerate. * generated/cshift0_i16.c: Regenerate. * generated/cshift0_i2.c: Regenerate. * generated/cshift0_i4.c: Regenerate. * generated/cshift0_i8.c: Regenerate. * generated/cshift0_r10.c: Regenerate. * generated/cshift0_r16.c: Regenerate. * generated/cshift0_r4.c: Regenerate. * generated/cshift0_r8.c: Regenerate. * generated/cshift1_16.c: Regenerate. * generated/cshift1_4.c: Regenerate. * generated/cshift1_8.c: Regenerate. * generated/eoshift1_16.c: Regenerate. * generated/eoshift1_4.c: Regenerate. * generated/eoshift1_8.c: Regenerate. * generated/eoshift3_16.c: Regenerate. * generated/eoshift3_4.c: Regenerate. * generated/eoshift3_8.c: Regenerate. * generated/iall_i1.c: Regenerate. * generated/iall_i16.c: Regenerate. * generated/iall_i2.c: Regenerate. * generated/iall_i4.c: Regenerate. * generated/iall_i8.c: Regenerate. * generated/iany_i1.c: Regenerate. * generated/iany_i16.c: Regenerate. * generated/iany_i2.c: Regenerate. * generated/iany_i4.c: Regenerate. * generated/iany_i8.c: Regenerate. * generated/in_pack_c10.c: Regenerate. * generated/in_pack_c16.c: Regenerate. * generated/in_pack_c4.c: Regenerate. * generated/in_pack_c8.c: Regenerate. * generated/in_pack_i1.c: Regenerate. * generated/in_pack_i16.c: Regenerate. * generated/in_pack_i2.c: Regenerate. * generated/in_pack_i4.c: Regenerate. * generated/in_pack_i8.c: Regenerate. * generated/in_pack_r10.c: Regenerate. * generated/in_pack_r16.c: Regenerate. * generated/in_pack_r4.c: Regenerate. * generated/in_pack_r8.c: Regenerate. * generated/in_unpack_c10.c: Regenerate. * generated/in_unpack_c16.c: Regenerate. * generated/in_unpack_c4.c: Regenerate. * generated/in_unpack_c8.c: Regenerate. * generated/in_unpack_i1.c: Regenerate. * generated/in_unpack_i16.c: Regenerate. * generated/in_unpack_i2.c: Regenerate. * generated/in_unpack_i4.c: Regenerate. * generated/in_unpack_i8.c: Regenerate. * generated/in_unpack_r10.c: Regenerate. * generated/in_unpack_r16.c: Regenerate. * generated/in_unpack_r4.c: Regenerate. * generated/in_unpack_r8.c: Regenerate. * generated/iparity_i1.c: Regenerate. * generated/iparity_i16.c: Regenerate. * generated/iparity_i2.c: Regenerate. * generated/iparity_i4.c: Regenerate. * generated/iparity_i8.c: Regenerate. * generated/matmul_c10.c: Regenerate. * generated/matmul_c16.c: Regenerate. * generated/matmul_c4.c: Regenerate. * generated/matmul_c8.c: Regenerate. * generated/matmul_i1.c: Regenerate. * generated/matmul_i16.c: Regenerate. * generated/matmul_i2.c: Regenerate. * generated/matmul_i4.c: Regenerate. * generated/matmul_i8.c: Regenerate. * generated/matmul_l16.c: Regenerate. * generated/matmul_l4.c: Regenerate. * generated/matmul_l8.c: Regenerate. * generated/matmul_r10.c: Regenerate. * generated/matmul_r16.c: Regenerate. * generated/matmul_r4.c: Regenerate. * generated/matmul_r8.c: Regenerate. * generated/maxloc0_16_i1.c: Regenerate. * generated/maxloc0_16_i16.c: Regenerate. * generated/maxloc0_16_i2.c: Regenerate. * generated/maxloc0_16_i4.c: Regenerate. * generated/maxloc0_16_i8.c: Regenerate. * generated/maxloc0_16_r10.c: Regenerate. * generated/maxloc0_16_r16.c: Regenerate. * generated/maxloc0_16_r4.c: Regenerate. * generated/maxloc0_16_r8.c: Regenerate. * generated/maxloc0_4_i1.c: Regenerate. * generated/maxloc0_4_i16.c: Regenerate. * generated/maxloc0_4_i2.c: Regenerate. * generated/maxloc0_4_i4.c: Regenerate. * generated/maxloc0_4_i8.c: Regenerate. * generated/maxloc0_4_r10.c: Regenerate. * generated/maxloc0_4_r16.c: Regenerate. * generated/maxloc0_4_r4.c: Regenerate. * generated/maxloc0_4_r8.c: Regenerate. * generated/maxloc0_8_i1.c: Regenerate. * generated/maxloc0_8_i16.c: Regenerate. * generated/maxloc0_8_i2.c: Regenerate. * generated/maxloc0_8_i4.c: Regenerate. * generated/maxloc0_8_i8.c: Regenerate. * generated/maxloc0_8_r10.c: Regenerate. * generated/maxloc0_8_r16.c: Regenerate. * generated/maxloc0_8_r4.c: Regenerate. * generated/maxloc0_8_r8.c: Regenerate. * generated/maxloc1_16_i1.c: Regenerate. * generated/maxloc1_16_i16.c: Regenerate. * generated/maxloc1_16_i2.c: Regenerate. * generated/maxloc1_16_i4.c: Regenerate. * generated/maxloc1_16_i8.c: Regenerate. * generated/maxloc1_16_r10.c: Regenerate. * generated/maxloc1_16_r16.c: Regenerate. * generated/maxloc1_16_r4.c: Regenerate. * generated/maxloc1_16_r8.c: Regenerate. * generated/maxloc1_4_i1.c: Regenerate. * generated/maxloc1_4_i16.c: Regenerate. * generated/maxloc1_4_i2.c: Regenerate. * generated/maxloc1_4_i4.c: Regenerate. * generated/maxloc1_4_i8.c: Regenerate. * generated/maxloc1_4_r10.c: Regenerate. * generated/maxloc1_4_r16.c: Regenerate. * generated/maxloc1_4_r4.c: Regenerate. * generated/maxloc1_4_r8.c: Regenerate. * generated/maxloc1_8_i1.c: Regenerate. * generated/maxloc1_8_i16.c: Regenerate. * generated/maxloc1_8_i2.c: Regenerate. * generated/maxloc1_8_i4.c: Regenerate. * generated/maxloc1_8_i8.c: Regenerate. * generated/maxloc1_8_r10.c: Regenerate. * generated/maxloc1_8_r16.c: Regenerate. * generated/maxloc1_8_r4.c: Regenerate. * generated/maxloc1_8_r8.c: Regenerate. * generated/maxval_i1.c: Regenerate. * generated/maxval_i16.c: Regenerate. * generated/maxval_i2.c: Regenerate. * generated/maxval_i4.c: Regenerate. * generated/maxval_i8.c: Regenerate. * generated/maxval_r10.c: Regenerate. * generated/maxval_r16.c: Regenerate. * generated/maxval_r4.c: Regenerate. * generated/maxval_r8.c: Regenerate. * generated/minloc0_16_i1.c: Regenerate. * generated/minloc0_16_i16.c: Regenerate. * generated/minloc0_16_i2.c: Regenerate. * generated/minloc0_16_i4.c: Regenerate. * generated/minloc0_16_i8.c: Regenerate. * generated/minloc0_16_r10.c: Regenerate. * generated/minloc0_16_r16.c: Regenerate. * generated/minloc0_16_r4.c: Regenerate. * generated/minloc0_16_r8.c: Regenerate. * generated/minloc0_4_i1.c: Regenerate. * generated/minloc0_4_i16.c: Regenerate. * generated/minloc0_4_i2.c: Regenerate. * generated/minloc0_4_i4.c: Regenerate. * generated/minloc0_4_i8.c: Regenerate. * generated/minloc0_4_r10.c: Regenerate. * generated/minloc0_4_r16.c: Regenerate. * generated/minloc0_4_r4.c: Regenerate. * generated/minloc0_4_r8.c: Regenerate. * generated/minloc0_8_i1.c: Regenerate. * generated/minloc0_8_i16.c: Regenerate. * generated/minloc0_8_i2.c: Regenerate. * generated/minloc0_8_i4.c: Regenerate. * generated/minloc0_8_i8.c: Regenerate. * generated/minloc0_8_r10.c: Regenerate. * generated/minloc0_8_r16.c: Regenerate. * generated/minloc0_8_r4.c: Regenerate. * generated/minloc0_8_r8.c: Regenerate. * generated/minloc1_16_i1.c: Regenerate. * generated/minloc1_16_i16.c: Regenerate. * generated/minloc1_16_i2.c: Regenerate. * generated/minloc1_16_i4.c: Regenerate. * generated/minloc1_16_i8.c: Regenerate. * generated/minloc1_16_r10.c: Regenerate. * generated/minloc1_16_r16.c: Regenerate. * generated/minloc1_16_r4.c: Regenerate. * generated/minloc1_16_r8.c: Regenerate. * generated/minloc1_4_i1.c: Regenerate. * generated/minloc1_4_i16.c: Regenerate. * generated/minloc1_4_i2.c: Regenerate. * generated/minloc1_4_i4.c: Regenerate. * generated/minloc1_4_i8.c: Regenerate. * generated/minloc1_4_r10.c: Regenerate. * generated/minloc1_4_r16.c: Regenerate. * generated/minloc1_4_r4.c: Regenerate. * generated/minloc1_4_r8.c: Regenerate. * generated/minloc1_8_i1.c: Regenerate. * generated/minloc1_8_i16.c: Regenerate. * generated/minloc1_8_i2.c: Regenerate. * generated/minloc1_8_i4.c: Regenerate. * generated/minloc1_8_i8.c: Regenerate. * generated/minloc1_8_r10.c: Regenerate. * generated/minloc1_8_r16.c: Regenerate. * generated/minloc1_8_r4.c: Regenerate. * generated/minloc1_8_r8.c: Regenerate. * generated/minval_i1.c: Regenerate. * generated/minval_i16.c: Regenerate. * generated/minval_i2.c: Regenerate. * generated/minval_i4.c: Regenerate. * generated/minval_i8.c: Regenerate. * generated/minval_r10.c: Regenerate. * generated/minval_r16.c: Regenerate. * generated/minval_r4.c: Regenerate. * generated/minval_r8.c: Regenerate. * generated/norm2_r10.c: Regenerate. * generated/norm2_r16.c: Regenerate. * generated/norm2_r4.c: Regenerate. * generated/norm2_r8.c: Regenerate. * generated/pack_c10.c: Regenerate. * generated/pack_c16.c: Regenerate. * generated/pack_c4.c: Regenerate. * generated/pack_c8.c: Regenerate. * generated/pack_i1.c: Regenerate. * generated/pack_i16.c: Regenerate. * generated/pack_i2.c: Regenerate. * generated/pack_i4.c: Regenerate. * generated/pack_i8.c: Regenerate. * generated/pack_r10.c: Regenerate. * generated/pack_r16.c: Regenerate. * generated/pack_r4.c: Regenerate. * generated/pack_r8.c: Regenerate. * generated/parity_l1.c: Regenerate. * generated/parity_l16.c: Regenerate. * generated/parity_l2.c: Regenerate. * generated/parity_l4.c: Regenerate. * generated/parity_l8.c: Regenerate. * generated/product_c10.c: Regenerate. * generated/product_c16.c: Regenerate. * generated/product_c4.c: Regenerate. * generated/product_c8.c: Regenerate. * generated/product_i1.c: Regenerate. * generated/product_i16.c: Regenerate. * generated/product_i2.c: Regenerate. * generated/product_i4.c: Regenerate. * generated/product_i8.c: Regenerate. * generated/product_r10.c: Regenerate. * generated/product_r16.c: Regenerate. * generated/product_r4.c: Regenerate. * generated/product_r8.c: Regenerate. * generated/reshape_c10.c: Regenerate. * generated/reshape_c16.c: Regenerate. * generated/reshape_c4.c: Regenerate. * generated/reshape_c8.c: Regenerate. * generated/reshape_i16.c: Regenerate. * generated/reshape_i4.c: Regenerate. * generated/reshape_i8.c: Regenerate. * generated/reshape_r10.c: Regenerate. * generated/reshape_r16.c: Regenerate. * generated/reshape_r4.c: Regenerate. * generated/reshape_r8.c: Regenerate. * generated/shape_i1.c: Regenerate. * generated/shape_i16.c: Regenerate. * generated/shape_i2.c: Regenerate. * generated/shape_i4.c: Regenerate. * generated/shape_i8.c: Regenerate. * generated/spread_c10.c: Regenerate. * generated/spread_c16.c: Regenerate. * generated/spread_c4.c: Regenerate. * generated/spread_c8.c: Regenerate. * generated/spread_i1.c: Regenerate. * generated/spread_i16.c: Regenerate. * generated/spread_i2.c: Regenerate. * generated/spread_i4.c: Regenerate. * generated/spread_i8.c: Regenerate. * generated/spread_r10.c: Regenerate. * generated/spread_r16.c: Regenerate. * generated/spread_r4.c: Regenerate. * generated/spread_r8.c: Regenerate. * generated/sum_c10.c: Regenerate. * generated/sum_c16.c: Regenerate. * generated/sum_c4.c: Regenerate. * generated/sum_c8.c: Regenerate. * generated/sum_i1.c: Regenerate. * generated/sum_i16.c: Regenerate. * generated/sum_i2.c: Regenerate. * generated/sum_i4.c: Regenerate. * generated/sum_i8.c: Regenerate. * generated/sum_r10.c: Regenerate. * generated/sum_r16.c: Regenerate. * generated/sum_r4.c: Regenerate. * generated/sum_r8.c: Regenerate. * generated/unpack_c10.c: Regenerate. * generated/unpack_c16.c: Regenerate. * generated/unpack_c4.c: Regenerate. * generated/unpack_c8.c: Regenerate. * generated/unpack_i1.c: Regenerate. * generated/unpack_i16.c: Regenerate. * generated/unpack_i2.c: Regenerate. * generated/unpack_i4.c: Regenerate. * generated/unpack_i8.c: Regenerate. * generated/unpack_r10.c: Regenerate. * generated/unpack_r16.c: Regenerate. * generated/unpack_r4.c: Regenerate. * generated/unpack_r8.c: Regenerate. From-SVN: r243846
2016-12-21abort.c: Remove unused headers.Francois-Xavier Coudert1-1/+0
* intrinsics/abort.c: Remove unused headers. * intrinsics/access.c: Remove unused headers. * intrinsics/chdir.c: Remove unused headers. * intrinsics/chmod.c: Remove unused headers. * intrinsics/cshift0.c: Remove unused headers. * intrinsics/ctime.c: Remove unused headers. * intrinsics/eoshift0.c: Remove unused headers. * intrinsics/eoshift2.c: Remove unused headers. * intrinsics/extends_type_of.c: Remove unused headers. * intrinsics/link.c: Remove unused headers. * intrinsics/pack_generic.c: Remove unused headers. * intrinsics/perror.c: Remove unused headers. * intrinsics/rename.c: Remove unused headers. * intrinsics/reshape_generic.c: Remove unused headers. * intrinsics/sleep.c: Remove unused headers. * intrinsics/spread_generic.c: Remove unused headers. * intrinsics/stat.c: Remove unused headers. * intrinsics/string_intrinsics.c: Remove unused headers. * intrinsics/symlnk.c: Remove unused headers. * intrinsics/system.c: Remove unused headers. * intrinsics/umask.c: Remove unused headers. * intrinsics/unlink.c: Remove unused headers. * intrinsics/unpack_generic.c: Remove unused headers. * io/read.c: Remove unused headers. * io/transfer.c: Remove unused headers. * io/unix.c: Remove unused headers. * io/write.c: Remove unused headers. * m4/all.m4: Remove unused headers. * m4/any.m4: Remove unused headers. * m4/bessel.m4: Remove unused headers. * m4/count.m4: Remove unused headers. * m4/cshift0.m4: Remove unused headers. * m4/cshift1.m4: Remove unused headers. * m4/eoshift1.m4: Remove unused headers. * m4/eoshift3.m4: Remove unused headers. * m4/iall.m4: Remove unused headers. * m4/iany.m4: Remove unused headers. * m4/in_pack.m4: Remove unused headers. * m4/in_unpack.m4: Remove unused headers. * m4/iparity.m4: Remove unused headers. * m4/maxloc0.m4: Remove unused headers. * m4/maxloc1.m4: Remove unused headers. * m4/maxval.m4: Remove unused headers. * m4/minloc0.m4: Remove unused headers. * m4/minloc1.m4: Remove unused headers. * m4/minval.m4: Remove unused headers. * m4/norm2.m4: Remove unused headers. * m4/pack.m4: Remove unused headers. * m4/parity.m4: Remove unused headers. * m4/product.m4: Remove unused headers. * m4/reshape.m4: Remove unused headers. * m4/shape.m4: Remove unused headers. * m4/spread.m4: Remove unused headers. * m4/sum.m4: Remove unused headers. * m4/unpack.m4: Remove unused headers. * runtime/backtrace.c: Remove unused headers. * runtime/convert_char.c: Remove unused headers. * runtime/in_pack_generic.c: Remove unused headers. * runtime/in_unpack_generic.c: Remove unused headers. * runtime/main.c: Remove unused headers. * runtime/stop.c: Remove unused headers. * generated/all_l1.c: Regenerate. * generated/all_l16.c: Regenerate. * generated/all_l2.c: Regenerate. * generated/all_l4.c: Regenerate. * generated/all_l8.c: Regenerate. * generated/any_l1.c: Regenerate. * generated/any_l16.c: Regenerate. * generated/any_l2.c: Regenerate. * generated/any_l4.c: Regenerate. * generated/any_l8.c: Regenerate. * generated/bessel_r10.c: Regenerate. * generated/bessel_r16.c: Regenerate. * generated/bessel_r4.c: Regenerate. * generated/bessel_r8.c: Regenerate. * generated/count_16_l.c: Regenerate. * generated/count_1_l.c: Regenerate. * generated/count_2_l.c: Regenerate. * generated/count_4_l.c: Regenerate. * generated/count_8_l.c: Regenerate. * generated/cshift0_c10.c: Regenerate. * generated/cshift0_c16.c: Regenerate. * generated/cshift0_c4.c: Regenerate. * generated/cshift0_c8.c: Regenerate. * generated/cshift0_i1.c: Regenerate. * generated/cshift0_i16.c: Regenerate. * generated/cshift0_i2.c: Regenerate. * generated/cshift0_i4.c: Regenerate. * generated/cshift0_i8.c: Regenerate. * generated/cshift0_r10.c: Regenerate. * generated/cshift0_r16.c: Regenerate. * generated/cshift0_r4.c: Regenerate. * generated/cshift0_r8.c: Regenerate. * generated/cshift1_16.c: Regenerate. * generated/cshift1_4.c: Regenerate. * generated/cshift1_8.c: Regenerate. * generated/eoshift1_16.c: Regenerate. * generated/eoshift1_4.c: Regenerate. * generated/eoshift1_8.c: Regenerate. * generated/eoshift3_16.c: Regenerate. * generated/eoshift3_4.c: Regenerate. * generated/eoshift3_8.c: Regenerate. * generated/iall_i1.c: Regenerate. * generated/iall_i16.c: Regenerate. * generated/iall_i2.c: Regenerate. * generated/iall_i4.c: Regenerate. * generated/iall_i8.c: Regenerate. * generated/iany_i1.c: Regenerate. * generated/iany_i16.c: Regenerate. * generated/iany_i2.c: Regenerate. * generated/iany_i4.c: Regenerate. * generated/iany_i8.c: Regenerate. * generated/in_pack_c10.c: Regenerate. * generated/in_pack_c16.c: Regenerate. * generated/in_pack_c4.c: Regenerate. * generated/in_pack_c8.c: Regenerate. * generated/in_pack_i1.c: Regenerate. * generated/in_pack_i16.c: Regenerate. * generated/in_pack_i2.c: Regenerate. * generated/in_pack_i4.c: Regenerate. * generated/in_pack_i8.c: Regenerate. * generated/in_pack_r10.c: Regenerate. * generated/in_pack_r16.c: Regenerate. * generated/in_pack_r4.c: Regenerate. * generated/in_pack_r8.c: Regenerate. * generated/in_unpack_c10.c: Regenerate. * generated/in_unpack_c16.c: Regenerate. * generated/in_unpack_c4.c: Regenerate. * generated/in_unpack_c8.c: Regenerate. * generated/in_unpack_i1.c: Regenerate. * generated/in_unpack_i16.c: Regenerate. * generated/in_unpack_i2.c: Regenerate. * generated/in_unpack_i4.c: Regenerate. * generated/in_unpack_i8.c: Regenerate. * generated/in_unpack_r10.c: Regenerate. * generated/in_unpack_r16.c: Regenerate. * generated/in_unpack_r4.c: Regenerate. * generated/in_unpack_r8.c: Regenerate. * generated/iparity_i1.c: Regenerate. * generated/iparity_i16.c: Regenerate. * generated/iparity_i2.c: Regenerate. * generated/iparity_i4.c: Regenerate. * generated/iparity_i8.c: Regenerate. * generated/maxloc0_16_i1.c: Regenerate. * generated/maxloc0_16_i16.c: Regenerate. * generated/maxloc0_16_i2.c: Regenerate. * generated/maxloc0_16_i4.c: Regenerate. * generated/maxloc0_16_i8.c: Regenerate. * generated/maxloc0_16_r10.c: Regenerate. * generated/maxloc0_16_r16.c: Regenerate. * generated/maxloc0_16_r4.c: Regenerate. * generated/maxloc0_16_r8.c: Regenerate. * generated/maxloc0_4_i1.c: Regenerate. * generated/maxloc0_4_i16.c: Regenerate. * generated/maxloc0_4_i2.c: Regenerate. * generated/maxloc0_4_i4.c: Regenerate. * generated/maxloc0_4_i8.c: Regenerate. * generated/maxloc0_4_r10.c: Regenerate. * generated/maxloc0_4_r16.c: Regenerate. * generated/maxloc0_4_r4.c: Regenerate. * generated/maxloc0_4_r8.c: Regenerate. * generated/maxloc0_8_i1.c: Regenerate. * generated/maxloc0_8_i16.c: Regenerate. * generated/maxloc0_8_i2.c: Regenerate. * generated/maxloc0_8_i4.c: Regenerate. * generated/maxloc0_8_i8.c: Regenerate. * generated/maxloc0_8_r10.c: Regenerate. * generated/maxloc0_8_r16.c: Regenerate. * generated/maxloc0_8_r4.c: Regenerate. * generated/maxloc0_8_r8.c: Regenerate. * generated/maxloc1_16_i1.c: Regenerate. * generated/maxloc1_16_i16.c: Regenerate. * generated/maxloc1_16_i2.c: Regenerate. * generated/maxloc1_16_i4.c: Regenerate. * generated/maxloc1_16_i8.c: Regenerate. * generated/maxloc1_16_r10.c: Regenerate. * generated/maxloc1_16_r16.c: Regenerate. * generated/maxloc1_16_r4.c: Regenerate. * generated/maxloc1_16_r8.c: Regenerate. * generated/maxloc1_4_i1.c: Regenerate. * generated/maxloc1_4_i16.c: Regenerate. * generated/maxloc1_4_i2.c: Regenerate. * generated/maxloc1_4_i4.c: Regenerate. * generated/maxloc1_4_i8.c: Regenerate. * generated/maxloc1_4_r10.c: Regenerate. * generated/maxloc1_4_r16.c: Regenerate. * generated/maxloc1_4_r4.c: Regenerate. * generated/maxloc1_4_r8.c: Regenerate. * generated/maxloc1_8_i1.c: Regenerate. * generated/maxloc1_8_i16.c: Regenerate. * generated/maxloc1_8_i2.c: Regenerate. * generated/maxloc1_8_i4.c: Regenerate. * generated/maxloc1_8_i8.c: Regenerate. * generated/maxloc1_8_r10.c: Regenerate. * generated/maxloc1_8_r16.c: Regenerate. * generated/maxloc1_8_r4.c: Regenerate. * generated/maxloc1_8_r8.c: Regenerate. * generated/maxval_i1.c: Regenerate. * generated/maxval_i16.c: Regenerate. * generated/maxval_i2.c: Regenerate. * generated/maxval_i4.c: Regenerate. * generated/maxval_i8.c: Regenerate. * generated/maxval_r10.c: Regenerate. * generated/maxval_r16.c: Regenerate. * generated/maxval_r4.c: Regenerate. * generated/maxval_r8.c: Regenerate. * generated/minloc0_16_i1.c: Regenerate. * generated/minloc0_16_i16.c: Regenerate. * generated/minloc0_16_i2.c: Regenerate. * generated/minloc0_16_i4.c: Regenerate. * generated/minloc0_16_i8.c: Regenerate. * generated/minloc0_16_r10.c: Regenerate. * generated/minloc0_16_r16.c: Regenerate. * generated/minloc0_16_r4.c: Regenerate. * generated/minloc0_16_r8.c: Regenerate. * generated/minloc0_4_i1.c: Regenerate. * generated/minloc0_4_i16.c: Regenerate. * generated/minloc0_4_i2.c: Regenerate. * generated/minloc0_4_i4.c: Regenerate. * generated/minloc0_4_i8.c: Regenerate. * generated/minloc0_4_r10.c: Regenerate. * generated/minloc0_4_r16.c: Regenerate. * generated/minloc0_4_r4.c: Regenerate. * generated/minloc0_4_r8.c: Regenerate. * generated/minloc0_8_i1.c: Regenerate. * generated/minloc0_8_i16.c: Regenerate. * generated/minloc0_8_i2.c: Regenerate. * generated/minloc0_8_i4.c: Regenerate. * generated/minloc0_8_i8.c: Regenerate. * generated/minloc0_8_r10.c: Regenerate. * generated/minloc0_8_r16.c: Regenerate. * generated/minloc0_8_r4.c: Regenerate. * generated/minloc0_8_r8.c: Regenerate. * generated/minloc1_16_i1.c: Regenerate. * generated/minloc1_16_i16.c: Regenerate. * generated/minloc1_16_i2.c: Regenerate. * generated/minloc1_16_i4.c: Regenerate. * generated/minloc1_16_i8.c: Regenerate. * generated/minloc1_16_r10.c: Regenerate. * generated/minloc1_16_r16.c: Regenerate. * generated/minloc1_16_r4.c: Regenerate. * generated/minloc1_16_r8.c: Regenerate. * generated/minloc1_4_i1.c: Regenerate. * generated/minloc1_4_i16.c: Regenerate. * generated/minloc1_4_i2.c: Regenerate. * generated/minloc1_4_i4.c: Regenerate. * generated/minloc1_4_i8.c: Regenerate. * generated/minloc1_4_r10.c: Regenerate. * generated/minloc1_4_r16.c: Regenerate. * generated/minloc1_4_r4.c: Regenerate. * generated/minloc1_4_r8.c: Regenerate. * generated/minloc1_8_i1.c: Regenerate. * generated/minloc1_8_i16.c: Regenerate. * generated/minloc1_8_i2.c: Regenerate. * generated/minloc1_8_i4.c: Regenerate. * generated/minloc1_8_i8.c: Regenerate. * generated/minloc1_8_r10.c: Regenerate. * generated/minloc1_8_r16.c: Regenerate. * generated/minloc1_8_r4.c: Regenerate. * generated/minloc1_8_r8.c: Regenerate. * generated/minval_i1.c: Regenerate. * generated/minval_i16.c: Regenerate. * generated/minval_i2.c: Regenerate. * generated/minval_i4.c: Regenerate. * generated/minval_i8.c: Regenerate. * generated/minval_r10.c: Regenerate. * generated/minval_r16.c: Regenerate. * generated/minval_r4.c: Regenerate. * generated/minval_r8.c: Regenerate. * generated/norm2_r10.c: Regenerate. * generated/norm2_r16.c: Regenerate. * generated/norm2_r4.c: Regenerate. * generated/norm2_r8.c: Regenerate. * generated/pack_c10.c: Regenerate. * generated/pack_c16.c: Regenerate. * generated/pack_c4.c: Regenerate. * generated/pack_c8.c: Regenerate. * generated/pack_i1.c: Regenerate. * generated/pack_i16.c: Regenerate. * generated/pack_i2.c: Regenerate. * generated/pack_i4.c: Regenerate. * generated/pack_i8.c: Regenerate. * generated/pack_r10.c: Regenerate. * generated/pack_r16.c: Regenerate. * generated/pack_r4.c: Regenerate. * generated/pack_r8.c: Regenerate. * generated/parity_l1.c: Regenerate. * generated/parity_l16.c: Regenerate. * generated/parity_l2.c: Regenerate. * generated/parity_l4.c: Regenerate. * generated/parity_l8.c: Regenerate. * generated/product_c10.c: Regenerate. * generated/product_c16.c: Regenerate. * generated/product_c4.c: Regenerate. * generated/product_c8.c: Regenerate. * generated/product_i1.c: Regenerate. * generated/product_i16.c: Regenerate. * generated/product_i2.c: Regenerate. * generated/product_i4.c: Regenerate. * generated/product_i8.c: Regenerate. * generated/product_r10.c: Regenerate. * generated/product_r16.c: Regenerate. * generated/product_r4.c: Regenerate. * generated/product_r8.c: Regenerate. * generated/reshape_c10.c: Regenerate. * generated/reshape_c16.c: Regenerate. * generated/reshape_c4.c: Regenerate. * generated/reshape_c8.c: Regenerate. * generated/reshape_i16.c: Regenerate. * generated/reshape_i4.c: Regenerate. * generated/reshape_i8.c: Regenerate. * generated/reshape_r10.c: Regenerate. * generated/reshape_r16.c: Regenerate. * generated/reshape_r4.c: Regenerate. * generated/reshape_r8.c: Regenerate. * generated/shape_i1.c: Regenerate. * generated/shape_i16.c: Regenerate. * generated/shape_i2.c: Regenerate. * generated/shape_i4.c: Regenerate. * generated/shape_i8.c: Regenerate. * generated/spread_c10.c: Regenerate. * generated/spread_c16.c: Regenerate. * generated/spread_c4.c: Regenerate. * generated/spread_c8.c: Regenerate. * generated/spread_i1.c: Regenerate. * generated/spread_i16.c: Regenerate. * generated/spread_i2.c: Regenerate. * generated/spread_i4.c: Regenerate. * generated/spread_i8.c: Regenerate. * generated/spread_r10.c: Regenerate. * generated/spread_r16.c: Regenerate. * generated/spread_r4.c: Regenerate. * generated/spread_r8.c: Regenerate. * generated/sum_c10.c: Regenerate. * generated/sum_c16.c: Regenerate. * generated/sum_c4.c: Regenerate. * generated/sum_c8.c: Regenerate. * generated/sum_i1.c: Regenerate. * generated/sum_i16.c: Regenerate. * generated/sum_i2.c: Regenerate. * generated/sum_i4.c: Regenerate. * generated/sum_i8.c: Regenerate. * generated/sum_r10.c: Regenerate. * generated/sum_r16.c: Regenerate. * generated/sum_r4.c: Regenerate. * generated/sum_r8.c: Regenerate. * generated/unpack_c10.c: Regenerate. * generated/unpack_c16.c: Regenerate. * generated/unpack_c4.c: Regenerate. * generated/unpack_c8.c: Regenerate. * generated/unpack_i1.c: Regenerate. * generated/unpack_i16.c: Regenerate. * generated/unpack_i2.c: Regenerate. * generated/unpack_i4.c: Regenerate. * generated/unpack_i8.c: Regenerate. * generated/unpack_r10.c: Regenerate. * generated/unpack_r16.c: Regenerate. * generated/unpack_r4.c: Regenerate. * generated/unpack_r8.c: Regenerate. From-SVN: r243844
2016-10-26New I/O specifiers CARRIAGECONTROL, READONLY, SHARE with -fdec.Fritz Reese1-1/+88
gcc/fortran/ * gfortran.texi: Document. * frontend-passes.c (gfc_code_walker): Add SHARE and CARRIAGECONTROL. * io.c (gfc_free_open, gfc_resolve_open, gfc_match_open): Ditto. * gfortran.h (gfc_open): Add SHARE, CARRIAGECONTROL, and READONLY. * io.c (io_tag, match_open_element): Ditto. * ioparm.def: Ditto. * trans-io.c (gfc_trans_open): Ditto. * io.c (match_dec_etag, match_dec_ftag): New functions. libgfortran/io/ * libgfortran.h (IOPARM_OPEN_HAS_READONLY, IOPARM_OPEN_HAS_SHARE, IOPARM_OPEN_HAS_CC): New for READONLY, SHARE, and CARRIAGECONTROL. * close.c (st_close): Support READONLY. * io.h (st_parameter_open, unit_flags): Support SHARE, CARRIAGECONTROL, and READONLY. * open.c (st_open): Ditto. * transfer.c (data_transfer_init): Ditto. * io.h (st_parameter_dt): New member 'cc' for CARRIAGECONTROL. * write.c (write_check_cc, write_cc): New functions for CARRIAGECONTROL. * transfer.c (next_record_cc): Ditto. * file_pos.c (st_endfile): Support SHARE and CARRIAGECONTROL. * io.h (st_parameter_inquire): Ditto. * open.c (edit_modes, new_unit): Ditto. * inquire.c (inquire_via_unit, inquire_via_filename): Ditto. * io.h (unit_share, unit_cc, cc_fortran, IOPARM_INQUIRE_HAS_SHARE, IOPARM_INQUIRE_HAS_CC): New for SHARE and CARRIAGECONTROL. * open.c (share_opt, cc_opt): Ditto. * read.c (read_x): Support CARRIAGECONTROL. * transfer.c (read_sf, next_record_r, next_record_w): Ditto. * write.c (list_formatted_write_scalar, write_a): Ditto. * unix.h (close_share): New prototype. * unix.c (open_share, close_share): New functions to handle SHARE. * unix.c (open_external): Handle READONLY. Call open_share. * close.c (st_close): Call close_share. gcc/testsuite/ * dec_io_1.f90: New test. * dec_io_2.f90: New test. * dec_io_3.f90: New test. * dec_io_4.f90: New test. * dec_io_5.f90: New test. * dec_io_6.f90: New test. From-SVN: r241550
2016-10-09PR 67585 Handle EINTRJanne Blomqvist1-26/+60
Many POSIX systems have the bad habit of not restarting interrupted syscalls. On these systems it's up to the user to check for an error with errno == EINTR and restart manually. This patch does this for libgfortran, so that GFortran users don't have to do it. 2016-10-09 Janne Blomqvist <jb@gcc.gnu.org> PR libfortran/67585 * io/io.h: TEMP_FAILURE_RETRY: Define macro if not found. * io/unix.c (raw_read): Handle EINTR. (raw_write): Check for return value -1. (raw_seek): Handle EINTR. (raw_tell): Likewise. (raw_size): Likewise. (raw_truncate): Likewise. (raw_close): Likewise. (buf_flush): Call raw_seek instead of lseek. (buf_read): Likewise. (buf_write): Likewise. (fd_to_stream): Handle EINTR. (tempfile_open): Likewise. (regular_file2): Likewise. (compare_file_filename): Likewise. (find_file): Likewise. (inquire_sequential): Likewise. (inquire_direct): Likewise. (inquire_formatted): Likewise. From-SVN: r240902
2016-08-31[multiple changes]Paul Thomas1-1/+1
2016-08-31 Paul Thomas <pault@gcc.gnu.org> Jerry DeLisle <jvdelisle@gcc.gnu.org> PR fortran/48298 * decl.c (access_attr_decl): Include case INTERFACE_DTIO as appropriate. * gfortran.h : Add INTRINSIC_FORMATTED and INTRINSIC_UNFORMATTED to gfc_intrinsic_op. Add INTERFACE_DTIO to interface type. Add new enum 'dtio_codes'. Add bitfield 'has_dtio_procs' to symbol_attr. Add prototypes 'gfc_check_dtio_interfaces' and 'gfc_find_specific_dtio_proc'. * interface.c (dtio_op): New function. (gfc_match_generic_spec): Match generic DTIO interfaces. (gfc_match_interface): Treat DTIO interfaces in the same way as (gfc_current_interface_head): Add INTERFACE_DTIO appropriately. (check_dtio_arg_TKR_intent): New function. (check_dtio_interface1): New function. (gfc_check_dtio_interfaces): New function. (gfc_find_specific_dtio_proc): New function. * io.c : Add FMT_DT to format_token. (format_lex): Handle DTIO formatting. * match.c (gfc_op2string): Add DTIO operators. * resolve.c (derived_inaccessible): Ignore pointer components to enclosing derived type. (resolve_transfer): Resolve transfers that involve DTIO. procedures. Find the specific subroutine for the transfer and use its existence to over-ride some of the constraints on derived types. If the transfer is recursive, require that the subroutine be so qualified. (dtio_procs_present): New function. (resolve_fl_namelist): Remove inhibition of polymorphic objects in namelists if DTIO read and write subroutines exist. Likewise for derived types. (resolve_types): Invoke 'gfc_verify_dtio_procedures'. * symbol.c : Set 'dtio_procs' using 'minit'. * trans-decl.c (gfc_finish_var_decl): If a derived-type/class object is associated with DTIO procedures, make it TREE_STATIC. * trans-expr.c (gfc_get_vptr_from_expr): If the expression drills down to a PARM_DECL, extract the vptr correctly. (gfc_conv_derived_to_class): Check 'info' in the test for 'useflags'. If the se expression exists and is a pointer, use it as the class _data. * trans-io.c : Add IOCALL_X_DERIVED to iocall and the function prototype. Likewise for IOCALL_SET_NML_DTIO_VAL. (set_parameter_tree): Renamed from 'set_parameter_const', now returns void and has new tree argument. Calls modified to match new interface. (transfer_namelist_element): Transfer DTIO procedure pointer and vpointer using the new function IOCALL_SET_NML_DTIO_VAL. (get_dtio_proc): New function. (transfer_expr): Add new argument for the vptr field of class objects. Add the code to call the specific DTIO proc, convert derived types to class and call IOCALL_X_DERIVED. (trans_transfer): Add BT_CLASS to structures for treatment by the scalarizer. Obtain the vptr for the dynamic type, both for scalar and array transfer. 2016-08-31 Jerry DeLisle <jvdelisle@gcc.gnu.org> Paul Thomas <pault@gcc.gnu.org> PR libgfortran/48298 * gfortran.map : Flag _st_set_nml_dtio_var and _gfortran_transfer_derived. * io/format.c (format_lex): Detect DTIO formatting. (parse_format_list): Parse the DTIO format. (next_format): Include FMT_DT. * io/format.h : Likewise. Add structure 'udf' to structure 'fnode' to carry the IOTYPE string and the 'vlist'. * io/io.h : Add prototypes for the two types of DTIO subroutine and a typedef for gfc_class. Also, add to 'namelist_type' fields for the pointer to the DTIO procedure and the vtable. Add fields to struct st_parameter_dt for pointers to the two types of DTIO subroutine. Add to gfc_unit DTIO specific fields. (internal_proto): Add prototype for 'read_user_defined' and 'write_user_defined'. * io/list_read.c (check_buffers): Use the 'current_unit' field. (unget_char): Likewise. (eat_spaces): Likewise. (list_formatted_read_scalar): For case BT_CLASS, call the DTIO procedure. (nml_get_obj_data): Likewise when DTIO procedure is present,. * io/transfer.c : Export prototypes for 'transfer_derived' and 'transfer_derived_write'. (unformatted_read): For case BT_CLASS, call the DTIO procedure. (unformatted_write): Likewise. (formatted_transfer_scalar_read): Likewise. (formatted_transfer_scalar_write: Likewise. (transfer_derived): New function. (data_transfer_init): Set last_char if no child_dtio. (finalize_transfer): Return if child_dtio set. (st_write_done): Add condition for child_dtio not set. Add extra arguments for st_set_nml_var prototype. (set_nml_var): New function that contains the contents of the old version of st_set_nml_var. Also sets the 'dtio_sub' and 'vtable' fields of the 'nml' structure. (st_set_nml_var): Now just calls set_nml_var with 'dtio_sub' and 'vtable' NULL. (st_set_nml_dtio_var): New function that calls set_nml_var. * io/unit.c (get_external_unit): If the found unit child_dtio is non zero, don't do any mutex locking/unlocking. Just return the unit. * io/unix.c (tempfile_open): Revert to C style comment. * io/write.c (list_formatted_write_scalar): Do the DTIO call. (nml_write_obj): Add BT_CLASS and do the DTIO call. 2016-08-31 Jerry DeLisle <jvdelisle@gcc.gnu.org> Paul Thomas <pault@gcc.gnu.org> PR fortran/48298 * gfortran.dg/dtio_1.f90: New test. * gfortran.dg/dtio_2.f90: New test. * gfortran.dg/dtio_3.f90: New test. * gfortran.dg/dtio_4.f90: New test. * gfortran.dg/dtio_5.f90: New test. * gfortran.dg/dtio_6.f90: New test. * gfortran.dg/dtio_7.f90: New test. * gfortran.dg/dtio_8.f90: New test. * gfortran.dg/dtio_9.f90: New test. * gfortran.dg/dtio_10.f90: New test. From-SVN: r239880
2016-01-04Update copyright years.Jakub Jelinek1-1/+1
From-SVN: r232055
2015-09-12re PR libfortran/67527 (io.h sanitizer complains on 1 << 31)Francois-Xavier Coudert1-1/+7
PR libfortran/67527 PR libfortran/67535 PR libfortran/67536 * io/io.h: Use unsigned values for 31-bit left shifts. * io/unix.c (buf_read): Do not call memcpy() with NULL pointer arg. * io/write.c (nml_write_obj): Likewise. From-SVN: r227705
2015-09-04libgfortran: Use remove(3) instead of unlink(2) when deleting files.Janne Blomqvist1-10/+0
testsuite: 2015-09-04 Janne Blomqvist <jb@gcc.gnu.org> * gfortran.dg/read_dir.f90: Delete empty directory when closing rather than calling rmdir, cleanup if open fails. libgfortran: 2015-09-04 Janne Blomqvist <jb@gcc.gnu.org> * io/unix.h (delete_file): Remove prototype. * io/unix.c (delete_file): Remove function. * io/close.c (st_close): Replace delete_file and unlink with remove. * io/open.c (already_open): Replace unlink with remove. From-SVN: r227472
2015-08-29re PR fortran/67367 (Program crashes on READ(IOSTAT=IOS, ...) on directory ↵Jerry DeLisle1-6/+16
OPEN()ed without error) 2015-08-29 Jerry DeLisle <jvdelisle@gcc.gnu.org> PR libgfortran/67367 * io/unix.c (buf_read): Check for error condition and if found return the error code. From-SVN: r227320
2015-08-29* io/unix.c (min): Remove unused macro.Francois-Xavier Coudert1-11/+0
From-SVN: r227317
2015-08-09re PR libfortran/66936 (io/unix.c gratuitously uses S_IRWXG and S_IRWXO on ↵Francois-Xavier Coudert1-0/+6
the basis that umask() is available) PR libfortran/66936 * io/unix.c (__MINGW32__): Undefine HAVE_UMASK. From-SVN: r226750
2015-07-14PR 66861 Fix null pointer crash on mingw.Janne Blomqvist1-2/+5
2015-07-14 Janne Blomqvist <jb@gcc.gnu.org> PR libfortran/66861 * io/unix.c (compare_file_filename): Verify that u->filename is non-NULL before strcmp. (find_file0): Likewise. From-SVN: r225788
2015-03-11PR 65200 Handle EPERM in addition to EACCES.Janne Blomqvist1-2/+2
gcc/fortran ChangeLog: 2015-03-11 Janne Blomqvist <jb@gcc.gnu.org> PR libfortran/65200 * gfortran.texi: Document behavior when opening files without explicit ACTION= specifier. libgfortran ChangeLog: 2015-03-11 Janne Blomqvist <jb@gcc.gnu.org> PR libfortran/65200 * io/open.c (new_unit): Use gf_strerror rather than hardcoding error messages for different errno values. * io/unix.c (regular_file2): Handle EPERM in addition to EACCES. gcc/testsuite ChangeLog: 2015-03-11 Janne Blomqvist <jb@gcc.gnu.org> PR libfortran/65200 * gfortran.dg/open_errors.f90: Update checks for iomsg string. * gfortran.dg/open_new_segv.f90: Fix error message pattern. From-SVN: r221361
2015-01-05Update copyright years.Jakub Jelinek1-1/+1
From-SVN: r219188
2014-09-17PR libfortran/62768 Handle filenames with embedded null characters.Janne Blomqvist1-12/+5
testsuite ChangeLog: 2014-09-17 Janne Blomqvist <jb@gcc.gnu.org> PR libfortran/62768 * gfortran.dg/filename_null.f90: New test. libgfortran ChangeLog: 2014-09-17 Janne Blomqvist <jb@gcc.gnu.org> PR libfortran/62768 * io/io.h (gfc_unit): Store C string for the filename. * io/close.c (st_close): Use gfc_unit.filename. * io/inquire.c (inquire_via_unit): Likewise. * io/open.c (new_unit): Likewise. (already_open): Likewise, unlink file before freeing filename. * io/unit.c (init_units): Likewise. (close_unit_1): Likewise. (filename_from_unit): Likewise. * io/unix.c (compare_file_filename): Likewise. (find_file0): Likewise. (delete_file): Likewise. From-SVN: r215307
2014-06-29re PR libfortran/61640 (KIND=4 Character Array Internal Unit Read Fail)Jerry DeLisle1-2/+2
2014-06-28 Jerry DeLisle <jvdelisle@gcc.gnu.org> PR libgfortran/61640 * io/list_read.c (next_char_internal): Adjust the read length to a single wide character. (eat_spaces): Add missing paren. * io/unix.c (mem_read4): Use the correct mem_alloc function for wide character internal reads. From-SVN: r212118
2014-06-08PR 56981 Flush buffer at record boundary if possible.Janne Blomqvist1-19/+31
2014-06-08 Janne Blomqvist <jb@gcc.gnu.org> PR libfortran/56981 * io/unix.h (struct stream_vtable): Add new member function, markeor. (smarkeor): New inline function. (flush_if_unbuffered): Remove prototype. * io/unix.c (raw_markeor): New function. (raw_vtable): Initialize markeor member. (buf_markeor): New function. (buf_vtable): Initialize markeor member. (mem_vtable): Likewise. (mem4_vtable): Likewise. (flush_if_unbuffered): Remove function. * io/transfer.c (next_record): Call smarkeor instead of flush_if_unbuffered. From-SVN: r211353
2014-05-22PR 60324 Handle long path names, don't use PATH_MAX.Janne Blomqvist1-83/+79
From-SVN: r210738
2014-05-16PR 61187 Fix use of uninitialized memory.Janne Blomqvist1-2/+12
2014-05-16 Janne Blomqvist <jb@gcc.gnu.org> PR libfortran/61187 * io/unix.c (raw_close): Check if s->fd is -1. (fd_to_stream): Check return value of fstat(), handle error. From-SVN: r210527
2014-03-18configure.ac: Check for presence of fcntl.Ulrich Weigand1-1/+1
* configure.ac: Check for presence of fcntl. * configure: Regenerate. * config.h.in: Regenerate. * io/unix.c (set_close_on_exec): Check for HAVE_FCNTL. From-SVN: r208634
2014-01-02Update copyright years in libgfortran/Richard Sandiford1-1/+1
From-SVN: r206296
2013-12-17unix.c (tempfile_open): Only use the needed flag O_CLOEXEC.Andreas Tobler1-1/+1
2013-12-17 Andreas Tobler <andreast@gcc.gnu.org> * io/unix.c (tempfile_open): Only use the needed flag O_CLOEXEC. From-SVN: r206064
2013-11-16When file status is unknown, don't set O_CREAT when opening read-only.Janne Blomqvist1-7/+13
2013-11-15 Janne Blomqvist <jb@gcc.gnu.org> Jerry DeLisle <jvdelisle@gcc.gnu.org> PR fortran/59108 * io/unix.c (regular_file): Don't set O_CREAT when opening a file read-only with unknown status. Mask out O_CREAT when falling back to opening read-only if ACTION= is not set and read-write fails. Co-Authored-By: Jerry DeLisle <jvdelisle@gcc.gnu.org> From-SVN: r204864
2013-11-10Set close-on-exec flag when opening files.Janne Blomqvist1-6/+37
2013-11-10 Janne Blomqvist <jb@gcc.gnu.org> * configure.ac: Check presence of mkostemp. * io/unix.c (set_close_on_exec): New function. (tempfile_open): Use mkostemp and O_CLOEXEC if available, fallback to calling set_close_on_exec. (regular_file): Add O_CLOEXEC to flags if defined. (open_external): Call set_close_on_exec if O_CLOEXEC is not defined. * config.h.in: Regenerated. * configure: Regenerated. * Makefile.in: Regenerated. * aclocal.m4: Regenerated. From-SVN: r204654
2013-05-04environ.c: Include unistd.h.David Edelsohn1-0/+3
* runtime/environ.c: Include unistd.h. * runtime/pause.c: Test HAVE_UNISTD_H. * runtime/stop.c: Same. * io/open.c: Same. * io/unix.c: Same. * io/read.c (si_max): Protect declaration of value. From-SVN: r198603
2013-04-29PR 56981 Improve unbuffered performance on special files.Janne Blomqvist1-7/+32
2013-04-29 Janne Blomqvist <jb@gcc.gnu.org> PR fortran/56981 * io/transfer.c (next_record_w_unf): First fix head marker, then write tail. (next_record): Call flush_if_unbuffered. * io/unix.c (struct unix_stream): Add field unbuffered. (flush_if_unbuffered): New function. (fd_to_stream): New argument. (open_external): Fix fd_to_stream call. (input_stream): Likewise. (output_stream): Likewise. (error_stream): Likewise. * io/unix.h (flush_if_unbuffered): New prototype. From-SVN: r198390
2013-02-21Fix regression when writing formatted sequential to a pipe.Janne Blomqvist1-10/+5
2013-02-21 Janne Blomqvist <jb@gcc.gnu.org> PR libfortran/30162 * io/open.c (test_endfile): Call stell only if size != 0. * io/unix.c (raw_tell): Revert r194679. (raw_size): Return size field only for regular files, otherwise 0. From-SVN: r196210
2013-01-14Update copyright years in libgfortran.Richard Sandiford1-3/+1
From-SVN: r195167