Author: Armin Rigo <ar...@tunes.org>
Branch: 
Changeset: r71471:cae86999e6c8
Date: 2014-05-12 18:30 +0200
http://bitbucket.org/pypy/pypy/changeset/cae86999e6c8/

Log:    issue1764

        Test and fix

diff --git a/rpython/translator/c/gcc/instruction.py 
b/rpython/translator/c/gcc/instruction.py
--- a/rpython/translator/c/gcc/instruction.py
+++ b/rpython/translator/c/gcc/instruction.py
@@ -184,6 +184,9 @@
     def __init__(self):
         self.delta = -7.25     # use this non-integer value as a marker
 
+class InsnPushed(InsnStackAdjust):
+    pass
+
 class InsnStop(Insn):
     _args_ = ['reason']
     def __init__(self, reason='?'):
diff --git a/rpython/translator/c/gcc/test/elf64/track_random_rsp_rbp.s 
b/rpython/translator/c/gcc/test/elf64/track_random_rsp_rbp.s
new file mode 100644
--- /dev/null
+++ b/rpython/translator/c/gcc/test/elf64/track_random_rsp_rbp.s
@@ -0,0 +1,158 @@
+       .type   seterror.part.1, @function
+seterror.part.1:
+.LFB77:
+       .cfi_startproc
+       pushq   %r14
+       .cfi_def_cfa_offset 16
+       .cfi_offset 14, -16
+       pushq   %r13
+       .cfi_def_cfa_offset 24
+       .cfi_offset 13, -24
+       pushq   %r12
+       .cfi_def_cfa_offset 32
+       .cfi_offset 12, -32
+       pushq   %rbp
+       .cfi_def_cfa_offset 40
+       .cfi_offset 6, -40
+       pushq   %rbx
+       .cfi_def_cfa_offset 48
+       .cfi_offset 3, -48
+       subq    $512, %rsp
+       .cfi_def_cfa_offset 560
+       testq   %r8, %r8
+       je      .L30
+.L11:
+       movq    PyPyExc_TypeError@GOTPCREL(%rip), %rax
+       movq    %r8, %rsi
+       movq    (%rax), %rdi
+       call    PyPyErr_SetString@PLT
+       ;; expected {552(%rsp) | 512(%rsp), 528(%rsp), 536(%rsp), 544(%rsp), 
%r15, 520(%rsp) | }
+       addq    $512, %rsp
+       .cfi_remember_state
+       .cfi_def_cfa_offset 48
+       popq    %rbx
+       .cfi_def_cfa_offset 40
+       popq    %rbp
+       .cfi_def_cfa_offset 32
+       popq    %r12
+       .cfi_def_cfa_offset 24
+       popq    %r13
+       .cfi_def_cfa_offset 16
+       popq    %r14
+       .cfi_def_cfa_offset 8
+       ret
+       .p2align 4,,10
+       .p2align 3
+.L30:
+       .cfi_restore_state
+       testq   %rcx, %rcx
+       movq    %rsi, %r12
+       movl    %edi, %r14d
+       movq    %rdx, %r13
+       movq    %rsp, %rbp
+       movl    $512, %esi
+       movq    %rsp, %rbx
+       je      .L13
+       leaq    .LC6(%rip), %rdx
+       movl    $512, %esi
+       movq    %rsp, %rdi
+       xorl    %eax, %eax
+       movq    %rsp, %rbx
+       call    PyPyOS_snprintf@PLT
+       ;; expected {552(%rsp) | 512(%rsp), 528(%rsp), 536(%rsp), 544(%rsp), 
%r15, 520(%rsp) | }
+.L14:
+       movl    (%rbx), %eax
+       addq    $4, %rbx
+       leal    -16843009(%rax), %esi
+       notl    %eax
+       andl    %eax, %esi
+       andl    $-2139062144, %esi
+       je      .L14
+       movl    %esi, %eax
+       shrl    $16, %eax
+       testl   $32896, %esi
+       cmove   %eax, %esi
+       leaq    2(%rbx), %rax
+       cmove   %rax, %rbx
+       addb    %sil, %sil
+       movq    %rbp, %rsi
+       sbbq    $3, %rbx
+       subq    %rbx, %rsi
+       addq    $512, %rsi
+.L13:
+       testl   %r14d, %r14d
+       je      .L16
+       leaq    .LC7(%rip), %rdx
+       movq    %rbx, %rdi
+       movl    %r14d, %ecx
+       xorl    %eax, %eax
+       call    PyPyOS_snprintf@PLT
+       ;; expected {552(%rsp) | 512(%rsp), 528(%rsp), 536(%rsp), 544(%rsp), 
%r15, 520(%rsp) | }
+       movq    %rbx, %rdi
+       call    strlen@PLT
+       ;; expected {552(%rsp) | 512(%rsp), 528(%rsp), 536(%rsp), 544(%rsp), 
%r15, 520(%rsp) | }
+       addq    %rax, %rbx
+       movl    0(%r13), %eax
+       testl   %eax, %eax
+       jle     .L18
+       movq    %rbx, %rdx
+       subq    %rbp, %rdx
+       cmpl    $219, %edx
+       jg      .L18
+       addq    $4, %r13
+       xorl    %r14d, %r14d
+       .p2align 4,,10
+       .p2align 3
+.L21:
+       movq    %rbp, %rsi
+       leal    -1(%rax), %ecx
+       leaq    .LC8(%rip), %rdx
+       subq    %rbx, %rsi
+       movq    %rbx, %rdi
+       xorl    %eax, %eax
+       addq    $512, %rsi
+       addl    $1, %r14d
+       call    PyPyOS_snprintf@PLT
+       ;; expected {552(%rsp) | 512(%rsp), 528(%rsp), 536(%rsp), 544(%rsp), 
%r15, 520(%rsp) | }
+       movq    %rbx, %rdi
+       call    strlen@PLT
+       ;; expected {552(%rsp) | 512(%rsp), 528(%rsp), 536(%rsp), 544(%rsp), 
%r15, 520(%rsp) | }
+       addq    %rax, %rbx
+       movl    0(%r13), %eax
+       testl   %eax, %eax
+       jle     .L18
+       cmpl    $32, %r14d
+       je      .L18
+       movq    %rbx, %rdx
+       addq    $4, %r13
+       subq    %rbp, %rdx
+       cmpl    $219, %edx
+       jle     .L21
+       jmp     .L18
+       .p2align 4,,10
+       .p2align 3
+.L16:
+       leaq    .LC9(%rip), %rdx
+       movq    %rbx, %rdi
+       xorl    %eax, %eax
+       call    PyPyOS_snprintf@PLT
+       ;; expected {552(%rsp) | 512(%rsp), 528(%rsp), 536(%rsp), 544(%rsp), 
%r15, 520(%rsp) | }
+       movq    %rbx, %rdi
+       call    strlen@PLT
+       ;; expected {552(%rsp) | 512(%rsp), 528(%rsp), 536(%rsp), 544(%rsp), 
%r15, 520(%rsp) | }
+       addq    %rax, %rbx
+.L18:
+       movq    %rbp, %rsi
+       leaq    .LC10(%rip), %rdx
+       movq    %r12, %rcx
+       subq    %rbx, %rsi
+       movq    %rbx, %rdi
+       xorl    %eax, %eax
+       addq    $512, %rsi
+       call    PyPyOS_snprintf@PLT
+       ;; expected {552(%rsp) | 512(%rsp), 528(%rsp), 536(%rsp), 544(%rsp), 
%r15, 520(%rsp) | }
+       movq    %rbp, %r8
+       jmp     .L11
+       .cfi_endproc
+.LFE77:
+       .size   seterror.part.1, .-seterror.part.1
diff --git a/rpython/translator/c/gcc/test/test_trackgcroot.py 
b/rpython/translator/c/gcc/test/test_trackgcroot.py
--- a/rpython/translator/c/gcc/test/test_trackgcroot.py
+++ b/rpython/translator/c/gcc/test/test_trackgcroot.py
@@ -130,7 +130,7 @@
     elif format == 'darwin' or format == 'darwin64':
         py.test.skip("disabled on OS/X's terribly old gcc")
     else:
