[Bug inline-asm/24761] Missing register load before inline asm in templated function causes SIGSEGV
--- Comment #3 from krzysiek-gcc dot gnu dot org at lichota dot net 2005-11-09 20:00 --- Created an attachment (id=10196) --> (http://gcc.gnu.org/bugzilla/attachment.cgi?id=10196&action=view) Correct code generated by g++ 3.4.2 This is the correct code generated by g++ 3.4.2. It loads eax before inline asm starts in both instantiations. -- http://gcc.gnu.org/bugzilla/show_bug.cgi?id=24761
[Bug inline-asm/24761] Missing register load before inline asm in templated function causes SIGSEGV
--- Comment #2 from krzysiek-gcc dot gnu dot org at lichota dot net 2005-11-09 19:49 --- Created an attachment (id=10195) --> (http://gcc.gnu.org/bugzilla/attachment.cgi?id=10195&action=view) Assembler code generated from testcase This is code generated from testcase. In first instantiation eax register is loaded before inline asm starts: .loc 1 25 0 movl-16(%ebp), %eax addl-20(%ebp), %eax sall$2, %eax addl8(%ebp), %eax movl%eax, -8(%ebp) .loc 1 41 0 movl-16(%ebp), %eax addl-24(%ebp), %eax sall$2, %eax movl%eax, %edx addl-12(%ebp), %edx movl-8(%ebp), %eax #APP movq (%edx), %mm0 ; In the second instantiation, eax is not loaded: .loc 1 25 0 movl-16(%ebp), %eax addl-20(%ebp), %eax sall$2, %eax addl8(%ebp), %eax movl%eax, -8(%ebp) .loc 1 41 0 movl-16(%ebp), %eax addl-24(%ebp), %eax sall$2, %eax movl%eax, %edx addl-12(%ebp), %edx #APP movq (%edx), %mm0 ; Then in line: pxor (%eax), %mm0 ; eax is dereferenced and segfault occurs. -- http://gcc.gnu.org/bugzilla/show_bug.cgi?id=24761
[Bug inline-asm/24761] Missing register load before inline asm in templated function causes SIGSEGV
--- Comment #1 from krzysiek-gcc dot gnu dot org at lichota dot net 2005-11-09 19:46 --- Created an attachment (id=10193) --> (http://gcc.gnu.org/bugzilla/attachment.cgi?id=10193&action=view) Testcase for the bug This is the testcase. Compile with: g++-4.0 -save-temps -fPIC -ggdb3 -Wno-non-virtual-dtor -O0 -pthread -fkeep-inline-functions testcase10.cpp When both calls to bar() are instantiated, the segfault occurs. When only one is instantiated (the other is commented out), it works correctly. -- http://gcc.gnu.org/bugzilla/show_bug.cgi?id=24761
[Bug inline-asm/24761] New: Missing register load before inline asm in templated function causes SIGSEGV
I have a templated function which uses inline assembler (with MMX instructions). Inline assembler is passed pointer to array element. When this function is instantiated for the first time, code before inline assembler is generated correctly. When it is instantiated for the second time, one of registers used in inline assembler is not loaded from stack and causes segfault when it is dereferenced in inline assembler. I will attach test case. g++-4.0 -v: Using built-in specs. Target: i486-linux-gnu Configured with: ../src/configure -v --enable-languages=c,c++,java,f95,objc,ada,treelang --prefix=/usr --enable-shared --with-system-zlib --libexecdir=/usr/lib --without-included-gettext --enable-threads=posix --enable-nls --program-suffix=-4.0 --enable-__cxa_atexit --enable-libstdcxx-allocator=mt --enable-clocale=gnu --enable-libstdcxx-debug --enable-java-gc=boehm --enable-java-awt=gtk --enable-gtk-cairo --with-java-home=/usr/lib/jvm/java-1.4.2-gcj-4.0-1.4.2.0/jre --enable-mpfr --disable-werror --enable-checking=release i486-linux-gnu Thread model: posix gcc version 4.0.2 (Debian 4.0.2-2) -- Summary: Missing register load before inline asm in templated function causes SIGSEGV Product: gcc Version: 4.0.2 Status: UNCONFIRMED Severity: normal Priority: P3 Component: inline-asm AssignedTo: unassigned at gcc dot gnu dot org ReportedBy: krzysiek-gcc dot gnu dot org at lichota dot net GCC host triplet: i486-linux-gnu GCC target triplet: i486-linux-gnu http://gcc.gnu.org/bugzilla/show_bug.cgi?id=24761