[lld] Buffer writes when composing a single diagnostic
authorFangrui Song <i@maskray.me>
Thu, 9 Sep 2021 16:27:14 +0000 (09:27 -0700)
committerFangrui Song <i@maskray.me>
Thu, 9 Sep 2021 16:27:14 +0000 (09:27 -0700)
commit0db402c5b4ef60ca8d20dda8bb59c7288a534e2a
tree93e760672d597379d475b037382ebad27e5e0450
parent0782e55c26bf56cd28c26793920fa37883bcf689
[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
lld/Common/ErrorHandler.cpp
lld/include/lld/Common/ErrorHandler.h
llvm/include/llvm/Support/raw_ostream.h