mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2025-08-24 07:30:11 +02:00
+ use a hash table to speed up line info retrieval
git-svn-id: trunk@49080 -
This commit is contained in:
parent
e7e2b7db41
commit
4dfcdeaef8
@ -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;
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user