Преглед изворни кода

--- 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: branches/fixes_3_2@49088 -

marco пре 4 година
родитељ
комит
44383938f9
1 измењених фајлова са 34 додато и 0 уклоњено
  1. 34 0
      rtl/inc/lnfodwrf.pp

+ 34 - 0
rtl/inc/lnfodwrf.pp

@@ -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,12 +1309,24 @@ var
   segment : Word = 0;
   segment : Word = 0;
 
 
   found, found_aranges : Boolean;
   found, found_aranges : Boolean;
+  CacheIndex: CodePtrUInt;
 
 
 begin
 begin
   func := '';
   func := '';
   source := '';
   source := '';
   GetLineInfo:=false;
   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
   if not OpenDwarf(codepointer(addr)) then
     exit;
     exit;
 
 
@@ -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;