Various fixes to cfi handling.
authordrepper <drepper>
Wed, 4 May 2005 17:52:08 +0000 (17:52 +0000)
committerdrepper <drepper>
Wed, 4 May 2005 17:52:08 +0000 (17:52 +0000)
17 files changed:
sysdeps/i386/addmul_1.S
sysdeps/i386/i586/addmul_1.S
sysdeps/i386/i586/memcpy.S
sysdeps/i386/i586/mul_1.S
sysdeps/i386/i586/rshift.S
sysdeps/i386/i586/sub_n.S
sysdeps/i386/i586/submul_1.S
sysdeps/i386/i686/memcmp.S
sysdeps/i386/i686/memmove.S
sysdeps/i386/mul_1.S
sysdeps/i386/strtok.S
sysdeps/i386/sub_n.S
sysdeps/i386/submul_1.S
sysdeps/unix/sysv/linux/i386/clone.S
sysdeps/unix/sysv/linux/i386/mmap.S
sysdeps/unix/sysv/linux/i386/mmap64.S
sysdeps/unix/sysv/linux/i386/setcontext.S

index 23c3f59..df50172 100644 (file)
 ENTRY (BP_SYM (__mpn_addmul_1))
        ENTER
 
-       pushl   %edi
+       pushl   %res_ptr
        cfi_adjust_cfa_offset (4)
-       pushl   %esi
+       pushl   %s1_ptr
        cfi_adjust_cfa_offset (4)
        pushl   %ebp
        cfi_adjust_cfa_offset (4)
-       pushl   %ebx
+       pushl   %s2_limb
        cfi_adjust_cfa_offset (4)
 
        movl    RES(%esp), %res_ptr
@@ -79,18 +79,18 @@ L(oop):
        jnz     L(oop)
        movl    %ebp, %eax
 
-       popl    %ebx
+       popl    %s2_limb
        cfi_adjust_cfa_offset (-4)
-       cfi_restore (ebx)
+       cfi_restore (s2_limb)
        popl    %ebp
        cfi_adjust_cfa_offset (-4)
        cfi_restore (ebp)
-       popl    %esi
+       popl    %s1_ptr
        cfi_adjust_cfa_offset (-4)
-       cfi_restore (esi)
-       popl    %edi
+       cfi_restore (s1_ptr)
+       popl    %res_ptr
        cfi_adjust_cfa_offset (-4)
-       cfi_restore (edi)
+       cfi_restore (res_ptr)
 
        LEAVE
        ret
index 18955e3..1890c5d 100644 (file)
 ENTRY (BP_SYM (__mpn_addmul_1))
        ENTER
 
-       pushl   %edi
+       pushl   %res_ptr
        cfi_adjust_cfa_offset (4)
-       pushl   %esi
+       pushl   %s1_ptr
        cfi_adjust_cfa_offset (4)
        pushl   %ebp
        cfi_adjust_cfa_offset (4)
-       pushl   %ebx
+       pushl   %s2_limb
        cfi_adjust_cfa_offset (4)
 
        movl    RES(%esp), %res_ptr
@@ -86,18 +86,18 @@ L(oop):     adcl    $0, %ebp
 
        adcl    $0, %ebp
        movl    %ebp, %eax
-       popl    %ebx
+       popl    %s2_limb
        cfi_adjust_cfa_offset (-4)
-       cfi_restore (ebx)
+       cfi_restore (s2_limb)
        popl    %ebp
        cfi_adjust_cfa_offset (-4)
        cfi_restore (ebp)
-       popl    %esi
+       popl    %s1_ptr
        cfi_adjust_cfa_offset (-4)
-       cfi_restore (esi)
-       popl    %edi
+       cfi_restore (s1_ptr)
+       popl    %res_ptr
        cfi_adjust_cfa_offset (-4)
-       cfi_restore (edi)
+       cfi_restore (res_ptr)
 
        LEAVE
        ret
