synthesize-float   [plain text]


#!/bin/sh
#
# Synthesize float.h to be installed in the the system.
#
# This is a combined header made up gcc3's config/float-i64.h and
# float-i386.h.
#
# This script is only called from the top-level GNUmakefile.  It
# is called as follows:
#
# synthesize_float $(SRCROOT) file $(RC_RELEASE)
#
# i.e., it will combine $(SRCROOT)/gcc/config/float-i64.h and
# $(SRCROOT)/gcc/config/float-i386.h and output the header into
# the file.
#
# Note that there is some additional C99-compatible definitions for
# FLT_ROUNDS based on whether __fegetfltrounds() is available to
# the system or not.  It is definitely not for Proton.  And we
# dynamically test for it for other releases.  Hence the third
# argument to this script. Probably in the future we can always
# assume __fegetfltrounds() exists and just unconditionally
# generate the additional definitions.  But until then...
#
cat <<EOF >"$2"
/* float.h */
#ifndef _FLOAT_H_
#define _FLOAT_H_

/* This is a combined header derived from gcc/config/float-i64.h for
   ppc and gcc/config/float-i386.h for the x86.  */

#ifdef __i386__

EOF

cat "$1"/gcc/config/float-i386.h | grep -v _FLOAT_H___ | grep -v _FLOAT_H_ >>"$2"

cat <<EOF >>"$2"
#else /* !__i386__ */

EOF

cat "$1"/gcc/config/float-i64.h | grep -v _FLOAT_H___  | grep -v _FLOAT_H_ >>"$2"

cat <<EOF >>"$2"
#endif /* !__i386__ */
EOF

cat <<EOF >/tmp/fegetfltrounds$$.c
extern int __fegetfltrounds (void);
int main()
{
  return __fegetfltrounds ();
}
EOF

set -x
if [ "$3" != "Proton" ]; then
    if cc /tmp/fegetfltrounds$$.c -o /tmp/xfegetfltrounds.$$ &> /dev/null; then
cat <<EOF >>"$2"

#ifdef __cplusplus
extern "C" {
#endif
extern int __fegetfltrounds( void ); 
#ifdef __cplusplus
}
#endif
#undef FLT_ROUNDS
#define FLT_ROUNDS (__fegetfltrounds ())
EOF
    fi
    rm -f /tmp/fegetfltrounds$$.c /tmp/xfegetfltrounds.$$
fi

cat <<EOF >>"$2"

#endif /* _FLOAT_H_ */
EOF