[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:
parent
fe7414a288
commit
e2414910f2
|
@ -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
|
||||||
# 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
|
||||||
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 @@
|
||||||
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 \
|
||||||
-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)
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue