summaryrefslogtreecommitdiffstats
path: root/lld/COFF/Writer.cpp
diff options
context:
space:
mode:
authorGraydon Hoare <ghoare@apple.com>2018-04-07 00:44:02 +0000
committerGraydon Hoare <ghoare@apple.com>2018-04-07 00:44:02 +0000
commit54fe208a5f366d776511fe99fef857490eb4426f (patch)
tree3f47544e006348a0c326107a052c9db233f62425 /lld/COFF/Writer.cpp
parent8a5ea618866ab00e1e4fd7d3083871cbd742046a (diff)
downloadbcm5719-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
OpenPOWER on IntegriCloud