Signed-off-by: Andrew Morton --- Documentation/kbuild/makefiles.txt | 5 +++++ arch/i386/Makefile | 4 ++++ arch/x86_64/Makefile | 3 +++ include/asm-x86_64/dwarf2.h | 2 +- scripts/Kbuild.include | 7 +++++++ 5 files changed, 20 insertions(+), 1 deletion(-) diff -puN Documentation/kbuild/makefiles.txt~x86_64-mm-detect-cfi Documentation/kbuild/makefiles.txt --- a/Documentation/kbuild/makefiles.txt~x86_64-mm-detect-cfi +++ a/Documentation/kbuild/makefiles.txt @@ -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. diff -puN arch/i386/Makefile~x86_64-mm-detect-cfi arch/i386/Makefile --- a/arch/i386/Makefile~x86_64-mm-detect-cfi +++ a/arch/i386/Makefile @@ -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 diff -puN arch/x86_64/Makefile~x86_64-mm-detect-cfi arch/x86_64/Makefile --- a/arch/x86_64/Makefile~x86_64-mm-detect-cfi +++ a/arch/x86_64/Makefile @@ -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) diff -puN include/asm-x86_64/dwarf2.h~x86_64-mm-detect-cfi include/asm-x86_64/dwarf2.h --- a/include/asm-x86_64/dwarf2.h~x86_64-mm-detect-cfi +++ a/include/asm-x86_64/dwarf2.h @@ -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 diff -puN scripts/Kbuild.include~x86_64-mm-detect-cfi scripts/Kbuild.include --- a/scripts/Kbuild.include~x86_64-mm-detect-cfi +++ a/scripts/Kbuild.include @@ -63,6 +63,13 @@ as-option = $(shell if $(CC) $(CFLAGS) $ -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) _