2009-05-22 Pavel Roskin <proski@gnu.org>

* aclocal.m4 (grub_I386_CHECK_REGPARM_BUG): Remove.
	* configure.ac: Don't call grub_I386_CHECK_REGPARM_BUG.  Define
	NESTED_FUNC_ATTR using AH_BOTTOM.  Use regparm(1) only when
	compiling for the i386 targets, but not for the utilities.
This commit is contained in:
proski 2009-05-22 21:15:31 +00:00
parent 96b1619a75
commit bf6a5fb2a8
3 changed files with 11 additions and 55 deletions

View file

@ -1,5 +1,10 @@
2009-05-22 Pavel Roskin <proski@gnu.org>
* aclocal.m4 (grub_I386_CHECK_REGPARM_BUG): Remove.
* configure.ac: Don't call grub_I386_CHECK_REGPARM_BUG. Define
NESTED_FUNC_ATTR using AH_BOTTOM. Use regparm(1) only when
compiling for the i386 targets, but not for the utilities.
* include/grub/i386/pc/kernel.h (grub_boot_drive): Change type
to grub_uint8_t.
(grub_root_drive): Likewise.

54
aclocal.m4 vendored
View file

@ -301,60 +301,6 @@ else
fi
])
dnl Check if the C compiler has a bug while using nested functions when
dnl mregparm is used on the i386. Some gcc versions do not pass the third
dnl parameter correctly to the nested function.
dnl Written by Marco Gerards.
AC_DEFUN(grub_I386_CHECK_REGPARM_BUG,
[AC_REQUIRE([AC_PROG_CC])
AC_MSG_CHECKING([if GCC has the regparm=3 bug])
AC_CACHE_VAL(grub_cv_i386_check_nested_functions,
[AC_RUN_IFELSE([AC_LANG_SOURCE(
[[
static int
test (int *n)
{
return *n == -1;
}
static int
testfunc (int __attribute__ ((__regparm__ (3))) (*hook) (int a, int b, int *c))
{
int a = 0;
int b = 0;
int c = -1;
return hook (a, b, &c);
}
int
main (void)
{
int __attribute__ ((__regparm__ (3))) nestedfunc (int a, int b, int *c)
{
return a == b && test (c);
}
return testfunc (nestedfunc) ? 0 : 1;
}
]])],
[grub_cv_i386_check_nested_functions=no],
[grub_cv_i386_check_nested_functions=yes],
[grub_cv_i386_check_nested_functions=yes])])
AC_MSG_RESULT([$grub_cv_i386_check_nested_functions])
if test "x$grub_cv_i386_check_nested_functions" = xyes; then
AC_DEFINE([NESTED_FUNC_ATTR],
[__attribute__ ((__regparm__ (1)))],
[Catch gcc bug])
else
dnl Unfortunately, the above test does not detect a bug in gcc-4.0.
dnl So use regparm 2 until a better test is found.
AC_DEFINE([NESTED_FUNC_ATTR],
[__attribute__ ((__regparm__ (1)))],
[Catch gcc bug])
fi
])
dnl Check if the C compiler generates calls to `__enable_execute_stack()'.
AC_DEFUN(grub_CHECK_ENABLE_EXECUTE_STACK,[
AC_MSG_CHECKING([whether `$CC' generates calls to `__enable_execute_stack()'])

View file

@ -391,11 +391,16 @@ if test "x$target_cpu" = xi386; then
grub_I386_ASM_PREFIX_REQUIREMENT
grub_I386_ASM_ADDR32
grub_I386_ASM_ABSOLUTE_WITHOUT_ASTERISK
grub_I386_CHECK_REGPARM_BUG
else
AC_DEFINE([NESTED_FUNC_ATTR], [], [Catch gcc bug])
fi
AH_BOTTOM([#if defined(__i386__) && !defined(GRUB_UTIL)
#define NESTED_FUNC_ATTR __attribute__ ((__regparm__ (1)))
#else
#define NESTED_FUNC_ATTR
#endif])
# Restore the flags.
CC="$tmp_CC"
CFLAGS="$tmp_CFLAGS"