gcc/libstdc++-v3/mknumeric_limits
Alexandre Oliva 48dbafe4a9 gen-num-limits.cc: Use sigsetjmp and siglongjmp if available.
* src/gen-num-limits.cc: Use sigsetjmp and siglongjmp if available.
* mknumeric_limits: Compile it with -DHAVE_CONFIG_H.
* configure.in: Test for sigsetjmp.
* configure, config.h.in: Rebuilt.

From-SVN: r39586
2001-02-11 18:15:49 +00:00

286 lines
9.2 KiB
Bash
Executable File

#! /bin/sh
# mknumeric_limits: generates
# - part of bits/std_limits.h completed by gen-num-limits.cc
# - src/limitsMEMBERS.cc that contains the definition of various
# static data members of specialization of class template numeric_limits
#
echo "running mknumeric_limits"
case `uname` in
CYGWIN*)
LDFLAGS='-nodefaultlibs -lcygwin -lc -lkernel32 -lgcc' ;;
AIX*)
case $CXX in
*pthread*)
LDFLAGS='-nodefaultlibs -lgcc -L/usr/lib/threads -lpthreads -lc_r /usr/lib/libc.a' ;;
*)
LDFLAGS='-nodefaultlibs -lgcc -lc' ;;
esac
;;
*)
LDFLAGS='-nodefaultlibs -lgcc -lc' ;;
esac
BUILD_DIR=$1
if [ ! -d "$BUILD_DIR" ]; then
echo "build directory $BUILD_DIR not found, exiting."
exit 1
fi
if [ ! -d "$BUILD_DIR/include" ]; then
mkdir "$BUILD_DIR/include"
fi
if [ ! -d "$BUILD_DIR/include/bits" ]; then
mkdir "$BUILD_DIR/include/bits"
fi
if [ ! -d "$BUILD_DIR/src" ]; then
mkdir "$BUILD_DIR/src"
fi
OUT_H="$BUILD_DIR/include/bits/std_limits.h"
OUT_C="$BUILD_DIR/src/limitsMEMBERS.cc"
if [ -f $OUT_C ]; then
rm -f $OUT_H $OUT_C $OUT_H-t $OUT_C-t
fi
SRC_DIR=$2
if [ ! -d "$SRC_DIR" ]; then
echo "source directory $SRC_DIR not found, exiting."
exit 1
fi
XCOMPILE=$3
if [ $XCOMPILE -eq 1 ]; then
echo "using default values for cross compiles"
cp $SRC_DIR/include/bits/limits_generic.h $OUT_H
cp $SRC_DIR/src/limits_generic.cc $OUT_C
exit 0;
fi
: ${CXX:="$BUILD_DIR/../../gcc/g++ -B$BUILD_DIR/../../gcc/"}
# We output to a temporary file, so that we don't appear to have
# succeeded unless we actually do.
cat <<EOF > $OUT_H-t
// The template and inlines for the -*- C++ -*- numeric_limits classes.
// Copyright (C) 1999, 2000 Free Software Foundation, Inc.
//
// This file is part of the GNU ISO C++ Library. This library is free
// software; you can redistribute it and/or modify it under the
// terms of the GNU General Public License as published by the
// Free Software Foundation; either version 2, or (at your option)
// any later version.
// This library is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
// You should have received a copy of the GNU General Public License along
// with this library; see the file COPYING. If not, write to the Free
// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307,
// USA.
// As a special exception, you may use this file as part of a free software
// library without restriction. Specifically, if other files instantiate
// templates or use macros or inline functions from this file, or you compile
// this file and link it with other files to produce an executable, this
// file does not by itself cause the resulting executable to be covered by
// the GNU General Public License. This exception does not however
// invalidate any other reasons why the executable file might be covered by
// the GNU General Public License.
// Note: this is not a conforming implementation.
// Written by Gabriel Dos Reis <Gabriel.Dos-Reis@cmla.ens-cachan.fr>
//
// THIS FILE IS AUTOMATICALLY GENERATED. DO NOT EDIT!
//
//
// ISO 14882:1998
// 18.2.1
//
#ifndef _CPP_NUMERIC_LIMITS
#define _CPP_NUMERIC_LIMITS 1
#include <bits/c++config.h>
#include <bits/std_cfloat.h>
namespace std {
enum float_round_style {
round_indeterminate = -1,
round_toward_zero = 0,
round_to_nearest = 1,
round_toward_infinity = 2,
round_toward_neg_infinity = 3
};
enum float_denorm_style {
denorm_indeterminate = -1,
denorm_absent = 0,
denorm_present = 1
};
template<typename _Tp> struct numeric_limits {
static const bool is_specialized = false;
static _Tp min() throw() { return static_cast<_Tp>(0); }
static _Tp max() throw() { return static_cast<_Tp>(0); }
static const int digits = 0;
static const int digits10 = 0;
static const bool is_signed = false;
static const bool is_integer = false;
static const bool is_exact = false;
static const int radix = 0;
static _Tp epsilon() throw() { return static_cast<_Tp>(0); }
static _Tp round_error() throw() { return static_cast<_Tp>(0); }
static const int min_exponent = 0;
static const int min_exponent10 = 0;
static const int max_exponent = 0;
static const int max_exponent10 = 0;
static const bool has_infinity = false;
static const bool has_quiet_NaN = false;
static const bool has_signaling_NaN = false;
static const float_denorm_style has_denorm = denorm_absent;
static const bool has_denorm_loss = false;
static _Tp infinity() throw() { return static_cast<_Tp>(0); }
static _Tp quiet_NaN() throw() { return static_cast<_Tp>(0); }
static _Tp signaling_NaN() throw() { return static_cast<_Tp>(0); }
static _Tp denorm_min() throw() { return static_cast<_Tp>(0); }
static const bool is_iec559 = false;
static const bool is_bounded = false;
static const bool is_modulo = false;
static const bool traps = false;
static const bool tinyness_before = false;
static const float_round_style round_style = round_toward_zero;
};
template<typename _Tp> _Tp __limits_infinity();
template<typename _Tp> _Tp __limits_quiet_NaN();
template<typename _Tp> _Tp __limits_signaling_NaN();
template<typename _Tp> _Tp __limits_denorm_min();
EOF
echo "$CXX -I. $CPPFLAGS -I$BUILD_DIR/include -DHAVE_CONFIG_H \
-o "$BUILD_DIR/src/gen-num-limits" "$SRC_DIR/src/gen-num-limits.cc" \
$LDFLAGS"
{ $CXX -I. $CPPFLAGS -I$BUILD_DIR/include -DHAVE_CONFIG_H \
-o "$BUILD_DIR/src/gen-num-limits" "$SRC_DIR/src/gen-num-limits.cc" \
$LDFLAGS
} || {
echo "gen-num-limits failed to build, exiting."
exit 1
}
"$BUILD_DIR/src/gen-num-limits" >> $OUT_H-t
cat <<EOF >> $OUT_H-t
} // namespace std
#endif // _CPP_NUMERIC_LIMITS
EOF
trait_name=numeric_limits
cat <<EOF > $OUT_C-t
// Static data members of -*- C++ -*- numeric_limits classes
// Copyright (C) 1999, 2000 Free Software Foundation, Inc.
//
// This file is part of the GNU ISO C++ Library. This library is free
// software; you can redistribute it and/or modify it under the
// terms of the GNU General Public License as published by the
// Free Software Foundation; either version 2, or (at your option)
// any later version.
// This library is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
// You should have received a copy of the GNU General Public License along
// with this library; see the file COPYING. If not, write to the Free
// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307,
// USA.
// As a special exception, you may use this file as part of a free software
// library without restriction. Specifically, if other files instantiate
// templates or use macros or inline functions from this file, or you compile
// this file and link it with other files to produce an executable, this
// file does not by itself cause the resulting executable to be covered by
// the GNU General Public License. This exception does not however
// invalidate any other reasons why the executable file might be covered by
// the GNU General Public License.
// Written by Gabriel Dos Reis <Gabriel.Dos-Reis@cmla.ens-cachan.fr>
//
// ISO C++ 14882:1998
// 18.2.1
//
#include <bits/std_limits.h>
namespace std {
EOF
for type_name in bool char 'signed char' 'unsigned char' \
short 'unsigned short' int 'unsigned int' \
long 'unsigned long' 'long long' 'unsigned long long' \
float double 'long double'
do
grep "<$type_name>" $OUT_H-t >/dev/null 2>&1 || continue
cat <<EOF >> $OUT_C-t
const bool $trait_name<$type_name>::is_specialized;
const int $trait_name<$type_name>::digits;
const int $trait_name<$type_name>::digits10;
const bool $trait_name<$type_name>::is_signed;
const bool $trait_name<$type_name>::is_integer;
const bool $trait_name<$type_name>::is_exact;
const int $trait_name<$type_name>::radix;
const int $trait_name<$type_name>::min_exponent;
const int $trait_name<$type_name>::min_exponent10;
const int $trait_name<$type_name>::max_exponent;
const int $trait_name<$type_name>::max_exponent10;
const bool $trait_name<$type_name>::has_infinity;
const bool $trait_name<$type_name>::has_quiet_NaN;
const bool $trait_name<$type_name>::has_signaling_NaN;
const float_denorm_style $trait_name<$type_name>::has_denorm;
const bool $trait_name<$type_name>::has_denorm_loss;
const bool $trait_name<$type_name>::is_iec559;
const bool $trait_name<$type_name>::is_bounded;
const bool $trait_name<$type_name>::is_modulo;
const bool $trait_name<$type_name>::traps;
const bool $trait_name<$type_name>::tinyness_before;
const float_round_style $trait_name<$type_name>::round_style;
EOF
done
cat <<EOF >> $OUT_C-t
} // namespace std
EOF
mv $OUT_C-t $OUT_C
mv $OUT_H-t $OUT_H