diff --git a/rtl/inc/lnfodwrf.pp b/rtl/inc/lnfodwrf.pp index d182c1f918..d92d2d14c0 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,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;