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