mirror of
https://gitlab.com/freepascal.org/lazarus/lazarus.git
synced 2025-05-01 01:43:48 +02:00
151 lines
3.2 KiB
ObjectPascal
151 lines
3.2 KiB
ObjectPascal
unit fpDbgSymTableContext;
|
|
|
|
{$mode objfpc}{$H+}
|
|
|
|
interface
|
|
|
|
uses
|
|
Classes,
|
|
SysUtils,
|
|
FpDbgLoader,
|
|
FpImgReaderBase,
|
|
DbgIntfBaseTypes,
|
|
fpDbgSymTable,
|
|
FpdMemoryTools,
|
|
FpDbgInfo;
|
|
|
|
type
|
|
|
|
TFpSymbolInfo = class;
|
|
|
|
{ TFpSymbolContext }
|
|
|
|
TFpSymbolContext = class(TFpDbgInfoContext)
|
|
private
|
|
FFpSymbolInfo: TFpSymbolInfo;
|
|
FSizeOfAddress: integer;
|
|
protected
|
|
function GetAddress: TDbgPtr; override;
|
|
function GetStackFrame: Integer; override;
|
|
function GetThreadId: Integer; override;
|
|
function GetSizeOfAddress: Integer; override;
|
|
public
|
|
constructor Create(AFpSymbolInfo: TFpSymbolInfo);
|
|
function FindSymbol(const AName: String): TFpDbgValue; override;
|
|
end;
|
|
|
|
{ TFpSymbolInfo }
|
|
|
|
TFpSymbolInfo = class(TDbgInfo)
|
|
private
|
|
FSymbolList: TfpSymbolList;
|
|
FContext: TFpSymbolContext;
|
|
FImage64Bit: boolean;
|
|
public
|
|
constructor Create(ALoaderList: TDbgImageLoaderList); override;
|
|
destructor Destroy; override;
|
|
function FindContext(AThreadId, AStackFrame: Integer; AAddress: TDbgPtr = 0): TFpDbgInfoContext; override;
|
|
function FindContext(AAddress: TDbgPtr): TFpDbgInfoContext; override;
|
|
function FindSymbol(AAddress: TDbgPtr): TFpDbgSymbol; override;
|
|
function FindSymbol(const AName: String): TFpDbgSymbol; override;
|
|
property Image64Bit: boolean read FImage64Bit;
|
|
end;
|
|
|
|
implementation
|
|
|
|
{ TFpSymbolContext }
|
|
|
|
function TFpSymbolContext.GetAddress: TDbgPtr;
|
|
begin
|
|
result := 0;
|
|
end;
|
|
|
|
function TFpSymbolContext.GetStackFrame: Integer;
|
|
begin
|
|
result := 0;
|
|
end;
|
|
|
|
function TFpSymbolContext.GetThreadId: Integer;
|
|
begin
|
|
result := 1;
|
|
end;
|
|
|
|
function TFpSymbolContext.GetSizeOfAddress: Integer;
|
|
begin
|
|
result := FSizeOfAddress;
|
|
end;
|
|
|
|
constructor TFpSymbolContext.Create(AFpSymbolInfo: TFpSymbolInfo);
|
|
begin
|
|
inherited create;
|
|
FFpSymbolInfo:=AFpSymbolInfo;
|
|
if AFpSymbolInfo.Image64Bit then
|
|
FSizeOfAddress:=8
|
|
else
|
|
FSizeOfAddress:=4;
|
|
end;
|
|
|
|
function TFpSymbolContext.FindSymbol(const AName: String): TFpDbgValue;
|
|
var
|
|
i: integer;
|
|
val: TFpDbgMemLocation;
|
|
begin
|
|
i := FFpSymbolInfo.FSymbolList.IndexOf(AName);
|
|
if i > -1 then
|
|
begin
|
|
val.Address:=TDbgPtr(pointer(FFpSymbolInfo.FSymbolList.Objects[i]));
|
|
val.MType:=mlfTargetMem;
|
|
result := TFpDbgValueConstAddress.Create(val);
|
|
end
|
|
else
|
|
result := nil;
|
|
end;
|
|
|
|
{ TFpSymbolInfo }
|
|
|
|
constructor TFpSymbolInfo.Create(ALoaderList: TDbgImageLoaderList);
|
|
|
|
var
|
|
i: Integer;
|
|
begin
|
|
inherited Create(ALoaderList);
|
|
FContext := TFpSymbolContext.Create(self);
|
|
|
|
FSymbolList := TfpSymbolList.Create;
|
|
for i := 0 to ALoaderList.Count-1 do
|
|
ALoaderList[i].ParseSymbolTable(FSymbolList);
|
|
FImage64Bit := ALoaderList.Image64Bit;
|
|
end;
|
|
|
|
destructor TFpSymbolInfo.Destroy;
|
|
begin
|
|
FSymbolList.Free;
|
|
FContext.Free;
|
|
inherited Destroy;
|
|
end;
|
|
|
|
function TFpSymbolInfo.FindContext(AThreadId, AStackFrame: Integer;
|
|
AAddress: TDbgPtr): TFpDbgInfoContext;
|
|
begin
|
|
Result:=FContext;
|
|
end;
|
|
|
|
function TFpSymbolInfo.FindContext(AAddress: TDbgPtr): TFpDbgInfoContext;
|
|
begin
|
|
Result:=FContext;
|
|
end;
|
|
|
|
function TFpSymbolInfo.FindSymbol(AAddress: TDbgPtr): TFpDbgSymbol;
|
|
begin
|
|
Result:=inherited FindSymbol(AAddress);
|
|
end;
|
|
|
|
function TFpSymbolInfo.FindSymbol(const AName: String): TFpDbgSymbol;
|
|
begin
|
|
result := nil;
|
|
//Result:=FContext.FindSymbol(AName);
|
|
end;
|
|
|
|
end.
|
|
|