mirror of
https://gitlab.com/freepascal.org/lazarus/lazarus.git
synced 2025-08-17 05:09:10 +02:00
Merge branch 'xtensa-stack-registers' into 'main'
Xtensa - Store all registers read for current stack frame. See merge request freepascal.org/lazarus/lazarus!280
This commit is contained in:
commit
7ec595fc3a
@ -436,11 +436,12 @@ const
|
|||||||
var
|
var
|
||||||
Address, returnAddress: TDBGPtr;
|
Address, returnAddress: TDBGPtr;
|
||||||
callSize: byte;
|
callSize: byte;
|
||||||
j, k, stackRegCount: integer;
|
j, k, stackRegCount, numRegsRead: integer;
|
||||||
spilled: boolean;
|
spilled: boolean;
|
||||||
stackRegs: array of TDBGPtr;
|
stackRegs: array of TDBGPtr;
|
||||||
tmpReg: uint32;
|
tmpReg: uint32;
|
||||||
LastFrameBase: TDBGPtr;
|
LastFrameBase: TDBGPtr;
|
||||||
|
regName: string;
|
||||||
begin
|
begin
|
||||||
ANewFrame := nil;
|
ANewFrame := nil;
|
||||||
Result := suFailed;
|
Result := suFailed;
|
||||||
@ -476,12 +477,14 @@ begin
|
|||||||
begin
|
begin
|
||||||
// Live registers, read from register file
|
// Live registers, read from register file
|
||||||
j := ((4*FWindowBase) and 63);
|
j := ((4*FWindowBase) and 63);
|
||||||
|
numRegsRead := stackRegCount;
|
||||||
for k := 0 to stackRegCount-1 do
|
for k := 0 to stackRegCount-1 do
|
||||||
stackRegs[k] := TDbgRspThread(Thread).InternalRegs.regs[((j+k) and 63)+1]; // wraparound indexing
|
stackRegs[k] := TDbgRspThread(Thread).InternalRegs.regs[((j+k) and 63)+1]; // wraparound indexing
|
||||||
end
|
end
|
||||||
else
|
else
|
||||||
begin
|
begin
|
||||||
// Registers spilled to stack, read from memory
|
// Registers spilled to stack, read from memory
|
||||||
|
numRegsRead := 0;
|
||||||
for j := 0 to callSize-1 do
|
for j := 0 to callSize-1 do
|
||||||
begin
|
begin
|
||||||
for k := 0 to 3 do
|
for k := 0 to 3 do
|
||||||
@ -497,6 +500,7 @@ begin
|
|||||||
Break;
|
Break;
|
||||||
end;
|
end;
|
||||||
stackRegs[4*j + k] := NtoLE(tmpReg);
|
stackRegs[4*j + k] := NtoLE(tmpReg);
|
||||||
|
inc(numRegsRead);
|
||||||
end;
|
end;
|
||||||
end;
|
end;
|
||||||
end;
|
end;
|
||||||
@ -506,13 +510,13 @@ begin
|
|||||||
FrameBasePointer := StackPointer;
|
FrameBasePointer := StackPointer;
|
||||||
|
|
||||||
ANewFrame:= TDbgCallstackEntry.create(Thread, AFrameIndex, FrameBasePointer, Address);
|
ANewFrame:= TDbgCallstackEntry.create(Thread, AFrameIndex, FrameBasePointer, Address);
|
||||||
ANewFrame.RegisterValueList.DbgRegisterAutoCreate[nPC].SetValue(Address, IntToStr(Address),Size, PCIndexDwarf);
|
ANewFrame.RegisterValueList.DbgRegisterAutoCreate[nPC].SetValue(Address, IntToStr(Address), Size, PCIndexDwarf);
|
||||||
ANewFrame.RegisterValueList.DbgRegisterAutoCreate[nReturnPC].SetValue(returnAddress, IntToStr(returnAddress),Size, ReturnPCIndexDwarf);
|
for j := 0 to numRegsRead-1 do
|
||||||
ANewFrame.RegisterValueList.DbgRegisterAutoCreate[nSP].SetValue(StackPointer, IntToStr(StackPointer),Size, SPindexDwarf);
|
begin
|
||||||
// In case a7 is used as frame pointer
|
regName := 'a' + IntToStr(j);
|
||||||
ANewFrame.RegisterValueList.DbgRegisterAutoCreate['a7'].SetValue(byte(FrameBasePointer), IntToStr(byte(FrameBasePointer)),Size, 7);
|
ANewFrame.RegisterValueList.DbgRegisterAutoCreate[regName].SetValue(stackRegs[j],
|
||||||
ANewFrame.RegisterValueList.DbgRegisterAutoCreate[nWindowBase].SetValue(FWindowBase, IntToStr(FWindowBase), 1, WindowBaseIndex);
|
IntToStr(stackRegs[j]), Size, j);
|
||||||
ANewFrame.RegisterValueList.DbgRegisterAutoCreate[nWindowStart].SetValue(FWindowStart, IntToStr(FWindowStart), 2 , WindowStartIndex);
|
end;
|
||||||
|
|
||||||
FLastFrameBaseIncreased := (FrameBasePointer <> 0) and (FrameBasePointer > LastFrameBase);
|
FLastFrameBaseIncreased := (FrameBasePointer <> 0) and (FrameBasePointer > LastFrameBase);
|
||||||
Result := suSuccess;
|
Result := suSuccess;
|
||||||
|
Loading…
Reference in New Issue
Block a user