This is the mail archive of the gcc-bugs@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]

Problems with egcs-1.0.1-/gcc-2.8.0-inline assembly [causes a kernel-oops in de4x5-driver]


Hi,

consider the following C-program (a very very simplified version
of de4x5.c :-):

-----------------------snip-----------------------



extern inline char * strstr(const char * cs,const char * ct)
{
register char * __res;
__asm__ __volatile__(
 "cld\n\t" \
 "movl %4,%%edi\n\t"
 "repne\n\t"
 "scasb\n\t"
 "notl %%ecx\n\t"
 "decl %%ecx\n\t" /* NOTE! This also sets Z if searchstring='' */
 "movl %%ecx,%%edx\n"
 "1:\tmovl %4,%%edi\n\t"
 "movl %%esi,%%eax\n\t"
 "movl %%edx,%%ecx\n\t"
 "repe\n\t"   /* <- SEGMENTATION FAULT HERE */
 "cmpsb\n\t"
 "je 2f\n\t"  /* also works for empty string, see above */
 "xchgl %%eax,%%esi\n\t"
 "incl %%esi\n\t"
 "cmpb $0,-1(%%eax)\n\t"
 "jne 1b\n\t"
 "xorl %%eax,%%eax\n\t"
 "2:"
 :"=a" (__res):"0" (0),"c" (0xffffffff),"S" (cs),"g" (ct)
 :"cx","dx","di","si");
return __res;
}

#include <stdio.h>

main() {
  int i, siglen;
  char ManCode[8];
  const char *signatures[]={"DE425","DE434","DE435","DE450","DE500"};
  siglen = sizeof(signatures)/sizeof(const char *);
  ManCode[0]='_'; ManCode[1]='_';
  ManCode[2]='?'; ManCode[3]='?'; ManCode[5]='?';
  ManCode[6]='\0';

  for (i=0;i<siglen;i++)
    if (strstr(ManCode, signatures[i]) != NULL)
      printf("Found\n");
    else
      printf("Not found\n");
}

-----------------------snip-----------------------

Compiled with
gcc strtst.c -o strtst
it runs without any error messages:

# ./strtst
Not found
Not found
Not found
Not found
Not found

but when I compile it with -O and higher optimizations
it gives a seg fault (it occurs in the assembler line with
the corresponding comment).
My egcs has been only build from the gcc-subtree
I hope I have given enough information to you.

Bernd

	.file	"strtst.c"
	.version	"01.01"
/ GNU C version egcs-2.90.23 980102 (egcs-1.0.1 release) (i686-pc-linux-gnulibc1) compiled by GNU C version egcs-2.90.23 980102 (egcs-1.0.1 release).
/ options passed: 
/ options enabled:  -fpeephole -ffunction-cse -fkeep-static-consts
/ -fpcc-struct-return -fsched-interblock -fsched-spec -fcommon
/ -fverbose-asm -fgnu-linker -fargument-alias -m80387 -mhard-float
/ -mno-soft-float -mieee-fp -mfp-ret-in-387 -mschedule-prologue
/ -mcpu=pentiumpro -march=pentium

gcc2_compiled.:
.section	.rodata
.LC0:
	.string	"DE425"
.LC1:
	.string	"DE434"
.LC2:
	.string	"DE435"
.LC3:
	.string	"DE450"
.LC4:
	.string	"DE500"
.LC5:
	.string	"Found\n"
.LC6:
	.string	"Not found\n"
.text
	.align 4
.globl main
	.type	 main,@function
main:
	pushl %ebp
	movl %esp,%ebp
	subl $36,%esp
	leal -36(%ebp),%eax
	movl $.LC0,-36(%ebp)
	movl $.LC1,-32(%ebp)
	movl $.LC2,-28(%ebp)
	movl $.LC3,-24(%ebp)
	movl $.LC4,-20(%ebp)
	movl $5,-8(%ebp)
	movb $95,-16(%ebp)
	movb $95,-15(%ebp)
	movb $63,-15(%ebp)
	movb $63,-15(%ebp)
	movb $63,-15(%ebp)
	movb $0,-10(%ebp)
	movl $0,-4(%ebp)
