[Bug inline-asm/24761] Missing register load before inline asm in templated function causes SIGSEGV

2005-11-09 Thread krzysiek-gcc dot gnu dot org at lichota dot net


--- 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

2005-11-09 Thread krzysiek-gcc dot gnu dot org at lichota dot net


--- 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

2005-11-09 Thread krzysiek-gcc dot gnu dot org at lichota dot net


--- 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

2005-11-09 Thread krzysiek-gcc dot gnu dot org at lichota dot net
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