index 1fa267e..6ab457f 100644 (file)
@@ -46,7 +46,7 @@ ENTRY (BP_SYM (memcpy))
        movl    DEST(%esp), %edi
        cfi_rel_offset (edi, 4)
        movl    SRC(%esp), %esi
-       cfi_rel_offset (esi, 4)
+       cfi_rel_offset (esi, 0)
        movl    LEN(%esp), %ecx
        CHECK_BOUNDS_BOTH_WIDE (%edi, DEST(%esp), %ecx)
        CHECK_BOUNDS_BOTH_WIDE (%esi, SRC(%esp), %ecx)
index b537c70..15765d7 100644 (file)
 ENTRY (BP_SYM (__mpn_mul_1))
        ENTER
 
-       pushl   %edi
+       pushl   %res_ptr
        cfi_adjust_cfa_offset (4)
-       pushl   %esi
+       pushl   %s1_ptr
        cfi_adjust_cfa_offset (4)
        pushl   %ebp
        cfi_adjust_cfa_offset (4)
-       pushl   %ebx
+       pushl   %s2_limb
        cfi_adjust_cfa_offset (4)
 
        movl    RES(%esp), %res_ptr
@@ -82,18 +82,18 @@ L(oop):     adcl    $0, %ebp
 
        adcl    $0, %ebp
        movl    %ebp, %eax
-       popl    %ebx
+       popl    %s2_limb
        cfi_adjust_cfa_offset (-4)
-       cfi_restore (ebx)
+       cfi_restore (s2_limb)
        popl    %ebp
        cfi_adjust_cfa_offset (-4)
        cfi_restore (ebp)
-       popl    %esi
+       popl    %s1_ptr
        cfi_adjust_cfa_offset (-4)
-       cfi_restore (esi)
-       popl    %edi
+       cfi_restore (s1_ptr)
+       popl    %res_ptr
        cfi_adjust_cfa_offset (-4)
-       cfi_restore (edi)
+       cfi_restore (res_ptr)
 
        LEAVE
        ret
index 29eded3..7b88289 100644 (file)
@@ -165,7 +165,7 @@ L(end2):
        cfi_rel_offset (edi, 12)
        cfi_rel_offset (esi, 8)
        cfi_rel_offset (ebp, 4)
-       cfi_rel_offset (ebx, 3)
+       cfi_rel_offset (ebx, 0)
 L(special):
        leal    -4(%edi,%ebx,4),%edi
        leal    -4(%esi,%ebx,4),%esi
index 1c40a80..7c32c1a 100644 (file)
@@ -56,8 +56,8 @@ ENTRY (BP_SYM (__mpn_sub_n))
        CHECK_BOUNDS_BOTH_WIDE (%ebx, S2(%esp), %ecx)
        shrl    $2, %ecx
 #endif
-       cfi_rel_offset (ebp, 4)
        movl    (%ebx),%ebp
+       cfi_rel_offset (ebp, 4)
 
        decl    %ecx
        movl    %ecx,%edx
index b9e578f..e8bc647 100644 (file)
 ENTRY (BP_SYM (__mpn_submul_1))
        ENTER
 
-       pushl   %edi
+       pushl   %res_ptr
        cfi_adjust_cfa_offset (4)
-       pushl   %esi
+       pushl   %s1_ptr
        cfi_adjust_cfa_offset (4)
        pushl   %ebp
        cfi_adjust_cfa_offset (4)
-       pushl   %ebx
+       pushl   %s2_limb
        cfi_adjust_cfa_offset (4)
 
        movl    RES(%esp), %res_ptr
@@ -86,18 +86,18 @@ L(oop):     adcl    $0, %ebp
 
        adcl    $0, %ebp
        movl    %ebp, %eax
-       popl    %ebx
+       popl    %s2_limb
        cfi_adjust_cfa_offset (-4)
-       cfi_restore (ebx)
+       cfi_restore (s2_limb)
        popl    %ebp
        cfi_adjust_cfa_offset (-4)
        cfi_restore (ebp)
