diff options
author | Oleg Tolmatcev <oleg.tolmatcev@gmail.com> | 2023-05-03 16:23:13 +0100 |
---|---|---|
committer | Nick Clifton <nickc@redhat.com> | 2023-05-03 16:23:13 +0100 |
commit | a2243c30bc13c9adce71d70eeb5e97b7846b48f3 (patch) | |
tree | 77273f76536b72de7ffa6007b2ed7736d0a731f6 /bfd | |
parent | 9b0ccb1ebaef7474d4f7242f778531ef042a55fc (diff) | |
download | fsf-binutils-gdb-a2243c30bc13c9adce71d70eeb5e97b7846b48f3.zip fsf-binutils-gdb-a2243c30bc13c9adce71d70eeb5e97b7846b48f3.tar.gz fsf-binutils-gdb-a2243c30bc13c9adce71d70eeb5e97b7846b48f3.tar.bz2 |
Make ar faster
* archive.c (_bfd_write_archive_contents): Use a larger buffer in order to improve efficiency.
Diffstat (limited to 'bfd')
-rw-r--r-- | bfd/ChangeLog | 5 | ||||
-rw-r--r-- | bfd/archive.c | 21 |
2 files changed, 21 insertions, 5 deletions
diff --git a/bfd/ChangeLog b/bfd/ChangeLog index 61a488c34..013386d 100644 --- a/bfd/ChangeLog +++ b/bfd/ChangeLog @@ -1,5 +1,10 @@ 2023-05-03 Oleg Tolmatcev <oleg.tolmatcev@gmail.com> + * archive.c (_bfd_write_archive_contents): Use a larger buffer in + order to improve efficiency. + +2023-05-03 Oleg Tolmatcev <oleg.tolmatcev@gmail.com> + * coffcode.h (coff_read_word_from_buffer): New function. * coffcode.h (COFF_CHECKSUM_BUFFER_SIZE): New constant. * coffcode.h (coff_compute_checksum): Improve speed by reducing diff --git a/bfd/archive.c b/bfd/archive.c index 273a1b3..f6cae7a 100644 --- a/bfd/archive.c +++ b/bfd/archive.c @@ -2142,6 +2142,7 @@ _bfd_write_archive_contents (bfd *arch) bfd_size_type wrote; int tries; char *armag; + char *buffer = NULL; /* Verify the viability of all entries; if any of them live in the filesystem (as opposed to living in an archive open for input) @@ -2222,16 +2223,23 @@ _bfd_write_archive_contents (bfd *arch) } } +#define AR_WRITE_BUFFERSIZE (DEFAULT_BUFFERSIZE * 1024) + + /* FIXME: Find a way to test link_info.reduce_memory_overheads + and change the buffer size. */ + buffer = bfd_malloc (AR_WRITE_BUFFERSIZE); + if (buffer == NULL) + goto input_err; + for (current = arch->archive_head; current != NULL; current = current->archive_next) { - char buffer[DEFAULT_BUFFERSIZE]; bfd_size_type remaining = arelt_size (current); /* Write ar header. */ if (!_bfd_write_ar_hdr (arch, current)) - return false; + goto input_err; if (bfd_is_thin_archive (arch)) continue; if (bfd_seek (current, (file_ptr) 0, SEEK_SET) != 0) @@ -2239,7 +2247,7 @@ _bfd_write_archive_contents (bfd *arch) while (remaining) { - size_t amt = DEFAULT_BUFFERSIZE; + size_t amt = AR_WRITE_BUFFERSIZE; if (amt > remaining) amt = remaining; @@ -2247,17 +2255,19 @@ _bfd_write_archive_contents (bfd *arch) if (bfd_bread (buffer, amt, current) != amt) goto input_err; if (bfd_bwrite (buffer, amt, arch) != amt) - return false; + goto input_err; remaining -= amt; } if ((arelt_size (current) % 2) == 1) { if (bfd_bwrite (&ARFMAG[1], 1, arch) != 1) - return false; + goto input_err; } } + free (buffer); + if (makemap && hasobjects) { /* Verify the timestamp in the archive file. If it would not be @@ -2281,6 +2291,7 @@ _bfd_write_archive_contents (bfd *arch) input_err: bfd_set_input_error (current, bfd_get_error ()); + free (buffer); return false; } |