On 20/04/2020 23:11, Florian Klämpfl wrote:
Am 20.04.20 um 22:45 schrieb Martin Frb:


Can you post also the relevant output of -al? It makes it easier to see where every assembler instruction comes from.

This is the entire proc
I put long ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
to mark the lines.
1) the begin of the IF
2) the jmp at the very end of that IF
3) the label
4) the next jmp



.section .text.n_fpdbgcontroller$_$tdbgcontrollerstepoutcmd_$__$$_internalcontinue$tdbgprocess$tdbgthread,"x"
    .balign 16,0x90
.globl FPDBGCONTROLLER$_$TDBGCONTROLLERSTEPOUTCMD_$__$$_INTERNALCONTINUE$TDBGPROCESS$TDBGTHREAD
FPDBGCONTROLLER$_$TDBGCONTROLLERSTEPOUTCMD_$__$$_INTERNALCONTINUE$TDBGPROCESS$TDBGTHREAD:
.Lc206:
# Temps allocated between rbp-72 and rbp-32
.seh_proc FPDBGCONTROLLER$_$TDBGCONTROLLERSTEPOUTCMD_$__$$_INTERNALCONTINUE$TDBGPROCESS$TDBGTHREAD
.Ll380:
# [793] begin
    pushq    %rbp
.seh_pushreg %rbp
.Lc208:
.Lc209:
    movq    %rsp,%rbp
.Lc210:
    leaq    -112(%rsp),%rsp
.seh_stackalloc 112
    movq    %rbx,-72(%rbp)
    movq    %rdi,-64(%rbp)
    movq    %rsi,-56(%rbp)
    movq    %r12,-48(%rbp)
    movq    %r13,-40(%rbp)
.seh_savereg %rbx, 40
.seh_savereg %rdi, 48
.seh_savereg %rsi, 56
.seh_savereg %r12, 64
.seh_savereg %r13, 72
.seh_endprologue
# Var AProcess located at rbp-8, size=OS_64
# Var AThread located at rbp-16, size=OS_64
# Var $self located at rbp-24, size=OS_64
# Var Outside located at rbp-32, size=OS_8
    movq    %rcx,-24(%rbp)
    movq    %rdx,-8(%rbp)
    movq    %r8,-16(%rbp)
.Ll381:
    movb    $85,-32(%rbp)
.Ll382:
# [794] assert(FProcess=AProcess, 'TDbgControllerStepOutCmd.DoContinue: FProcess=AProcess');
    movq    -24(%rbp),%rax
    movq    24(%rax),%rax
    cmpq    -8(%rbp),%rax
    jne    .Lj1617
    jmp    .Lj1618
.Lj1617:
    movq    %rbp,%r9
    leaq    _$FPDBGCONTROLLER$_Ld1(%rip),%rdx
    leaq    _$FPDBGCONTROLLER$_Ld24(%rip),%rcx
    movl    $794,%r8d
    call    fpc_assert
.Lj1618:
.Ll383:
# [796] if (AThread = FThread) then begin
    movq    -24(%rbp),%rax
    movq    16(%rax),%rax
    cmpq    -16(%rbp),%rax
    je    .Lj1627
    jmp    .Lj1628
.Lj1627:
.Ll384:
# [797] if IsSteppedOut then begin
    movq    -24(%rbp),%rcx
    call FPDBGCONTROLLER$_$TDBGCONTROLLERHIDDENBREAKSTEPBASECMD_$__$$_GETISSTEPPEDOUT$$BOOLEAN
    testb    %al,%al
    jne    .Lj1629
    jmp    .Lj1630
.Lj1629:
.Ll385:
# [798] CheckForCallAndSetBreak;
    movq    -24(%rbp),%rcx
    call FPDBGCONTROLLER$_$TDBGCONTROLLERHIDDENBREAKSTEPBASECMD_$__$$_CHECKFORCALLANDSETBREAK$$BOOLEAN
    jmp    .Lj1635
.Lj1630:
.Ll386:
# [801] if not assigned(FHiddenBreakpoint) then begin
    movq    -24(%rbp),%rax
    cmpq    $0,72(%rax)
    je    .Lj1636
    jmp    .Lj1637
.Lj1636:
.Ll387:
# [802] if GetOutsideFrame(Outside) then begin
    leaq    -32(%rbp),%rdx
    movq    -24(%rbp),%rcx
    call FPDBGCONTROLLER$_$TDBGCONTROLLERSTEPOUTCMD_$__$$_GETOUTSIDEFRAME$BOOLEAN$$BOOLEAN
    testb    %al,%al
    jne    .Lj1638
    jmp    .Lj1639
.Lj1638:
.Ll388:
# [803] SetReturnAdressBreakpoint(AProcess, Outside);
    movzbl    -32(%rbp),%r8d
    movq    -8(%rbp),%rdx
    movq    -24(%rbp),%rcx
    call FPDBGCONTROLLER$_$TDBGCONTROLLERSTEPOUTCMD_$__$$_SETRETURNADRESSBREAKPOINT$TDBGPROCESS$BOOLEAN
    jmp    .Lj1650
.Lj1639:
.Ll389:
# [806] if FStepCount < 12 then
    movq    -24(%rbp),%rax
    cmpl    $12,136(%rax)
    jl    .Lj1651
    jmp    .Lj1652
.Lj1651:
.Ll390:
# [811] Inc(FStepCount);
    movq    -24(%rbp),%rax
    movslq    136(%rax),%rbx
    addq    $1,%rbx
    jno    .Lj1655
    call    FPC_OVERFLOW
.Lj1655:
    movq    %rbx,%rax
    subq    $-2147483648,%rax
# Fix for Win64-GAS bug
    movl    $4294967295,%edx
    cmpq    %rdx,%rax
    jbe    .Lj1656
    call    fpc_rangeerror
.Lj1656:
    movq    -24(%rbp),%rax
    movl    %ebx,136(%rax)
.Ll391:
# [812] if NextInstruction.IsCallInstruction or NextInstruction.IsLeaveStackFrame then  // asm "call" // set break before "leave" or the frame becomes unavail
    movq    -24(%rbp),%rax
    cmpq    $0,40(%rax)
    je    .Lj1663
    jmp    .Lj1664
.Lj1663:
    movq    -24(%rbp),%rax
    movq    24(%rax),%rcx
    call FPDBGCLASSES$_$TDBGPROCESS_$__$$_GETDISASSEMBLER$$TDBGASMDECODER
    movq    %rax,%rbx
    movq    -24(%rbp),%rax
    movq    16(%rax),%rdi
    movq    -24(%rbp),%rax
    movq    16(%rax),%rsi
    testq    %rsi,%rsi
    jne    .Lj1675
    movl    $210,%ecx
    call    fpc_handleerror
.Lj1675:
    movq    (%rsi),%rsi
    movq    %rsi,%rcx
    call    fpc_check_object
    movq    %rdi,%rcx
    call    *248(%rsi)
    movq    %rax,%rsi
    movq    %rbx,%rdi
    movq    %rbx,%r12
    testq    %r12,%r12
    jne    .Lj1678
    movl    $210,%ecx
    call    fpc_handleerror
.Lj1678:
    movq    (%r12),%r12
    movq    %r12,%rcx
    call    fpc_check_object
    movq    %rdi,%rcx
    movq    %rsi,%rdx
    call    *256(%r12)
    movq    -24(%rbp),%rdx
    movq    %rax,40(%rdx)
    movq    -24(%rbp),%rax
    movq    40(%rax),%rcx
    movq    $0,%r8
    movq    $0,%rdx
    call LAZCLASSES$_$TREFCOUNTEDOBJECT_$__$$_ADDREFERENCE$POINTER$ANSISTRING
.Lj1664:
    movq    -24(%rbp),%rax
    movq    40(%rax),%rbx
    movq    %rbx,%rsi
    movq    %rbx,%rdi
    testq    %rdi,%rdi
    jne    .Lj1689
    movl    $210,%ecx
    call    fpc_handleerror
.Lj1689:
    movq    (%rdi),%rdi
    movq    %rdi,%rcx
    call    fpc_check_object
    movq    %rsi,%rcx
    call    *224(%rdi)
    testb    %al,%al
    jne    .Lj1657
    jmp    .Lj1659
.Lj1659:
    movq    -24(%rbp),%rax
    cmpq    $0,40(%rax)
    je    .Lj1693
    jmp    .Lj1694
