Re: [PATCH] fix extern inline errors with gcc 4.3.0

From: Benny Halevy
Date: Mon Jun 30 2008 - 12:37:44 EST


On Jun. 30, 2008, 19:22 +0300, Jeff Dike <jdike@xxxxxxxxxxx> wrote:
> On Sun, Jun 29, 2008 at 10:32:43AM +0300, Benny Halevy wrote:
>> Note that the crash happened with gcc 4.1.2 and it will get the
>> -fno-unit-at-a-time flag with the proposed patch.
>>
>> That said, this option or the lack of it ought not to cause any
>> runtime crashes. If it does, I'd feel much more comfortable to know
>> exactly what the root cause is before deciding to use the flag to
>> workaround^hide it.
>
> I agree.
>
> The constraints on [no-]unit-at-a-time that I see are:
> i386 uses no-unit-at-a-time for pre-4.0 (not 4.3)
> x86_64 uses unit-at-a-time always
>
> Uli reported a crash on x86_64 with gcc 4.1.2 with unit-at-a-time
> Ingo reported a gcc internal error with gcc 4.3 with
> no-unit-at-a-time
> You are seeing extern inlines not resolved with gcc 4.3 with
> no-unit-at-a-time
>
> I'm tempted to follow x86 on this, with the results that
> extern inlines should be fine
> Ingo's gcc crash should not reappear
> Uli's crash may reappear
>
> If that crash does come back, I'd say we should just debug it. It's
> likely UML implicitly relying on some gcc behavior anyway.

Agreed.

>
> This is the patch that I'm dropping into my tree:
>
> Index: linux-2.6.22/arch/um/Makefile-i386
> ===================================================================
> --- linux-2.6.22.orig/arch/um/Makefile-i386 2008-05-29 11:21:25.000000000 -0400
> +++ linux-2.6.22/arch/um/Makefile-i386 2008-06-30 12:20:01.000000000 -0400
> @@ -32,4 +32,10 @@ cflags-y += $(call cc-option,-mpreferred
> # an unresolved reference.
> cflags-y += -ffreestanding
>
> +# Disable unit-at-a-time mode on pre-gcc-4.0 compilers, it makes gcc use
> +# a lot more stack due to the lack of sharing of stacklots. Also, gcc
> +# 4.3.0 needs -funit-at-a-time for extern inline functions.
> +KBUILD_CFLAGS += $(shell if [ $(call cc-version) -lt 0403 ] ; then \

This isn't exactly aligned with the comment above.
Should be -lt 0400, as in 22eecde2f9034764a3fd095eecfa3adfb8ec9a98?

> + echo $(call cc-option,-fno-unit-at-a-time); fi ;)
> +
> KBUILD_CFLAGS += $(cflags-y)
> Index: linux-2.6.22/arch/um/Makefile-x86_64
> ===================================================================
> --- linux-2.6.22.orig/arch/um/Makefile-x86_64 2008-05-29 11:21:25.000000000 -0400
> +++ linux-2.6.22/arch/um/Makefile-x86_64 2008-06-30 12:21:01.000000000 -0400
> @@ -21,3 +21,6 @@ HEADER_ARCH := x86
>
> LINK-$(CONFIG_LD_SCRIPT_DYN) += -Wl,-rpath,/lib64
> LINK-y += -m64
> +
> +# Do unit-at-a-time unconditionally on x86_64, following the host
> +KBUILD_CFLAGS += $(call cc-option,-funit-at-a-time)

Hmm, arch/um/Makefile includes $(srctree)/$(ARCH_DIR)/Makefile-$(SUBARCH)
before add -fno-unit-at-a-time to KBUILD_CFLAGS.
Will this override the flag set first here?

Benny

>
> Jeff
>

--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/