configure: Detect the appropriate form for the __ASM_GLOBAL_FUNC macro.
diff --git a/configure.ac b/configure.ac
index 99a60bc..4f74d71 100644
--- a/configure.ac
+++ b/configure.ac
@@ -1384,6 +1384,24 @@
fi
fi
+dnl **** Check for underscore on external symbols ****
+
+AC_CACHE_CHECK([whether external symbols need an underscore prefix], ac_cv_c_extern_prefix,
+ WINE_TRY_ASM_LINK([".globl _ac_test\n_ac_test:\t.long 0"],
+ [extern int ac_test;],
+ [if (ac_test) return 1],
+ ac_cv_c_extern_prefix="yes",ac_cv_c_extern_prefix="no"))
+
+AH_TEMPLATE(__ASM_NAME,[Define to a macro to generate an assembly name from a C symbol])
+if test "$ac_cv_c_extern_prefix" = "yes"
+then
+ AC_DEFINE([__ASM_NAME(name)], ["_" name])
+ asm_name_prefix="_"
+else
+ AC_DEFINE([__ASM_NAME(name)], [name])
+ asm_name_prefix=""
+fi
+
dnl **** Check how to define a function in assembly code ****
AC_CACHE_CHECK([how to define a function in assembly code], ac_cv_asm_func_def,
@@ -1399,29 +1417,41 @@
AH_TEMPLATE(__ASM_FUNC,[Define to a macro to generate an assembly function directive])
case "$ac_cv_asm_func_def" in
".def")
- AC_DEFINE([__ASM_FUNC(name)], [".def " __ASM_NAME(name) "; .scl 2; .type 32; .endef"]) ;;
+ AC_DEFINE([__ASM_FUNC(name)], [".def " __ASM_NAME(name) "; .scl 2; .type 32; .endef"])
+ asm_func_header=".def $asm_name_prefix\" #name \"; .scl 2; .type 32; .endef" ;;
".type @function")
- AC_DEFINE([__ASM_FUNC(name)], [".type " __ASM_NAME(name) ",@function"]) ;;
+ AC_DEFINE([__ASM_FUNC(name)], [".type " __ASM_NAME(name) ",@function"])
+ asm_func_header=".type $asm_name_prefix\" #name \",@function" ;;
".type 2")
- AC_DEFINE([__ASM_FUNC(name)], [".type " __ASM_NAME(name) ",2"]) ;;
+ AC_DEFINE([__ASM_FUNC(name)], [".type " __ASM_NAME(name) ",2"])
+ asm_func_header=".type $asm_name_prefix\" #name \",2" ;;
*)
- AC_DEFINE([__ASM_FUNC(name)], [""]) ;;
+ AC_DEFINE([__ASM_FUNC(name)], [""])
+ asm_func_header="" ;;
esac
-dnl **** Check for underscore on external symbols ****
+AC_CACHE_CHECK([whether asm() works outside of functions], ac_cv_c_asm_outside_funcs,
+ AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[asm(".text\n\t.long 0");]],)],
+ ac_cv_c_asm_outside_funcs="yes",ac_cv_c_asm_outside_funcs="no"))
-AC_CACHE_CHECK([whether external symbols need an underscore prefix], ac_cv_c_extern_prefix,
- WINE_TRY_ASM_LINK([".globl _ac_test\n_ac_test:\t.long 0"],
- [extern int ac_test;],
- [if (ac_test) return 1],
- ac_cv_c_extern_prefix="yes",ac_cv_c_extern_prefix="no"))
+AC_CACHE_CHECK([whether .previous is supported in assembly code], ac_cv_c_dot_previous,
+ WINE_TRY_ASM_LINK([".text\nac_test:\t.long 0\n\t.previous"],,,
+ ac_cv_c_dot_previous="yes",ac_cv_c_dot_previous="no"))
-AH_TEMPLATE(__ASM_NAME,[Define to a macro to generate an assembly name from a C symbol])
-if test "$ac_cv_c_extern_prefix" = "yes"
+asm_func_header=".globl $asm_name_prefix\" #name \"\\n\\t$asm_func_header\\n$asm_name_prefix\" #name \":\\n\\t"
+asm_func_trailer=""
+if test "$ac_cv_c_dot_previous" = "yes"
then
- AC_DEFINE([__ASM_NAME(name)], ["_" name])
+ asm_func_trailer="\\n\\t.previous"
+fi
+asm_func_code="$asm_func_header\" code \"$asm_func_trailer"
+
+AH_TEMPLATE(__ASM_GLOBAL_FUNC,[Define to a macro to generate an assembly function])
+if test "$ac_cv_c_asm_outside_funcs" = "yes"
+then
+ AC_DEFINE_UNQUOTED([__ASM_GLOBAL_FUNC(name,code)],[asm(".text\n\t.align 4\n\t$asm_func_code");])
else
- AC_DEFINE([__ASM_NAME(name)], [name])
+ AC_DEFINE_UNQUOTED([__ASM_GLOBAL_FUNC(name,code)],[void __asm_dummy_##name(void) { asm(".text\n\t.align 4\n\t$asm_func_code"); }])
fi
dnl **** Platform-specific checks ****