On Thu, Jun 21, 2012 at 07:59:06AM +0200, Philipp Marek wrote:
> Just out of curiosity, could you show the disassembler output of the 
> OutputWrite() function for gcc-4.6, and gcc-4.7 with -O1 and -O2?
> 
>       # objdump -Sgd <name-of-obj-file>
> 
> and pasting only this function might be a good way.

Sure, attached files for those combinations.

Cheers,
-- 
James
GPG Key: 4096R/331BA3DB 2011-12-05 James McCoy <james...@debian.org>
0000000000001b2a <OutputWrite>:
/* Output buffer management
 */

    static PyObject *
OutputWrite(PyObject *self, PyObject *args)
{
    1b2a:       55                      push   %rbp
    1b2b:       53                      push   %rbx
    1b2c:       48 83 ec 18             sub    $0x18,%rsp
    1b30:       48 89 f0                mov    %rsi,%rax
    int len;
    char *str = NULL;
    1b33:       48 c7 04 24 00 00 00    movq   $0x0,(%rsp)
    1b3a:       00 
    int error = ((OutputObject *)(self))->error;
    1b3b:       8b 5f 18                mov    0x18(%rdi),%ebx

    if (!PyArg_ParseTuple(args, "et#", ENC_OPT, &str, &len))
    1b3e:       4c 8d 44 24 0c          lea    0xc(%rsp),%r8
    1b43:       48 89 e1                mov    %rsp,%rcx
    1b46:       48 8b 15 00 00 00 00    mov    0x0(%rip),%rdx        # 1b4d 
<OutputWrite+0x23>
    1b4d:       be 00 00 00 00          mov    $0x0,%esi
    1b52:       48 89 c7                mov    %rax,%rdi
    1b55:       b8 00 00 00 00          mov    $0x0,%eax
    1b5a:       e8 00 00 00 00          callq  1b5f <OutputWrite+0x35>
    1b5f:       85 c0                   test   %eax,%eax
    1b61:       74 4d                   je     1bb0 <OutputWrite+0x86>
        return NULL;

    /* TODO: This works around a gcc optimizer problem and avoids Vim
     * from crashing.  Should find a real solution. */
    if (str == NULL)
    1b63:       48 83 3c 24 00          cmpq   $0x0,(%rsp)
    1b68:       74 4d                   je     1bb7 <OutputWrite+0x8d>
        return NULL;

    Py_BEGIN_ALLOW_THREADS
    1b6a:       e8 00 00 00 00          callq  1b6f <OutputWrite+0x45>
    1b6f:       48 89 c5                mov    %rax,%rbp
    Python_Lock_Vim();
    writer((writefn)(error ? emsg : msg), (char_u *)str, len);
    1b72:       48 63 54 24 0c          movslq 0xc(%rsp),%rdx
    1b77:       85 db                   test   %ebx,%ebx
    1b79:       b8 00 00 00 00          mov    $0x0,%eax
    1b7e:       bf 00 00 00 00          mov    $0x0,%edi
    1b83:       48 0f 45 f8             cmovne %rax,%rdi
    1b87:       48 8b 34 24             mov    (%rsp),%rsi
    1b8b:       e8 e2 fc ff ff          callq  1872 <writer>
    Python_Release_Vim();
    Py_END_ALLOW_THREADS
    1b90:       48 89 ef                mov    %rbp,%rdi
    1b93:       e8 00 00 00 00          callq  1b98 <OutputWrite+0x6e>
    PyMem_Free(str);
    1b98:       48 8b 3c 24             mov    (%rsp),%rdi
    1b9c:       e8 00 00 00 00          callq  1ba1 <OutputWrite+0x77>

    Py_INCREF(Py_None);
    1ba1:       48 83 05 00 00 00 00    addq   $0x1,0x0(%rip)        # 1ba9 
<OutputWrite+0x7f>
    1ba8:       01 
    return Py_None;
    1ba9:       b8 00 00 00 00          mov    $0x0,%eax
    1bae:       eb 0c                   jmp    1bbc <OutputWrite+0x92>
    int len;
    char *str = NULL;
    int error = ((OutputObject *)(self))->error;

    if (!PyArg_ParseTuple(args, "et#", ENC_OPT, &str, &len))
        return NULL;
    1bb0:       b8 00 00 00 00          mov    $0x0,%eax
    1bb5:       eb 05                   jmp    1bbc <OutputWrite+0x92>

    /* TODO: This works around a gcc optimizer problem and avoids Vim
     * from crashing.  Should find a real solution. */
    if (str == NULL)
        return NULL;
    1bb7:       b8 00 00 00 00          mov    $0x0,%eax
    Py_END_ALLOW_THREADS
    PyMem_Free(str);

    Py_INCREF(Py_None);
    return Py_None;
}
    1bbc:       48 83 c4 18             add    $0x18,%rsp
    1bc0:       5b                      pop    %rbx
    1bc1:       5d                      pop    %rbp
    1bc2:       c3                      retq   
