FpDebug: Prevent range checks on target address computation

This commit is contained in:
Martin 2024-01-31 21:46:13 +01:00
parent 8da1763be3
commit ad54dc2ceb

View File

@ -4461,7 +4461,9 @@ begin
Exit; Exit;
end; end;
DW_LNS_advance_pc: begin DW_LNS_advance_pc: begin
{$PUSH}{$R-}{$Q-}
Inc(FAddress, ULEB128toOrdinal(pbyte(FLineInfoPtr))); Inc(FAddress, ULEB128toOrdinal(pbyte(FLineInfoPtr)));
{$POP}
end; end;
DW_LNS_advance_line: begin DW_LNS_advance_line: begin
Inc(FLine, SLEB128toOrdinal(pbyte(FLineInfoPtr))); Inc(FLine, SLEB128toOrdinal(pbyte(FLineInfoPtr)));
@ -4480,12 +4482,16 @@ begin
end; end;
DW_LNS_const_add_pc: begin DW_LNS_const_add_pc: begin
Opcode := 255 - Length(FOwner.FLineInfo.StandardOpcodeLengths); Opcode := 255 - Length(FOwner.FLineInfo.StandardOpcodeLengths);
{$PUSH}{$R-}{$Q-}
if FOwner.FLineInfo.LineRange = 0 if FOwner.FLineInfo.LineRange = 0
then Inc(FAddress, Opcode * FOwner.FLineInfo.MinimumInstructionLength) then Inc(FAddress, Opcode * FOwner.FLineInfo.MinimumInstructionLength)
else Inc(FAddress, (Opcode div FOwner.FLineInfo.LineRange) * FOwner.FLineInfo.MinimumInstructionLength); else Inc(FAddress, (Opcode div FOwner.FLineInfo.LineRange) * FOwner.FLineInfo.MinimumInstructionLength);
{$POP}
end; end;
DW_LNS_fixed_advance_pc: begin DW_LNS_fixed_advance_pc: begin
{$PUSH}{$R-}{$Q-}
Inc(FAddress, PWord(FLineInfoPtr)^); Inc(FAddress, PWord(FLineInfoPtr)^);
{$POP}
Inc(pbyte(FLineInfoPtr), 2); Inc(pbyte(FLineInfoPtr), 2);
end; end;
DW_LNS_set_prologue_end: begin DW_LNS_set_prologue_end: begin
@ -4548,6 +4554,7 @@ begin
// Special opcode // Special opcode
Dec(Opcode, Length(FOwner.FLineInfo.StandardOpcodeLengths)+1); Dec(Opcode, Length(FOwner.FLineInfo.StandardOpcodeLengths)+1);
{$PUSH}{$R-}{$Q-}
if FOwner.FLineInfo.LineRange = 0 if FOwner.FLineInfo.LineRange = 0
then begin then begin
Inc(FAddress, Opcode * FOwner.FLineInfo.MinimumInstructionLength); Inc(FAddress, Opcode * FOwner.FLineInfo.MinimumInstructionLength);
@ -4556,6 +4563,7 @@ begin
Inc(FAddress, (Opcode div FOwner.FLineInfo.LineRange) * FOwner.FLineInfo.MinimumInstructionLength); Inc(FAddress, (Opcode div FOwner.FLineInfo.LineRange) * FOwner.FLineInfo.MinimumInstructionLength);
Inc(FLine, FOwner.FLineInfo.LineBase + (Opcode mod FOwner.FLineInfo.LineRange)); Inc(FLine, FOwner.FLineInfo.LineBase + (Opcode mod FOwner.FLineInfo.LineRange));
end; end;
{$POP}
Result := True; Result := True;
Exit; Exit;
end; end;