.Lj1693:
    movq    -24(%rbp),%rax
    movq    24(%rax),%rcx
    call FPDBGCLASSES$_$TDBGPROCESS_$__$$_GETDISASSEMBLER$$TDBGASMDECODER
    movq    %rax,%rbx
    movq    -24(%rbp),%rax
    movq    16(%rax),%rdi
    movq    -24(%rbp),%rax
    movq    16(%rax),%rsi
    testq    %rsi,%rsi
    jne    .Lj1705
    movl    $210,%ecx
    call    fpc_handleerror
.Lj1705:
    movq    (%rsi),%rsi
    movq    %rsi,%rcx
    call    fpc_check_object
    movq    %rdi,%rcx
    call    *248(%rsi)
    movq    %rax,%rsi
    movq    %rbx,%rdi
    movq    %rbx,%r12
    testq    %r12,%r12
    jne    .Lj1708
    movl    $210,%ecx
    call    fpc_handleerror
.Lj1708:
    movq    (%r12),%r12
    movq    %r12,%rcx
    call    fpc_check_object
    movq    %rdi,%rcx
    movq    %rsi,%rdx
    call    *256(%r12)
    movq    -24(%rbp),%rdx
    movq    %rax,40(%rdx)
    movq    -24(%rbp),%rax
    movq    40(%rax),%rcx
    movq    $0,%r8
    movq    $0,%rdx
    call LAZCLASSES$_$TREFCOUNTEDOBJECT_$__$$_ADDREFERENCE$POINTER$ANSISTRING
.Lj1694:
    movq    -24(%rbp),%rax
    movq    40(%rax),%rbx
    movq    %rbx,%rsi
    movq    %rbx,%rdi
    testq    %rdi,%rdi
    jne    .Lj1719
    movl    $210,%ecx
    call    fpc_handleerror
.Lj1719:
    movq    (%rdi),%rdi
    movq    %rdi,%rcx
    call    fpc_check_object
    movq    %rsi,%rcx
    call    *240(%rdi)
    testb    %al,%al
    jne    .Lj1657
    jmp    .Lj1658
.Lj1657:
.Ll392:
# [814] SetReturnAdressBreakpoint(AProcess, False);
    movq    -8(%rbp),%rdx
    movq    -24(%rbp),%rcx
    movl    $0,%r8d
    call FPDBGCONTROLLER$_$TDBGCONTROLLERSTEPOUTCMD_$__$$_SETRETURNADRESSBREAKPOINT$TDBGPROCESS$BOOLEAN
    jmp    .Lj1726
.Lj1658:
.Ll393:
# [817] if NextInstruction.IsReturnInstruction then  // asm "ret"          // 1 //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    movq    -24(%rbp),%rax
    cmpq    $0,40(%rax)
    je    .Lj1732
    jmp    .Lj1733
.Lj1732:
    movq    -24(%rbp),%rax
    movq    24(%rax),%rcx
    call FPDBGCLASSES$_$TDBGPROCESS_$__$$_GETDISASSEMBLER$$TDBGASMDECODER
    movq    %rax,%rbx
    movq    -24(%rbp),%rax
    movq    16(%rax),%rdi
    movq    -24(%rbp),%rax
    movq    16(%rax),%rsi
    testq    %rsi,%rsi
    jne    .Lj1744
    movl    $210,%ecx
    call    fpc_handleerror
.Lj1744:
    movq    (%rsi),%rsi
    movq    %rsi,%rcx
    call    fpc_check_object
    movq    %rdi,%rcx
    call    *248(%rsi)
    movq    %rax,%rsi
    movq    %rbx,%rdi
    movq    %rbx,%r12
    testq    %r12,%r12
    jne    .Lj1747
    movl    $210,%ecx
    call    fpc_handleerror
.Lj1747:
    movq    (%r12),%r12
    movq    %r12,%rcx
    call    fpc_check_object
    movq    %rdi,%rcx
    movq    %rsi,%rdx
    call    *256(%r12)
    movq    -24(%rbp),%rdx
    movq    %rax,40(%rdx)
    movq    -24(%rbp),%rax
    movq    40(%rax),%rcx
    movq    $0,%r8
    movq    $0,%rdx
    call LAZCLASSES$_$TREFCOUNTEDOBJECT_$__$$_ADDREFERENCE$POINTER$ANSISTRING
