Browse Source

+ use a hash table to speed up line info retrieval

git-svn-id: trunk@49080 -
florian 4 years ago
parent
commit
4dfcdeaef8
1 changed files with 34 additions and 0 deletions
  1. 34 0
      rtl/inc/lnfodwrf.pp

+ 34 - 0
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,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;