linux-gcc.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* GCC 3.3.2 -Wall affects the code generated...
@ 2004-07-01 18:03 Denis Zaitsev
  2004-07-06 20:41 ` Jim Wilson
  0 siblings, 1 reply; 6+ messages in thread
From: Denis Zaitsev @ 2004-07-01 18:03 UTC (permalink / raw)
  To: gcc; +Cc: linux-gcc

The long story is such: I was compiling GLIBC 2.3.2 and there is a
file libio/fileops.c which includes iconv/gconv_charset.h.  In this
header an inline function named strip is defined.  And I found that
the object code generated for this function depends of the presence of
-Wall in the list of option to GCC.  (For some reason, GCC can't
inline this function, so it's compiled as just an outline one.)  Is
this a bug in GCC?

Below I include the source code of this strip function and its
assembler generated with and without -Wall.  I can say also, that it
seems that this libio/fileops.c file is kinda 'hard to compile'
source: another tho inline functions can't be inlined (and GCC
complains about that), GCC warns that yet another one function
'declared inline after being called', even though it's not true
(AFAIK) and GCC just silently refuse to do some other optimization
during the compilation.


The source code:


static inline void
strip (char *wp, const char *s)
{
  int slash_count = 0;

  while (*s != '\0')
    {
      if (__isalnum_l (*s, &_nl_C_locobj)
	  || *s == '_' || *s == '-' || *s == '.')
	*wp++ = __toupper_l (*s, &_nl_C_locobj);
      else if (*s == '/')
	{
	  if (++slash_count == 3)
	    break;
	  *wp++ = '/';
	}
      ++s;
    }

  while (slash_count++ < 2)
    *wp++ = '/';

  *wp = '\0';
}


The command line:


gcc fileops.c -c -std=gnu99 -D__USE_STRING_INLINES -O2 -Wall -Winline -Wstrict-prototypes -Wwrite-strings -fno-align-functions -fno-align-jumps -fno-align-loops -fno-ident -fno-strength-reduce -mcpu=pentium -mpreferred-stack-boundary=2 -pipe   -fPIC -g0 -fomit-frame-pointer -fexceptions   -I../include -I. -I/home/src/zzz/lib/glibc/bld/libio -I.. -I../libio  -I/home/src/zzz/lib/glibc/bld -I../sysdeps/i386/elf -I../linuxthreads/sysdeps/unix/sysv/linux/i386 -I../linuxthreads/sysdeps/unix/sysv/linux -I../linuxthreads/sysdeps/pthread -I../sysdeps/pthread -I../linuxthreads/sysdeps/unix/sysv -I../linuxthreads/sysdeps/unix -I../linuxthreads/sysdeps/i386/i586 -I../linuxthreads/sysdeps/i386 -I../sysdeps/unix/sysv/linux/i386 -I../sysdeps/unix/sysv/linux -I../sysdeps/gnu -I../sysdeps/unix/common -I../sysdeps/unix/mman -I../sysdeps/unix/inet -I../sysdeps/unix/sysv/i386 -I../sysdeps/unix/sysv -I../sysdeps/unix/i386 -I../sysdeps/unix -I../sysdeps/posix -I../sysdeps/i386/i586 -I../sysdeps/i386/i486 -I../sysdeps/i386/fpu -I../sysdeps/i386 -I../sysdeps/wordsize-32 -I../sysdeps/ieee754/ldbl-96 -I../sysdeps/ieee754/dbl-64 -I../sysdeps/ieee754/flt-32 -I../sysdeps/ieee754 -I../sysdeps/generic/elf -I../sysdeps/generic  -I /lib/modules/2.4.24/build/include -D_LIBC_REENTRANT -include ../include/libc-symbols.h  -DPIC -DSHARED     -D_IO_MTSAFE_IO -o ...


The assembler (-Wall):


strip:
.LFB113:
	pushl	%ebp
.LCFI521:
	xorl	%ebp, %ebp
	pushl	%edi
.LCFI522:
	pushl	%esi
.LCFI523:
	pushl	%ebx
.LCFI524:
	pushl	%edi
.LCFI525:
	call	.L796
.L796:
	popl	%ebx
	addl	$_GLOBAL_OFFSET_TABLE_+[.-.L796], %ebx
	movl	28(%esp), %edi
	movl	24(%esp), %esi
	movb	(%edi), %al
	movb	%al, 3(%esp)
	testb	%al, %al
	je	.L24
.L23:
	movsbl	3(%esp),%edx
	movl	52+_nl_C_locobj@GOTOFF(%ebx), %eax
	testb	$8, (%eax,%edx,2)
	jne	.L13
	cmpb	$95, 3(%esp)
	je	.L13
	cmpb	$45, 3(%esp)
	je	.L13
	cmpb	$46, 3(%esp)
	je	.L13
	cmpb	$47, 3(%esp)
	je	.L794
.L20:
	incl	%edi
	movb	(%edi), %al
	movb	%al, 3(%esp)
	testb	%al, %al
	jne	.L23
.L24:
	movl	%ebp, %eax
	incl	%ebp
	decl	%eax
	jg	.L795
	movb	$47, (%esi)
	incl	%esi
	jmp	.L24
.LCFI526:
.L795:
	movb	$0, (%esi)
	popl	%esi
.LCFI527:
	popl	%ebx
.LCFI528:
	popl	%esi
.LCFI529:
	popl	%edi
.LCFI530:
	popl	%ebp
.LCFI531:
	ret
.L794:
	incl	%ebp
	cmpl	$3, %ebp
	je	.L24
	movb	$47, (%esi)
	incl	%esi
	jmp	.L20
.L13:
	movsbl	3(%esp),%edx
	movl	60+_nl_C_locobj@GOTOFF(%ebx), %eax
	movl	%esi, %ecx
	incl	%esi
	movl	(%eax,%edx,4), %eax
	movb	%al, (%ecx)
	jmp	.L20
.LFE113:
	.size	strip, .-strip
	.type	upstr, @function


The assembler (w/o -Wall):


strip:
.LFB113:
	pushl	%ebp
.LCFI521:
	xorl	%ebp, %ebp
	pushl	%edi
.LCFI522:
	pushl	%esi
.LCFI523:
	pushl	%ebx
.LCFI524:
	pushl	%edi
.LCFI525:
	call	.L797
.L797:
	popl	%ebx
	addl	$_GLOBAL_OFFSET_TABLE_+[.-.L797], %ebx
	movl	28(%esp), %edi
	movl	24(%esp), %esi
	movb	(%edi), %al
	movb	%al, 3(%esp)
	testb	%al, %al
	je	.L10
.L23:
	movsbl	3(%esp),%edx
	movl	52+_nl_C_locobj@GOTOFF(%ebx), %eax
	testb	$8, (%eax,%edx,2)
	jne	.L13
	cmpb	$95, 3(%esp)
	je	.L13
	cmpb	$45, 3(%esp)
	je	.L13
	cmpb	$46, 3(%esp)
	je	.L13
	cmpb	$47, 3(%esp)
	je	.L796
.L20:
	incl	%edi
	movb	(%edi), %al
	movb	%al, 3(%esp)
	testb	%al, %al
	jne	.L23
.L10:
	movl	%ebp, %eax
	incl	%ebp
	decl	%eax
	jle	.L27
.L795:
	movb	$0, (%esi)
	popl	%esi
.LCFI526:
	popl	%ebx
.LCFI527:
	popl	%esi
.LCFI528:
	popl	%edi
.LCFI529:
	popl	%ebp
.LCFI530:
	ret
.L27:
	movl	%ebp, %eax
	movb	$47, (%esi)
	incl	%ebp
	incl	%esi
	decl	%eax
	jle	.L27
	jmp	.L795
.L796:
	incl	%ebp
	cmpl	$3, %ebp
	je	.L10
	movb	$47, (%esi)
	incl	%esi
	jmp	.L20
.L13:
	movsbl	3(%esp),%edx
	movl	60+_nl_C_locobj@GOTOFF(%ebx), %eax
	movl	%esi, %ecx
	incl	%esi
	movl	(%eax,%edx,4), %eax
	movb	%al, (%ecx)
	jmp	.L20
.LFE113:
	.size	strip, .-strip
	.type	upstr, @function


The diff (I omited all the parts that describe only the different
labels):


47,51c47
< 	jg	.L795
< 	movb	$47, (%esi)
< 	incl	%esi
< 	jmp	.L24
< .LCFI526:
---
> 	jle	.L27

65c61,69
< .L794:
---
> .L27:
> 	movl	%ebp, %eax
> 	movb	$47, (%esi)
> 	incl	%ebp
> 	incl	%esi
> 	decl	%eax
> 	jle	.L27
> 	jmp	.L795
> .L796:

^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: GCC 3.3.2 -Wall affects the code generated...
  2004-07-01 18:03 GCC 3.3.2 -Wall affects the code generated Denis Zaitsev
@ 2004-07-06 20:41 ` Jim Wilson
  2004-07-06 21:11   ` John Richard Moser
  2004-07-06 22:46   ` Denis Zaitsev
  0 siblings, 2 replies; 6+ messages in thread
