1
0
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:
Chris Lattner 2009-08-11 17:49:14 +00:00
parent d4f20f9186
commit be69fa08b6
2 changed files with 45 additions and 1 deletions

View File

@ -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) {

View File

@ -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;
}