1N/Adnl grub_ASM_USCORE checks if C symbols get an underscore after
1N/Adnl compiling to assembler.
1N/Adnl Written by Pavel Roskin. Based on grub_ASM_EXT_C written by
1N/Adnl Erich Boleyn and modified by OKUJI Yoshinori
1N/AAC_DEFUN([grub_ASM_USCORE],
1N/A[AC_REQUIRE([AC_PROG_CC])
1N/AAC_MSG_CHECKING([if C symbols get an underscore after compilation])
1N/AAC_CACHE_VAL(grub_cv_asm_uscore,
1N/A[cat > conftest.c <<\EOF
1N/Aint
1N/Afunc (int *list)
1N/A{
1N/A *list = 0;
1N/A return *list;
1N/A}
1N/AEOF
1N/A
1N/Aif AC_TRY_COMMAND([${CC-cc} ${CFLAGS} -S conftest.c]) && test -s conftest.s; then
1N/A true
1N/Aelse
1N/A AC_MSG_ERROR([${CC-cc} failed to produce assembly code])
1N/Afi
1N/A
1N/Aif grep _func conftest.s >/dev/null 2>&1; then
1N/A grub_cv_asm_uscore=yes
1N/Aelse
1N/A grub_cv_asm_uscore=no
1N/Afi
1N/A
1N/Arm -f conftest*])
1N/A
1N/Aif test "x$grub_cv_asm_uscore" = xyes; then
1N/A AC_DEFINE_UNQUOTED([HAVE_ASM_USCORE], $grub_cv_asm_uscore,
1N/A [Define if C symbols get an underscore after compilation])
1N/Afi
1N/A
1N/AAC_MSG_RESULT([$grub_cv_asm_uscore])
1N/A])
1N/A
1N/A
1N/Adnl Some versions of `objcopy -O binary' vary their output depending
1N/Adnl on the link address.
1N/AAC_DEFUN([grub_PROG_OBJCOPY_ABSOLUTE],
1N/A[AC_MSG_CHECKING([whether ${OBJCOPY} works for absolute addresses])
1N/AAC_CACHE_VAL(grub_cv_prog_objcopy_absolute,
1N/A[cat > conftest.c <<\EOF
1N/Avoid
1N/Acmain (void)
1N/A{
1N/A *((int *) 0x1000) = 2;
1N/A}
1N/AEOF
1N/A
1N/Aif AC_TRY_EVAL(ac_compile) && test -s conftest.o; then :
1N/Aelse
1N/A AC_MSG_ERROR([${CC-cc} cannot compile C source code])
1N/Afi
1N/Agrub_cv_prog_objcopy_absolute=yes
1N/Afor link_addr in 2000 8000 7C00; do
1N/A if AC_TRY_COMMAND([${CC-cc} ${CFLAGS} -nostdlib -Wl,-N -Wl,-Ttext -Wl,$link_addr conftest.o -o conftest.exec]); then :
1N/A else
1N/A AC_MSG_ERROR([${CC-cc} cannot link at address $link_addr])
1N/A fi
1N/A if AC_TRY_COMMAND([${OBJCOPY-objcopy} -O binary conftest.exec conftest]); then :
1N/A else
1N/A AC_MSG_ERROR([${OBJCOPY-objcopy} cannot create binary files])
1N/A fi
1N/A if test ! -f conftest.old || AC_TRY_COMMAND([cmp -s conftest.old conftest]); then
1N/A mv -f conftest conftest.old
1N/A else
1N/A grub_cv_prog_objcopy_absolute=no
1N/A break
1N/A fi
1N/Adone
1N/Arm -f conftest*])
1N/AAC_MSG_RESULT([$grub_cv_prog_objcopy_absolute])])
1N/A
1N/Adnl Mass confusion!
1N/Adnl Older versions of GAS interpret `.code16' to mean ``generate 32-bit
1N/Adnl instructions, but implicitly insert addr32 and data32 bytes so
1N/Adnl that the code works in real mode''.
1N/Adnl
1N/Adnl Newer versions of GAS interpret `.code16' to mean ``generate 16-bit
1N/Adnl instructions,'' which seems right. This requires the programmer
1N/Adnl to explicitly insert addr32 and data32 instructions when they want
1N/Adnl them.
1N/Adnl
1N/Adnl We only support the newer versions, because the old versions cause
1N/Adnl major pain, by requiring manual assembly to get 16-bit instructions into
1N/Adnl stage1/stage1.S.
1N/AAC_DEFUN([grub_ASM_ADDR32],
1N/A[AC_REQUIRE([AC_PROG_CC])
1N/AAC_REQUIRE([grub_ASM_PREFIX_REQUIREMENT])
1N/AAC_MSG_CHECKING([for .code16 addr32 assembler support])
1N/AAC_CACHE_VAL(grub_cv_asm_addr32,
1N/A[cat > conftest.s.in <<\EOF
1N/A .code16
1N/Al1: @ADDR32@ movb %al, l1
1N/AEOF
1N/A
1N/Aif test "x$grub_cv_asm_prefix_requirement" = xyes; then
1N/A sed -e s/@ADDR32@/addr32/ < conftest.s.in > conftest.s
1N/Aelse
1N/A sed -e s/@ADDR32@/addr32\;/ < conftest.s.in > conftest.s
1N/Afi
1N/A
1N/Aif AC_TRY_COMMAND([${CC-cc} ${CFLAGS} -c conftest.s]) && test -s conftest.o; then
1N/A grub_cv_asm_addr32=yes
1N/Aelse
1N/A grub_cv_asm_addr32=no
1N/Afi
1N/A
1N/Arm -f conftest*])
1N/A
1N/AAC_MSG_RESULT([$grub_cv_asm_addr32])])
1N/A
1N/Adnl
1N/Adnl Later versions of GAS requires that addr32 and data32 prefixes
1N/Adnl appear in the same lines as the instructions they modify, while
1N/Adnl earlier versions requires that they appear in separate lines.
1N/AAC_DEFUN([grub_ASM_PREFIX_REQUIREMENT],
1N/A[AC_REQUIRE([AC_PROG_CC])
1N/AAC_MSG_CHECKING(dnl
1N/A[whether addr32 must be in the same line as the instruction])
1N/AAC_CACHE_VAL(grub_cv_asm_prefix_requirement,
1N/A[cat > conftest.s <<\EOF
1N/A .code16
1N/Al1: addr32 movb %al, l1
1N/AEOF
1N/A
1N/Aif AC_TRY_COMMAND([${CC-cc} ${CFLAGS} -c conftest.s]) && test -s conftest.o; then
1N/A grub_cv_asm_prefix_requirement=yes
1N/Aelse
1N/A grub_cv_asm_prefix_requirement=no
1N/Afi
1N/A
1N/Arm -f conftest*])
1N/A
1N/Aif test "x$grub_cv_asm_prefix_requirement" = xyes; then
1N/A grub_tmp_addr32="addr32"
1N/A grub_tmp_data32="data32"
1N/Aelse
1N/A grub_tmp_addr32="addr32;"
1N/A grub_tmp_data32="data32;"
1N/Afi
1N/A
1N/AAC_DEFINE_UNQUOTED([ADDR32], $grub_tmp_addr32,
1N/A [Define it to \"addr32\" or \"addr32;\" to make GAS happy])
1N/AAC_DEFINE_UNQUOTED([DATA32], $grub_tmp_data32,
1N/A [Define it to \"data32\" or \"data32;\" to make GAS happy])
1N/A
1N/AAC_MSG_RESULT([$grub_cv_asm_prefix_requirement])])
1N/A
1N/Adnl
1N/Adnl Older versions of GAS require that absolute indirect calls/jumps are
1N/Adnl not prefixed with `*', while later versions warn if not prefixed.
1N/AAC_DEFUN([grub_ASM_ABSOLUTE_WITHOUT_ASTERISK],
1N/A[AC_REQUIRE([AC_PROG_CC])
1N/AAC_MSG_CHECKING(dnl
1N/A[whether an absolute indirect call/jump must not be prefixed with an asterisk])
1N/AAC_CACHE_VAL(grub_cv_asm_absolute_without_asterisk,
1N/A[cat > conftest.s <<\EOF
1N/A lcall *(offset)
1N/Aoffset:
1N/A .long 0
1N/A .word 0
1N/AEOF
1N/A
1N/Aif AC_TRY_COMMAND([${CC-cc} ${CFLAGS} -c conftest.s]) && test -s conftest.o; then
1N/A grub_cv_asm_absolute_without_asterisk=no
1N/Aelse
1N/A grub_cv_asm_absolute_without_asterisk=yes
1N/Afi
1N/A
1N/Arm -f conftest*])
1N/A
1N/Aif test "x$grub_cv_asm_absolute_without_asterisk" = xyes; then
1N/A AC_DEFINE(ABSOLUTE_WITHOUT_ASTERISK, 1, [Define if an absolute indirect call/jump must NOT be prefixed with `*'])
1N/Afi
1N/A
1N/AAC_MSG_RESULT([$grub_cv_asm_absolute_without_asterisk])])
1N/A
1N/Adnl
1N/Adnl grub_CHECK_START_SYMBOL checks if start is automatically defined by
1N/Adnl the compiler.
1N/Adnl Written by OKUJI Yoshinori
1N/AAC_DEFUN([grub_CHECK_START_SYMBOL],
1N/A[AC_REQUIRE([AC_PROG_CC])
1N/AAC_MSG_CHECKING([if start is defined by the compiler])
1N/AAC_CACHE_VAL(grub_cv_check_start_symbol,
1N/A[AC_TRY_LINK([], [asm ("incl start")],
1N/A grub_cv_check_start_symbol=yes,
1N/A grub_cv_check_start_symbol=no)])
1N/A
1N/Aif test "x$grub_cv_check_start_symbol" = xyes; then
1N/A AC_DEFINE(HAVE_START_SYMBOL, 1, [Define if start is defined])
1N/Afi
1N/A
1N/AAC_MSG_RESULT([$grub_cv_check_start_symbol])
1N/A])
1N/A
1N/Adnl
1N/Adnl grub_CHECK_USCORE_START_SYMBOL checks if _start is automatically
1N/Adnl defined by the compiler.
1N/Adnl Written by OKUJI Yoshinori
1N/AAC_DEFUN([grub_CHECK_USCORE_START_SYMBOL],
1N/A[AC_REQUIRE([AC_PROG_CC])
1N/AAC_MSG_CHECKING([if _start is defined by the compiler])
1N/AAC_CACHE_VAL(grub_cv_check_uscore_start_symbol,
1N/A[AC_TRY_LINK([], [asm ("incl _start")],
1N/A grub_cv_check_uscore_start_symbol=yes,
1N/A grub_cv_check_uscore_start_symbol=no)])
1N/A
1N/Aif test "x$grub_cv_check_uscore_start_symbol" = xyes; then
1N/A AC_DEFINE(HAVE_USCORE_START_SYMBOL, 1, [Define if _start is defined])
1N/Afi
1N/A
1N/AAC_MSG_RESULT([$grub_cv_check_uscore_start_symbol])
1N/A])
1N/A
1N/Adnl
1N/Adnl grub_CHECK_USCORE_USCORE_BSS_START_SYMBOL checks if __bss_start is
1N/Adnl automatically defined by the compiler.
1N/Adnl Written by Michael Hohmoth.
1N/AAC_DEFUN([grub_CHECK_USCORE_USCORE_BSS_START_SYMBOL],
1N/A[AC_REQUIRE([AC_PROG_CC])
1N/AAC_MSG_CHECKING([if __bss_start is defined by the compiler])
1N/AAC_CACHE_VAL(grub_cv_check_uscore_uscore_bss_start_symbol,
1N/A[AC_TRY_LINK([], [asm ("incl __bss_start")],
1N/A grub_cv_check_uscore_uscore_bss_start_symbol=yes,
1N/A grub_cv_check_uscore_uscore_bss_start_symbol=no)])
1N/A
1N/Aif test "x$grub_cv_check_uscore_uscore_bss_start_symbol" = xyes; then
1N/A AC_DEFINE(HAVE_USCORE_USCORE_BSS_START_SYMBOL, 1, [Define if __bss_start is defined])
1N/Afi
1N/A
1N/AAC_MSG_RESULT([$grub_cv_check_uscore_uscore_bss_start_symbol])
1N/A])
1N/A
1N/Adnl
1N/Adnl grub_CHECK_EDATA_SYMBOL checks if edata is automatically defined by the
1N/Adnl compiler.
1N/Adnl Written by Michael Hohmuth.
1N/AAC_DEFUN([grub_CHECK_EDATA_SYMBOL],
1N/A[AC_REQUIRE([AC_PROG_CC])
1N/AAC_MSG_CHECKING([if edata is defined by the compiler])
1N/AAC_CACHE_VAL(grub_cv_check_edata_symbol,
1N/A[AC_TRY_LINK([], [asm ("incl edata")],
1N/A grub_cv_check_edata_symbol=yes,
1N/A grub_cv_check_edata_symbol=no)])
1N/A
1N/Aif test "x$grub_cv_check_edata_symbol" = xyes; then
1N/A AC_DEFINE(HAVE_EDATA_SYMBOL, 1, [Define if edata is defined])
1N/Afi
1N/A
1N/AAC_MSG_RESULT([$grub_cv_check_edata_symbol])
1N/A])
1N/A
1N/Adnl
1N/Adnl grub_CHECK_USCORE_EDATA_SYMBOL checks if _edata is automatically
1N/Adnl defined by the compiler.
1N/Adnl Written by Michael Hohmuth.
1N/AAC_DEFUN([grub_CHECK_USCORE_EDATA_SYMBOL],
1N/A[AC_REQUIRE([AC_PROG_CC])
1N/AAC_MSG_CHECKING([if _edata is defined by the compiler])
1N/AAC_CACHE_VAL(grub_cv_check_uscore_edata_symbol,
1N/A[AC_TRY_LINK([], [asm ("incl _edata")],
1N/A grub_cv_check_uscore_edata_symbol=yes,
1N/A grub_cv_check_uscore_edata_symbol=no)])
1N/A
1N/Aif test "x$grub_cv_check_uscore_edata_symbol" = xyes; then
1N/A AC_DEFINE(HAVE_USCORE_EDATA_SYMBOL, 1, [Define if _edata is defined])
1N/Afi
1N/A
1N/AAC_MSG_RESULT([$grub_cv_check_uscore_edata_symbol])
1N/A])
1N/A
1N/Adnl
1N/Adnl grub_CHECK_END_SYMBOL checks if end is automatically defined by the
1N/Adnl compiler.
1N/Adnl Written by OKUJI Yoshinori
1N/AAC_DEFUN([grub_CHECK_END_SYMBOL],
1N/A[AC_REQUIRE([AC_PROG_CC])
1N/AAC_MSG_CHECKING([if end is defined by the compiler])
1N/AAC_CACHE_VAL(grub_cv_check_end_symbol,
1N/A[AC_TRY_LINK([], [asm ("incl end")],
1N/A grub_cv_check_end_symbol=yes,
1N/A grub_cv_check_end_symbol=no)])
1N/A
1N/Aif test "x$grub_cv_check_end_symbol" = xyes; then
1N/A AC_DEFINE(HAVE_END_SYMBOL, 1, [Define if end is defined])
1N/Afi
1N/A
1N/AAC_MSG_RESULT([$grub_cv_check_end_symbol])
1N/A])
1N/A
1N/Adnl
1N/Adnl grub_CHECK_USCORE_END_SYMBOL checks if _end is automatically defined
1N/Adnl by the compiler.
1N/Adnl Written by OKUJI Yoshinori
1N/AAC_DEFUN([grub_CHECK_USCORE_END_SYMBOL],
1N/A[AC_REQUIRE([AC_PROG_CC])
1N/AAC_MSG_CHECKING([if _end is defined by the compiler])
1N/AAC_CACHE_VAL(grub_cv_check_uscore_end_symbol,
1N/A[AC_TRY_LINK([], [asm ("incl _end")],
1N/A grub_cv_check_uscore_end_symbol=yes,
1N/A grub_cv_check_uscore_end_symbol=no)])
1N/A
1N/Aif test "x$grub_cv_check_uscore_end_symbol" = xyes; then
1N/A AC_DEFINE(HAVE_USCORE_END_SYMBOL, 1, [Define if end is defined])
1N/Afi
1N/A
1N/AAC_MSG_RESULT([$grub_cv_check_uscore_end_symbol])
1N/A])
1N/A
1N/Adnl grub_DEFINE_FILE(MACRO_NAME, FILE_NAME, DESCRIPTION)
1N/Adnl grub_DEFINE_FILE defines a macro as the contents of a file safely.
1N/Adnl Replace some escape sequences, because autoconf doesn't handle them
1N/Adnl gracefully.
1N/Adnl Written by OKUJI Yoshinori.
1N/AAC_DEFUN([grub_DEFINE_FILE],
1N/A[AC_REQUIRE([AC_PROG_CC])
1N/A# Because early versions of GNU sed 3.x are too buggy, use a C program
1N/A# instead of shell commands. *sigh*
1N/Acat >conftest.c <<\EOF
1N/A#include <stdio.h>
1N/A
1N/Aint
1N/Amain (void)
1N/A{
1N/A int c;
1N/A
1N/A while ((c = getchar ()) != EOF)
1N/A {
1N/A switch (c)
1N/A {
1N/A case '\n':
1N/A fputs ("\\n", stdout);
1N/A break;
1N/A case '\r':
1N/A fputs ("\\r", stdout);
1N/A break;
1N/A case '\\':
1N/A fputs ("\\\\", stdout);
1N/A break;
1N/A case '"':
1N/A fputs ("\\\"", stdout);
1N/A break;
1N/A default:
1N/A putchar (c);
1N/A }
1N/A }
1N/A
1N/A return 0;
1N/A}
1N/AEOF
1N/A
1N/Aif AC_TRY_COMMAND([${CC-cc} ${CFLAGS} conftest.c -o conftest]) && test -s conftest; then
1N/A grub_tmp_value=`./conftest < "[$2]"`
1N/Aelse
1N/A AC_MSG_ERROR([${CC-cc} failed to produce an executable file])
1N/Afi
1N/A
1N/AAC_DEFINE_UNQUOTED([$1], "$grub_tmp_value", [$3])
1N/Arm -f conftest*
1N/A])