-       popl    %esi
+       popl    %s1_ptr
        cfi_adjust_cfa_offset (-4)
-       cfi_restore (esi)
-       popl    %edi
+       cfi_restore (s1_ptr)
+       popl    %res_ptr
        cfi_adjust_cfa_offset (-4)
-       cfi_restore (edi)
+       cfi_restore (res_ptr)
 
        LEAVE
        ret
index 4f1c741..4bd5394 100644 (file)
@@ -29,7 +29,8 @@
 #define ENTRANCE       pushl %ebx; cfi_adjust_cfa_offset (4); \
                        cfi_rel_offset (ebx, 0); ENTER
 #define RETURN         popl %ebx; cfi_adjust_cfa_offset (-4); \
-                       cfi_restore (ebx); LEAVE; ret
+                       cfi_restore (ebx); LEAVE; ret; \
+                       cfi_adjust_cfa_offset (4); cfi_rel_offset (ebx, 0);
 
 /* Load an entry in a jump table into EBX.  TABLE is a jump table
    with relative offsets.  INDEX is a register contains the index
@@ -79,6 +80,8 @@ L(neq):
        sbbl    $-1, %eax
        RETURN
 
+       cfi_adjust_cfa_offset (4)
+       cfi_rel_offset (ebx, 0)
 L(not_1):
        jl      L(bye)                  /* LEN == 0  */
 
@@ -137,8 +140,9 @@ L(0bytes):
        xorl    %eax, %eax
        RETURN
 
-       cfi_adjust_cfa_offset (4)
+       cfi_adjust_cfa_offset (8)
        cfi_rel_offset (esi, 0)
+       cfi_rel_offset (ebx, 4)
 L(29bytes):
        movl    -29(%esi), %eax
        movl    -29(%edx), %ecx
@@ -184,8 +188,9 @@ L(1bytes):
        xorl    %eax, %eax
        RETURN
 
-       cfi_adjust_cfa_offset (4)
+       cfi_adjust_cfa_offset (8)
        cfi_rel_offset (esi, 0)
+       cfi_rel_offset (ebx, 4)
 L(30bytes):
        movl    -30(%esi), %eax
        movl    -30(%edx), %ecx
@@ -234,8 +239,9 @@ L(2bytes):
        xorl    %eax, %eax
        RETURN
 
-       cfi_adjust_cfa_offset (4)
+       cfi_adjust_cfa_offset (8)
        cfi_rel_offset (esi, 0)
+       cfi_rel_offset (ebx, 4)
 L(31bytes):
        movl    -31(%esi), %eax
        movl    -31(%edx), %ecx
@@ -287,8 +293,9 @@ L(3bytes):
        xorl    %eax, %eax
        RETURN
 
-       cfi_adjust_cfa_offset (4)
+       cfi_adjust_cfa_offset (8)
        cfi_rel_offset (esi, 0)
+       cfi_rel_offset (ebx, 4)
        ALIGN (4)
 /* ECX >= 32.  */
 L(32bytesormore):
index a433622..b93b5c7 100644 (file)
@@ -79,6 +79,10 @@ ENTRY (BP_SYM (memmove))
        LEAVE
        RET_PTR
 
+       cfi_adjust_cfa_offset (4)
+       cfi_rel_offset (edi, 0)
+       cfi_register (esi, edx)
+
        /* Backward copying.  */
 3:     std
        leal    -1(%edi, %ecx), %edi
index 2de8783..0d0c07e 100644 (file)
 ENTRY (BP_SYM (__mpn_mul_1))
        ENTER
 
-       pushl   %edi
+       pushl   %res_ptr
        cfi_adjust_cfa_offset (4)
-       pushl   %esi
+       pushl   %s1_ptr
        cfi_adjust_cfa_offset (4)
        pushl   %ebp
        cfi_adjust_cfa_offset (4)
-       pushl   %ebx
+       pushl   %s2_limb
        cfi_adjust_cfa_offset (4)
 
        movl    RES(%esp), %res_ptr
@@ -78,18 +78,18 @@ L(oop):
        jnz     L(oop)
        movl    %ebp, %eax
 
-       popl    %ebx
+       popl    %s2_limb
        cfi_adjust_cfa_offset (-4)
-       cfi_restore (ebx)
+       cfi_restore (s2_limb)
        popl    %ebp
        cfi_adjust_cfa_offset (-4)
        cfi_restore (ebp)
-       popl    %esi
+       popl    %s1_ptr
        cfi_adjust_cfa_offset (-4)
-       cfi_restore (esi)
-       popl    %edi
+       cfi_restore (s1_ptr)
+       popl    %res_ptr
        cfi_adjust_cfa_offset (-4)
-       cfi_restore (edi)
+       cfi_restore (res_ptr)
 
        LEAVE
        ret
index e45db61..88b343b 100644 (file)
@@ -81,7 +81,7 @@ ENTRY (BP_SYM (FUNCTION))
        cfi_adjust_cfa_offset (4)
        call L(here)
        cfi_adjust_cfa_offset (4)
-       cfi_rel_offset (ebx, 4)
+       cfi_rel_offset (ebx, 0)
 L(here):
        popl %ebx
        cfi_adjust_cfa_offset (-4)
index c9f6418..e1e62b8 100644 (file)
@@ -67,10 +67,12 @@ ENTRY (BP_SYM (__mpn_sub_n))
 /* Calculate start address in loop for PIC.  Due to limitations in some
    assemblers, Loop-L0-3 cannot be put into the leal */
        call    L(0)
+       cfi_adjust_cfa_offset (4)
 L(0):  leal    (%eax,%eax,8),%eax
        addl    (%esp),%eax
        addl    $(L(oop)-L(0)-3),%eax
        addl    $4,%esp
+       cfi_adjust_cfa_offset (-4)
 #else
 /* Calculate start address in loop for non-PIC.  */
        leal    (L(oop) - 3)(%eax,%eax,8),%eax
index f932213..7f8523d 100644 (file)
@@ -46,14 +46,15 @@ ENTRY (BP_SYM (__mpn_submul_1))
        cfi_adjust_cfa_offset (4)
        pushl   %ebx
        cfi_adjust_cfa_offset (4)
+       cfi_rel_offset (edi, 12)
+       cfi_rel_offset (esi, 8)
+       cfi_rel_offset (ebp, 4)
+       cfi_rel_offset (ebx, 0)
 
        movl    RES(%esp), %res_ptr
-       cfi_rel_offset (res_ptr, 12)
        movl    S1(%esp), %s1_ptr
-       cfi_rel_offset (s1_ptr, 8)
        movl    SIZE(%esp), %sizeP
        movl    S2LIMB(%esp), %s2_limb
-       cfi_rel_offset (s2_limb, 0)
 #if __BOUNDED_POINTERS__
        shll    $2, %sizeP      /* convert limbs to bytes */
        CHECK_BOUNDS_BOTH_WIDE (%res_ptr, RES(%esp), %sizeP)
@@ -64,7 +65,6 @@ ENTRY (BP_SYM (__mpn_submul_1))
        leal    (%s1_ptr,%sizeP,4), %s1_ptr
        negl    %sizeP
        xorl    %ebp, %ebp
-       cfi_rel_offset (ebp, 4)
        ALIGN (3)
 L(oop):
        movl    (%s1_ptr,%sizeP,4), %eax
index 69243d5..54524ec 100644 (file)
@@ -88,6 +88,7 @@ ENTRY (BP_SYM (__clone))
        cfi_adjust_cfa_offset (4)
        pushl   %edi
        cfi_adjust_cfa_offset (4)
+
        movl    TLS+12(%esp),%esi
        cfi_rel_offset (esi, 4)
        movl    PTID+12(%esp),%edx
@@ -102,16 +103,14 @@ ENTRY (BP_SYM (__clone))
        movl    %ebx, (%ecx)
 #endif
 
