From 20b6f60757b623449a203b30b0401bc3a3340bc5 Mon Sep 17 00:00:00 2001 From: "Erlend E. Aasland" Date: Tue, 15 Oct 2024 23:30:52 +0200 Subject: [PATCH] Add patch for ax_c_float_words_bigendian.m4 to autoconf-archive --- autoconf/Dockerfile | 6 +- autoconf/ax_c_float_words_bigendian.diff | 92 ++++++++++++++++++++++++ 2 files changed, 97 insertions(+), 1 deletion(-) create mode 100644 autoconf/ax_c_float_words_bigendian.diff diff --git a/autoconf/Dockerfile b/autoconf/Dockerfile index be4dfd4..1c62a0e 100644 --- a/autoconf/Dockerfile +++ b/autoconf/Dockerfile @@ -30,8 +30,12 @@ RUN curl https://ftp.gnu.org/gnu/automake/automake-${AUTOMAKE_VERSION}.tar.gz | && ./configure --prefix=/usr/local \ && make \ && make install -RUN curl https://ftp.gnu.org/gnu/autoconf-archive/autoconf-archive-${AUTOCONF_ARCHIVE_VERSION}.tar.xz | xz -cd - | tar -xf - \ +# We can get rid of the ax_c_float_words_bigendian.m4 patch when a new version +# of autoconf-archive is released. +COPY ax_c_float_words_bigendian.diff . +RUN PATCH_VERBOSE=1 curl https://ftp.gnu.org/gnu/autoconf-archive/autoconf-archive-${AUTOCONF_ARCHIVE_VERSION}.tar.xz | xz -cd - | tar -xf - \ && cd autoconf-archive-${AUTOCONF_ARCHIVE_VERSION} \ + && patch -p1 -i ../ax_c_float_words_bigendian.diff \ && ./configure --prefix=/usr/local \ && make \ && make install diff --git a/autoconf/ax_c_float_words_bigendian.diff b/autoconf/ax_c_float_words_bigendian.diff new file mode 100644 index 0000000..9785589 --- /dev/null +++ b/autoconf/ax_c_float_words_bigendian.diff @@ -0,0 +1,92 @@ +diff --git a/m4/ax_c_float_words_bigendian.m4 b/m4/ax_c_float_words_bigendian.m4 +index 216b90d8..52036844 100644 +--- a/m4/ax_c_float_words_bigendian.m4 ++++ b/m4/ax_c_float_words_bigendian.m4 +@@ -27,32 +27,81 @@ + # If neither value is found, the user is instructed to specify the + # ordering. + # ++# Early versions of this macro (i.e., before serial 12) would not work ++# when interprocedural optimization (via link-time optimization) was ++# enabled. This would happen when, say, the GCC/clang "-flto" flag, or the ++# ICC "-ipo" flag was used, for example. The problem was that under ++# these conditions, the compiler did not allocate for and write the special ++# float value in the data segment of the object file, since doing so might ++# not prove optimal once more context was available. Thus, the special value ++# (in platform-dependent binary form) could not be found in the object file, ++# and the macro would fail. ++# ++# The solution to the above problem was to: ++# ++# 1) Compile and link a whole test program rather than just compile an ++# object file. This ensures that we reach the point where even an ++# interprocedural optimizing compiler writes values to the data segment. ++# ++# 2) Add code that requires the compiler to write the special value to ++# the data segment, as opposed to "optimizing away" the variable's ++# allocation. This could be done via compiler keywords or options, but ++# it's tricky to make this work for all versions of all compilers with ++# all optimization settings. The chosen solution was to make the exit ++# code of the test program depend on the storing of the special value ++# in memory (in the data segment). Because the exit code can be ++# verified, any compiler that aspires to be correct will produce a ++# program binary that contains the value, which the macro can then find. ++# ++# How does the exit code depend on the special value residing in memory? ++# Memory, unlike variables and registers, can be addressed indirectly at run ++# time. The exit code of this test program is a result of indirectly reading ++# and writing to the memory region where the special value is supposed to ++# reside. The actual memory addresses used and the values to be written are ++# derived from the the program input ("argv") and are therefore not known at ++# compile or link time. The compiler has no choice but to defer the ++# computation to run time, and to prepare by allocating and populating the ++# data segment with the special value. For further details, refer to the ++# source code of the test program. ++# ++# Note that the test program is never meant to be run. It only exists to host ++# a double float value in a given platform's binary format. Thus, error ++# handling is not included. ++# + # LICENSE + # +-# Copyright (c) 2008 Daniel Amelang ++# Copyright (c) 2008, 2023 Daniel Amelang + # + # Copying and distribution of this file, with or without modification, are + # permitted in any medium without royalty provided the copyright notice + # and this notice are preserved. This file is offered as-is, without any + # warranty. + +-#serial 11 ++#serial 12 + + AC_DEFUN([AX_C_FLOAT_WORDS_BIGENDIAN], + [AC_CACHE_CHECK(whether float word ordering is bigendian, + ax_cv_c_float_words_bigendian, [ + + ax_cv_c_float_words_bigendian=unknown +-AC_COMPILE_IFELSE([AC_LANG_SOURCE([[ ++AC_LINK_IFELSE([AC_LANG_SOURCE([[ ++ ++#include ++ ++static double m[] = {9.090423496703681e+223, 0.0}; + +-double d = 90904234967036810337470478905505011476211692735615632014797120844053488865816695273723469097858056257517020191247487429516932130503560650002327564517570778480236724525140520121371739201496540132640109977779420565776568942592.0; ++int main (int argc, char *argv[]) ++{ ++ m[atoi (argv[1])] += atof (argv[2]); ++ return m[atoi (argv[3])] > 0.0; ++} + + ]])], [ + +-if grep noonsees conftest.$ac_objext >/dev/null ; then ++if grep noonsees conftest$EXEEXT >/dev/null ; then + ax_cv_c_float_words_bigendian=yes + fi +-if grep seesnoon conftest.$ac_objext >/dev/null ; then ++if grep seesnoon conftest$EXEEXT >/dev/null ; then + if test "$ax_cv_c_float_words_bigendian" = unknown; then + ax_cv_c_float_words_bigendian=no + else