[PATCH] x86: Detect CFI support in the assembler at runtime
authorAndi Kleen <ak@suse.de>
Tue, 26 Sep 2006 08:52:30 +0000 (10:52 +0200)
committerAndi Kleen <andi@basil.nowhere.org>
Tue, 26 Sep 2006 08:52:30 +0000 (10:52 +0200)
... 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>
Documentation/kbuild/makefiles.txt
arch/i386/Makefile
arch/x86_64/Makefile
include/asm-x86_64/dwarf2.h
scripts/Kbuild.include

index b7d6abb501a6458ce8e30176b2a5205a3240398a..e2cbd59cf2d0bdcf82ba99064dbf50b86b976f38 100644 (file)
@@ -421,6 +421,11 @@ more details, with real examples.
        The second argument is optional, and if supplied will be used
        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 is used to check if $(CC) supports a given option, and not
        supported to use an optional second option.
index 3e4adb1e224430ce3398ff538c09d316522b5ab2..508cdbeb3a092845925cb3fb6a7ec39f514cf997 100644 (file)
@@ -46,6 +46,10 @@ cflags-y += -ffreestanding
 # 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 ;)
 
+# 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)
 
 # Default subarch .c files
index 431bb4bc36cdc950b1a9168a3abfcb0b954eb373..d6472ddf5f6e28561cdf35f2bb8450c5de7dbb6c 100644 (file)
@@ -54,6 +54,9 @@ endif
 cflags-y += $(call cc-option,-funit-at-a-time)
 # prevent gcc from generating any FP code by mistake
 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_KERNEL += $(cflags-kernel-y)
index 0744db777676033aa351c41b7b64ebf0bdc4cd25..2b9368365fadca1531d5db27545e98de9aa85464 100644 (file)
@@ -13,7 +13,7 @@
    away for older version. 
  */
 
-#ifdef CONFIG_UNWIND_INFO
+#ifdef CONFIG_AS_CFI
 
 #define CFI_STARTPROC .cfi_startproc
 #define CFI_ENDPROC .cfi_endproc
index 3d523899fdc05dc56e5a2eb6c18e88b26390d102..7adef12a0c26f41e9db4359ef8d6b4cb0732bf92 100644 (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)"; \
             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
 # Usage: cflags-y += $(call cc-option, -march=winchip-c6, -march=i586)