+       /* End FDE now, because in the child the unwind info will be
+          wrong.  */
+       cfi_endproc
+
        int     $0x80
        popl    %edi
-       cfi_adjust_cfa_offset (-4)
-       cfi_restore (edi)
        popl    %esi
-       cfi_adjust_cfa_offset (-4)
-       cfi_restore (esi)
        popl    %ebx
-       cfi_adjust_cfa_offset (-4)
-       cfi_restore (ebx)
 
        test    %eax,%eax
        jl      SYSCALL_ERROR_LABEL
@@ -131,10 +130,8 @@ L(haspid):
        call    *%ebx
 #ifdef PIC
        call    L(here)
-       cfi_adjust_cfa_offset (4)
 L(here):
        popl    %ebx
-       cfi_adjust_cfa_offset (-4)
        addl    $_GLOBAL_OFFSET_TABLE_+[.-L(here)], %ebx
 #endif
        movl    %eax, %ebx
@@ -156,6 +153,7 @@ L(nomoregetpid):
        .previous
 #endif
 
+       cfi_startproc
 PSEUDO_END (BP_SYM (__clone))
 
 weak_alias (BP_SYM (__clone), BP_SYM (clone))
index 9f664de..10f8bc7 100644 (file)
@@ -26,7 +26,7 @@
 
 ENTRY (__mmap)
 
-/* I don't think it is worthwhile trzing to use mmap2 whenever it
+/* I don't think it is worthwhile trying to use mmap2 whenever it
    is available.  Only use it when we are sure the syscall exists.  */
 #ifdef __ASSUME_MMAP2_SYSCALL
 
@@ -78,6 +78,7 @@ L(skip):
 
        /* Save registers.  */
        movl %ebx, %edx
+       cfi_register (ebx, edx)
 
        movl $SYS_ify(mmap), %eax       /* System call number in %eax.  */
 
@@ -88,6 +89,7 @@ L(skip):
 
        /* Restore registers.  */
        movl %edx, %ebx
+       cfi_restore (ebx)
 
 #endif
 
index 89d9f5f..4209453 100644 (file)
@@ -130,6 +130,7 @@ L(einval):
 3:
        /* Save registers.  */
        movl %ebx, %edx
+       cfi_register (ebx, edx)
 
        cmpl $0, OFFHI-SVRSP(%esp)
        jne L(einval2)
@@ -143,6 +144,7 @@ L(einval):
 
        /* Restore registers.  */
        movl %edx, %ebx
+       cfi_restore (ebx)
 
        /* If 0 > %eax > -4096 there was an error.  */
        cmpl $-4096, %eax
@@ -154,8 +156,10 @@ L(pseudo_end):
 #endif
        ret
 
+       cfi_register (ebx, edx)
 L(einval2):
        movl %edx, %ebx
+       cfi_restore (ebx)
        movl $-EINVAL, %eax
        jmp SYSCALL_ERROR_LABEL
 #endif
index 22469b2..c493cf9 100644 (file)
@@ -61,6 +61,13 @@ ENTRY(__setcontext)
        movl    oEIP(%eax), %ecx
 
        /* Load the new stack pointer.  */
+       cfi_def_cfa (eax, 0)
+       cfi_offset (edi, oEDI)
+       cfi_offset (esi, oESI)
+       cfi_offset (ebp, oEBP)
+       cfi_offset (ebx, oEBX)
+       cfi_offset (edx, oEDX)
+       cfi_offset (ecx, oECX)
        movl    oESP(%eax), %esp
 
        /* Push the return address on the new stack so we can return there.  */
@@ -76,6 +83,10 @@ ENTRY(__setcontext)
        movl    oECX(%eax), %ecx
        movl    oEAX(%eax), %eax
 
+       /* End FDE here, we fall into another context.  */
+       cfi_endproc
+       cfi_startproc
+
        /* The following 'ret' will pop the address of the code and jump
           to it.  */