X-Git-Url: http://drtracing.org/?a=blobdiff_plain;f=gdb%2Fdoublest.h;h=4b9d6bcbc916589526172ff2338dc900c0698de8;hb=edd079d9f6ca2f9ad21322b742269aec5de61190;hp=058b4a34e68a307a3547c52482380f29da6873bb;hpb=8da61cc40ac287bc30919c8648c0f7addc515008;p=deliverable%2Fbinutils-gdb.git diff --git a/gdb/doublest.h b/gdb/doublest.h index 058b4a34e6..4b9d6bcbc9 100644 --- a/gdb/doublest.h +++ b/gdb/doublest.h @@ -1,14 +1,12 @@ /* Floating point definitions for GDB. - Copyright (C) 1986, 1988, 1989, 1990, 1991, 1992, 1993, 1994, 1995, 1996, - 1997, 1998, 1999, 2000, 2001, 2003, 2005, 2006, 2007 - Free Software Foundation, Inc. + Copyright (C) 1986-2017 Free Software Foundation, Inc. This file is part of GDB. This program 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 of the License, or + the Free Software Foundation; either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, @@ -17,9 +15,7 @@ GNU General Public License for more details. You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 51 Franklin Street, Fifth Floor, - Boston, MA 02110-1301, USA. */ + along with this program. If not, see . */ #ifndef DOUBLEST_H #define DOUBLEST_H @@ -27,18 +23,6 @@ struct type; struct floatformat; -/* Setup definitions for host and target floating point formats. We need to - consider the format for `float', `double', and `long double' for both target - and host. We need to do this so that we know what kind of conversions need - to be done when converting target numbers to and from the hosts DOUBLEST - data type. */ - -/* This is used to indicate that we don't know the format of the floating point - number. Typically, this is useful for native ports, where the actual format - is irrelevant, since no conversions will be taking place. */ - -#include "floatformat.h" /* For struct floatformat */ - /* Use `long double' if the host compiler supports it. (Note that this is not necessarily any longer than `double'. On SunOS/gcc, it's the same as double.) This is necessary because GDB internally converts all floating @@ -51,12 +35,12 @@ struct floatformat; #if (defined HAVE_LONG_DOUBLE && defined PRINTF_HAS_LONG_DOUBLE \ && defined SCANF_HAS_LONG_DOUBLE) typedef long double DOUBLEST; -# define DOUBLEST_PRINT_FORMAT "%Lg" -# define DOUBLEST_SCAN_FORMAT "%Lg" +# define DOUBLEST_PRINT_FORMAT "Lg" +# define DOUBLEST_SCAN_FORMAT "Lg" #else typedef double DOUBLEST; -# define DOUBLEST_PRINT_FORMAT "%g" -# define DOUBLEST_SCAN_FORMAT "%lg" +# define DOUBLEST_PRINT_FORMAT "g" +# define DOUBLEST_SCAN_FORMAT "lg" /* If we can't scan or print long double, we don't want to use it anywhere. */ # undef HAVE_LONG_DOUBLE @@ -64,6 +48,17 @@ typedef double DOUBLEST; # undef SCANF_HAS_LONG_DOUBLE #endif +/* Different kinds of floatformat numbers recognized by + floatformat_classify. To avoid portability issues, we use local + values instead of the C99 macros (FP_NAN et cetera). */ +enum float_kind { + float_nan, + float_infinite, + float_zero, + float_normal, + float_subnormal +}; + extern void floatformat_to_doublest (const struct floatformat *, const void *in, DOUBLEST *out); extern void floatformat_from_doublest (const struct floatformat *, @@ -71,26 +66,20 @@ extern void floatformat_from_doublest (const struct floatformat *, extern int floatformat_is_negative (const struct floatformat *, const bfd_byte *); -extern int floatformat_is_nan (const struct floatformat *, const bfd_byte *); +extern enum float_kind floatformat_classify (const struct floatformat *, + const bfd_byte *); extern const char *floatformat_mantissa (const struct floatformat *, const bfd_byte *); -/* These functions have been replaced by extract_typed_floating and - store_typed_floating. - - Most calls are passing in TYPE_LENGTH (TYPE) so can be changed to - just pass the TYPE. The remainder pass in the length of a - register, those calls should instead pass in the floating point - type that corresponds to that length. */ - -extern DOUBLEST deprecated_extract_floating (const void *addr, int len); -extern void deprecated_store_floating (void *addr, int len, DOUBLEST val); +extern std::string floatformat_to_string (const struct floatformat *fmt, + const gdb_byte *in, + const char *format = nullptr); +extern bool floatformat_from_string (const struct floatformat *fmt, + gdb_byte *out, const std::string &in); -/* Given TYPE, return its floatformat. TYPE_FLOATFORMAT() may return - NULL. type_floatformat() detects that and returns a floatformat - based on the type size when FLOATFORMAT is NULL. */ +/* Return the floatformat's total size in host bytes. */ -const struct floatformat *floatformat_from_type (const struct type *type); +extern size_t floatformat_totalsize_bytes (const struct floatformat *fmt); extern DOUBLEST extract_typed_floating (const void *addr, const struct type *type);