From 0a7f1b1da9597bfcfcbde76546ddbec4b0ccaf3e Mon Sep 17 00:00:00 2001 From: Martin Date: Sun, 14 Nov 2021 09:13:55 +0100 Subject: [PATCH] FpDebug: Dwarf location-parser, allow to deref a register-location. See merge-request !28 --- components/fpdebug/fpdbgdwarfdataclasses.pas | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/components/fpdebug/fpdbgdwarfdataclasses.pas b/components/fpdebug/fpdbgdwarfdataclasses.pas index 212cd8a857..f8e3b48ec6 100644 --- a/components/fpdebug/fpdbgdwarfdataclasses.pas +++ b/components/fpdebug/fpdbgdwarfdataclasses.pas @@ -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;