FpDebug: fix new registers as watch result / get text, instead of read-int / add unique reg-nums

This commit is contained in:
Martin 2024-07-11 12:21:40 +02:00
parent f36d862b98
commit 836e23ff27
6 changed files with 249 additions and 198 deletions

View File

@ -57,28 +57,6 @@ type
deFailed);
TFPDCompareStepInfo = (dcsiNewLine, dcsiSameLine, dcsiNoLineInfo, dcsiZeroLine);
{ TDbgRegisterValue }
TDbgRegisterValue = class
private
FDwarfIdx: cardinal;
FName: string;
FNumValue: TDBGPtr;
FSize: byte;
FStrValue: string;
public
constructor Create(const AName: String);
procedure Assign(ASource: TDbgRegisterValue);
function HasEqualVal(AnOther: TDbgRegisterValue): Boolean;
procedure SetValue(ANumValue: TDBGPtr; const AStrValue: string; ASize: byte; ADwarfIdx: cardinal);
procedure Setx86EFlagsValue(ANumValue: TDBGPtr);
property Name: string read FName;
property NumValue: TDBGPtr read FNumValue;
property StrValue: string read FStrValue;
property Size: byte read FSize;
property DwarfIdx: cardinal read FDwarfIdx;
end;
TGDbgRegisterValueList = specialize TFPGObjectList<TDbgRegisterValue>;
{ TDbgRegisterValueList }
@ -163,6 +141,7 @@ type
function ReadRegister(ARegNum: Cardinal; out AValue: TDbgPtr; AContext: TFpDbgLocationContext): Boolean; override;
function RegisterSize(ARegNum: Cardinal): Integer; override;
function RegisterNumber(ARegName: String; out ARegNum: Cardinal): Boolean; override;
function GetRegister(const ARegNum: Cardinal; AContext: TFpDbgLocationContext): TDbgRegisterValue; override;
function WriteRegister(ARegNum: Cardinal; const AValue: TDbgPtr; AContext: TFpDbgLocationContext): Boolean; override;
end;
@ -2043,6 +2022,41 @@ begin
ARegNum := ARegister.DwarfIdx;
end;
function TDbgMemReader.GetRegister(const ARegNum: Cardinal; AContext: TFpDbgLocationContext
): TDbgRegisterValue;
var
ARegister: TDbgRegisterValue;
StackFrame: Integer;
AFrame: TDbgCallstackEntry;
CtxThread: TDbgThread;
begin
// TODO: Thread with ID
result := nil;
CtxThread := GetDbgThread(AContext);
if CtxThread = nil then
exit;
if AContext <> nil then // TODO: Always true?
StackFrame := AContext.StackFrame
else
StackFrame := 0;
if StackFrame = 0 then
begin
Result:=CtxThread.RegisterValueList.FindRegisterByDwarfIndex(ARegNum);
end
else
begin
CtxThread.PrepareCallStackEntryList(StackFrame+1);
if CtxThread.CallStackEntryList.Count <= StackFrame then
exit;
AFrame := CtxThread.CallStackEntryList[StackFrame];
if AFrame <> nil then
Result:=AFrame.RegisterValueList.FindRegisterByDwarfIndex(ARegNum)
else
Result:=nil;
end;
end;
{ TDbgRegisterValueList }
function TDbgRegisterValueList.GetDbgRegister(AName: string
@ -2119,65 +2133,6 @@ begin
Result := GetDbgRegister(AnName);
end;
{ TDbgRegisterValue }
constructor TDbgRegisterValue.Create(const AName: String);
begin
FName:=AName;
end;
procedure TDbgRegisterValue.Assign(ASource: TDbgRegisterValue);
begin
FDwarfIdx := ASource.FDwarfIdx;
FName := ASource.FName;
FNumValue := ASource.FNumValue;
FSize := ASource.FSize;
FStrValue := ASource.FStrValue;
end;
function TDbgRegisterValue.HasEqualVal(AnOther: TDbgRegisterValue): Boolean;
begin
Result :=
(FNumValue = AnOther.FNumValue) and
(FSize = AnOther.FSize) and
(FStrValue = AnOther.FStrValue);
end;
procedure TDbgRegisterValue.SetValue(ANumValue: TDBGPtr;
const AStrValue: string; ASize: byte; ADwarfIdx: cardinal);
begin
FStrValue:=AStrValue;
FNumValue:=ANumValue;
FSize:=ASize;
FDwarfIdx:=ADwarfIdx;
end;
procedure TDbgRegisterValue.Setx86EFlagsValue(ANumValue: TDBGPtr);
var
FlagS: string;
begin
FlagS := '';
if ANumValue and (1 shl 0) <> 0 then FlagS := FlagS + 'CF ';
if ANumValue and (1 shl 2) <> 0 then FlagS := FlagS + 'PF ';
if ANumValue and (1 shl 4) <> 0 then FlagS := FlagS + 'AF ';
if ANumValue and (1 shl 6) <> 0 then FlagS := FlagS + 'ZF ';
if ANumValue and (1 shl 7) <> 0 then FlagS := FlagS + 'SF ';
if ANumValue and (1 shl 8) <> 0 then FlagS := FlagS + 'TF ';
if ANumValue and (1 shl 9) <> 0 then FlagS := FlagS + 'IF ';
if ANumValue and (1 shl 10) <> 0 then FlagS := FlagS + 'DF ';
if ANumValue and (1 shl 11) <> 0 then FlagS := FlagS + 'OF ';
if (ANumValue shr 12) and 3 <> 0 then FlagS := FlagS + 'IOPL=' + IntToStr((ANumValue shr 12) and 3);
if ANumValue and (1 shl 14) <> 0 then FlagS := FlagS + 'NT ';
if ANumValue and (1 shl 16) <> 0 then FlagS := FlagS + 'RF ';
if ANumValue and (1 shl 17) <> 0 then FlagS := FlagS + 'VM ';
if ANumValue and (1 shl 18) <> 0 then FlagS := FlagS + 'AC ';
if ANumValue and (1 shl 19) <> 0 then FlagS := FlagS + 'VIF ';
if ANumValue and (1 shl 20) <> 0 then FlagS := FlagS + 'VIP ';
if ANumValue and (1 shl 21) <> 0 then FlagS := FlagS + 'ID ';
SetValue(ANumValue, trim(FlagS),4,Cardinal(-1));
end;
{ TDbgAsmInstruction }
function TDbgAsmInstruction.IsCallInstruction: boolean;

View File

@ -836,32 +836,34 @@ begin
FRegisterValueList.DbgRegisterAutoCreate['gs'].SetValue(FUserRegs.regs64[gs], IntToStr(FUserRegs.regs64[gs]),8,47);
if FFpRegsAvail then begin
FRegisterValueList.DbgRegisterAutoCreate['st0'].SetValue(0, FloatToStr(PExtended(@FFpRegs.st_space[ 0*4])^),10,0);
FRegisterValueList.DbgRegisterAutoCreate['st1'].SetValue(0, FloatToStr(PExtended(@FFpRegs.st_space[ 1*4])^),10,0);
FRegisterValueList.DbgRegisterAutoCreate['st2'].SetValue(0, FloatToStr(PExtended(@FFpRegs.st_space[ 2*4])^),10,0);
FRegisterValueList.DbgRegisterAutoCreate['st3'].SetValue(0, FloatToStr(PExtended(@FFpRegs.st_space[ 3*4])^),10,0);
FRegisterValueList.DbgRegisterAutoCreate['st4'].SetValue(0, FloatToStr(PExtended(@FFpRegs.st_space[ 4*4])^),10,0);
FRegisterValueList.DbgRegisterAutoCreate['st5'].SetValue(0, FloatToStr(PExtended(@FFpRegs.st_space[ 5*4])^),10,0);
FRegisterValueList.DbgRegisterAutoCreate['st6'].SetValue(0, FloatToStr(PExtended(@FFpRegs.st_space[ 6*4])^),10,0);
FRegisterValueList.DbgRegisterAutoCreate['st7'].SetValue(0, FloatToStr(PExtended(@FFpRegs.st_space[ 7*4])^),10,0);
FRegisterValueList.DbgRegisterAutoCreate['st0'].SetValue(0, FloatToStr(PExtended(@FFpRegs.st_space[ 0*4])^),10,500);
FRegisterValueList.DbgRegisterAutoCreate['st1'].SetValue(0, FloatToStr(PExtended(@FFpRegs.st_space[ 1*4])^),10,501);
FRegisterValueList.DbgRegisterAutoCreate['st2'].SetValue(0, FloatToStr(PExtended(@FFpRegs.st_space[ 2*4])^),10,502);
FRegisterValueList.DbgRegisterAutoCreate['st3'].SetValue(0, FloatToStr(PExtended(@FFpRegs.st_space[ 3*4])^),10,503);
FRegisterValueList.DbgRegisterAutoCreate['st4'].SetValue(0, FloatToStr(PExtended(@FFpRegs.st_space[ 4*4])^),10,504);
FRegisterValueList.DbgRegisterAutoCreate['st5'].SetValue(0, FloatToStr(PExtended(@FFpRegs.st_space[ 5*4])^),10,505);
FRegisterValueList.DbgRegisterAutoCreate['st6'].SetValue(0, FloatToStr(PExtended(@FFpRegs.st_space[ 6*4])^),10,506);
FRegisterValueList.DbgRegisterAutoCreate['st7'].SetValue(0, FloatToStr(PExtended(@FFpRegs.st_space[ 7*4])^),10,507);
FRegisterValueList.DbgRegisterAutoCreate['fctrl'].SetValue(FFpRegs.cwd, IntToStr(FFpRegs.cwd),2,0);
FRegisterValueList.DbgRegisterAutoCreate['fstat'].SetValue(FFpRegs.swd, IntToStr(FFpRegs.swd),2,0);
FRegisterValueList.DbgRegisterAutoCreate['ftwd'].SetValue(FFpRegs.twd, IntToStr(FFpRegs.twd),2,0);
FRegisterValueList.DbgRegisterAutoCreate['fop'].SetValue(FFpRegs.fop, IntToStr(FFpRegs.fop),2,0);
FRegisterValueList.DbgRegisterAutoCreate['fcs'].SetValue(FFpRegs.fcs, IntToStr(FFpRegs.fcs),4,0);
FRegisterValueList.DbgRegisterAutoCreate['fip'].SetValue(FFpRegs.fip, IntToStr(FFpRegs.fip),4,0);
FRegisterValueList.DbgRegisterAutoCreate['foo'].SetValue(FFpRegs.foo, IntToStr(FFpRegs.foo),4,0);
FRegisterValueList.DbgRegisterAutoCreate['fos'].SetValue(FFpRegs.fos, IntToStr(FFpRegs.fos),4,0);
FRegisterValueList.DbgRegisterAutoCreate['fctrl'].SetValue(FFpRegs.cwd, IntToStr(FFpRegs.cwd),2,510);
FRegisterValueList.DbgRegisterAutoCreate['fstat'].SetValue(FFpRegs.swd, IntToStr(FFpRegs.swd),2,511);
FRegisterValueList.DbgRegisterAutoCreate['ftwd'].SetValue(FFpRegs.twd, IntToStr(FFpRegs.twd),2,512);
FRegisterValueList.DbgRegisterAutoCreate['fop'].SetValue(FFpRegs.fop, IntToStr(FFpRegs.fop),2,513);
FRegisterValueList.DbgRegisterAutoCreate['fcs'].SetValue(FFpRegs.fcs, IntToStr(FFpRegs.fcs),4,514);
FRegisterValueList.DbgRegisterAutoCreate['fip'].SetValue(FFpRegs.fip, IntToStr(FFpRegs.fip),4,515);
FRegisterValueList.DbgRegisterAutoCreate['foo'].SetValue(FFpRegs.foo, IntToStr(FFpRegs.foo),4,516);
FRegisterValueList.DbgRegisterAutoCreate['fos'].SetValue(FFpRegs.fos, IntToStr(FFpRegs.fos),4,517);
FRegisterValueList.DbgRegisterAutoCreate['Xmm0' ].SetValue(0, XmmToString(PM128A(@FFpRegs.xmm_space[0*4])^),16,0);
FRegisterValueList.DbgRegisterAutoCreate['Xmm1' ].SetValue(0, XmmToString(PM128A(@FFpRegs.xmm_space[1*4])^),16,0);
FRegisterValueList.DbgRegisterAutoCreate['Xmm2' ].SetValue(0, XmmToString(PM128A(@FFpRegs.xmm_space[2*4])^),16,0);
FRegisterValueList.DbgRegisterAutoCreate['Xmm3' ].SetValue(0, XmmToString(PM128A(@FFpRegs.xmm_space[3*4])^),16,0);
FRegisterValueList.DbgRegisterAutoCreate['Xmm4' ].SetValue(0, XmmToString(PM128A(@FFpRegs.xmm_space[4*4])^),16,0);
FRegisterValueList.DbgRegisterAutoCreate['Xmm5' ].SetValue(0, XmmToString(PM128A(@FFpRegs.xmm_space[5*4])^),16,0);
FRegisterValueList.DbgRegisterAutoCreate['Xmm6' ].SetValue(0, XmmToString(PM128A(@FFpRegs.xmm_space[6*4])^),16,0);
FRegisterValueList.DbgRegisterAutoCreate['Xmm7' ].SetValue(0, XmmToString(PM128A(@FFpRegs.xmm_space[7*4])^),16,0);
FRegisterValueList.DbgRegisterAutoCreate['Xmm0' ].SetValue(0, XmmToString(PM128A(@FFpRegs.xmm_space[0*4])^),16,600);
FRegisterValueList.DbgRegisterAutoCreate['Xmm1' ].SetValue(0, XmmToString(PM128A(@FFpRegs.xmm_space[1*4])^),16,601);
FRegisterValueList.DbgRegisterAutoCreate['Xmm2' ].SetValue(0, XmmToString(PM128A(@FFpRegs.xmm_space[2*4])^),16,602);
FRegisterValueList.DbgRegisterAutoCreate['Xmm3' ].SetValue(0, XmmToString(PM128A(@FFpRegs.xmm_space[3*4])^),16,603);
FRegisterValueList.DbgRegisterAutoCreate['Xmm4' ].SetValue(0, XmmToString(PM128A(@FFpRegs.xmm_space[4*4])^),16,604);
FRegisterValueList.DbgRegisterAutoCreate['Xmm5' ].SetValue(0, XmmToString(PM128A(@FFpRegs.xmm_space[5*4])^),16,605);
FRegisterValueList.DbgRegisterAutoCreate['Xmm6' ].SetValue(0, XmmToString(PM128A(@FFpRegs.xmm_space[6*4])^),16,606);
FRegisterValueList.DbgRegisterAutoCreate['Xmm7' ].SetValue(0, XmmToString(PM128A(@FFpRegs.xmm_space[7*4])^),16,607);
FRegisterValueList.DbgRegisterAutoCreate['mxcsr'].SetValue(FFpRegs.fos, IntToStr(FFpRegs.mxcsr),4,620);
end;
end;

View File

@ -466,7 +466,7 @@ end;
function XmmToString(xmm: M128A): String;
begin
Result := format('D: %s, %s | S: %s, %s, %s, %s | I64: %s, %s | I32: %s, %s, %s, %s | I16: %s, %s, %s, %s, %s, %s, %s, %s | I8: %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s', [
Result := format('{"D": [%s, %s], "S": [%s, %s, %s, %s], "I64": [%s, %s], "I32": [%s, %s, %s, %s], "I16": [%s, %s, %s, %s, %s, %s, %s, %s], "I8": [%s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s]}', [
FloatToStr(PDouble(@xmm+0)^), FloatToStr(PDouble(@xmm+8)^),
FloatToStr(PSingle(@xmm+0)^), FloatToStr(PSingle(@xmm+4)^),

View File

@ -1756,36 +1756,36 @@ begin
FRegisterValueList.DbgRegisterAutoCreate['fs'].SetValue(SegFs, IntToStr(SegFs),4,0);
FRegisterValueList.DbgRegisterAutoCreate['gs'].SetValue(SegGs, IntToStr(SegGs),4,0);
FRegisterValueList.DbgRegisterAutoCreate['st0'].SetValue(0, FloatToStr(PExtended(@FloatSave.RegisterArea[ 0])^),10,0);
FRegisterValueList.DbgRegisterAutoCreate['st1'].SetValue(0, FloatToStr(PExtended(@FloatSave.RegisterArea[10])^),10,0);
FRegisterValueList.DbgRegisterAutoCreate['st2'].SetValue(0, FloatToStr(PExtended(@FloatSave.RegisterArea[20])^),10,0);
FRegisterValueList.DbgRegisterAutoCreate['st3'].SetValue(0, FloatToStr(PExtended(@FloatSave.RegisterArea[30])^),10,0);
FRegisterValueList.DbgRegisterAutoCreate['st4'].SetValue(0, FloatToStr(PExtended(@FloatSave.RegisterArea[40])^),10,0);
FRegisterValueList.DbgRegisterAutoCreate['st5'].SetValue(0, FloatToStr(PExtended(@FloatSave.RegisterArea[50])^),10,0);
FRegisterValueList.DbgRegisterAutoCreate['st6'].SetValue(0, FloatToStr(PExtended(@FloatSave.RegisterArea[60])^),10,0);
FRegisterValueList.DbgRegisterAutoCreate['st7'].SetValue(0, FloatToStr(PExtended(@FloatSave.RegisterArea[70])^),10,0);
FRegisterValueList.DbgRegisterAutoCreate['st0'].SetValue(0, FloatToStr(PExtended(@FloatSave.RegisterArea[ 0])^),10,500);
FRegisterValueList.DbgRegisterAutoCreate['st1'].SetValue(0, FloatToStr(PExtended(@FloatSave.RegisterArea[10])^),10,501);
FRegisterValueList.DbgRegisterAutoCreate['st2'].SetValue(0, FloatToStr(PExtended(@FloatSave.RegisterArea[20])^),10,502);
FRegisterValueList.DbgRegisterAutoCreate['st3'].SetValue(0, FloatToStr(PExtended(@FloatSave.RegisterArea[30])^),10,503);
FRegisterValueList.DbgRegisterAutoCreate['st4'].SetValue(0, FloatToStr(PExtended(@FloatSave.RegisterArea[40])^),10,504);
FRegisterValueList.DbgRegisterAutoCreate['st5'].SetValue(0, FloatToStr(PExtended(@FloatSave.RegisterArea[50])^),10,505);
FRegisterValueList.DbgRegisterAutoCreate['st6'].SetValue(0, FloatToStr(PExtended(@FloatSave.RegisterArea[60])^),10,506);
FRegisterValueList.DbgRegisterAutoCreate['st7'].SetValue(0, FloatToStr(PExtended(@FloatSave.RegisterArea[70])^),10,507);
FRegisterValueList.DbgRegisterAutoCreate['fctrl' ].SetValue(FloatSave.ControlWord, IntToStr(FloatSave.ControlWord),2,0);
FRegisterValueList.DbgRegisterAutoCreate['fstat' ].SetValue(FloatSave.StatusWord, IntToStr(FloatSave.StatusWord),2,0);
FRegisterValueList.DbgRegisterAutoCreate['ftag' ].SetValue(FloatSave.TagWord, IntToStr(FloatSave.TagWord),1,0);
//FRegisterValueList.DbgRegisterAutoCreate['fErrOp' ].SetValue(FloatSave.ErrorOpcode, IntToStr(FloatSave.ErrorOpcode),2,0);
FRegisterValueList.DbgRegisterAutoCreate['fErrOff'].SetValue(FloatSave.ErrorOffset, IntToStr(FloatSave.ErrorOffset),4,0);
FRegisterValueList.DbgRegisterAutoCreate['fErrSel'].SetValue(FloatSave.ErrorSelector, IntToStr(FloatSave.ErrorSelector),2,0);
FRegisterValueList.DbgRegisterAutoCreate['fDatOff'].SetValue(FloatSave.DataOffset, IntToStr(FloatSave.DataOffset),4,0);
FRegisterValueList.DbgRegisterAutoCreate['fDatSel'].SetValue(FloatSave.DataSelector, IntToStr(FloatSave.DataSelector),2,0);
FRegisterValueList.DbgRegisterAutoCreate['fCr0NpxSt'].SetValue(FloatSave.Cr0NpxState, IntToStr(FloatSave.Cr0NpxState),4,0);
FRegisterValueList.DbgRegisterAutoCreate['fctrl' ].SetValue(FloatSave.ControlWord, IntToStr(FloatSave.ControlWord),2,510);
FRegisterValueList.DbgRegisterAutoCreate['fstat' ].SetValue(FloatSave.StatusWord, IntToStr(FloatSave.StatusWord),2,511);
FRegisterValueList.DbgRegisterAutoCreate['ftag' ].SetValue(FloatSave.TagWord, IntToStr(FloatSave.TagWord),1,512);
//FRegisterValueList.DbgRegisterAutoCreate['fErrOp' ].SetValue(FloatSave.ErrorOpcode, IntToStr(FloatSave.ErrorOpcode),2,513);
FRegisterValueList.DbgRegisterAutoCreate['fErrOff'].SetValue(FloatSave.ErrorOffset, IntToStr(FloatSave.ErrorOffset),4,514);
FRegisterValueList.DbgRegisterAutoCreate['fErrSel'].SetValue(FloatSave.ErrorSelector, IntToStr(FloatSave.ErrorSelector),2,515);
FRegisterValueList.DbgRegisterAutoCreate['fDatOff'].SetValue(FloatSave.DataOffset, IntToStr(FloatSave.DataOffset),4,516);
FRegisterValueList.DbgRegisterAutoCreate['fDatSel'].SetValue(FloatSave.DataSelector, IntToStr(FloatSave.DataSelector),2,517);
FRegisterValueList.DbgRegisterAutoCreate['fCr0NpxSt'].SetValue(FloatSave.Cr0NpxState, IntToStr(FloatSave.Cr0NpxState),4,518);
if not FFailed_CONTEXT_EXTENDED_REGISTERS then begin
FRegisterValueList.DbgRegisterAutoCreate['Xmm0'].SetValue(0, XmmToString(PM128A(@ExtendedRegisters[10*16])^),16,0);
FRegisterValueList.DbgRegisterAutoCreate['Xmm1'].SetValue(0, XmmToString(PM128A(@ExtendedRegisters[11*16])^),16,0);
FRegisterValueList.DbgRegisterAutoCreate['Xmm2'].SetValue(0, XmmToString(PM128A(@ExtendedRegisters[12*16])^),16,0);
FRegisterValueList.DbgRegisterAutoCreate['Xmm3'].SetValue(0, XmmToString(PM128A(@ExtendedRegisters[13*16])^),16,0);
FRegisterValueList.DbgRegisterAutoCreate['Xmm4'].SetValue(0, XmmToString(PM128A(@ExtendedRegisters[14*16])^),16,0);
FRegisterValueList.DbgRegisterAutoCreate['Xmm5'].SetValue(0, XmmToString(PM128A(@ExtendedRegisters[15*16])^),16,0);
FRegisterValueList.DbgRegisterAutoCreate['Xmm6'].SetValue(0, XmmToString(PM128A(@ExtendedRegisters[16*16])^),16,0);
FRegisterValueList.DbgRegisterAutoCreate['Xmm7'].SetValue(0, XmmToString(PM128A(@ExtendedRegisters[17*16])^),16,0);
FRegisterValueList.DbgRegisterAutoCreate['Xmm0'].SetValue(0, XmmToString(PM128A(@ExtendedRegisters[10*16])^),16,600);
FRegisterValueList.DbgRegisterAutoCreate['Xmm1'].SetValue(0, XmmToString(PM128A(@ExtendedRegisters[11*16])^),16,601);
FRegisterValueList.DbgRegisterAutoCreate['Xmm2'].SetValue(0, XmmToString(PM128A(@ExtendedRegisters[12*16])^),16,602);
FRegisterValueList.DbgRegisterAutoCreate['Xmm3'].SetValue(0, XmmToString(PM128A(@ExtendedRegisters[13*16])^),16,603);
FRegisterValueList.DbgRegisterAutoCreate['Xmm4'].SetValue(0, XmmToString(PM128A(@ExtendedRegisters[14*16])^),16,604);
FRegisterValueList.DbgRegisterAutoCreate['Xmm5'].SetValue(0, XmmToString(PM128A(@ExtendedRegisters[15*16])^),16,605);
FRegisterValueList.DbgRegisterAutoCreate['Xmm6'].SetValue(0, XmmToString(PM128A(@ExtendedRegisters[16*16])^),16,606);
FRegisterValueList.DbgRegisterAutoCreate['Xmm7'].SetValue(0, XmmToString(PM128A(@ExtendedRegisters[17*16])^),16,607);
FRegisterValueList.DbgRegisterAutoCreate['MxCsr'].SetValue(PDWORD(@ExtendedRegisters[24])^, IntToStr(PDWORD(@ExtendedRegisters[24])^),16,4);
FRegisterValueList.DbgRegisterAutoCreate['MxCsr'].SetValue(PDWORD(@ExtendedRegisters[24])^, IntToStr(PDWORD(@ExtendedRegisters[24])^),4,620);
end;
end;
{$else}
@ -1813,37 +1813,37 @@ begin
// TODO: 64bit extended is not 10 byte // currently downgrading to double
{$IF FPC_Fullversion>30202}
FRegisterValueList.DbgRegisterAutoCreate['st0'].SetValue(0, FloatToStr(PExtended(@FloatSave.RegisterArea[ 0])^),10,0);
FRegisterValueList.DbgRegisterAutoCreate['st1'].SetValue(0, FloatToStr(PExtended(@FloatSave.RegisterArea[10])^),10,0);
FRegisterValueList.DbgRegisterAutoCreate['st2'].SetValue(0, FloatToStr(PExtended(@FloatSave.RegisterArea[20])^),10,0);
FRegisterValueList.DbgRegisterAutoCreate['st3'].SetValue(0, FloatToStr(PExtended(@FloatSave.RegisterArea[30])^),10,0);
FRegisterValueList.DbgRegisterAutoCreate['st4'].SetValue(0, FloatToStr(PExtended(@FloatSave.RegisterArea[40])^),10,0);
FRegisterValueList.DbgRegisterAutoCreate['st5'].SetValue(0, FloatToStr(PExtended(@FloatSave.RegisterArea[50])^),10,0);
FRegisterValueList.DbgRegisterAutoCreate['st6'].SetValue(0, FloatToStr(PExtended(@FloatSave.RegisterArea[60])^),10,0);
FRegisterValueList.DbgRegisterAutoCreate['st7'].SetValue(0, FloatToStr(PExtended(@FloatSave.RegisterArea[70])^),10,0);
FRegisterValueList.DbgRegisterAutoCreate['st0'].SetValue(0, FloatToStr(PExtended(@FloatSave.RegisterArea[ 0])^),10,500);
FRegisterValueList.DbgRegisterAutoCreate['st1'].SetValue(0, FloatToStr(PExtended(@FloatSave.RegisterArea[10])^),10,501);
FRegisterValueList.DbgRegisterAutoCreate['st2'].SetValue(0, FloatToStr(PExtended(@FloatSave.RegisterArea[20])^),10,502);
FRegisterValueList.DbgRegisterAutoCreate['st3'].SetValue(0, FloatToStr(PExtended(@FloatSave.RegisterArea[30])^),10,503);
FRegisterValueList.DbgRegisterAutoCreate['st4'].SetValue(0, FloatToStr(PExtended(@FloatSave.RegisterArea[40])^),10,504);
FRegisterValueList.DbgRegisterAutoCreate['st5'].SetValue(0, FloatToStr(PExtended(@FloatSave.RegisterArea[50])^),10,505);
FRegisterValueList.DbgRegisterAutoCreate['st6'].SetValue(0, FloatToStr(PExtended(@FloatSave.RegisterArea[60])^),10,506);
FRegisterValueList.DbgRegisterAutoCreate['st7'].SetValue(0, FloatToStr(PExtended(@FloatSave.RegisterArea[70])^),10,507);
{$ENDIF}
FRegisterValueList.DbgRegisterAutoCreate['fctrl' ].SetValue(FloatSave.ControlWord, IntToStr(FloatSave.ControlWord),2,0);
FRegisterValueList.DbgRegisterAutoCreate['fstat' ].SetValue(FloatSave.StatusWord, IntToStr(FloatSave.StatusWord),2,0);
FRegisterValueList.DbgRegisterAutoCreate['ftag' ].SetValue(FloatSave.TagWord, IntToStr(FloatSave.TagWord),1,0);
//FRegisterValueList.DbgRegisterAutoCreate['fErrOp' ].SetValue(FloatSave.ErrorOpcode, IntToStr(FloatSave.ErrorOpcode),2,0);
FRegisterValueList.DbgRegisterAutoCreate['fErrOff'].SetValue(FloatSave.ErrorOffset, IntToStr(FloatSave.ErrorOffset),4,0);
FRegisterValueList.DbgRegisterAutoCreate['fErrSel'].SetValue(FloatSave.ErrorSelector, IntToStr(FloatSave.ErrorSelector),2,0);
FRegisterValueList.DbgRegisterAutoCreate['fDatOff'].SetValue(FloatSave.DataOffset, IntToStr(FloatSave.DataOffset),4,0);
FRegisterValueList.DbgRegisterAutoCreate['fDatSel'].SetValue(FloatSave.DataSelector, IntToStr(FloatSave.DataSelector),2,0);
FRegisterValueList.DbgRegisterAutoCreate['fCr0NpxSt'].SetValue(FloatSave.Cr0NpxState, IntToStr(FloatSave.Cr0NpxState),4,0);
FRegisterValueList.DbgRegisterAutoCreate['fctrl' ].SetValue(FloatSave.ControlWord, IntToStr(FloatSave.ControlWord),2,510);
FRegisterValueList.DbgRegisterAutoCreate['fstat' ].SetValue(FloatSave.StatusWord, IntToStr(FloatSave.StatusWord),2,511);
FRegisterValueList.DbgRegisterAutoCreate['ftag' ].SetValue(FloatSave.TagWord, IntToStr(FloatSave.TagWord),1,512);
//FRegisterValueList.DbgRegisterAutoCreate['fErrOp' ].SetValue(FloatSave.ErrorOpcode, IntToStr(FloatSave.ErrorOpcode),2,513);
FRegisterValueList.DbgRegisterAutoCreate['fErrOff'].SetValue(FloatSave.ErrorOffset, IntToStr(FloatSave.ErrorOffset),4,514);
FRegisterValueList.DbgRegisterAutoCreate['fErrSel'].SetValue(FloatSave.ErrorSelector, IntToStr(FloatSave.ErrorSelector),2,515);
FRegisterValueList.DbgRegisterAutoCreate['fDatOff'].SetValue(FloatSave.DataOffset, IntToStr(FloatSave.DataOffset),4,516);
FRegisterValueList.DbgRegisterAutoCreate['fDatSel'].SetValue(FloatSave.DataSelector, IntToStr(FloatSave.DataSelector),2,517);
FRegisterValueList.DbgRegisterAutoCreate['fCr0NpxSt'].SetValue(FloatSave.Cr0NpxState, IntToStr(FloatSave.Cr0NpxState),4,518);
if not FFailed_CONTEXT_EXTENDED_REGISTERS then begin
FRegisterValueList.DbgRegisterAutoCreate['Xmm0'].SetValue(0, XmmToString(PM128A(@ExtendedRegisters[10*16])^),16,0);
FRegisterValueList.DbgRegisterAutoCreate['Xmm1'].SetValue(0, XmmToString(PM128A(@ExtendedRegisters[11*16])^),16,0);
FRegisterValueList.DbgRegisterAutoCreate['Xmm2'].SetValue(0, XmmToString(PM128A(@ExtendedRegisters[12*16])^),16,0);
FRegisterValueList.DbgRegisterAutoCreate['Xmm3'].SetValue(0, XmmToString(PM128A(@ExtendedRegisters[13*16])^),16,0);
FRegisterValueList.DbgRegisterAutoCreate['Xmm4'].SetValue(0, XmmToString(PM128A(@ExtendedRegisters[14*16])^),16,0);
FRegisterValueList.DbgRegisterAutoCreate['Xmm5'].SetValue(0, XmmToString(PM128A(@ExtendedRegisters[15*16])^),16,0);
FRegisterValueList.DbgRegisterAutoCreate['Xmm6'].SetValue(0, XmmToString(PM128A(@ExtendedRegisters[16*16])^),16,0);
FRegisterValueList.DbgRegisterAutoCreate['Xmm7'].SetValue(0, XmmToString(PM128A(@ExtendedRegisters[17*16])^),16,0);
FRegisterValueList.DbgRegisterAutoCreate['Xmm0'].SetValue(0, XmmToString(PM128A(@ExtendedRegisters[10*16])^),16,600);
FRegisterValueList.DbgRegisterAutoCreate['Xmm1'].SetValue(0, XmmToString(PM128A(@ExtendedRegisters[11*16])^),16,601);
FRegisterValueList.DbgRegisterAutoCreate['Xmm2'].SetValue(0, XmmToString(PM128A(@ExtendedRegisters[12*16])^),16,602);
FRegisterValueList.DbgRegisterAutoCreate['Xmm3'].SetValue(0, XmmToString(PM128A(@ExtendedRegisters[13*16])^),16,603);
FRegisterValueList.DbgRegisterAutoCreate['Xmm4'].SetValue(0, XmmToString(PM128A(@ExtendedRegisters[14*16])^),16,604);
FRegisterValueList.DbgRegisterAutoCreate['Xmm5'].SetValue(0, XmmToString(PM128A(@ExtendedRegisters[15*16])^),16,605);
FRegisterValueList.DbgRegisterAutoCreate['Xmm6'].SetValue(0, XmmToString(PM128A(@ExtendedRegisters[16*16])^),16,606);
FRegisterValueList.DbgRegisterAutoCreate['Xmm7'].SetValue(0, XmmToString(PM128A(@ExtendedRegisters[17*16])^),16,607);
FRegisterValueList.DbgRegisterAutoCreate['MxCsr'].SetValue(PDWORD(@ExtendedRegisters[24])^, IntToStr(PDWORD(@ExtendedRegisters[24])^),16,4);
FRegisterValueList.DbgRegisterAutoCreate['MxCsr'].SetValue(PDWORD(@ExtendedRegisters[24])^, IntToStr(PDWORD(@ExtendedRegisters[24])^),4,620);
end;
end
else
@ -1879,44 +1879,44 @@ begin
// TODO: 64bit extended is not 10 byte // currently downgrading to double
{$IF FPC_Fullversion>30202}
FRegisterValueList.DbgRegisterAutoCreate['st0'].SetValue(0, FloatToStr(PExtended(@FltSave.FloatRegisters[0])^),10,0);
FRegisterValueList.DbgRegisterAutoCreate['st1'].SetValue(0, FloatToStr(PExtended(@FltSave.FloatRegisters[1])^),10,0);
FRegisterValueList.DbgRegisterAutoCreate['st2'].SetValue(0, FloatToStr(PExtended(@FltSave.FloatRegisters[2])^),10,0);
FRegisterValueList.DbgRegisterAutoCreate['st3'].SetValue(0, FloatToStr(PExtended(@FltSave.FloatRegisters[3])^),10,0);
FRegisterValueList.DbgRegisterAutoCreate['st4'].SetValue(0, FloatToStr(PExtended(@FltSave.FloatRegisters[4])^),10,0);
FRegisterValueList.DbgRegisterAutoCreate['st5'].SetValue(0, FloatToStr(PExtended(@FltSave.FloatRegisters[5])^),10,0);
FRegisterValueList.DbgRegisterAutoCreate['st6'].SetValue(0, FloatToStr(PExtended(@FltSave.FloatRegisters[6])^),10,0);
FRegisterValueList.DbgRegisterAutoCreate['st7'].SetValue(0, FloatToStr(PExtended(@FltSave.FloatRegisters[7])^),10,0);
FRegisterValueList.DbgRegisterAutoCreate['st0'].SetValue(0, FloatToStr(PExtended(@FltSave.FloatRegisters[0])^),10,500);
FRegisterValueList.DbgRegisterAutoCreate['st1'].SetValue(0, FloatToStr(PExtended(@FltSave.FloatRegisters[1])^),10,501);
FRegisterValueList.DbgRegisterAutoCreate['st2'].SetValue(0, FloatToStr(PExtended(@FltSave.FloatRegisters[2])^),10,502);
FRegisterValueList.DbgRegisterAutoCreate['st3'].SetValue(0, FloatToStr(PExtended(@FltSave.FloatRegisters[3])^),10,503);
FRegisterValueList.DbgRegisterAutoCreate['st4'].SetValue(0, FloatToStr(PExtended(@FltSave.FloatRegisters[4])^),10,504);
FRegisterValueList.DbgRegisterAutoCreate['st5'].SetValue(0, FloatToStr(PExtended(@FltSave.FloatRegisters[5])^),10,505);
FRegisterValueList.DbgRegisterAutoCreate['st6'].SetValue(0, FloatToStr(PExtended(@FltSave.FloatRegisters[6])^),10,506);
FRegisterValueList.DbgRegisterAutoCreate['st7'].SetValue(0, FloatToStr(PExtended(@FltSave.FloatRegisters[7])^),10,507);
{$ENDIF}
FRegisterValueList.DbgRegisterAutoCreate['fctrl' ].SetValue(FltSave.ControlWord, IntToStr(FltSave.ControlWord),2,0);
FRegisterValueList.DbgRegisterAutoCreate['fstat' ].SetValue(FltSave.StatusWord, IntToStr(FltSave.StatusWord),2,0);
FRegisterValueList.DbgRegisterAutoCreate['ftag' ].SetValue(FltSave.TagWord, IntToStr(FltSave.TagWord),1,0);
FRegisterValueList.DbgRegisterAutoCreate['fErrOp' ].SetValue(FltSave.ErrorOpcode, IntToStr(FltSave.ErrorOpcode),2,0);
FRegisterValueList.DbgRegisterAutoCreate['fErrOff'].SetValue(FltSave.ErrorOffset, IntToStr(FltSave.ErrorOffset),4,0);
FRegisterValueList.DbgRegisterAutoCreate['fErrSel'].SetValue(FltSave.ErrorSelector, IntToStr(FltSave.ErrorSelector),2,0);
FRegisterValueList.DbgRegisterAutoCreate['fDatOff'].SetValue(FltSave.DataOffset, IntToStr(FltSave.DataOffset),4,0);
FRegisterValueList.DbgRegisterAutoCreate['fDatSel'].SetValue(FltSave.DataSelector, IntToStr(FltSave.DataSelector),2,0);
FRegisterValueList.DbgRegisterAutoCreate['fctrl' ].SetValue(FltSave.ControlWord, IntToStr(FltSave.ControlWord),2,510);
FRegisterValueList.DbgRegisterAutoCreate['fstat' ].SetValue(FltSave.StatusWord, IntToStr(FltSave.StatusWord),2,511);
FRegisterValueList.DbgRegisterAutoCreate['ftag' ].SetValue(FltSave.TagWord, IntToStr(FltSave.TagWord),1,512);
FRegisterValueList.DbgRegisterAutoCreate['fErrOp' ].SetValue(FltSave.ErrorOpcode, IntToStr(FltSave.ErrorOpcode),2,513);
FRegisterValueList.DbgRegisterAutoCreate['fErrOff'].SetValue(FltSave.ErrorOffset, IntToStr(FltSave.ErrorOffset),4,514);
FRegisterValueList.DbgRegisterAutoCreate['fErrSel'].SetValue(FltSave.ErrorSelector, IntToStr(FltSave.ErrorSelector),2,515);
FRegisterValueList.DbgRegisterAutoCreate['fDatOff'].SetValue(FltSave.DataOffset, IntToStr(FltSave.DataOffset),4,516);
FRegisterValueList.DbgRegisterAutoCreate['fDatSel'].SetValue(FltSave.DataSelector, IntToStr(FltSave.DataSelector),2,517);
FRegisterValueList.DbgRegisterAutoCreate['Xmm0' ].SetValue(0, XmmToString(FltSave.XmmRegisters[0]),16,0);
FRegisterValueList.DbgRegisterAutoCreate['Xmm1' ].SetValue(0, XmmToString(FltSave.XmmRegisters[1]),16,0);
FRegisterValueList.DbgRegisterAutoCreate['Xmm2' ].SetValue(0, XmmToString(FltSave.XmmRegisters[2]),16,0);
FRegisterValueList.DbgRegisterAutoCreate['Xmm3' ].SetValue(0, XmmToString(FltSave.XmmRegisters[3]),16,0);
FRegisterValueList.DbgRegisterAutoCreate['Xmm4' ].SetValue(0, XmmToString(FltSave.XmmRegisters[4]),16,0);
FRegisterValueList.DbgRegisterAutoCreate['Xmm5' ].SetValue(0, XmmToString(FltSave.XmmRegisters[5]),16,0);
FRegisterValueList.DbgRegisterAutoCreate['Xmm6' ].SetValue(0, XmmToString(FltSave.XmmRegisters[6]),16,0);
FRegisterValueList.DbgRegisterAutoCreate['Xmm7' ].SetValue(0, XmmToString(FltSave.XmmRegisters[7]),16,0);
FRegisterValueList.DbgRegisterAutoCreate['Xmm8' ].SetValue(0, XmmToString(FltSave.XmmRegisters[8]),16,0);
FRegisterValueList.DbgRegisterAutoCreate['Xmm9' ].SetValue(0, XmmToString(FltSave.XmmRegisters[9]),16,0);
FRegisterValueList.DbgRegisterAutoCreate['Xmm10'].SetValue(0, XmmToString(FltSave.XmmRegisters[10]),16,0);
FRegisterValueList.DbgRegisterAutoCreate['Xmm11'].SetValue(0, XmmToString(FltSave.XmmRegisters[11]),16,0);
FRegisterValueList.DbgRegisterAutoCreate['Xmm12'].SetValue(0, XmmToString(FltSave.XmmRegisters[12]),16,0);
FRegisterValueList.DbgRegisterAutoCreate['Xmm13'].SetValue(0, XmmToString(FltSave.XmmRegisters[13]),16,0);
FRegisterValueList.DbgRegisterAutoCreate['Xmm14'].SetValue(0, XmmToString(FltSave.XmmRegisters[14]),16,0);
FRegisterValueList.DbgRegisterAutoCreate['Xmm15'].SetValue(0, XmmToString(FltSave.XmmRegisters[15]),16,0);
FRegisterValueList.DbgRegisterAutoCreate['Xmm0' ].SetValue(0, XmmToString(FltSave.XmmRegisters[ 0]),16,600);
FRegisterValueList.DbgRegisterAutoCreate['Xmm1' ].SetValue(0, XmmToString(FltSave.XmmRegisters[ 1]),16,601);
FRegisterValueList.DbgRegisterAutoCreate['Xmm2' ].SetValue(0, XmmToString(FltSave.XmmRegisters[ 2]),16,602);
FRegisterValueList.DbgRegisterAutoCreate['Xmm3' ].SetValue(0, XmmToString(FltSave.XmmRegisters[ 3]),16,603);
FRegisterValueList.DbgRegisterAutoCreate['Xmm4' ].SetValue(0, XmmToString(FltSave.XmmRegisters[ 4]),16,604);
FRegisterValueList.DbgRegisterAutoCreate['Xmm5' ].SetValue(0, XmmToString(FltSave.XmmRegisters[ 5]),16,605);
FRegisterValueList.DbgRegisterAutoCreate['Xmm6' ].SetValue(0, XmmToString(FltSave.XmmRegisters[ 6]),16,606);
FRegisterValueList.DbgRegisterAutoCreate['Xmm7' ].SetValue(0, XmmToString(FltSave.XmmRegisters[ 7]),16,607);
FRegisterValueList.DbgRegisterAutoCreate['Xmm8' ].SetValue(0, XmmToString(FltSave.XmmRegisters[ 8]),16,608);
FRegisterValueList.DbgRegisterAutoCreate['Xmm9' ].SetValue(0, XmmToString(FltSave.XmmRegisters[ 9]),16,609);
FRegisterValueList.DbgRegisterAutoCreate['Xmm10'].SetValue(0, XmmToString(FltSave.XmmRegisters[10]),16,610);
FRegisterValueList.DbgRegisterAutoCreate['Xmm11'].SetValue(0, XmmToString(FltSave.XmmRegisters[11]),16,611);
FRegisterValueList.DbgRegisterAutoCreate['Xmm12'].SetValue(0, XmmToString(FltSave.XmmRegisters[12]),16,612);
FRegisterValueList.DbgRegisterAutoCreate['Xmm13'].SetValue(0, XmmToString(FltSave.XmmRegisters[13]),16,613);
FRegisterValueList.DbgRegisterAutoCreate['Xmm14'].SetValue(0, XmmToString(FltSave.XmmRegisters[14]),16,614);
FRegisterValueList.DbgRegisterAutoCreate['Xmm15'].SetValue(0, XmmToString(FltSave.XmmRegisters[15]),16,615);
FRegisterValueList.DbgRegisterAutoCreate['MxCsr'].SetValue(FltSave.MxCsr, IntToStr(FltSave.MxCsr),16,4);
FRegisterValueList.DbgRegisterAutoCreate['MxCsrM'].SetValue(FltSave.MxCsr_Mask, IntToStr(FltSave.MxCsr_Mask),16,4);
FRegisterValueList.DbgRegisterAutoCreate['MxCsr'].SetValue(FltSave.MxCsr, IntToStr(FltSave.MxCsr),4,620);
FRegisterValueList.DbgRegisterAutoCreate['MxCsrM'].SetValue(FltSave.MxCsr_Mask, IntToStr(FltSave.MxCsr_Mask),4,621);
end;
{$endif}

View File

@ -78,6 +78,28 @@ type
TFpDbgMemModel = class;
{ TDbgRegisterValue }
TDbgRegisterValue = class
private
FDwarfIdx: cardinal;
FName: string;
FNumValue: TDBGPtr;
FSize: byte;
FStrValue: string;
public
constructor Create(const AName: String);
procedure Assign(ASource: TDbgRegisterValue);
function HasEqualVal(AnOther: TDbgRegisterValue): Boolean;
procedure SetValue(ANumValue: TDBGPtr; const AStrValue: string; ASize: byte; ADwarfIdx: cardinal);
procedure Setx86EFlagsValue(ANumValue: TDBGPtr);
property Name: string read FName;
property NumValue: TDBGPtr read FNumValue;
property StrValue: string read FStrValue;
property Size: byte read FSize;
property DwarfIdx: cardinal read FDwarfIdx;
end;
{ TFpDbgLocationContext }
TFpDbgLocationContext = class;
@ -185,6 +207,8 @@ type
function ReadString(const ALocation: TFpDbgMemLocation; ALen: Int64; out AValue: RawByteString; AnIgnoreMaxStringLen: boolean = False): Boolean;
function ReadWString(const ALocation: TFpDbgMemLocation; ALen: Int64; out AValue: WideString; AnIgnoreMaxStringLen: boolean = False): Boolean;
function GetRegister(const ARegNum: Cardinal): TDbgRegisterValue;
end;
@ -207,6 +231,7 @@ type
function WriteRegister(ARegNum: Cardinal; const AValue: TDbgPtr; AContext: TFpDbgLocationContext): Boolean; virtual; abstract;
function RegisterSize(ARegNum: Cardinal): Integer; virtual; abstract;
function RegisterNumber(ARegName: String; out ARegNum: Cardinal): Boolean; virtual; abstract;
function GetRegister(const ARegNum: Cardinal; AContext: TFpDbgLocationContext): TDbgRegisterValue; virtual; abstract;
// Registernum from name
end;
@ -989,6 +1014,65 @@ begin
WriteStr(Result, AReadDataType);
end;
{ TDbgRegisterValue }
constructor TDbgRegisterValue.Create(const AName: String);
begin
FName:=AName;
end;
procedure TDbgRegisterValue.Assign(ASource: TDbgRegisterValue);
begin
FDwarfIdx := ASource.FDwarfIdx;
FName := ASource.FName;
FNumValue := ASource.FNumValue;
FSize := ASource.FSize;
FStrValue := ASource.FStrValue;
end;
function TDbgRegisterValue.HasEqualVal(AnOther: TDbgRegisterValue): Boolean;
begin
Result :=
(FNumValue = AnOther.FNumValue) and
(FSize = AnOther.FSize) and
(FStrValue = AnOther.FStrValue);
end;
procedure TDbgRegisterValue.SetValue(ANumValue: TDBGPtr;
const AStrValue: string; ASize: byte; ADwarfIdx: cardinal);
begin
FStrValue:=AStrValue;
FNumValue:=ANumValue;
FSize:=ASize;
FDwarfIdx:=ADwarfIdx;
end;
procedure TDbgRegisterValue.Setx86EFlagsValue(ANumValue: TDBGPtr);
var
FlagS: string;
begin
FlagS := '';
if ANumValue and (1 shl 0) <> 0 then FlagS := FlagS + 'CF ';
if ANumValue and (1 shl 2) <> 0 then FlagS := FlagS + 'PF ';
if ANumValue and (1 shl 4) <> 0 then FlagS := FlagS + 'AF ';
if ANumValue and (1 shl 6) <> 0 then FlagS := FlagS + 'ZF ';
if ANumValue and (1 shl 7) <> 0 then FlagS := FlagS + 'SF ';
if ANumValue and (1 shl 8) <> 0 then FlagS := FlagS + 'TF ';
if ANumValue and (1 shl 9) <> 0 then FlagS := FlagS + 'IF ';
if ANumValue and (1 shl 10) <> 0 then FlagS := FlagS + 'DF ';
if ANumValue and (1 shl 11) <> 0 then FlagS := FlagS + 'OF ';
if (ANumValue shr 12) and 3 <> 0 then FlagS := FlagS + 'IOPL=' + IntToStr((ANumValue shr 12) and 3);
if ANumValue and (1 shl 14) <> 0 then FlagS := FlagS + 'NT ';
if ANumValue and (1 shl 16) <> 0 then FlagS := FlagS + 'RF ';
if ANumValue and (1 shl 17) <> 0 then FlagS := FlagS + 'VM ';
if ANumValue and (1 shl 18) <> 0 then FlagS := FlagS + 'AC ';
if ANumValue and (1 shl 19) <> 0 then FlagS := FlagS + 'VIF ';
if ANumValue and (1 shl 20) <> 0 then FlagS := FlagS + 'VIP ';
if ANumValue and (1 shl 21) <> 0 then FlagS := FlagS + 'ID ';
SetValue(ANumValue, trim(FlagS),4,Cardinal(-1));
end;
{ TFpDbgLocationContext }
function TFpDbgLocationContext.GetLastMemError: TFpError;
@ -1208,6 +1292,11 @@ begin
AValue := ''
end;
function TFpDbgLocationContext.GetRegister(const ARegNum: Cardinal): TDbgRegisterValue;
begin
Result := MemManager.MemReader.GetRegister(ARegNum, Self);
end;
{ TFpDbgMemLimits }
procedure TFpDbgMemLimits.SetMaxMemReadSize(AValue: QWord);

View File

@ -3189,6 +3189,7 @@ var
RNum: Cardinal;
RSize: Integer;
RVal: QWord;
Reg: TDbgRegisterValue;
begin
Result := nil;
if FScope = nil then
@ -3198,12 +3199,16 @@ begin
exit;
RSize := FScope.MemManager.RegisterSize(RNum);
if RSize > 8 then
exit;
if not FScope.LocationContext.ReadUnsignedInt(RegisterLoc(RNum), SizeVal(RSize), RVal) then
exit;
Result := TFpValueConstNumber.Create(RVal, False);
if (RSize <= 8) and
FScope.LocationContext.ReadUnsignedInt(RegisterLoc(RNum), SizeVal(RSize), RVal)
then begin
Result := TFpValueConstNumber.Create(RVal, False);
end
else begin
Reg := FScope.LocationContext.GetRegister(RNum);
if Reg <> nil then
Result := TFpValueConstString.Create(Reg.StrValue);
end;
end;
constructor TFpPascalExpression.Create(ATextExpression: String; AScope: TFpDbgSymbolScope;