[PATCH] x86: Detect CFI support in the assembler at runtime

... instead of using a CONFIG option. The config option still controls
if the resulting executable actually has unwind information.

This is useful to prevent compilation errors when users select
CONFIG_STACK_UNWIND on old binutils and also allows to use
CFI in the future for non kernel debugging applications.

Cc: jbeulich@novell.com
Cc: sam@ravnborg.org

Signed-off-by: Andi Kleen <ak@suse.de>
This commit is contained in:
Andi Kleen 2006-09-26 10:52:30 +02:00 committed by Andi Kleen
parent fe7414a288
commit e2414910f2
5 changed files with 20 additions and 1 deletions

View File

@ -421,6 +421,11 @@ more details, with real examples.
The second argument is optional, and if supplied will be used The second argument is optional, and if supplied will be used
if first argument is not supported. if first argument is not supported.
as-instr
as-instr checks if the assembler reports a specific instruction
and then outputs either option1 or option2
C escapes are supported in the test instruction
cc-option cc-option
cc-option is used to check if $(CC) supports a given option, and not cc-option is used to check if $(CC) supports a given option, and not
supported to use an optional second option. supported to use an optional second option.

View File

@ -46,6 +46,10 @@ cflags-y += -ffreestanding
# a lot more stack due to the lack of sharing of stacklots: # a lot more stack due to the lack of sharing of stacklots:
CFLAGS += $(shell if [ $(call cc-version) -lt 0400 ] ; then echo $(call cc-option,-fno-unit-at-a-time); fi ;) CFLAGS += $(shell if [ $(call cc-version) -lt 0400 ] ; then echo $(call cc-option,-fno-unit-at-a-time); fi ;)
# do binutils support CFI?
cflags-y += $(call as-instr,.cfi_startproc\n.cfi_endproc,-DCONFIG_AS_CFI=1,)
AFLAGS += $(call as-instr,.cfi_startproc\n.cfi_endproc,-DCONFIG_AS_CFI=1,)
CFLAGS += $(cflags-y) CFLAGS += $(cflags-y)
# Default subarch .c files # Default subarch .c files

View File

@ -54,6 +54,9 @@ endif
cflags-y += $(call cc-option,-funit-at-a-time) cflags-y += $(call cc-option,-funit-at-a-time)
# prevent gcc from generating any FP code by mistake # prevent gcc from generating any FP code by mistake
cflags-y += $(call cc-option,-mno-sse -mno-mmx -mno-sse2 -mno-3dnow,) cflags-y += $(call cc-option,-mno-sse -mno-mmx -mno-sse2 -mno-3dnow,)
# do binutils support CFI?
cflags-y += $(call as-instr,.cfi_startproc\n.cfi_endproc,-DCONFIG_AS_CFI=1,)
AFLAGS += $(call as-instr,.cfi_startproc\n.cfi_endproc,-DCONFIG_AS_CFI=1,)
CFLAGS += $(cflags-y) CFLAGS += $(cflags-y)
CFLAGS_KERNEL += $(cflags-kernel-y) CFLAGS_KERNEL += $(cflags-kernel-y)

View File

@ -13,7 +13,7 @@
away for older version. away for older version.
*/ */
#ifdef CONFIG_UNWIND_INFO #ifdef CONFIG_AS_CFI
#define CFI_STARTPROC .cfi_startproc #define CFI_STARTPROC .cfi_startproc
#define CFI_ENDPROC .cfi_endproc #define CFI_ENDPROC .cfi_endproc

View File

@ -63,6 +63,13 @@ as-option = $(shell if $(CC) $(CFLAGS) $(1) -Wa,-Z -c -o /dev/null \
-xassembler /dev/null > /dev/null 2>&1; then echo "$(1)"; \ -xassembler /dev/null > /dev/null 2>&1; then echo "$(1)"; \
else echo "$(2)"; fi ;) else echo "$(2)"; fi ;)
# as-instr
# Usage: cflags-y += $(call as-instr, instr, option1, option2)
as-instr = $(shell if echo -e "$(1)" | $(AS) -Z -o astest$$$$.out \
2>&1 >/dev/null ; then echo "$(2)"; else echo "$(3)"; fi; \
rm -f astest$$$$.out)
# cc-option # cc-option
# Usage: cflags-y += $(call cc-option, -march=winchip-c6, -march=i586) # Usage: cflags-y += $(call cc-option, -march=winchip-c6, -march=i586)