path: root/configure
diff options
authorRich Felker <>2013-08-02 19:34:22 -0400
committerRich Felker <>2013-08-02 19:34:22 -0400
commit86cc54b577f445da1582d2cf1ac3eff064ca27ef (patch)
tree6e97212567048708456eb035e920fb92fd42f7c8 /configure
parent2f820f3b1f639fee30f5bfa31aa3191758573f25 (diff)
protect against long double type mismatches (mainly powerpc for now)
check in configure to be polite (failing early if we're going to fail) and in vfprintf.c since that is the point at which a mismatching type would be extremely dangerous.
Diffstat (limited to 'configure')
1 files changed, 21 insertions, 0 deletions
diff --git a/configure b/configure
index 1d734726..48465f7c 100755
--- a/configure
+++ b/configure
@@ -393,6 +393,27 @@ test "$ARCH" = "microblaze" && trycppif __MICROBLAZEEL__ "$t" \
test "$SUBARCH" \
&& printf "configured for %s variant: %s\n" "$ARCH" "$ARCH$SUBARCH"
+# Some archs (powerpc) have different possible long double formats
+# that the compiler can be configured for. The logic for whether this
+# is supported is in bits/float.h; in general, it is not. We need to
+# check for mismatches here or code in printf, strotd, and scanf will
+# be dangerously incorrect because it depends on (1) the macros being
+# correct, and (2) IEEE semantics.
+printf "checking whether compiler's long double definition matches float.h... "
+echo '#include <float.h>' > "$tmpc"
+echo '#if LDBL_MANT_DIG == 53' >> "$tmpc"
+echo 'typedef char ldcheck[9-(int)sizeof(long double)];' >> "$tmpc"
+echo '#endif' >> "$tmpc"
+if $CC $CFLAGS_C99FSE -I./arch/$ARCH -I./include $CPPFLAGS $CFLAGS \
+ -c -o /dev/null "$tmpc" >/dev/null 2>&1 ; then
+printf "yes\n"
+printf "no\n"
+fail "$0: error: unsupported long double type"
printf "creating config.mak... "
exec 3>&1 1>config.mak