From: Jim Wilson @ 2004-07-06 20:41 UTC (permalink / raw)
  To: Denis Zaitsev; +Cc: linux-gcc, gcc

Denis Zaitsev wrote:
> header an inline function named strip is defined.  And I found that
> the object code generated for this function depends of the presence of
> -Wall in the list of option to GCC.  

This is probably a bug.  This is a small loop that is being complied 
differently, so this might be a problem with a loop optimizer, or with 
the basic block reorganizer.  I'd guess we have an uninitialized 
variable, or some other kind of memory corruption somewhere.  I don't 
know of any other reason why -Wall would effect the code emitted.

We need a testcase to look at this.  The source you provided can not be 
compiled on its own.  I don't happen to have an x86 GLIBC tree, so I can 
not easily generate my own testcase.  I tried fixing your testcase to 
make it compilable, but nothing interesting happens when using 
gcc-3.3.4.  I suspect that there is a complicated interaction going on 
here, and we actually need the full input file to reproduce the problem, 
rather than just the source for the one function that changes.  Or maybe 
the problem has already been fixed.  I can't tell.
-- 
Jim Wilson, GNU Tools Support, http://www.SpecifixInc.com


^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: GCC 3.3.2 -Wall affects the code generated...
  2004-07-06 20:41 ` Jim Wilson
@ 2004-07-06 21:11   ` John Richard Moser
  2004-07-06 22:46   ` Denis Zaitsev
  1 sibling, 0 replies; 6+ messages in thread
From: John Richard Moser @ 2004-07-06 21:11 UTC (permalink / raw)
  To: Jim Wilson; +Cc: Denis Zaitsev, linux-gcc, gcc

-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1



Jim Wilson wrote:
| Denis Zaitsev wrote:
|

| know of any other reason why -Wall would effect the code emitted.
AFFECT
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.2.4 (GNU/Linux)
Comment: Using GnuPG with Thunderbird - http://enigmail.mozdev.org

iD8DBQFA6xWEhDd4aOud5P8RAgDkAJ94vibaOqcTaSaLawg8LfCFBNqSjwCePPuC
iZEYFTr8NWdZ4zHy6AT+djs=
=qTaC
-----END PGP SIGNATURE-----

^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: GCC 3.3.2 -Wall affects the code generated...
  2004-07-06 20:41 ` Jim Wilson
  2004-07-06 21:11   ` John Richard Moser
@ 2004-07-06 22:46   ` Denis Zaitsev
  2004-07-07  0:20     ` Jim Wilson
  1 sibling, 1 reply; 6+ messages in thread
From: Denis Zaitsev @ 2004-07-06 22:46 UTC (permalink / raw)
  To: Jim Wilson; +Cc: linux-gcc, gcc

On Tue, Jul 06, 2004 at 01:41:02PM -0700, Jim Wilson wrote:
> Denis Zaitsev wrote:
> > header an inline function named strip is defined.  And I found that
> > the object code generated for this function depends of the presence of
> > -Wall in the list of option to GCC.  
> 
> This is probably a bug.  This is a small loop that is being complied 
> differently, so this might be a problem with a loop optimizer, or with 
> the basic block reorganizer.  I'd guess we have an uninitialized 
> variable, or some other kind of memory corruption somewhere.  I don't 
> know of any other reason why -Wall would effect the code emitted.
> 
> We need a testcase to look at this.  The source you provided can not be 
> compiled on its own.  I don't happen to have an x86 GLIBC tree, so I can 
> not easily generate my own testcase.  I tried fixing your testcase to 
> make it compilable, but nothing interesting happens when using 
> gcc-3.3.4.  I suspect that there is a complicated interaction going on 
> here, and we actually need the full input file to reproduce the problem, 
> rather than just the source for the one function that changes.  Or maybe 
> the problem has already been fixed.  I can't tell.

I used to assume that everybody has the GLIBC tree.  :)  So, I can
just sent all the necessary files to you.  And I don't think that this
problem is specific for that function, so there is no sence to try to
reproduce the problem upon that function only.  I have already told,
it seems that a compilation of that file loads GCC too high, and bugs
are popping up.  Compiling that file, GCC just refuse to do some
(other that the inlining) optimization it always does.  I can describe
this problem too, should it help.

And I going to compile and install GCC-3.3.4 myself, so I will try to
compile GLIBC with this GCC and will report the result.

^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: GCC 3.3.2 -Wall affects the code generated...
  2004-07-06 22:46   ` Denis Zaitsev
