From 50fa1ba19fbdaec7550253d56d067a1b5fc946df Mon Sep 17 00:00:00 2001 From: Willy Tarreau Date: Sun, 5 Aug 2007 18:37:07 +0200 Subject: [PATCH] [PATCH] fix incorrect use of -fno-unit-at-a-time on GCC >= 4 Axel Reinhold reported wrong code being emitted for arch/i386/kernel/i8259.c using gcc-4.2, while the same code with gcc-4.1 was valid. The problem was tracked down to gcc-4.2 messing up with sections with this option which is already deprecated for gcc 4.x, and the asm statements were incorrectly assigned to section .data. It was also possible to trick gcc-4.1 into the same error by simply declaring an array before any asm statement. The correct fix is to remove -fno-unit-at-a-time with gcc >= 4, which is also what has been done in 2.6. In anticipation of such other problems with gcc 4.x, a new function "if_gcc4" has been added to the main Makefile. Signed-off-by: Willy Tarreau --- Makefile | 1 + arch/i386/Makefile | 6 +++--- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/Makefile b/Makefile index 6f23ba27..71b66525 100644 --- a/Makefile +++ b/Makefile @@ -100,6 +100,7 @@ endif AFLAGS := -D__ASSEMBLY__ $(CPPFLAGS) check_gcc = $(shell if $(CC) $(1) -S -o /dev/null -xc /dev/null > /dev/null 2>&1; then echo "$(1)"; else echo "$(2)"; fi) +if_gcc4 = $(shell if echo __GNUC__ | $(CC) -E -xc - | grep -q '^4$$' > /dev/null 2>&1; then echo "$(1)"; else echo "$(2)"; fi) # disable pointer signedness warnings in gcc 4.0 CFLAGS += $(call check_gcc,-Wno-pointer-sign,) diff --git a/arch/i386/Makefile b/arch/i386/Makefile index 8f93efd5..8ba6bd00 100644 --- a/arch/i386/Makefile +++ b/arch/i386/Makefile @@ -92,9 +92,9 @@ ifdef CONFIG_MVIAC3_2 CFLAGS += $(call check_gcc,-march=c3-2,-march=i686) endif -# Disable unit-at-a-time mode, it makes gcc use a lot more stack -# due to the lack of sharing of stacklots. -CFLAGS += $(call check_gcc,-fno-unit-at-a-time,) +# 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. +CFLAGS += $(call if_gcc4,,$(call check_gcc,-fno-unit-at-a-time,)) HEAD := arch/i386/kernel/head.o arch/i386/kernel/init_task.o -- 2.11.0