.Lj1733:
    movq    -24(%rbp),%rax
    movq    40(%rax),%rbx
    movq    %rbx,%rsi
    movq    %rbx,%rdi
    testq    %rdi,%rdi
    jne    .Lj1758
    movl    $210,%ecx
    call    fpc_handleerror
.Lj1758:
    movq    (%rdi),%rdi
    movq    %rdi,%rcx
    call    fpc_check_object
    movq    %rsi,%rcx
    call    *232(%rdi)
    testb    %al,%al
    jne    .Lj1727
    jmp    .Lj1728            // 2 //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
.Lj1727:
.Ll394:
# [819] FStepCount := MaxInt; // Do one more single-step, and we're finished.
    movq    -24(%rbp),%rax
    movl    $2147483647,136(%rax)
.Ll395:
# [820] FProcess.Continue(FProcess, FThread, True);
    movq    -24(%rbp),%rax
    movq    16(%rax),%r13
    movq    -24(%rbp),%rax
    movq    24(%rax),%r12
    movq    -24(%rbp),%rax
    movq    24(%rax),%rdi
    movl    $1,%esi
    movq    -24(%rbp),%rax
    movq    24(%rax),%rbx
    testq    %rbx,%rbx
    jne    .Lj1769
    movl    $210,%ecx
    call    fpc_handleerror
.Lj1769:
    movq    (%rbx),%rbx
    movq    %rbx,%rcx
    call    fpc_check_object
    movl    %esi,%r9d
    movq    %rdi,%rcx
    movq    %r12,%rdx
    movq    %r13,%r8
    call    *400(%rbx)
.Ll396:
# [821] exit;
    jmp    .Lj1611
.Lj1728:            // 3 //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
.Lj1726:
    jmp    .Lj1770              // 4 //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
.Lj1652:
.Ll397:
# [827] SetReturnAdressBreakpoint(AProcess, False);
    movq    -8(%rbp),%rdx
    movq    -24(%rbp),%rcx
    movl    $0,%r8d
    call FPDBGCONTROLLER$_$TDBGCONTROLLERSTEPOUTCMD_$__$$_SETRETURNADRESSBREAKPOINT$TDBGPROCESS$BOOLEAN
.Lj1770:
.Lj1650:
.Lj1637:
.Lj1635:
.Lj1628:
.Ll398:
# [832] FProcess.Continue(FProcess, FThread, FHiddenBreakpoint = nil);
    movq    -24(%rbp),%rax
    cmpq    $0,72(%rax)
    seteb    %bl
    movzbl    %bl,%ebx
    movq    -24(%rbp),%rax
    movq    16(%rax),%r13
    movq    -24(%rbp),%rax
    movq    24(%rax),%r12
    movq    -24(%rbp),%rax
    movq    24(%rax),%rdi
    movq    -24(%rbp),%rax
    movq    24(%rax),%rsi
    testq    %rsi,%rsi
    jne    .Lj1785
    movl    $210,%ecx
    call    fpc_handleerror
.Lj1785:
    movq    (%rsi),%rsi
    movq    %rsi,%rcx
    call    fpc_check_object
    movq    %rdi,%rcx
    movq    %r12,%rdx
    movq    %r13,%r8
    movl    %ebx,%r9d
    call    *400(%rsi)
.Lj1611:
.Ll399:
# [833] end;
    movq    -72(%rbp),%rbx
    movq    -64(%rbp),%rdi
    movq    -56(%rbp),%rsi
    movq    -48(%rbp),%r12
    movq    -40(%rbp),%r13
    leaq    (%rbp),%rsp
    popq    %rbp
    ret
.seh_endproc
.Lc207:
.Lt73:
.Ll400:




# [820:44]
    .byte    2
    .uleb128    .Ll395-.Ll394
    .byte    5
    .uleb128    44
    .byte    13
# [821:9]
    .byte    2
    .uleb128    .Ll396-.Ll395   // Ll396 is the label before the "exit"
    .byte    5
    .uleb128    9
    .byte    13
# [827:7]
    .byte    2
    .uleb128    .Ll397-.Ll396  // and line info for it goes up to Ll397 which is the first statement in the following "else" block
    .byte    5
    .uleb128    7
    .byte    18
# [832:40]

_______________________________________________
fpc-devel maillist  -  fpc-devel@lists.freepascal.org
https://lists.freepascal.org/cgi-bin/mailman/listinfo/fpc-devel

Reply via email to