.L3:
	movl -4(%ebp),%eax
	cmpl %eax,-8(%ebp)
	jg .L6
	jmp .L4
	.align 4
.L6:
	movl -4(%ebp),%eax
	movl %eax,%edx
	leal 0(,%edx,4),%eax
	leal -36(%ebp),%edx
	movl (%eax,%edx),%eax
	pushl %eax
	leal -16(%ebp),%eax
	pushl %eax
	call strstr
	addl $8,%esp
	movl %eax,%eax
	testl %eax,%eax
	je .L7
	pushl $.LC5
	call printf
	addl $4,%esp
	jmp .L5
	.align 4
.L7:
	pushl $.LC6
	call printf
	addl $4,%esp
.L8:
.L5:
	incl -4(%ebp)
	jmp .L3
	.align 4
.L4:
.L2:
	movl %ebp,%esp
	popl %ebp
	ret
.Lfe1:
	.size	 main,.Lfe1-main
	.ident	"GCC: (GNU) egcs-2.90.23 980102 (egcs-1.0.1 release)"
	.file	"strtst.c"
	.version	"01.01"
/ GNU C version egcs-2.90.23 980102 (egcs-1.0.1 release) (i686-pc-linux-gnulibc1) compiled by GNU C version egcs-2.90.23 980102 (egcs-1.0.1 release).
/ options passed:  -O
/ options enabled:  -fdefer-pop -fthread-jumps -fpeephole -ffunction-cse
/ -finline -fkeep-static-consts -fpcc-struct-return -fsched-interblock
/ -fsched-spec -fcommon -fverbose-asm -fgnu-linker -falias-check
/ -fargument-alias -m80387 -mhard-float -mno-soft-float -mieee-fp
/ -mfp-ret-in-387 -mschedule-prologue -mcpu=pentiumpro -march=pentium

gcc2_compiled.:
.section	.rodata
.LC0:
	.string	"DE425"
.LC1:
	.string	"DE434"
.LC2:
	.string	"DE435"
.LC3:
	.string	"DE450"
.LC4:
	.string	"DE500"
.LC5:
	.string	"Found\n"
.LC6:
	.string	"Not found\n"
.text
	.align 4
.globl main
	.type	 main,@function
main:
	pushl %ebp
	movl %esp,%ebp
	subl $40,%esp
	pushl %edi
	pushl %esi
	pushl %ebx
	movl $.LC0,-28(%ebp)
	movl $.LC1,-24(%ebp)
	movl $.LC2,-20(%ebp)
	movl $.LC3,-16(%ebp)
	movl $.LC4,-12(%ebp)
	movb $95,-8(%ebp)
	movb $63,-7(%ebp)
	movb $0,-2(%ebp)
	movl $0,-40(%ebp)
	leal -28(%ebp),%edx
	movl %edx,-32(%ebp)
	leal -8(%ebp),%ecx
	movl %ecx,-36(%ebp)
	.align 4
.L6:
	xorl %eax,%eax
	movl $-1,%ecx
	movl -36(%ebp),%esi
	movl -40(%ebp),%edx
	movl -32(%ebp),%ebx
#APP
	cld
	movl (%ebx,%edx,4),%edi
	repne
	scasb
	notl %ecx
	decl %ecx
	movl %ecx,%edx
1:	movl (%ebx,%edx,4),%edi
	movl %esi,%eax
	movl %edx,%ecx
	repe
	cmpsb
	je 2f
	xchgl %eax,%esi
	incl %esi
	cmpb $0,-1(%eax)
	jne 1b
	xorl %eax,%eax
	2:
#NO_APP
	testl %eax,%eax
	je .L7
	pushl $.LC5
	jmp .L11
	.align 4
.L7:
	pushl $.LC6
.L11:
	call printf
	addl $4,%esp
	incl -40(%ebp)
	cmpl $5,-40(%ebp)
	jl .L6
	leal -52(%ebp),%esp
	popl %ebx
	popl %esi
	popl %edi
	movl %ebp,%esp
	popl %ebp
	ret
.Lfe1:
	.size	 main,.Lfe1-main
	.ident	"GCC: (GNU) egcs-2.90.23 980102 (egcs-1.0.1 release)"

Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]