Fix alignment for darwin with -Dusemorebits.
authorAndy Dougherty <doughera@lafayete.edu>
Mon, 10 Sep 2012 11:45:26 +0000 (07:45 -0400)
committerAndy Dougherty <doughera@lafayete.edu>
Mon, 10 Sep 2012 11:45:26 +0000 (07:45 -0400)
By default, the darwin build assumes a "multiarchitecture" build.
Configure has a hardwired default of '8' for alignbytes (and then
proceeds to ignore it with another hard-wired '8' in config.h).
That '8' was supposed to be a safe value, in case perl was built
on one architecture but run on another with a stricter constraint.
With darwin and -Dusemorebits, however, the alignment should be on
16-byte boundaries.  We don't want to penalize all darwin builds for
this unlikely configuration, but we do want to allow it.

This patch causes Configure to compute alignbytes even for multiarch
builds, but if the result is less than 8, it sets it to 8 (which
preserves the previous behavior).  If, however, alignbytes is 16,
Configure won't decrease it.  Then, this patch also fixes the bits that
end up in config_h.SH so that it uses the value determined by Configure
instead of the previous hardwired value.

U/compline/alignbytes.U

index e5edbea..8fb2cc8 100644 (file)
 ?C:MEM_ALIGNBYTES (ALIGNBYTES):
 ?C:    This symbol contains the number of bytes required to align a
 ?C:    double, or a long double when applicable. Usual values are 2,
-?C:    4 and 8. The default is eight, for safety.
+?C:    4 and 8. The default is eight, for safety.  For cross-compiling
+?C:    or multiarch support, Configure will set a minimum of 8.
 ?C:.
-?H:?%<:#if defined(USE_CROSS_COMPILE) || defined(MULTIARCH)
-?H:?%<:#  define MEM_ALIGNBYTES 8
-?H:?%<:#else
 ?H:?%<:#define MEM_ALIGNBYTES $alignbytes
-?H:?%<:#endif
 ?H:.
 ?F:!try
 : check for alignment requirements
 echo " "
-case "$usecrosscompile$multiarch" in
+case "$usecrosscompile" in
 *$define*)
        $cat <<EOM
-You seem to be either cross-compiling or doing a multiarchitecture build,
-skipping the memory alignment check.
+You seem to be cross-compiling.  Skipping the memory alignment check.
 
 EOM
        case "$alignbytes" in
@@ -84,6 +80,17 @@ EOCP
                        dflt='8'
                        echo "(I can't seem to compile the test program...)"
                fi
+               case "$multiarch" in
+               *$define*)
+                       : The usual safe value is 8, but Darwin with -Duselongdouble
+                       : needs 16.  Hence, we will take 8 as a minimum, but allow
+                       : Configure to pick a larger value if needed.
+                       if $test "$dflt" -lt 8; then
+                           dflt='8'
+                               echo "Setting alignment to 8 for multiarch support.">&4
+                       fi
+                       ;;
+               esac
                ;;
        *) dflt="$alignbytes"
                ;;