aboutsummaryrefslogtreecommitdiff
path: root/bfd
diff options
context:
space:
mode:
authorOleg Tolmatcev <oleg.tolmatcev@gmail.com>2023-05-03 16:23:13 +0100
committerNick Clifton <nickc@redhat.com>2023-05-03 16:23:13 +0100
commita2243c30bc13c9adce71d70eeb5e97b7846b48f3 (patch)
tree77273f76536b72de7ffa6007b2ed7736d0a731f6 /bfd
parent9b0ccb1ebaef7474d4f7242f778531ef042a55fc (diff)
downloadfsf-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/ChangeLog5
-rw-r--r--bfd/archive.c21
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;
}