lazarus/components/fpdebug/fpdbgsymtablecontext.pas

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.