summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authormarco <marco@3ad0048d-3df7-0310-abae-a5850022a9f2>2021-03-30 20:10:09 +0000
committermarco <marco@3ad0048d-3df7-0310-abae-a5850022a9f2>2021-03-30 20:10:09 +0000
commit43175cc9bcd71d2a1352d01a2db695dd69ba9bbb (patch)
tree7b85d664e091d9bc97b83b1f968c37be4a4c37c0
parent6432b512726f0b3167ec916c5cf67cf3dfbd922a (diff)
downloadfpc-43175cc9bcd71d2a1352d01a2db695dd69ba9bbb.tar.gz
--- Merging r49080 into '.':
U rtl/inc/lnfodwrf.pp --- Recording mergeinfo for merge of r49080 into '.': U . --- Merging r49086 into '.': G rtl/inc/lnfodwrf.pp --- Recording mergeinfo for merge of r49086 into '.': G . # revisions: 49080,49086 r49080 | florian | 2021-03-29 14:20:39 +0200 (Mon, 29 Mar 2021) | 1 line Changed paths: M /trunk/rtl/inc/lnfodwrf.pp + use a hash table to speed up line info retrieval r49086 | florian | 2021-03-30 16:06:19 +0200 (Tue, 30 Mar 2021) | 1 line Changed paths: M /trunk/rtl/inc/lnfodwrf.pp * check for cache entry before even trying to open the file containing the debug info git-svn-id: https://svn.freepascal.org/svn/fpc/branches/fixes_3_2@49088 3ad0048d-3df7-0310-abae-a5850022a9f2
-rw-r--r--rtl/inc/lnfodwrf.pp34
1 files changed, 34 insertions, 0 deletions
diff --git a/rtl/inc/lnfodwrf.pp b/rtl/inc/lnfodwrf.pp
index d182c1f918..2a0de65da6 100644
--- a/rtl/inc/lnfodwrf.pp
+++ b/rtl/inc/lnfodwrf.pp
@@ -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,12 +1309,24 @@ var
segment : Word = 0;
found, found_aranges : Boolean;
+ CacheIndex: CodePtrUInt;
begin
func := '';
source := '';
GetLineInfo:=false;
+ 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;
+
if not OpenDwarf(codepointer(addr)) then
exit;
@@ -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;