+ 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;
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; function GetLineInfo(addr : codeptruint; var func, source : string; var line : longint) : boolean;
var var
@ -1292,6 +1309,7 @@ var
segment : Word = 0; segment : Word = 0;
found, found_aranges : Boolean; found, found_aranges : Boolean;
CacheIndex: CodePtrUInt;
begin begin
func := ''; func := '';
@ -1301,6 +1319,17 @@ begin
if not OpenDwarf(codepointer(addr)) then if not OpenDwarf(codepointer(addr)) then
exit; 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} {$ifdef CPUI8086}
{$if defined(FPC_MM_MEDIUM) or defined(FPC_MM_LARGE) or defined(FPC_MM_HUGE)} {$if defined(FPC_MM_MEDIUM) or defined(FPC_MM_LARGE) or defined(FPC_MM_HUGE)}
segment := (addr shr 16) - e.processsegment; segment := (addr shr 16) - e.processsegment;
@ -1363,6 +1392,11 @@ begin
if not AllowReuseOfLineInfoData then if not AllowReuseOfLineInfoData then
CloseDwarf; CloseDwarf;
LineInfoCache[CacheIndex].addr:=addr;
LineInfoCache[CacheIndex].func:=func;
LineInfoCache[CacheIndex].source:=source;
LineInfoCache[CacheIndex].line:=line;
GetLineInfo:=true; GetLineInfo:=true;
end; end;