[FFmpeg-devel] swscale-test segfault with 64-bit icc 11.1
Ramiro Polla
ramiro.polla
Sat Jul 17 21:50:10 CEST 2010
Hi,
swscale-test segfaults when built with 64-bit icc 11.1 (20100414). The
function that fails is hyscale_fast_MMX2(). Here's a disassembly of
the function:
a4b0: 53 push %rbx
a4b1: 48 8b 87 c8 30 00 00 mov 0x30c8(%rdi),%rax
a4b8: 4c 8b 9f a8 30 00 00 mov 0x30a8(%rdi),%r11
a4bf: 48 89 74 24 d8 mov %rsi,-0x28(%rsp)
a4c4: 45 89 ca mov %r9d,%r10d
a4c7: 48 89 54 24 e0 mov %rdx,-0x20(%rsp)
a4cc: 41 f7 da neg %r10d
a4cf: 83 bf 10 31 00 00 00 cmpl $0x0,0x3110(%rdi)
a4d6: 48 89 4c 24 e8 mov %rcx,-0x18(%rsp)
a4db: 48 89 44 24 d0 mov %rax,-0x30(%rsp)
a4e0: 48 8b 87 00 31 00 00 mov 0x3100(%rdi),%rax
a4e7: 4c 89 5c 24 f0 mov %r11,-0x10(%rsp)
a4ec: 48 89 44 24 f8 mov %rax,-0x8(%rsp)
a4f1: 0f 84 05 01 00 00 je a5fc <hyscale_fast_MMX2+0x14c>
a4f7: 0f ef ff pxor %mm7,%mm7
a4fa: 48 8b 4c 24 e8 mov -0x18(%rsp),%rcx
a4ff: 48 8b 7c 24 d8 mov -0x28(%rsp),%rdi
a504: 48 8b 54 24 f0 mov -0x10(%rsp),%rdx
a509: 48 8b 5c 24 d0 mov -0x30(%rsp),%rbx
a50e: 48 31 c0 xor %rax,%rax
a511: 0f 18 01 prefetchnta (%rcx)
a514: 0f 18 41 20 prefetchnta 0x20(%rcx)
a518: 0f 18 41 40 prefetchnta 0x40(%rcx)
a51c: 8b 33 mov (%rbx),%esi
a51e: ff 54 24 f8 callq *-0x8(%rsp)
a522: 8b 34 03 mov (%rbx,%rax,1),%esi
a525: 48 01 f1 add %rsi,%rcx
a528: 48 01 c7 add %rax,%rdi
a52b: 48 31 c0 xor %rax,%rax
a52e: 8b 33 mov (%rbx),%esi
a530: ff 54 24 f8 callq *-0x8(%rsp)
[...]
Since no functions are being called in C inside hyscale_fast_MMX2(),
the compiler decides it's ok to use -0x8(%rsp) instead of properly
sub'ing rsp, as it supposedly won't get overwritten. But in this case
we call the mmx2 code inside asm, overwriting -0x8(%rsp). The second
callq goes to a522, and when run again, it tries to run some random
code that was the next pointer on the stack. gcc does the same thing,
but it seems it leaves -0x8(%rsp) alone and uses the stack -0x10(%rsp)
and below.
Is this a compiler bug (as in should it detect a call inside asm)?
Could (or should) we hint to the compiler that a call is being made
inside the asm block (I don't even know if this is possible)?
Ramiro Polla
More information about the ffmpeg-devel
mailing list