0000000000000500 <OutputWrite>:
/* Output buffer management
 */

    static PyObject *
OutputWrite(PyObject *self, PyObject *args)
{
     500:       55                      push   %rbp
     501:       48 89 f0                mov    %rsi,%rax
    int len;
    char *str = NULL;
    int error = ((OutputObject *)(self))->error;

    if (!PyArg_ParseTuple(args, "et#", ENC_OPT, &str, &len))
     504:       be 00 00 00 00          mov    $0x0,%esi
/* Output buffer management
 */

    static PyObject *
OutputWrite(PyObject *self, PyObject *args)
{
     509:       53                      push   %rbx
     50a:       48 83 ec 18             sub    $0x18,%rsp
    int len;
    char *str = NULL;
    int error = ((OutputObject *)(self))->error;

    if (!PyArg_ParseTuple(args, "et#", ENC_OPT, &str, &len))
     50e:       48 8b 15 00 00 00 00    mov    0x0(%rip),%rdx        # 515 
<OutputWrite+0x15>
    static PyObject *
OutputWrite(PyObject *self, PyObject *args)
{
    int len;
    char *str = NULL;
    int error = ((OutputObject *)(self))->error;
     515:       8b 5f 18                mov    0x18(%rdi),%ebx

    if (!PyArg_ParseTuple(args, "et#", ENC_OPT, &str, &len))
     518:       4c 8d 44 24 04          lea    0x4(%rsp),%r8
     51d:       48 8d 4c 24 08          lea    0x8(%rsp),%rcx
     522:       48 89 c7                mov    %rax,%rdi
     525:       31 c0                   xor    %eax,%eax

    static PyObject *
OutputWrite(PyObject *self, PyObject *args)
{
    int len;
    char *str = NULL;
     527:       48 c7 44 24 08 00 00    movq   $0x0,0x8(%rsp)
     52e:       00 00 
    int error = ((OutputObject *)(self))->error;

    if (!PyArg_ParseTuple(args, "et#", ENC_OPT, &str, &len))
     530:       e8 00 00 00 00          callq  535 <OutputWrite+0x35>
     535:       85 c0                   test   %eax,%eax
     537:       74 57                   je     590 <OutputWrite+0x90>
        return NULL;

    /* TODO: This works around a gcc optimizer problem and avoids Vim
     * from crashing.  Should find a real solution. */
    if (str == NULL)
     539:       48 83 7c 24 08 00       cmpq   $0x0,0x8(%rsp)
     53f:       74 4f                   je     590 <OutputWrite+0x90>
        return NULL;

    Py_BEGIN_ALLOW_THREADS
     541:       e8 00 00 00 00          callq  546 <OutputWrite+0x46>
    Python_Lock_Vim();
    writer((writefn)(error ? emsg : msg), (char_u *)str, len);
     546:       48 63 54 24 04          movslq 0x4(%rsp),%rdx
     54b:       48 8b 74 24 08          mov    0x8(%rsp),%rsi
     550:       85 db                   test   %ebx,%ebx
    /* TODO: This works around a gcc optimizer problem and avoids Vim
     * from crashing.  Should find a real solution. */
    if (str == NULL)
        return NULL;

    Py_BEGIN_ALLOW_THREADS
     552:       48 89 c5                mov    %rax,%rbp
    Python_Lock_Vim();
    writer((writefn)(error ? emsg : msg), (char_u *)str, len);
     555:       bf 00 00 00 00          mov    $0x0,%edi
     55a:       b8 00 00 00 00          mov    $0x0,%eax
     55f:       48 0f 44 f8             cmove  %rax,%rdi
     563:       e8 28 fd ff ff          callq  290 <writer>
    Python_Release_Vim();
    Py_END_ALLOW_THREADS
     568:       48 89 ef                mov    %rbp,%rdi
     56b:       e8 00 00 00 00          callq  570 <OutputWrite+0x70>
    PyMem_Free(str);
     570:       48 8b 7c 24 08          mov    0x8(%rsp),%rdi
     575:       e8 00 00 00 00          callq  57a <OutputWrite+0x7a>

    Py_INCREF(Py_None);
     57a:       48 83 05 00 00 00 00    addq   $0x1,0x0(%rip)        # 582 
<OutputWrite+0x82>
     581:       01 
    return Py_None;
}
     582:       48 83 c4 18             add    $0x18,%rsp
    Python_Release_Vim();
    Py_END_ALLOW_THREADS
    PyMem_Free(str);

    Py_INCREF(Py_None);
    return Py_None;
     586:       b8 00 00 00 00          mov    $0x0,%eax
}
     58b:       5b                      pop    %rbx
     58c:       5d                      pop    %rbp
     58d:       c3                      retq   
     58e:       66 90                   xchg   %ax,%ax
     590:       48 83 c4 18             add    $0x18,%rsp
    int len;
    char *str = NULL;
    int error = ((OutputObject *)(self))->error;

    if (!PyArg_ParseTuple(args, "et#", ENC_OPT, &str, &len))
        return NULL;
     594:       31 c0                   xor    %eax,%eax
    Py_END_ALLOW_THREADS
    PyMem_Free(str);

    Py_INCREF(Py_None);
    return Py_None;
}
     596:       5b                      pop    %rbx
     597:       5d                      pop    %rbp
     598:       c3                      retq   
     599:       0f 1f 80 00 00 00 00    nopl   0x0(%rax)
0000000000001ade <OutputWrite>:
/* Output buffer management
 */

    static PyObject *
OutputWrite(PyObject *self, PyObject *args)
{
    1ade:       55                      push   %rbp
    1adf:       53                      push   %rbx
    1ae0:       48 83 ec 18             sub    $0x18,%rsp
    1ae4:       48 89 f0                mov    %rsi,%rax
    int len;
    char *str = NULL;
    1ae7:       48 c7 04 24 00 00 00    movq   $0x0,(%rsp)
    1aee:       00 
    int error = ((OutputObject *)(self))->error;
    1aef:       48 8b 5f 18             mov    0x18(%rdi),%rbx

    if (!PyArg_ParseTuple(args, "et#", ENC_OPT, &str, &len))
    1af3:       4c 8d 44 24 0c          lea    0xc(%rsp),%r8
    1af8:       48 89 e1                mov    %rsp,%rcx
    1afb:       48 8b 15 00 00 00 00    mov    0x0(%rip),%rdx        # 1b02 
<OutputWrite+0x24>
    1b02:       be 00 00 00 00          mov    $0x0,%esi
    1b07:       48 89 c7                mov    %rax,%rdi
    1b0a:       b8 00 00 00 00          mov    $0x0,%eax
    1b0f:       e8 00 00 00 00          callq  1b14 <OutputWrite+0x36>
        return NULL;
    1b14:       ba 00 00 00 00          mov    $0x0,%edx
{
    int len;
    char *str = NULL;
    int error = ((OutputObject *)(self))->error;

    if (!PyArg_ParseTuple(args, "et#", ENC_OPT, &str, &len))
    1b19:       85 c0                   test   %eax,%eax
    1b1b:       74 4b                   je     1b68 <OutputWrite+0x8a>
        return NULL;

    /* TODO: This works around a gcc optimizer problem and avoids Vim
     * from crashing.  Should find a real solution. */
    if (str == NULL)
    1b1d:       48 83 3c 24 00          cmpq   $0x0,(%rsp)
    1b22:       74 44                   je     1b68 <OutputWrite+0x8a>
        return NULL;

    Py_BEGIN_ALLOW_THREADS
    1b24:       e8 00 00 00 00          callq  1b29 <OutputWrite+0x4b>
    1b29:       48 89 c5                mov    %rax,%rbp
    Python_Lock_Vim();
    writer((writefn)(error ? emsg : msg), (char_u *)str, len);
    1b2c:       48 63 54 24 0c          movslq 0xc(%rsp),%rdx
    1b31:       85 db                   test   %ebx,%ebx
    1b33:       b8 00 00 00 00          mov    $0x0,%eax
    1b38:       bf 00 00 00 00          mov    $0x0,%edi
    1b3d:       48 0f 45 f8             cmovne %rax,%rdi
    1b41:       48 8b 34 24             mov    (%rsp),%rsi
    1b45:       e8 d9 fc ff ff          callq  1823 <writer>
    Python_Release_Vim();
    Py_END_ALLOW_THREADS
    1b4a:       48 89 ef                mov    %rbp,%rdi
    1b4d:       e8 00 00 00 00          callq  1b52 <OutputWrite+0x74>
    PyMem_Free(str);
    1b52:       48 8b 3c 24             mov    (%rsp),%rdi
    1b56:       e8 00 00 00 00          callq  1b5b <OutputWrite+0x7d>

    Py_INCREF(Py_None);
    1b5b:       48 83 05 00 00 00 00    addq   $0x1,0x0(%rip)        # 1b63 
<OutputWrite+0x85>
    1b62:       01 
    return Py_None;
    1b63:       ba 00 00 00 00          mov    $0x0,%edx
}
    1b68:       48 89 d0                mov    %rdx,%rax
    1b6b:       48 83 c4 18             add    $0x18,%rsp
    1b6f:       5b                      pop    %rbx
    1b70:       5d                      pop    %rbp
    1b71:       c3                      retq   
00000000000005d0 <OutputWrite>:
/* Output buffer management
 */

    static PyObject *
OutputWrite(PyObject *self, PyObject *args)
{
     5d0:       55                      push   %rbp
     5d1:       48 89 f0                mov    %rsi,%rax
    int len;
    char *str = NULL;
    int error = ((OutputObject *)(self))->error;

    if (!PyArg_ParseTuple(args, "et#", ENC_OPT, &str, &len))
     5d4:       be 00 00 00 00          mov    $0x0,%esi
/* Output buffer management
 */

    static PyObject *
OutputWrite(PyObject *self, PyObject *args)
{
     5d9:       53                      push   %rbx
     5da:       48 83 ec 18             sub    $0x18,%rsp
    int len;
    char *str = NULL;
    int error = ((OutputObject *)(self))->error;

    if (!PyArg_ParseTuple(args, "et#", ENC_OPT, &str, &len))
     5de:       48 8b 15 00 00 00 00    mov    0x0(%rip),%rdx        # 5e5 
<OutputWrite+0x15>
    static PyObject *
OutputWrite(PyObject *self, PyObject *args)
{
    int len;
    char *str = NULL;
    int error = ((OutputObject *)(self))->error;
     5e5:       48 8b 5f 18             mov    0x18(%rdi),%rbx

    if (!PyArg_ParseTuple(args, "et#", ENC_OPT, &str, &len))
     5e9:       4c 8d 44 24 0c          lea    0xc(%rsp),%r8
     5ee:       48 89 c7                mov    %rax,%rdi
     5f1:       48 89 e1                mov    %rsp,%rcx
     5f4:       31 c0                   xor    %eax,%eax

    static PyObject *
OutputWrite(PyObject *self, PyObject *args)
{
    int len;
    char *str = NULL;
     5f6:       48 c7 04 24 00 00 00    movq   $0x0,(%rsp)
     5fd:       00 
    int error = ((OutputObject *)(self))->error;

    if (!PyArg_ParseTuple(args, "et#", ENC_OPT, &str, &len))
     5fe:       e8 00 00 00 00          callq  603 <OutputWrite+0x33>
        return NULL;
     603:       31 d2                   xor    %edx,%edx
{
    int len;
    char *str = NULL;
    int error = ((OutputObject *)(self))->error;

    if (!PyArg_ParseTuple(args, "et#", ENC_OPT, &str, &len))
     605:       85 c0                   test   %eax,%eax
     607:       74 4b                   je     654 <OutputWrite+0x84>
        return NULL;

    /* TODO: This works around a gcc optimizer problem and avoids Vim
     * from crashing.  Should find a real solution. */
    if (str == NULL)
     609:       48 83 3c 24 00          cmpq   $0x0,(%rsp)
     60e:       74 44                   je     654 <OutputWrite+0x84>
        return NULL;

    Py_BEGIN_ALLOW_THREADS
     610:       e8 00 00 00 00          callq  615 <OutputWrite+0x45>
    Python_Lock_Vim();
    writer((writefn)(error ? emsg : msg), (char_u *)str, len);
     615:       48 63 54 24 0c          movslq 0xc(%rsp),%rdx
     61a:       48 8b 34 24             mov    (%rsp),%rsi
     61e:       85 db                   test   %ebx,%ebx
    /* TODO: This works around a gcc optimizer problem and avoids Vim
     * from crashing.  Should find a real solution. */
    if (str == NULL)
        return NULL;

    Py_BEGIN_ALLOW_THREADS
     620:       48 89 c5                mov    %rax,%rbp
    Python_Lock_Vim();
    writer((writefn)(error ? emsg : msg), (char_u *)str, len);
     623:       bf 00 00 00 00          mov    $0x0,%edi
     628:       b8 00 00 00 00          mov    $0x0,%eax
     62d:       48 0f 44 f8             cmove  %rax,%rdi
     631:       e8 da fc ff ff          callq  310 <writer>
    Python_Release_Vim();
    Py_END_ALLOW_THREADS
     636:       48 89 ef                mov    %rbp,%rdi
     639:       e8 00 00 00 00          callq  63e <OutputWrite+0x6e>
    PyMem_Free(str);
     63e:       48 8b 3c 24             mov    (%rsp),%rdi
     642:       e8 00 00 00 00          callq  647 <OutputWrite+0x77>

    Py_INCREF(Py_None);
     647:       48 83 05 00 00 00 00    addq   $0x1,0x0(%rip)        # 64f 
<OutputWrite+0x7f>
     64e:       01 
    return Py_None;
     64f:       ba 00 00 00 00          mov    $0x0,%edx
}
     654:       48 83 c4 18             add    $0x18,%rsp
     658:       48 89 d0                mov    %rdx,%rax
     65b:       5b                      pop    %rbx
     65c:       5d                      pop    %rbp
     65d:       c3                      retq   
     65e:       66 90                   xchg   %ax,%ax

Attachment: signature.asc
Description: Digital signature

Reply via email to