On 05.03.2021 19:58, Brian Inglis wrote:
On 2021-03-05 05:18, Marco Atzeri via Cygwin wrote:
Hi Guys,
noted trying to rebuild guile 1.8.8.
The following piece of code in the past
was setting SCM_I_GSC_STACK_GROWS_UP=0
and now produces SCM_I_GSC_STACK_GROWS_UP=1
I assume some change in the gcc compiler is causing the issue.
I presume most of the programs and libraries do not care,
but some special one like guile crashes during build for this issue,
so be aware.
Regards
Marco
#--------------------------------------------------------------------
#
# Which way does the stack grow?
#
# Following code comes from Autoconf 2.61's internal _AC_LIBOBJ_ALLOCA
# macro (/usr/share/autoconf/autoconf/functions.m4). Gnulib has
# very similar code, so in future we could look at using that.
#
# An important detail is that the code involves find_stack_direction
# calling _itself_ - which means that find_stack_direction (or at
# least the second find_stack_direction() call) cannot be inlined.
# If the code could be inlined, that might cause the test to give
# an incorrect answer.
#--------------------------------------------------------------------
SCM_I_GSC_STACK_GROWS_UP=0
AC_RUN_IFELSE([AC_LANG_SOURCE(
[AC_INCLUDES_DEFAULT
int
find_stack_direction ()
{
static char *addr = 0;
auto char dummy;
if (addr == 0)
{
addr = &dummy;
return find_stack_direction ();
}
else
return (&dummy > addr) ? 1 : -1;
}
int
main ()
{
return find_stack_direction () < 0;
}])],
[SCM_I_GSC_STACK_GROWS_UP=1],
[],
[AC_MSG_WARN(Guessing that stack grows down -- see
scmconfig.h)])
Report it upstream to guile and [better] autoconf for correction -
suggest a patch or not as you feel appropriate.
It's an issue that the code does not assume --push and pop++ as that is
the common implementation -- then do adequate due diligence to inhibit
optimizations that avoid stack usage, eliminate tail recursion, and
generate inline code, to prove the opposite. Some implementations (used
to?) not natively support or use stacks and emulated them with
dynamically allocated memory blocks.
I am surprised that this has not occurred previously, and wonder if
someone recently replaced, eliminated, or "optimized" code, or some
necessary settings, that allow such autoconf tests to do their jobs
properly.
guile 1.8.8 is 10 years old, but it is still used by some programs
as all the guile 2.x series were slower.
the code on recent guile 3.0.x is different, with no recursion at all.
SCM_I_GSC_STACK_GROWS_UP=0
AC_RUN_IFELSE([AC_LANG_SOURCE(
[AC_INCLUDES_DEFAULT
int
find_stack_direction (int *addr, int depth)
{
int dir, dummy = 0;
if (! addr)
addr = &dummy;
*addr = addr < &dummy ? 1 : addr == &dummy ? 0 : -1;
dir = depth ? find_stack_direction (addr, depth - 1) : 0;
return dir + dummy;
}
int
main (int argc, char **argv)
{
return find_stack_direction (0, argc + !argv + 20) < 0;
}])],
We all love the advantage such transformations provide our code at large
compile time and space costs, but most are unaware of the effort that
detection code like the above now has to go thru to avoid being rendered
useless.
it is always impossible to guess in which direction programming
paradigms evolve, due to the large number of elements involved.
But testing for functionality remain much more resistent to hard coded
solution.
Regards
Marco
--
Problem reports: https://cygwin.com/problems.html
FAQ: https://cygwin.com/faq/
Documentation: https://cygwin.com/docs.html
Unsubscribe info: https://cygwin.com/ml/#unsubscribe-simple