@ 2004-07-07  0:20     ` Jim Wilson
  2004-07-07  7:44       ` Denis Zaitsev
  0 siblings, 1 reply; 6+ messages in thread
From: Jim Wilson @ 2004-07-07  0:20 UTC (permalink / raw)
  To: Denis Zaitsev; +Cc: linux-gcc, gcc

On Tue, 2004-07-06 at 15:46, Denis Zaitsev wrote:
> I used to assume that everybody has the GLIBC tree.  :)

I have a glibc src/build tree on my IA-64 machine, but not on my x86
machine.  I wasn't sure I'd get the right testcase if I tried to
generate one on a IA-64 machine.  It seemed easier to ask you for one.
-- 
Jim Wilson, GNU Tools Support, http://www.SpecifixInc.com


^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: GCC 3.3.2 -Wall affects the code generated...
  2004-07-07  0:20     ` Jim Wilson
@ 2004-07-07  7:44       ` Denis Zaitsev
  0 siblings, 0 replies; 6+ messages in thread
From: Denis Zaitsev @ 2004-07-07  7:44 UTC (permalink / raw)
  To: Jim Wilson; +Cc: linux-gcc, gcc

On Tue, Jul 06, 2004 at 05:20:21PM -0700, Jim Wilson wrote:
> On Tue, 2004-07-06 at 15:46, Denis Zaitsev wrote:
> > I used to assume that everybody has the GLIBC tree.  :)
> 
> I have a glibc src/build tree on my IA-64 machine, but not on my x86
> machine.  I wasn't sure I'd get the right testcase if I tried to
> generate one on a IA-64 machine.  It seemed easier to ask you for one.

Ok.  I understand.

^ permalink raw reply	[flat|nested] 6+ messages in thread

end of thread, other threads:[~2004-07-07  7:44 UTC | newest]

Thread overview: 6+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2004-07-01 18:03 GCC 3.3.2 -Wall affects the code generated Denis Zaitsev
2004-07-06 20:41 ` Jim Wilson
2004-07-06 21:11   ` John Richard Moser
2004-07-06 22:46   ` Denis Zaitsev
2004-07-07  0:20     ` Jim Wilson
2004-07-07  7:44       ` Denis Zaitsev

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).