On Thu, Jun 21, 2012 at 07:54:35AM -0400, James McCoy wrote: > 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. Another potentially useful data point is that adding -fstack-protector causes -O1 to no longer work. I noticed this while trying to prepare an upload of Vim which works around the optimization problem. With -fstack-protector, I have to drop down to -O0 to get the code to work. -- James GPG Key: 4096R/331BA3DB 2011-12-05 James McCoy <jamessan@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 44 24 08 00 00 movq $0x0,0x8(%rsp)
1b3a: 00 00
int error = ((OutputObject *)(self))->error;
1b3c: 8b 5f 18 mov 0x18(%rdi),%ebx
if (!PyArg_ParseTuple(args, "et#", ENC_OPT, &str, &len))
1b3f: 4c 8d 44 24 04 lea 0x4(%rsp),%r8
1b44: 48 8d 4c 24 08 lea 0x8(%rsp),%rcx
1b49: 48 8b 15 00 00 00 00 mov 0x0(%rip),%rdx # 1b50 <OutputWrite+0x26>
1b50: be 00 00 00 00 mov $0x0,%esi
1b55: 48 89 c7 mov %rax,%rdi
1b58: b8 00 00 00 00 mov $0x0,%eax
1b5d: e8 00 00 00 00 callq 1b62 <OutputWrite+0x38>
1b62: 85 c0 test %eax,%eax
1b64: 74 50 je 1bb6 <OutputWrite+0x8c>
return NULL;
/* TODO: This works around a gcc optimizer problem and avoids Vim
* from crashing. Should find a real solution. */
if (str == NULL)
1b66: 48 83 7c 24 08 00 cmpq $0x0,0x8(%rsp)
1b6c: 74 4f je 1bbd <OutputWrite+0x93>
return NULL;
Py_BEGIN_ALLOW_THREADS
1b6e: e8 00 00 00 00 callq 1b73 <OutputWrite+0x49>
1b73: 48 89 c5 mov %rax,%rbp
Python_Lock_Vim();
writer((writefn)(error ? emsg : msg), (char_u *)str, len);
1b76: 48 63 54 24 04 movslq 0x4(%rsp),%rdx
1b7b: 85 db test %ebx,%ebx
1b7d: b8 00 00 00 00 mov $0x0,%eax
1b82: bf 00 00 00 00 mov $0x0,%edi
1b87: 48 0f 45 f8 cmovne %rax,%rdi
1b8b: 48 8b 74 24 08 mov 0x8(%rsp),%rsi
1b90: e8 dd fc ff ff callq 1872 <writer>
Python_Release_Vim();
Py_END_ALLOW_THREADS
1b95: 48 89 ef mov %rbp,%rdi
1b98: e8 00 00 00 00 callq 1b9d <OutputWrite+0x73>
PyMem_Free(str);
1b9d: 48 8b 7c 24 08 mov 0x8(%rsp),%rdi
1ba2: e8 00 00 00 00 callq 1ba7 <OutputWrite+0x7d>
Py_INCREF(Py_None);
1ba7: 48 83 05 00 00 00 00 addq $0x1,0x0(%rip) # 1baf <OutputWrite+0x85>
1bae: 01
return Py_None;
1baf: b8 00 00 00 00 mov $0x0,%eax
1bb4: eb 0c jmp 1bc2 <OutputWrite+0x98>
int len;
char *str = NULL;
int error = ((OutputObject *)(self))->error;
if (!PyArg_ParseTuple(args, "et#", ENC_OPT, &str, &len))
return NULL;
1bb6: b8 00 00 00 00 mov $0x0,%eax
1bbb: eb 05 jmp 1bc2 <OutputWrite+0x98>
/* TODO: This works around a gcc optimizer problem and avoids Vim
* from crashing. Should find a real solution. */
if (str == NULL)
return NULL;
1bbd: b8 00 00 00 00 mov $0x0,%eax
Py_END_ALLOW_THREADS
PyMem_Free(str);
Py_INCREF(Py_None);
return Py_None;
}
1bc2: 48 83 c4 18 add $0x18,%rsp
1bc6: 5b pop %rbx
1bc7: 5d pop %rbp
1bc8: c3 retq
000000000000000c <OutputWrite>:
/* Output buffer management
*/
static PyObject *
OutputWrite(PyObject *self, PyObject *args)
{
c: 55 push %rbp
d: 48 89 e5 mov %rsp,%rbp
10: 48 83 ec 30 sub $0x30,%rsp
14: 48 89 7d d8 mov %rdi,-0x28(%rbp)
18: 48 89 75 d0 mov %rsi,-0x30(%rbp)
int len;
char *str = NULL;
1c: 48 c7 45 f0 00 00 00 movq $0x0,-0x10(%rbp)
23: 00
int error = ((OutputObject *)(self))->error;
24: 48 8b 45 d8 mov -0x28(%rbp),%rax
28: 48 8b 40 18 mov 0x18(%rax),%rax
2c: 89 45 ec mov %eax,-0x14(%rbp)
if (!PyArg_ParseTuple(args, "et#", ENC_OPT, &str, &len))
2f: 48 8b 15 00 00 00 00 mov 0x0(%rip),%rdx # 36 <OutputWrite+0x2a>
36: 48 8d 75 e8 lea -0x18(%rbp),%rsi
3a: 48 8d 4d f0 lea -0x10(%rbp),%rcx
3e: 48 8b 45 d0 mov -0x30(%rbp),%rax
42: 49 89 f0 mov %rsi,%r8
45: be 00 00 00 00 mov $0x0,%esi
4a: 48 89 c7 mov %rax,%rdi
4d: b8 00 00 00 00 mov $0x0,%eax
52: e8 00 00 00 00 callq 57 <OutputWrite+0x4b>
57: 85 c0 test %eax,%eax
59: 75 07 jne 62 <OutputWrite+0x56>
return NULL;
5b: b8 00 00 00 00 mov $0x0,%eax
60: eb 79 jmp db <OutputWrite+0xcf>
/* TODO: This works around a gcc optimizer problem and avoids Vim
* from crashing. Should find a real solution. */
if (str == NULL)
62: 48 8b 45 f0 mov -0x10(%rbp),%rax
66: 48 85 c0 test %rax,%rax
69: 75 07 jne 72 <OutputWrite+0x66>
return NULL;
6b: b8 00 00 00 00 mov $0x0,%eax
70: eb 69 jmp db <OutputWrite+0xcf>
Py_BEGIN_ALLOW_THREADS
72: e8 00 00 00 00 callq 77 <OutputWrite+0x6b>
77: 48 89 45 f8 mov %rax,-0x8(%rbp)
Python_Lock_Vim();
7b: e8 80 ff ff ff callq 0 <Python_Lock_Vim>
writer((writefn)(error ? emsg : msg), (char_u *)str, len);
80: 8b 45 e8 mov -0x18(%rbp),%eax
83: 48 63 d0 movslq %eax,%rdx
86: 48 8b 4d f0 mov -0x10(%rbp),%rcx
8a: 83 7d ec 00 cmpl $0x0,-0x14(%rbp)
8e: 74 07 je 97 <OutputWrite+0x8b>
90: b8 00 00 00 00 mov $0x0,%eax
95: eb 05 jmp 9c <OutputWrite+0x90>
97: b8 00 00 00 00 mov $0x0,%eax
9c: 48 89 ce mov %rcx,%rsi
9f: 48 89 c7 mov %rax,%rdi
a2: e8 ca 02 00 00 callq 371 <writer>
Python_Release_Vim();
a7: e8 5a ff ff ff callq 6 <Python_Release_Vim>
Py_END_ALLOW_THREADS
ac: 48 8b 45 f8 mov -0x8(%rbp),%rax
b0: 48 89 c7 mov %rax,%rdi
b3: e8 00 00 00 00 callq b8 <OutputWrite+0xac>
PyMem_Free(str);
b8: 48 8b 45 f0 mov -0x10(%rbp),%rax
bc: 48 89 c7 mov %rax,%rdi
bf: e8 00 00 00 00 callq c4 <OutputWrite+0xb8>
Py_INCREF(Py_None);
c4: 48 8b 05 00 00 00 00 mov 0x0(%rip),%rax # cb <OutputWrite+0xbf>
cb: 48 83 c0 01 add $0x1,%rax
cf: 48 89 05 00 00 00 00 mov %rax,0x0(%rip) # d6 <OutputWrite+0xca>
return Py_None;
d6: b8 00 00 00 00 mov $0x0,%eax
}
db: c9 leaveq
dc: c3 retq
Attachment:
signature.asc
Description: Digital signature