-        r_globallabel = re.compile(r"([\w]+)=[.]+")
+        r_globallabel = re.compile(r"([\w.]+)=[.]+")
     print
     print path.dirpath().basename + '/' + path.basename
     lines = path.readlines()
diff --git a/rpython/translator/c/gcc/trackgcroot.py 
b/rpython/translator/c/gcc/trackgcroot.py
--- a/rpython/translator/c/gcc/trackgcroot.py
+++ b/rpython/translator/c/gcc/trackgcroot.py
@@ -8,7 +8,7 @@
 from rpython.translator.c.gcc.instruction import InsnSetLocal, InsnCopyLocal
 from rpython.translator.c.gcc.instruction import InsnPrologue, InsnEpilogue
 from rpython.translator.c.gcc.instruction import InsnGCROOT, InsnCondJump
-from rpython.translator.c.gcc.instruction import InsnStackAdjust
+from rpython.translator.c.gcc.instruction import InsnStackAdjust, InsnPushed
 from rpython.translator.c.gcc.instruction import InsnCannotFollowEsp
 from rpython.translator.c.gcc.instruction import LocalVar, somenewvalue
 from rpython.translator.c.gcc.instruction import frameloc_esp, frameloc_ebp
@@ -665,14 +665,22 @@
         match = self.r_unaryinsn.match(line)
         source = match.group(1)
         return self.insns_for_copy(source, self.TOP_OF_STACK_MINUS_WORD) + \
-               [InsnStackAdjust(-self.WORD)]
+               [InsnPushed(-self.WORD)]
 
     def _visit_pop(self, target):
         return [InsnStackAdjust(+self.WORD)] + \
                self.insns_for_copy(self.TOP_OF_STACK_MINUS_WORD, target)
 
     def _visit_prologue(self):
-        # for the prologue of functions that use %ebp as frame pointer
+        # For the prologue of functions that use %ebp as frame pointer.
+        # First, find the latest InsnStackAdjust; if it's not a PUSH,
+        # then consider that this 'mov %rsp, %rbp' is actually unrelated
+        i = -1
+        while not isinstance(self.insns[i], InsnStackAdjust):
+            i -= 1
+        if not isinstance(self.insns[i], InsnPushed):
+            return []
+        #
         self.uses_frame_pointer = True
         self.r_localvar = self.r_localvarfp
         return [InsnPrologue(self.WORD)]
_______________________________________________
pypy-commit mailing list
pypy-commit@python.org
https://mail.python.org/mailman/listinfo/pypy-commit

Reply via email to