* Merge branch 'lazarus-fpdebug-readregisterasaddress' into 'main'

See merge request freepascal.org/lazarus/lazarus!43
This commit is contained in:
Martin 2023-12-12 13:19:13 +01:00
commit 736f8182f9
6 changed files with 77 additions and 7 deletions

View File

@ -46,6 +46,12 @@ const
type
{ TAvrMemManager }
TAvrMemManager = class(TFpDbgMemManager)
function ReadRegisterAsAddress(ARegNum: Cardinal; out AValue: TDbgPtr; AContext: TFpDbgLocationContext): Boolean; override;
end;
{ TDbgAvrThread }
TDbgAvrThread = class(TDbgThread)
@ -171,6 +177,30 @@ uses
var
DBG_VERBOSE, DBG_WARNINGS: PLazLoggerLogGroup;
{ TAvrMemManager }
function TAvrMemManager.ReadRegisterAsAddress(ARegNum: Cardinal; out
AValue: TDbgPtr; AContext: TFpDbgLocationContext): Boolean;
const
AvrDataOffset = $800000;
var
tmpVal: TDBGPtr;
begin
Result := ReadRegister(ARegNum, AValue, AContext);
{ Assume the pointer points to data space.
This will be the case for stack based parameters.
But if parameters are stored in registers this could lead to confusion.
E.g. when passing a procedure pointer the pointer points to code space.
Todo: consider adding DW_AT_address_class or DW_AT_segment information on compiler side.
There will be more potential for confusion when section support is added to the compiler }
if Result then
begin
Result := ReadRegister(ARegNum+1, tmpVal, AContext);
if Result then
AValue := AvrDataOffset or (AValue + (word(tmpVal) shl 8));
end;
end;
{ TFpRspWatchPointData }
function TFpRspWatchPointData.BreakWatchPoint(AnIndex: Integer

View File

@ -2310,7 +2310,7 @@ begin
end;
DW_OP_breg0..DW_OP_breg31: begin
if not FContext.ReadRegister(CurInstr^-DW_OP_breg0, NewValue) then begin
if not FContext.ReadRegisterasAddress(CurInstr^-DW_OP_breg0, NewValue) then begin
SetError;
exit;
end;
@ -2319,7 +2319,7 @@ begin
{$POP}
end;
DW_OP_bregx: begin
if not FContext.ReadRegister(ULEB128toOrdinal(CurData), NewValue) then begin
if not FContext.ReadRegisterasAddress(ULEB128toOrdinal(CurData), NewValue) then begin
SetError;
exit;
end;

View File

@ -105,6 +105,7 @@ type
(* ReadRegister needs a Context, to get the thread/stackframe
*)
function ReadRegister(ARegNum: Cardinal; out AValue: TDbgPtr): Boolean; inline;
function ReadRegisterasAddress(ARegNum: Cardinal; out AValue: TDbgPtr): Boolean; inline;
function WriteMemory(const ADestLocation: TFpDbgMemLocation; const ASize: TFpDbgValueSize;
const ASource: Pointer; const AFlags: TFpDbgMemManagerFlags = []
@ -426,6 +427,8 @@ type
(* ReadRegister needs a Context, to get the thread/stackframe
*)
function ReadRegister(ARegNum: Cardinal; out AValue: TDbgPtr; AContext: TFpDbgLocationContext {= nil}): Boolean;
function ReadRegisterAsAddress(ARegNum: Cardinal; out AValue: TDbgPtr; AContext: TFpDbgLocationContext {= nil}): Boolean; virtual;
property MemReader: TFpDbgMemReaderBase read FMemReader;
public
procedure SetCacheManager(ACacheMgr: TFpDbgMemCacheManagerBase);
property CacheManager: TFpDbgMemCacheManagerBase read GetCacheManager;
@ -961,6 +964,12 @@ begin
Result := MemManager.ReadRegister(ARegNum, AValue, Self);
end;
function TFpDbgLocationContext.ReadRegisterasAddress(ARegNum: Cardinal; out
AValue: TDbgPtr): Boolean;
begin
Result := MemManager.ReadRegisterAsAddress(ARegNum, AValue, Self);
end;
function TFpDbgLocationContext.WriteMemory(
const ADestLocation: TFpDbgMemLocation; const ASize: TFpDbgValueSize;
const ASource: Pointer; const AFlags: TFpDbgMemManagerFlags): Boolean;
@ -1908,6 +1917,12 @@ begin
FLastError := CreateError(fpErrFailedReadRegister);
end;
function TFpDbgMemManager.ReadRegisterAsAddress(ARegNum: Cardinal; out
AValue: TDbgPtr; AContext: TFpDbgLocationContext): Boolean;
begin
Result := ReadRegister(ARegNum, AValue, AContext);
end;
function TFpDbgMemManager.SetLength(var ADest: TByteDynArray; ALength: Int64
): Boolean;
begin

View File

@ -382,6 +382,9 @@ type
procedure GetCurrentThreadAndStackFrame(out AThreadId, AStackFrame: Integer);
function GetContextForEvaluate(const ThreadId, StackFrame: Integer): TFpDbgSymbolScope;
function CreateMemReader: TDbgMemReader; virtual;
function CreateMemConverter: TFpDbgMemConvertor; virtual;
function CreateMemManager: TFpDbgMemManager; virtual;
function CreateLineInfo: TDBGLineInfo; override;
function CreateWatches: TWatchesSupplier; override;
function CreateThreads: TThreadsSupplier; override;
@ -3583,6 +3586,21 @@ begin
Result := FindSymbolScope(ThreadId, StackFrame);
end;
function TFpDebugDebugger.CreateMemReader: TDbgMemReader;
begin
Result := TFpDbgMemReader.Create(self);
end;
function TFpDebugDebugger.CreateMemConverter: TFpDbgMemConvertor;
begin
Result := TFpDbgMemConvertorLittleEndian.Create;
end;
function TFpDebugDebugger.CreateMemManager: TFpDbgMemManager;
begin
Result := TFpDbgMemManager.Create(FMemReader, FMemConverter);
end;
function TFpDebugDebugger.GetClassInstanceName(AnAddr: TDBGPtr): string;
var
AnErr: TFpError;
@ -4590,9 +4608,9 @@ begin
FBreakUpdateList := TBreakPointUpdateList.create();
FExceptionStepper := TFpDebugExceptionStepping.Create(Self);
FPrettyPrinter := TFpPascalPrettyPrinter.Create(sizeof(pointer));
FMemReader := TFpDbgMemReader.Create(self);
FMemConverter := TFpDbgMemConvertorLittleEndian.Create;
FMemManager := TFpDbgMemManager.Create(FMemReader, FMemConverter);
FMemReader := CreateMemReader;
FMemConverter := CreateMemConverter;
FMemManager := CreateMemManager;
FMemManager.MemLimits.MaxMemReadSize := TFpDebugDebuggerProperties(GetProperties).MemLimits.MaxMemReadSize;
FMemManager.MemLimits.MaxArrayLen := TFpDebugDebuggerProperties(GetProperties).MemLimits.MaxArrayLen;
FMemManager.MemLimits.MaxStringLen := TFpDebugDebuggerProperties(GetProperties).MemLimits.MaxStringLen;

View File

@ -22,7 +22,7 @@ type
FDbgController: TDbgController;
FMemManager: TFpDbgMemManager;
FMemReader: TDbgMemReader;
FMemConverter: TFpDbgMemConvertorLittleEndian;
FMemConverter: TFpDbgMemConvertor;
FLockList: TFpDbgLockList;
FWorkQueue: TFpThreadPriorityWorkerQueue;
@ -71,7 +71,7 @@ type
property DbgController: TDbgController read FDbgController;
property MemManager: TFpDbgMemManager read FMemManager;
property MemReader: TDbgMemReader read FMemReader;
property MemConverter: TFpDbgMemConvertorLittleEndian read FMemConverter;
property MemConverter: TFpDbgMemConvertor read FMemConverter;
property LockList: TFpDbgLockList read FLockList;
property WorkQueue: TFpThreadPriorityWorkerQueue read FWorkQueue;
end;

View File

@ -66,6 +66,8 @@ type
private
FProcessConfig: TRemoteConfig;
procedure UpdateProcessConfig;
protected
function CreateMemManager: TFpDbgMemManager; override;
public
constructor Create(const AExternalDebugger: String); override;
destructor Destroy; override;
@ -96,6 +98,11 @@ begin
TRemoteConfig(FProcessConFig).SkipSectionsList.Assign(AProperties.SkipUploadOfSectionList);
end;
function TFpRspRemoteDebugger.CreateMemManager: TFpDbgMemManager;
begin
Result := TAvrMemManager.Create(FMemReader, FMemConverter);
end;
constructor TFpRspRemoteDebugger.Create(const AExternalDebugger: String);
begin
inherited Create(AExternalDebugger);