+ use a hash table to speed up line info retrieval

git-svn-id: trunk@49080 -
This commit is contained in:
florian 2021-03-29 12:20:39 +00:00
parent e7e2b7db41
commit 4dfcdeaef8

View File

@ -1284,6 +1284,23 @@ begin
end;
end;
const
{ 64 bit and 32 bit CPUs tend to have more memory }
{$if defined(CPU64)}
LineInfoCacheLength = 2039;
{$elseif defined(CPU32)}
LineInfoCacheLength = 251;
{$else}
LineInfoCacheLength = 1;
{$endif CPU64}
var
LineInfoCache : array[0..LineInfoCacheLength-1] of
record
addr : codeptruint;
func, source : string;
line : longint;
end;
function GetLineInfo(addr : codeptruint; var func, source : string; var line : longint) : boolean;
var
@ -1292,6 +1309,7 @@ var
segment : Word = 0;
found, found_aranges : Boolean;
CacheIndex: CodePtrUInt;
begin
func := '';
@ -1301,6 +1319,17 @@ begin
if not OpenDwarf(codepointer(addr)) then
exit;
CacheIndex:=addr mod LineInfoCacheLength;
if LineInfoCache[CacheIndex].addr=addr then
begin
func:=LineInfoCache[CacheIndex].func;
source:=LineInfoCache[CacheIndex].source;
line:=LineInfoCache[CacheIndex].line;
GetLineInfo:=true;
exit;
end;
{$ifdef CPUI8086}
{$if defined(FPC_MM_MEDIUM) or defined(FPC_MM_LARGE) or defined(FPC_MM_HUGE)}
segment := (addr shr 16) - e.processsegment;
@ -1363,6 +1392,11 @@ begin
if not AllowReuseOfLineInfoData then
CloseDwarf;
LineInfoCache[CacheIndex].addr:=addr;
LineInfoCache[CacheIndex].func:=func;
LineInfoCache[CacheIndex].source:=source;
LineInfoCache[CacheIndex].line:=line;
GetLineInfo:=true;
end;