FpDebug: Dwarf location-parser, allow to deref a register-location. See merge-request !28

This commit is contained in:
Martin 2021-11-14 09:13:55 +01:00
parent 805c9e3169
commit 0a7f1b1da9

View File

@ -2122,6 +2122,13 @@ var
SetError(fpErrLocationParserNoAddressOnStack);
end;
function AssertAddressOrRegOnStack: Boolean; inline;
begin
Result := (FStack.PeekKind in [mlfTargetMem, mlfSelfMem, mlfConstantDeref, mlfTargetRegister]);
if not Result then
SetError(fpErrLocationParserNoAddressOnStack);
end;
function AssertMinCount(ACnt: Integer): Boolean; inline;
begin
Result := FStack.Count >= ACnt;
@ -2198,7 +2205,7 @@ begin
FStack.Push(FCU.ReadTargetAddressFromDwarfSection(CurData, True)); // always mlfTargetMem;
end;
DW_OP_deref: begin
if not AssertAddressOnStack then exit;
if not AssertAddressOrRegOnStack then exit;
EntryP := FStack.PeekForDeref;
if not ReadAddressFromMemory(EntryP^, AddrSize, NewLoc) then exit;
EntryP^ := NewLoc; // mlfTargetMem;
@ -2213,7 +2220,7 @@ begin
EntryP^ := NewLoc; // mlfTargetMem;
end;
DW_OP_deref_size: begin
if not AssertAddressOnStack then exit;
if not AssertAddressOrRegOnStack then exit;
EntryP := FStack.PeekForDeref;
if not ReadAddressFromMemory(EntryP^, ReadUnsignedFromExpression(CurData, 1), NewLoc) then exit;
EntryP^ := NewLoc; // mlfTargetMem;