[COFF] Add and use a zero-copy tokenizer for .drectve
authorReid Kleckner <rnk@google.com>
Fri, 1 May 2020 14:34:12 +0000 (07:34 -0700)
committerReid Kleckner <rnk@google.com>
Sat, 2 May 2020 17:47:02 +0000 (10:47 -0700)
commit270d3faf6e0d09ec00ba51b46241534bc6455256
tree7f96df8e86fe60e0deb34941bbd6e1934129499c
parentf7bf28b2c02a4785d0d533fbbe4a7d8810b6dcf1
[COFF] Add and use a zero-copy tokenizer for .drectve

This generalizes the main Windows command line tokenizer to be able to
produce StringRef substrings as well as freshly copied C strings. The
implementation is still shared with the normal tokenizer, which is
important, because we have unit tests for that.

.drective sections can be very long. They can potentially list up to
every symbol in the object file by name. It is worth avoiding these
string copies.

This saves a lot of memory when linking chrome.dll with PGO
instrumentation:

             BEFORE      AFTER      % IMP
peak memory: 6657.76MB   4983.54MB  -25%
real:        4m30.875s   2m26.250s  -46%

The time improvement may not be real, my machine was noisy while running
this, but that the peak memory usage improvement should be real.

This change may also help apps that heavily use dllexport annotations,
because those also use linker directives in object files. Apps that do
not use many directives are unlikely to be affected.

Reviewed By: thakis

Differential Revision: https://reviews.llvm.org/D79262
lld/COFF/DriverUtils.cpp
llvm/include/llvm/Support/CommandLine.h
llvm/lib/Support/CommandLine.cpp