mirror of
https://gitlab.com/freepascal.org/lazarus/lazarus.git
synced 2025-04-09 23:08:05 +02:00
* Merge branch 'lazarus-fpdebug-readregisterasaddress' into 'main'
See merge request freepascal.org/lazarus/lazarus!43
This commit is contained in:
commit
736f8182f9
@ -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
|
||||
|
@ -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;
|
||||
|
@ -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
|
||||
|
@ -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;
|
||||
|
@ -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;
|
||||
|
@ -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);
|
||||
|
Loading…
Reference in New Issue
Block a user