Commit e2414910 authored by Andi Kleen's avatar Andi Kleen Committed by Andi Kleen

[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: default avatarAndi Kleen <ak@suse.de>
parent fe7414a2
...@@ -421,6 +421,11 @@ more details, with real examples. ...@@ -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.
......
...@@ -46,6 +46,10 @@ cflags-y += -ffreestanding ...@@ -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
......
...@@ -54,6 +54,9 @@ endif ...@@ -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)
......
...@@ -13,7 +13,7 @@ ...@@ -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
......
...@@ -63,6 +63,13 @@ as-option = $(shell if $(CC) $(CFLAGS) $(1) -Wa,-Z -c -o /dev/null \ ...@@ -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)
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment