2011-04-13 19:50:11

by Richard Weinberger

[permalink] [raw]
Subject: gcc-4.6.0 generates no code for sub_preempt_count()

Hi,

I'm facing a very strange issue with gcc-4.6.0 and UML.
Within __local_bh_enable() gcc generates no code for sub_preempt_count().

See:
http://userweb.kernel.org/~rw/uml-gcc460/__local_bh_enable-gcc460.txt
vs.
http://userweb.kernel.org/~rw/uml-gcc460/__local_bh_enable-gcc431.txt

Interestingly it generates code for add_preempt_count().
I can reproduce this on x86 and x86_64.

The problem has to do with UML's current_thread_info() function.
When I replace it with arch/x86's (unportable) variant gcc generates code.

Any ideas whether this is a gcc or a kernel issue?
Thanks,
//richard


2011-04-14 07:49:18

by Mikael Pettersson

[permalink] [raw]
Subject: Re: gcc-4.6.0 generates no code for sub_preempt_count()

Richard Weinberger writes:
> Hi,
>
> I'm facing a very strange issue with gcc-4.6.0 and UML.
> Within __local_bh_enable() gcc generates no code for sub_preempt_count().
>
> See:
> http://userweb.kernel.org/~rw/uml-gcc460/__local_bh_enable-gcc460.txt
> vs.
> http://userweb.kernel.org/~rw/uml-gcc460/__local_bh_enable-gcc431.txt
>
> Interestingly it generates code for add_preempt_count().
> I can reproduce this on x86 and x86_64.
>
> The problem has to do with UML's current_thread_info() function.
> When I replace it with arch/x86's (unportable) variant gcc generates code.
>
> Any ideas whether this is a gcc or a kernel issue?

Please provide a standalone test case.

2011-04-14 13:52:47

by Richard Weinberger

[permalink] [raw]
Subject: Re: gcc-4.6.0 generates no code for sub_preempt_count()

Am Donnerstag 14 April 2011, 09:49:14 schrieb Mikael Pettersson:
> Richard Weinberger writes:
> > Hi,
> >
> > I'm facing a very strange issue with gcc-4.6.0 and UML.
> > Within __local_bh_enable() gcc generates no code for
> > sub_preempt_count().
> >
> > See:
> > http://userweb.kernel.org/~rw/uml-gcc460/__local_bh_enable-gcc460.txt
> > vs.
> > http://userweb.kernel.org/~rw/uml-gcc460/__local_bh_enable-gcc431.txt
> >
> > Interestingly it generates code for add_preempt_count().
> > I can reproduce this on x86 and x86_64.
> >
> > The problem has to do with UML's current_thread_info() function.
> > When I replace it with arch/x86's (unportable) variant gcc generates
> > code.
> >
> > Any ideas whether this is a gcc or a kernel issue?
>
> Please provide a standalone test case.

There you go!
http://userweb.kernel.org/~rw/uml-gcc460/testcase.c

Thanks,
//richard

2011-04-14 14:43:25

by masterkom masterkom

[permalink] [raw]
Subject: Re: gcc-4.6.0 generates no code for sub_preempt_count()

Hi,, I have the project to make Operating System using linux kernel.
That system is multiplatform, which is combine linux and window . This
project hope All people that who has familiar with windows can use
this operating system without sin. This project is free..

I hape there people can help us to done this project ,, thx,,,

On 4/14/11, Richard Weinberger <[email protected]> wrote:
> Hi,
>
> I'm facing a very strange issue with gcc-4.6.0 and UML.
> Within __local_bh_enable() gcc generates no code for sub_preempt_count().
>
> See:
> http://userweb.kernel.org/~rw/uml-gcc460/__local_bh_enable-gcc460.txt
> vs.
> http://userweb.kernel.org/~rw/uml-gcc460/__local_bh_enable-gcc431.txt
>
> Interestingly it generates code for add_preempt_count().
> I can reproduce this on x86 and x86_64.
>
> The problem has to do with UML's current_thread_info() function.
> When I replace it with arch/x86's (unportable) variant gcc generates code.
>
> Any ideas whether this is a gcc or a kernel issue?
> Thanks,
> //richard
> --
> To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
> the body of a message to [email protected]
> More majordomo info at http://vger.kernel.org/majordomo-info.html
> Please read the FAQ at http://www.tux.org/lkml/
>

2011-04-14 15:17:37

by Frank Kingswood

[permalink] [raw]
Subject: Re: gcc-4.6.0 generates no code for sub_preempt_count()

On 14/04/11 15:43, masterkom masterkom wrote:
> Hi,, I have the project to make Operating System using linux kernel.
> That system is multiplatform, which is combine linux and window . This
> project hope All people that who has familiar with windows can use
> this operating system without sin. This project is free..

Well, good luck with that.
There was this Finish guy who wanted to do this, never heard from him again.

Frank

2011-04-14 19:56:31

by James McMechan

[permalink] [raw]
Subject: RE: [uml-devel] gcc-4.6.0 generates no code for sub_preempt_count()


> Am Donnerstag 14 April 2011, 09:49:14 schrieb Mikael Pettersson:
> > Richard Weinberger writes:
> > > Hi,
> > >
> > > I'm facing a very strange issue with gcc-4.6.0 and UML.
> > > Within __local_bh_enable() gcc generates no code for
> > > sub_preempt_count().
> > >
> > > See:
> > > http://userweb.kernel.org/~rw/uml-gcc460/__local_bh_enable-gcc460.txt
> > > vs.
> > > http://userweb.kernel.org/~rw/uml-gcc460/__local_bh_enable-gcc431.txt
> > >
> > > Interestingly it generates code for add_preempt_count().
> > > I can reproduce this on x86 and x86_64.
> > >
> > > The problem has to do with UML's current_thread_info() function.
> > > When I replace it with arch/x86's (unportable) variant gcc generates
> > > code.
> > >
> > > Any ideas whether this is a gcc or a kernel issue?

It looks like a gcc error with one of the optimization passes

> > Please provide a standalone test case.
>
> There you go!
> http://userweb.kernel.org/~rw/uml-gcc460/testcase.c

Replacing inline with __attribute__((noinline)) makes it produce code again

without requiring asm("esp")/asm("rsp") tricks and the code appears to be working

I think gcc is assuming only low bits in the address of stack vars and thought they

were all masked out :( with this change my test version of gcc-4.6.0 works for x86/amd64

I have not yet gotten 4.6.0 to install yet so I was testing with xgcc from the failed build


--- testcase.orig?????? 2011-04-14 08:34:24.000000000 -0700

+++ testcase.c? 2011-04-14 12:17:44.000000000 -0700

@@ -31,7 +31,7 @@

?}

?#else

?/* UML */

-static inline struct thread_info *current_thread_info(void)

+static __attribute__((noinline)) struct thread_info *current_thread_info(void)

?{

?? struct thread_info *ti;

?? unsigned long mask = THREAD_SIZE - 1;>

> Thanks,
> //richard

-

2011-04-15 15:17:50

by Richard Weinberger

[permalink] [raw]
Subject: Re: [uml-devel] gcc-4.6.0 generates no code for sub_preempt_count()

Am Donnerstag 14 April 2011, 21:50:13 schrieb James McMechan:
> > > > Any ideas whether this is a gcc or a kernel issue?
>
> It looks like a gcc error with one of the optimization passes

I've submitted a bug report.

http://gcc.gnu.org/bugzilla/show_bug.cgi?id=48623

Thanks,
//richard