mirror of
https://gitlab.freedesktop.org/cairo/cairo.git
synced 2026-05-30 21:18:17 +02:00
When using clang -O4, the compiled test object is output in bitcode format rather than as an ELF object, so when we grep the test value from the object it fails. To work around this, go ahead and link the test object into an executable, and then grep against this native binary instead of the compiler's intermediary object. We need to add __attribute__((used)) to ensure the d variable doesn't get optimized out during linking, since it's not referenced in the test's main(). Patch authored by cmuelle8 <abendstund@gmail.com> Reviewed-by: Bryce Harrington <b.harrington@samsung.com> Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=63310
65 lines
2.6 KiB
Text
65 lines
2.6 KiB
Text
# AX_C_FLOAT_WORDS_BIGENDIAN ([ACTION-IF-TRUE], [ACTION-IF-FALSE],
|
|
# [ACTION-IF-UNKNOWN])
|
|
#
|
|
# Checks the ordering of words within a multi-word float. This check
|
|
# is necessary because on some systems (e.g. certain ARM systems), the
|
|
# float word ordering can be different from the byte ordering. In a
|
|
# multi-word float context, "big-endian" implies that the word containing
|
|
# the sign bit is found in the memory location with the lowest address.
|
|
# This implemenation was inspired by the AC_C_BIGENDIAN macro in autoconf.
|
|
# -------------------------------------------------------------------------
|
|
AC_DEFUN([AX_C_FLOAT_WORDS_BIGENDIAN],
|
|
[AC_CACHE_CHECK(whether float word ordering is bigendian,
|
|
ax_cv_c_float_words_bigendian, [
|
|
|
|
# The endianess is detected by first compiling C code that contains a special
|
|
# double float value, then grepping the resulting object file for certain
|
|
# strings of ascii values. The double is specially crafted to have a
|
|
# binary representation that corresponds with a simple string. In this
|
|
# implementation, the string "noonsees" was selected because the individual
|
|
# word values ("noon" and "sees") are palindromes, thus making this test
|
|
# byte-order agnostic. If grep finds the string "noonsees" in the object
|
|
# file, the target platform stores float words in big-endian order. If grep
|
|
# finds "seesnoon", float words are in little-endian order. If neither value
|
|
# is found, the user is instructed to specify the ordering.
|
|
|
|
ax_cv_c_float_words_bigendian=unknown
|
|
AC_LINK_IFELSE([AC_LANG_SOURCE([[
|
|
|
|
double d __attribute__((used)) = 90904234967036810337470478905505011476211692735615632014797120844053488865816695273723469097858056257517020191247487429516932130503560650002327564517570778480236724525140520121371739201496540132640109977779420565776568942592.0;
|
|
int main() { return 0; }
|
|
|
|
]])], [
|
|
|
|
if strings - conftest | grep noonsees >/dev/null ; then
|
|
ax_cv_c_float_words_bigendian=yes
|
|
fi
|
|
if strings - conftest | grep seesnoon >/dev/null ; then
|
|
if test "$ax_cv_c_float_words_bigendian" = unknown; then
|
|
ax_cv_c_float_words_bigendian=no
|
|
else
|
|
ax_cv_c_float_words_bigendian=unknown
|
|
fi
|
|
fi
|
|
|
|
])])
|
|
|
|
case $ax_cv_c_float_words_bigendian in
|
|
yes)
|
|
m4_default([$1],
|
|
[AC_DEFINE([FLOAT_WORDS_BIGENDIAN], 1,
|
|
[Define to 1 if your system stores words within floats
|
|
with the most significant word first])]) ;;
|
|
no)
|
|
$2 ;;
|
|
*)
|
|
m4_default([$3],
|
|
[AC_MSG_ERROR([
|
|
|
|
Unknown float word ordering. You need to manually preset
|
|
ax_cv_c_float_words_bigendian=no (or yes) according to your system.
|
|
|
|
])]) ;;
|
|
esac
|
|
|
|
])# AX_C_FLOAT_WORDS_BIGENDIAN
|