diff options
author | Mike Frysinger <vapier@gentoo.org> | 2012-04-03 03:37:26 +0000 |
---|---|---|
committer | Mike Frysinger <vapier@gentoo.org> | 2012-04-03 03:37:26 +0000 |
commit | 23916fffce6bac40347fc5a061c9e073e462f943 (patch) | |
tree | 85aeab61cb42c3ca488bac57d9500e93475fbf29 | |
parent | b1c0804b2ea1532cab67ae4d7b288b8e013615c5 (diff) | |
download | gdb-23916fffce6bac40347fc5a061c9e073e462f943.zip gdb-23916fffce6bac40347fc5a061c9e073e462f943.tar.gz gdb-23916fffce6bac40347fc5a061c9e073e462f943.tar.bz2 |
ld: optimize vfinfo output slightly
ld atm ends up calling the write() syscall on every char when displaying
an error message. For example:
$ echo 'main(){foo();}' | strace -f -ewrite gcc -x c -o /dev/null -
...
[pid 13035] write(2, ":", 1) = 1
[pid 13035] write(2, " ", 1) = 1
[pid 13035] write(2, "I", 1) = 1
[pid 13035] write(2, "n", 1) = 1
[pid 13035] write(2, " ", 1) = 1
[pid 13035] write(2, "f", 1) = 1
[pid 13035] write(2, "u", 1) = 1
[pid 13035] write(2, "n", 1) = 1
[pid 13035] write(2, "c", 1) = 1
[pid 13035] write(2, "t", 1) = 1
[pid 13035] write(2, "i", 1) = 1
[pid 13035] write(2, "o", 1) = 1
[pid 13035] write(2, "n", 1) = 1
[pid 13035] write(2, " ", 1) = 1
[pid 13035] write(2, "`", 1) = 1
...
That's just to write ": In function `main':". A slight optimization in
the vfinfo() func gives a much more reasonable syscall footprint:
...
write(2, ": In function `", 15) = 15
...
Signed-off-by: Mike Frysinger <vapier@gentoo.org>
-rw-r--r-- | ld/ChangeLog | 6 | ||||
-rw-r--r-- | ld/ldmisc.c | 11 |
2 files changed, 13 insertions, 4 deletions
diff --git a/ld/ChangeLog b/ld/ChangeLog index 9801bda..203f986 100644 --- a/ld/ChangeLog +++ b/ld/ChangeLog @@ -1,3 +1,9 @@ +2012-04-02 Mike Frysinger <vapier@gentoo.org> + + * ldmisc.c (vfinfo): Assign new local str to fmt. Delete + putc call. If str and fmt are different, call fwrite on + the difference. + 2012-03-30 Nick Clifton <nickc@redhat.com> * po/vi.po: Updated Vietnamese translation. diff --git a/ld/ldmisc.c b/ld/ldmisc.c index 5112c71..ca1896f 100644 --- a/ld/ldmisc.c +++ b/ld/ldmisc.c @@ -72,11 +72,14 @@ vfinfo (FILE *fp, const char *fmt, va_list arg, bfd_boolean is_warning) while (*fmt != '\0') { + const char *str = fmt; while (*fmt != '%' && *fmt != '\0') - { - putc (*fmt, fp); - fmt++; - } + fmt++; + if (fmt != str) + if (fwrite (str, 1, fmt - str, fp)) + { + /* Ignore. */ + } if (*fmt == '%') { |