mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2026-04-21 08:17:40 +00:00
add a trivial line # cache to SourceMgr to make repeated queries to
FindLineNumber much faster when in sequence. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@78693 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
@@ -18,7 +18,24 @@
|
||||
#include "llvm/Support/raw_ostream.h"
|
||||
using namespace llvm;
|
||||
|
||||
namespace {
|
||||
struct LineNoCacheTy {
|
||||
int LastQueryBufferID;
|
||||
const char *LastQuery;
|
||||
unsigned LineNoOfQuery;
|
||||
};
|
||||
}
|
||||
|
||||
static LineNoCacheTy *getCache(void *Ptr) {
|
||||
return (LineNoCacheTy*)Ptr;
|
||||
}
|
||||
|
||||
|
||||
SourceMgr::~SourceMgr() {
|
||||
// Delete the line # cache if allocated.
|
||||
if (LineNoCacheTy *Cache = getCache(LineNoCache))
|
||||
delete Cache;
|
||||
|
||||
while (!Buffers.empty()) {
|
||||
delete Buffers.back().Buffer;
|
||||
Buffers.pop_back();
|
||||
@@ -71,8 +88,31 @@ unsigned SourceMgr::FindLineNumber(SMLoc Loc, int BufferID) const {
|
||||
|
||||
const char *Ptr = Buff->getBufferStart();
|
||||
|
||||
// If we have a line number cache, and if the query is to a later point in the
|
||||
// same file, start searching from the last query location. This optimizes
|
||||
// for the case when multiple diagnostics come out of one file in order.
|
||||
if (LineNoCacheTy *Cache = getCache(LineNoCache))
|
||||
if (Cache->LastQueryBufferID == BufferID &&
|
||||
Cache->LastQuery <= Loc.getPointer()) {
|
||||
Ptr = Cache->LastQuery;
|
||||
LineNo = Cache->LineNoOfQuery;
|
||||
}
|
||||
|
||||
// Scan for the location being queried, keeping track of the number of lines
|
||||
// we see.
|
||||
for (; SMLoc::getFromPointer(Ptr) != Loc; ++Ptr)
|
||||
if (*Ptr == '\n') ++LineNo;
|
||||
|
||||
|
||||
// Allocate the line number cache if it doesn't exist.
|
||||
if (LineNoCache == 0)
|
||||
LineNoCache = new LineNoCacheTy();
|
||||
|
||||
// Update the line # cache.
|
||||
LineNoCacheTy &Cache = *getCache(LineNoCache);
|
||||
Cache.LastQueryBufferID = BufferID;
|
||||
Cache.LastQuery = Ptr;
|
||||
Cache.LineNoOfQuery = LineNo;
|
||||
return LineNo;
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user