version.c revision 1.1.1.3
1/*
2 * Output various information about GMP and MPFR.
3 */
4
5/*
6Copyright 2010-2016 Free Software Foundation, Inc.
7Contributed by the AriC and Caramba projects, INRIA.
8
9This file is part of the GNU MPFR Library.
10
11The GNU MPFR Library is free software; you can redistribute it and/or modify
12it under the terms of the GNU Lesser General Public License as published by
13the Free Software Foundation; either version 3 of the License, or (at your
14option) any later version.
15
16The GNU MPFR Library is distributed in the hope that it will be useful, but
17WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
18or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public
19License for more details.
20
21You should have received a copy of the GNU Lesser General Public License
22along with the GNU MPFR Library; see the file COPYING.LESSER.  If not, see
23http://www.gnu.org/licenses/ or write to the Free Software Foundation, Inc.,
2451 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA.
25*/
26
27#include <stdio.h>
28#include <limits.h>
29#include <gmp.h>
30#include <mpfr.h>
31
32/* The following failure can occur if GMP has been rebuilt with
33 * a different ABI, e.g.
34 *   1. GMP built with ABI=mode32.
35 *   2. MPFR built against this GMP version.
36 *   3. GMP rebuilt with ABI=32.
37 */
38static void failure_test (void)
39{
40  mpfr_t x;
41
42  mpfr_init2 (x, 128);
43  mpfr_set_str (x, "17", 0, MPFR_RNDN);
44  if (mpfr_cmp_ui (x, 17) != 0)
45    printf ("\nFailure in mpfr_set_str! Probably an unmatched ABI!\n");
46  mpfr_clear (x);
47}
48
49static void patches (void)
50{
51  const char *p = mpfr_get_patches ();
52  printf ("MPFR patches: %s\n", p[0] ? p : "[none]");
53}
54
55#define STRINGIZE(S) #S
56#define MAKE_STR(S) STRINGIZE(S)
57
58#define SIGNED_STR(V) ((V) < 0 ? "signed" : "unsigned")
59#define SIGNED(I) SIGNED_STR((I) - (I) - 1)
60
61int main (void)
62{
63  unsigned long c;
64  mp_limb_t t[4];
65  int i;
66
67  /* Casts are for C++ compilers. */
68  for (i = 0; i < (int) (sizeof (t) / sizeof (mp_limb_t)); i++)
69    t[i] = (mp_limb_t) -1;
70
71  /**************** Information about the C implementation ****************/
72
73  /* This is useful, as this can affect the behavior of MPFR. */
74
75#define COMP "Compiler: "
76#ifdef __INTEL_COMPILER
77# ifdef __VERSION__
78#  define ICCV " [" __VERSION__ "]"
79# else
80#  define ICCV ""
81# endif
82  printf (COMP "ICC %d.%d.%d" ICCV "\n", __INTEL_COMPILER / 100,
83          __INTEL_COMPILER % 100, __INTEL_COMPILER_UPDATE);
84#elif (defined(__GNUC__) || defined(__clang__)) && defined(__VERSION__)
85# ifdef __clang__
86#  define COMP2 COMP
87# else
88#  define COMP2 COMP "GCC "
89# endif
90  printf (COMP2 "%s\n", __VERSION__);
91#endif
92
93#if defined(__STDC__) || defined(__STDC_VERSION__)
94  printf ("C/C++: __STDC__ = "
95#if defined(__STDC__)
96          MAKE_STR(__STDC__)
97#else
98          "undef"
99#endif
100          ", __STDC_VERSION__ = "
101#if defined(__STDC_VERSION__)
102          MAKE_STR(__STDC_VERSION__)
103#else
104          "undef"
105#endif
106#if defined(__cplusplus)
107          ", C++"
108#endif
109          "\n");
110#endif
111
112#if defined(__GNUC__)
113  printf ("GNU compatibility: __GNUC__ = " MAKE_STR(__GNUC__)
114          ", __GNUC_MINOR__ = "
115#if defined(__GNUC_MINOR__)
116          MAKE_STR(__GNUC_MINOR__)
117#else
118          "undef"
119#endif
120          "\n");
121#endif
122
123#if defined(__ICC) || defined(__INTEL_COMPILER)
124  printf ("Intel compiler: __ICC = "
125#if defined(__ICC)
126          MAKE_STR(__ICC)
127#else
128          "undef"
129#endif
130          ", __INTEL_COMPILER = "
131#if defined(__INTEL_COMPILER)
132          MAKE_STR(__INTEL_COMPILER)
133#else
134          "undef"
135#endif
136          "\n");
137#endif
138
139#if defined(_WIN32) || defined(_MSC_VER)
140  printf ("MS Windows: _WIN32 = "
141#if defined(_WIN32)
142          MAKE_STR(_WIN32)
143#else
144          "undef"
145#endif
146          ", _MSC_VER = "
147#if defined(_MSC_VER)
148          MAKE_STR(_MSC_VER)
149#else
150          "undef"
151#endif
152          "\n");
153#endif
154
155#if defined(__GLIBC__)
156  printf ("GNU C library: __GLIBC__ = " MAKE_STR(__GLIBC__)
157          ", __GLIBC_MINOR__ = "
158#if defined(__GLIBC_MINOR__)
159          MAKE_STR(__GLIBC_MINOR__)
160#else
161          "undef"
162#endif
163          "\n");
164#endif
165
166  printf ("\n");
167
168  /************************************************************************/
169
170#if defined(__MPIR_VERSION)
171  printf ("MPIR ....  Library: %-12s  Header: %d.%d.%d\n",
172          mpir_version, __MPIR_VERSION, __MPIR_VERSION_MINOR,
173          __MPIR_VERSION_PATCHLEVEL);
174#else
175  printf ("GMP .....  Library: %-12s  Header: %d.%d.%d\n",
176          gmp_version, __GNU_MP_VERSION, __GNU_MP_VERSION_MINOR,
177          __GNU_MP_VERSION_PATCHLEVEL);
178#endif
179
180  printf ("MPFR ....  Library: %-12s  Header: %s (based on %d.%d.%d)\n",
181          mpfr_get_version (), MPFR_VERSION_STRING, MPFR_VERSION_MAJOR,
182          MPFR_VERSION_MINOR, MPFR_VERSION_PATCHLEVEL);
183
184  printf ("MPFR features: TLS = %s, decimal = %s",
185          mpfr_buildopt_tls_p () ? "yes" : "no",
186          mpfr_buildopt_decimal_p () ? "yes" : "no");
187#if MPFR_VERSION_MAJOR > 3 || MPFR_VERSION_MINOR >= 1
188  printf (", GMP internals = %s\nMPFR tuning: %s",
189          mpfr_buildopt_gmpinternals_p () ? "yes" : "no",
190          mpfr_buildopt_tune_case ());
191#endif  /* 3.1 */
192  printf ("\n");
193
194  patches ();
195
196  printf ("\n");
197#ifdef __GMP_CC
198  printf ("__GMP_CC = \"%s\"\n", __GMP_CC);
199#endif
200#ifdef __GMP_CFLAGS
201  printf ("__GMP_CFLAGS = \"%s\"\n", __GMP_CFLAGS);
202#endif
203  printf ("GMP_LIMB_BITS     = %d\n", (int) GMP_LIMB_BITS);
204  printf ("GMP_NAIL_BITS     = %d\n", (int) GMP_NAIL_BITS);
205  printf ("GMP_NUMB_BITS     = %d\n", (int) GMP_NUMB_BITS);
206  printf ("mp_bits_per_limb  = %d\n", (int) mp_bits_per_limb);
207  printf ("sizeof(mp_limb_t) = %d\n", (int) sizeof(mp_limb_t));
208  if (mp_bits_per_limb != GMP_LIMB_BITS)
209    printf ("Warning! mp_bits_per_limb != GMP_LIMB_BITS\n");
210  if (GMP_LIMB_BITS != sizeof(mp_limb_t) * CHAR_BIT)
211    printf ("Warning! GMP_LIMB_BITS != sizeof(mp_limb_t) * CHAR_BIT\n");
212
213  c = mpn_popcount (t, 1);
214  printf ("The GMP library expects %lu bits in a mp_limb_t.\n", c);
215  if (c != GMP_LIMB_BITS)
216    printf ("Warning! This is different from GMP_LIMB_BITS!\n"
217            "Different ABI caused by a GMP library upgrade?\n");
218
219  printf ("\n");
220  printf ("sizeof(mpfr_prec_t) = %d (%s type)\n", (int) sizeof(mpfr_prec_t),
221          SIGNED_STR((mpfr_prec_t) -1));
222  printf ("sizeof(mpfr_exp_t)  = %d (%s type)\n", (int) sizeof(mpfr_exp_t),
223          SIGNED_STR((mpfr_exp_t) -1));
224#ifdef _MPFR_PREC_FORMAT
225  printf ("_MPFR_PREC_FORMAT = %d\n", (int) _MPFR_PREC_FORMAT);
226#endif
227  /* Note: "long" is sufficient for all current _MPFR_PREC_FORMAT values
228     (1, 2, 3). Thus we do not need to depend on ISO C99 or later. */
229  printf ("MPFR_PREC_MIN = %ld (%s)\n", (long) MPFR_PREC_MIN,
230          SIGNED (MPFR_PREC_MIN));
231  printf ("MPFR_PREC_MAX = %ld (%s)\n", (long) MPFR_PREC_MAX,
232          SIGNED (MPFR_PREC_MAX));
233#ifdef _MPFR_EXP_FORMAT
234  printf ("_MPFR_EXP_FORMAT = %d\n", (int) _MPFR_EXP_FORMAT);
235#endif
236  printf ("sizeof(mpfr_t) = %d\n", (int) sizeof(mpfr_t));
237  printf ("sizeof(mpfr_ptr) = %d\n", (int) sizeof(mpfr_ptr));
238  failure_test ();
239
240  return 0;
241}
242