diff options
| author | Graydon Hoare <ghoare@apple.com> | 2018-04-07 00:44:02 +0000 |
|---|---|---|
| committer | Graydon Hoare <ghoare@apple.com> | 2018-04-07 00:44:02 +0000 |
| commit | 54fe208a5f366d776511fe99fef857490eb4426f (patch) | |
| tree | 3f47544e006348a0c326107a052c9db233f62425 /lld/COFF/Writer.cpp | |
| parent | 8a5ea618866ab00e1e4fd7d3083871cbd742046a (diff) | |
| download | bcm5719-llvm-54fe208a5f366d776511fe99fef857490eb4426f.tar.gz bcm5719-llvm-54fe208a5f366d776511fe99fef857490eb4426f.zip | |
[Support] Make line-number cache robust against access patterns.
Summary:
The LLVM SourceMgr class (which is used indirectly by Swift, though not Clang)
has a routine for looking up line numbers of SMLocs. This routine uses a
shared, special-purpose cache that handles exactly one access pattern
efficiently: looking up the line number of an SMLoc that points into the same
buffer as the last query made to the SourceMgr, at a location in the buffer at
or ahead of the last query.
When this works it's fine, but when it fails it's catastrophic for performancer:
one recent out-of-order access from a Swift utility routine ran for tens of
seconds, spending 99% of its time repeatedly scanning buffers for '\n'.
This change removes the shared cache from the SourceMgr and installs a new
cache in each SrcBuffer. The per-SrcBuffer caches are also "full", in the sense
that rather than caching a single last-query pointer, they cache _all_ the
line-ending offsets, in a binary-searchable array, such that once it's
populated (on first access), all subsequent access patterns run at the same
speed.
Performance measurements I've done show this is actually a little bit faster on
real codebases (though only a couple fractions of a percent). Memory usage is
up by a few tens to hundreds of bytes per SrcBuffer that has a line lookup done
on it; I've attempted to minimize this by using dynamic selection of integer
sized when storing offset arrays. But the main motive here is to
make-impossible the cases we don't always see, that show up by surprise when
there is an out-of-order access pattern.
Reviewers: jordan_rose
Reviewed By: jordan_rose
Subscribers: probinson, llvm-commits
Differential Revision: https://reviews.llvm.org/D45003
llvm-svn: 329470
Diffstat (limited to 'lld/COFF/Writer.cpp')
0 files changed, 0 insertions, 0 deletions

