HomePhabricator

[lld] Buffer writes when composing a single diagnostic

Authored by MaskRay on Sep 9 2021, 9:27 AM.

Description

[lld] Buffer writes when composing a single diagnostic

llvm::errs() is unbuffered. On a POSIX platform, composing a diagnostic
string may invoke the ::write syscall multiple times, which can be slow.
Buffer writes to a temporary SmallString when composing a single diagnostic to
reduce the number of ::write syscalls to one (also easier to read under
strace/truss).

For an invocation of ld.lld with 62000+ lines of
ld.lld: warning: symbol ordering file: no such symbol: warnings (D87121),
the buffering decreases the write time from 1s to 0.4s (for /dev/tty) and
from 0.4s to 0.1s (for a tmpfs file). This can speed up
relocation R_X86_64_PC32 out of range diagnostic printing as well
with --noinhibit-exec --no-fatal-warnings.

Reviewed By: jhenderson

Differential Revision: https://reviews.llvm.org/D87272