mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-11-24 03:33:20 +01:00
add a trivial line # cache to SourceMgr to make repeated queries to
FindLineNumber much faster when in sequence. llvm-svn: 78693
This commit is contained in:
parent
d4f20f9186
commit
be69fa08b6
@ -65,10 +65,14 @@ class SourceMgr {
|
||||
// include files in.
|
||||
std::vector<std::string> IncludeDirectories;
|
||||
|
||||
/// LineNoCache - This is a cache for line number queries, its implementation
|
||||
/// is really private to SourceMgr.cpp.
|
||||
mutable void *LineNoCache;
|
||||
|
||||
SourceMgr(const SourceMgr&); // DO NOT IMPLEMENT
|
||||
void operator=(const SourceMgr&); // DO NOT IMPLEMENT
|
||||
public:
|
||||
SourceMgr() {}
|
||||
SourceMgr() : LineNoCache(0) {}
|
||||
~SourceMgr();
|
||||
|
||||
void setIncludeDirs(const std::vector<std::string> &Dirs) {
|
||||
|
@ -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;
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user