summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPhilip Withnall <philip@tecnocode.co.uk>2019-04-11 16:51:14 +0000
committerPhilip Withnall <philip@tecnocode.co.uk>2019-04-11 16:51:14 +0000
commit7c584260fcb765c301f70426950f9a9e331eb6bd (patch)
tree18df6aa8a8d2ad069e7350c90efd7c299c72fab7
parent65b6aac4c2b654bf499caa3ba91dc6a53e4082bb (diff)
parentde5761db487d4d01c9fdc28e7e1542656d140285 (diff)
downloadglib-7c584260fcb765c301f70426950f9a9e331eb6bd.tar.gz
Merge branch 'gnulib.msvc.fixes' into 'master'
Fix gnulib build on older Visual Studio builds See merge request GNOME/glib!757
-rw-r--r--glib/gnulib/README8
-rw-r--r--glib/gnulib/frexpl.c2
-rw-r--r--glib/gnulib/gl_cv_func_frexpl_works/meson.build12
-rw-r--r--glib/gnulib/gl_cv_func_ldexpl_works/meson.build12
-rw-r--r--glib/gnulib/isinf.c30
-rw-r--r--glib/gnulib/isnanf-nolibm.h40
-rw-r--r--glib/gnulib/isnanf.c20
-rw-r--r--glib/gnulib/meson.build37
-rw-r--r--glib/gnulib/signbitd.c64
-rw-r--r--glib/gnulib/signbitf.c64
-rw-r--r--glib/gnulib/signbitl.c64
11 files changed, 347 insertions, 6 deletions
diff --git a/glib/gnulib/README b/glib/gnulib/README
index 78a264c57..2fd920e9b 100644
--- a/glib/gnulib/README
+++ b/glib/gnulib/README
@@ -44,7 +44,8 @@ To update:
* Run gnulib-tool --lgpl=2 --import --lib=libgnu --source-base=lib \
--m4-base=m4 --doc-base=doc --tests-base=tests --aux-dir=. \
--no-conditional-dependencies --no-libtool --macro-prefix=gl \
- isnand-nolibm isnanl-nolibm printf-frexpl vasnprintf
+ isnand-nolibm isnanf-nolibm isnanl-nolibm printf-frexpl \
+ signbit vasnprintf
* Then pick out the files that are already in glib/gnulib subdirectory
(the rest of the files are not needed):
@@ -56,6 +57,8 @@ gnulib_math.h.in (rename from math.in.h)
isnan.c
isnand.c
isnand-nolibm.h
+isnanf.c
+isnanf-nolibm.h
isnanl.c
isnanl-nolibm.h
printf-args.c
@@ -66,6 +69,9 @@ printf-frexpl.c
printf-frexpl.h
printf-parse.c
printf-parse.h
+signbitd.c
+signbitf.c
+signbitl.c
vasnprintf.c
vasnprintf.h
verify.h
diff --git a/glib/gnulib/frexpl.c b/glib/gnulib/frexpl.c
index 5736dc848..cd6a81c77 100644
--- a/glib/gnulib/frexpl.c
+++ b/glib/gnulib/frexpl.c
@@ -14,6 +14,8 @@ long double rpl_frexpl (long double x, int *expptr)
return x;
else if (isinf (x))
return x;
+#ifndef _MSC_VER
#undef frexpl
+#endif
return frexpl (x, expptr);
}
diff --git a/glib/gnulib/gl_cv_func_frexpl_works/meson.build b/glib/gnulib/gl_cv_func_frexpl_works/meson.build
index c37b741db..303ec63d7 100644
--- a/glib/gnulib/gl_cv_func_frexpl_works/meson.build
+++ b/glib/gnulib/gl_cv_func_frexpl_works/meson.build
@@ -29,7 +29,11 @@ extern
#ifdef __cplusplus
"C"
#endif
+
+#if !defined (_MSC_VER) || defined (TEST_FREXPL_DECL)
long double frexpl (long double, int *);
+#endif
+
int main()
{
int result = 0;
@@ -128,3 +132,11 @@ else
gl_cv_func_frexpl_broken_beyond_repair = false
endif
endif
+
+frexpl_test_decl = '''
+#define TEST_FREXPL_DECL 1
+''' + frexpl_test
+
+build_result = cc.compiles(frexpl_test_decl,
+ name : 'frexpl prototype can be re-listed')
+gl_cv_func_frexpl_decl = build_result
diff --git a/glib/gnulib/gl_cv_func_ldexpl_works/meson.build b/glib/gnulib/gl_cv_func_ldexpl_works/meson.build
index dc83675ed..ae176cb8e 100644
--- a/glib/gnulib/gl_cv_func_ldexpl_works/meson.build
+++ b/glib/gnulib/gl_cv_func_ldexpl_works/meson.build
@@ -9,7 +9,11 @@ extern
#ifdef __cplusplus
"C"
#endif
+
+#if !defined (_MSC_VER) || defined (TEST_LDEXPL_DECL)
long double ldexpl (long double, int);
+#endif
+
int main()
{
int result = 0;
@@ -43,3 +47,11 @@ else
gl_cv_func_ldexpl_works = true
endif
endif
+
+ldexpl_test_decl = '''
+#define TEST_LDEXPL_DECL 1
+''' + ldexpl_test
+
+build_result = cc.compiles(ldexpl_test_decl,
+ name : 'ldexpl prototype can be re-listed')
+gl_cv_func_ldexpl_decl = build_result
diff --git a/glib/gnulib/isinf.c b/glib/gnulib/isinf.c
new file mode 100644
index 000000000..e7b44b98d
--- /dev/null
+++ b/glib/gnulib/isinf.c
@@ -0,0 +1,30 @@
+#ifndef _MSC_VER
+#error "This implementation is currently supported for Visual Studio only!"
+#endif
+
+#include "config.h"
+#include <gnulib_math.h>
+#include <float.h>
+#include <math.h>
+
+int
+gl_isinff (float x)
+{
+#if defined (_WIN64) && (defined (_M_X64) || defined (_M_AMD64))
+ return !_finitef (x);
+#else
+ return !_finite (x);
+#endif
+}
+
+int
+gl_isinfd (double x)
+{
+ return !_finite (x);
+}
+
+int
+gl_isinfl (long double x)
+{
+ return gl_isinfd (x);
+} \ No newline at end of file
diff --git a/glib/gnulib/isnanf-nolibm.h b/glib/gnulib/isnanf-nolibm.h
new file mode 100644
index 000000000..47c52f7f3
--- /dev/null
+++ b/glib/gnulib/isnanf-nolibm.h
@@ -0,0 +1,40 @@
+/* Test for NaN that does not need libm.
+ Copyright (C) 2007-2019 Free Software Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU Lesser General PublicLicense as published by
+ the Free Software Foundation; either version 2.1 of the License, or
+ (at your option) any later version.
+
+ This program 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 Lesser General PublicLicense for more details.
+
+ You should have received a copy of the GNU Lesser General PublicLicense
+ along with this program. If not, see <https://www.gnu.org/licenses/>. */
+
+#if HAVE_ISNANF_IN_LIBC
+/* Get declaration of isnan macro or (older) isnanf function. */
+# include <math.h>
+# if __GNUC__ >= 4
+ /* GCC 4.0 and newer provides three built-ins for isnan. */
+# undef isnanf
+# define isnanf(x) __builtin_isnanf ((float)(x))
+# elif defined isnan
+# undef isnanf
+# define isnanf(x) isnan ((float)(x))
+# else
+ /* Get declaration of isnanf(), if not declared in <math.h>. */
+# if defined __sgi
+ /* We can't include <ieeefp.h>, because it conflicts with our definition of
+ isnand. Therefore declare isnanf separately. */
+extern int isnanf (float x);
+# endif
+# endif
+#else
+/* Test whether X is a NaN. */
+# undef isnanf
+# define isnanf rpl_isnanf
+extern int isnanf (float x);
+#endif
diff --git a/glib/gnulib/isnanf.c b/glib/gnulib/isnanf.c
new file mode 100644
index 000000000..8651733a1
--- /dev/null
+++ b/glib/gnulib/isnanf.c
@@ -0,0 +1,20 @@
+/* Test for NaN that does not need libm.
+ Copyright (C) 2007, 2009-2019 Free Software Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU Lesser General PublicLicense as published by
+ the Free Software Foundation; either version 2.1 of the License, or
+ (at your option) any later version.
+
+ This program 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 Lesser General PublicLicense for more details.
+
+ You should have received a copy of the GNU Lesser General PublicLicense
+ along with this program. If not, see <https://www.gnu.org/licenses/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>, 2007. */
+
+#define USE_FLOAT
+#include "isnan.c"
diff --git a/glib/gnulib/meson.build b/glib/gnulib/meson.build
index 60499d9b7..af697f29c 100644
--- a/glib/gnulib/meson.build
+++ b/glib/gnulib/meson.build
@@ -51,10 +51,6 @@ unneeded_funcs = [
'ILOGB',
'ILOGBF',
'ILOGBL',
- 'ISFINITE',
- 'ISINF',
- 'ISNAN',
- 'ISNANF',
'LDEXPF',
'LOG',
'LOG10',
@@ -84,7 +80,6 @@ unneeded_funcs = [
'ROUND',
'ROUNDF',
'ROUNDL',
- 'SIGNBIT',
'SINF',
'SINHF',
'SINL',
@@ -110,9 +105,14 @@ endforeach
needed_funcs = [
'FREXP',
'FREXPL',
+ 'ISFINITE',
+ 'ISINF',
+ 'ISNAN',
'ISNAND',
+ 'ISNANF',
'ISNANL',
'LDEXPL',
+ 'SIGNBIT',
]
foreach f : needed_funcs
@@ -282,6 +282,7 @@ endif
math_h_config.set ('REPLACE_FREXP', gl_cv_func_frexp_works ? 0 : 1)
math_h_config.set ('REPLACE_FREXPL', gl_cv_func_frexpl_works ? 0 : 1)
+math_h_config.set ('HAVE_DECL_FREXPL', gl_cv_func_frexpl_decl ? 0 : 1)
math_h_config.set ('REPLACE_ITOLD', 0)
math_h_config.set ('REPLACE_HUGE_VAL', 0)
@@ -293,6 +294,30 @@ else
gl_cv_func_ldexpl_works = false
endif
math_h_config.set ('REPLACE_LDEXPL', gl_cv_func_ldexpl_works ? 0 : 1)
+math_h_config.set ('HAVE_DECL_LDEXPL', gl_cv_func_ldexpl_decl ? 0 : 1)
+
+inf_tmpl = '''#include <math.h>
+ double x;
+ int main () {return @0@ (x);}
+ '''
+
+other_needed_math_sources = []
+# Some compilers may not have isfinite, isinf available
+foreach f: ['isfinite', 'isinf', 'isnan', 'isnanf', 'signbit']
+ links = cc.links (inf_tmpl.format('@0@'.format(f)),
+ dependencies : [libm])
+ math_h_config.set ('HAVE_@0@'.format(f.to_upper()), links ? 1 : 0)
+ math_h_config.set ('HAVE_@0@_IN_LIBC'.format(f.to_upper()), links ? 1 : 0)
+ math_h_config.set ('REPLACE_@0@'.format(f.to_upper()), links ? 0 : 1)
+ set_variable ('have_@0@'.format(f), links)
+ if not links
+ if f == 'signbit'
+ other_needed_math_sources += [ 'signbitd.c', 'signbitf.c', 'signbitl.c' ]
+ elif f != 'isfinite' and f != 'isnan'
+ other_needed_math_sources += [ '@0@.c'.format(f) ]
+ endif
+ endif
+endforeach
math_h = configure_file (input: 'gnulib_math.h.in',
output: 'gnulib_math.h',
@@ -307,6 +332,8 @@ if not gl_cv_func_frexpl_works
gnulib_sources += ['frexpl.c']
endif
+gnulib_sources += other_needed_math_sources
+
gnulib_lib = static_library('gnulib', gnulib_sources,
dependencies : [libm],
include_directories : [configinc, glibinc, include_directories ('.')],
diff --git a/glib/gnulib/signbitd.c b/glib/gnulib/signbitd.c
new file mode 100644
index 000000000..dfc1c9092
--- /dev/null
+++ b/glib/gnulib/signbitd.c
@@ -0,0 +1,64 @@
+/* signbit() macro: Determine the sign bit of a floating-point number.
+ Copyright (C) 2007-2019 Free Software Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU Lesser General PublicLicense as published by
+ the Free Software Foundation; either version 2.1 of the License, or
+ (at your option) any later version.
+
+ This program 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 Lesser General PublicLicense for more details.
+
+ You should have received a copy of the GNU Lesser General PublicLicense
+ along with this program. If not, see <https://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include <gnulib_math.h>
+
+#include <string.h>
+#include "isnand-nolibm.h"
+#include "float+.h"
+
+#ifdef gl_signbitd_OPTIMIZED_MACRO
+# undef gl_signbitd
+#endif
+
+int
+gl_signbitd (double arg)
+{
+#if defined DBL_SIGNBIT_WORD && defined DBL_SIGNBIT_BIT
+ /* The use of a union to extract the bits of the representation of a
+ 'long double' is safe in practice, despite of the "aliasing rules" of
+ C99, because the GCC docs say
+ "Even with '-fstrict-aliasing', type-punning is allowed, provided the
+ memory is accessed through the union type."
+ and similarly for other compilers. */
+# define NWORDS \
+ ((sizeof (double) + sizeof (unsigned int) - 1) / sizeof (unsigned int))
+ union { double value; unsigned int word[NWORDS]; } m;
+ m.value = arg;
+ return (m.word[DBL_SIGNBIT_WORD] >> DBL_SIGNBIT_BIT) & 1;
+#elif HAVE_COPYSIGN_IN_LIBC
+ return copysign (1.0, arg) < 0;
+#else
+ /* This does not do the right thing for NaN, but this is irrelevant for
+ most use cases. */
+ if (isnand (arg))
+ return 0;
+ if (arg < 0.0)
+ return 1;
+ else if (arg == 0.0)
+ {
+ /* Distinguish 0.0 and -0.0. */
+ static double plus_zero = 0.0;
+ double arg_mem = arg;
+ return (memcmp (&plus_zero, &arg_mem, SIZEOF_DBL) != 0);
+ }
+ else
+ return 0;
+#endif
+}
diff --git a/glib/gnulib/signbitf.c b/glib/gnulib/signbitf.c
new file mode 100644
index 000000000..573d6d975
--- /dev/null
+++ b/glib/gnulib/signbitf.c
@@ -0,0 +1,64 @@
+/* signbit() macro: Determine the sign bit of a floating-point number.
+ Copyright (C) 2007, 2009-2019 Free Software Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU Lesser General PublicLicense as published by
+ the Free Software Foundation; either version 2.1 of the License, or
+ (at your option) any later version.
+
+ This program 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 Lesser General PublicLicense for more details.
+
+ You should have received a copy of the GNU Lesser General PublicLicense
+ along with this program. If not, see <https://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include <gnulib_math.h>
+
+#include <string.h>
+#include "isnanf-nolibm.h"
+#include "float+.h"
+
+#ifdef gl_signbitf_OPTIMIZED_MACRO
+# undef gl_signbitf
+#endif
+
+int
+gl_signbitf (float arg)
+{
+#if defined FLT_SIGNBIT_WORD && defined FLT_SIGNBIT_BIT
+ /* The use of a union to extract the bits of the representation of a
+ 'long double' is safe in practice, despite of the "aliasing rules" of
+ C99, because the GCC docs say
+ "Even with '-fstrict-aliasing', type-punning is allowed, provided the
+ memory is accessed through the union type."
+ and similarly for other compilers. */
+# define NWORDS \
+ ((sizeof (float) + sizeof (unsigned int) - 1) / sizeof (unsigned int))
+ union { float value; unsigned int word[NWORDS]; } m;
+ m.value = arg;
+ return (m.word[FLT_SIGNBIT_WORD] >> FLT_SIGNBIT_BIT) & 1;
+#elif HAVE_COPYSIGNF_IN_LIBC
+ return copysignf (1.0f, arg) < 0;
+#else
+ /* This does not do the right thing for NaN, but this is irrelevant for
+ most use cases. */
+ if (isnanf (arg))
+ return 0;
+ if (arg < 0.0f)
+ return 1;
+ else if (arg == 0.0f)
+ {
+ /* Distinguish 0.0f and -0.0f. */
+ static float plus_zero = 0.0f;
+ float arg_mem = arg;
+ return (memcmp (&plus_zero, &arg_mem, SIZEOF_FLT) != 0);
+ }
+ else
+ return 0;
+#endif
+}
diff --git a/glib/gnulib/signbitl.c b/glib/gnulib/signbitl.c
new file mode 100644
index 000000000..11b3e66c9
--- /dev/null
+++ b/glib/gnulib/signbitl.c
@@ -0,0 +1,64 @@
+/* signbit() macro: Determine the sign bit of a floating-point number.
+ Copyright (C) 2007, 2009-2019 Free Software Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU Lesser General PublicLicense as published by
+ the Free Software Foundation; either version 2.1 of the License, or
+ (at your option) any later version.
+
+ This program 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 Lesser General PublicLicense for more details.
+
+ You should have received a copy of the GNU Lesser General PublicLicense
+ along with this program. If not, see <https://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include <gnulib_math.h>
+
+#include <string.h>
+#include "isnanl-nolibm.h"
+#include "float+.h"
+
+#ifdef gl_signbitl_OPTIMIZED_MACRO
+# undef gl_signbitl
+#endif
+
+int
+gl_signbitl (long double arg)
+{
+#if defined LDBL_SIGNBIT_WORD && defined LDBL_SIGNBIT_BIT
+ /* The use of a union to extract the bits of the representation of a
+ 'long double' is safe in practice, despite of the "aliasing rules" of
+ C99, because the GCC docs say
+ "Even with '-fstrict-aliasing', type-punning is allowed, provided the
+ memory is accessed through the union type."
+ and similarly for other compilers. */
+# define NWORDS \
+ ((sizeof (long double) + sizeof (unsigned int) - 1) / sizeof (unsigned int))
+ union { long double value; unsigned int word[NWORDS]; } m;
+ m.value = arg;
+ return (m.word[LDBL_SIGNBIT_WORD] >> LDBL_SIGNBIT_BIT) & 1;
+#elif HAVE_COPYSIGNL_IN_LIBC
+ return copysignl (1.0L, arg) < 0;
+#else
+ /* This does not do the right thing for NaN, but this is irrelevant for
+ most use cases. */
+ if (isnanl (arg))
+ return 0;
+ if (arg < 0.0L)
+ return 1;
+ else if (arg == 0.0L)
+ {
+ /* Distinguish 0.0L and -0.0L. */
+ static long double plus_zero = 0.0L;
+ long double arg_mem = arg;
+ return (memcmp (&plus_zero, &arg_mem, SIZEOF_LDBL) != 0);
+ }
+ else
+ return 0;
+#endif
+}