+2017-11-06 Ulrich Weigand <uweigand@de.ibm.com>
+
+ * doublest.c: Do not include "gdbtypes.h".
+ (extract_typed_floating): Remove.
+ (store_typed_floating): Remove.
+ (convert_typed_floating): Remove.
+ * doublest.h (struct type): Remove.
+ (DOUBLEST_PRINT_FORMAT): Remove.
+ (DOUBLEST_SCAN_FORMAT): Remove.
+ (extract_typed_floating): Remove.
+ (store_typed_floating): Remove.
+ (convert_typed_floating): Remove.
+
+ * dfp.c (decimal_from_doublest): Remove.
+ (decimal_to_doublest): Remove.
+ * dfp.h: Do not include "doublest.h".
+ (decimal_from_doublest): Remove.
+ (decimal_to_doublest): Remove.
+
+ * value.c: Do not include "doublest.h" and "dfp.h".
+ (value_as_double): Remove.
+ (unpack_double): Remove.
+ (value_from_double): Remove.
+ (value_from_decfloat): Remove.
+ * value.h: Do not include "doublest.h".
+ (value_as_double): Remove.
+ (unpack_double): Remove.
+ (value_from_double): Remove.
+ (value_from_decfloat): Remove.
+
2017-11-06 Ulrich Weigand <uweigand@de.ibm.com>
* i386-tdep.c: Include "target-float.h". Do not include "doublest.h".
return strtoll (str.c_str (), NULL, 10);
}
-/* Converts a value of a float type to a decimal float of
- specified LEN bytes.
-
- This is an ugly way to do the conversion, but libdecnumber does
- not offer a direct way to do it. */
-void
-decimal_from_doublest (DOUBLEST from,
- gdb_byte *to, int len, enum bfd_endian byte_order)
-{
- std::string str = string_printf ("%.30" DOUBLEST_PRINT_FORMAT, from);
- decimal_from_string (to, len, byte_order, str);
-}
-
-/* Converts a decimal float of LEN bytes to a double value. */
-DOUBLEST
-decimal_to_doublest (const gdb_byte *from, int len, enum bfd_endian byte_order)
-{
- /* This is an ugly way to do the conversion, but libdecnumber does
- not offer a direct way to do it. */
- std::string str = decimal_to_string (from, len, byte_order);
- return strtod (str.c_str (), NULL);
-}
-
/* Perform operation OP with operands X and Y with sizes LEN_X and LEN_Y
and byte orders BYTE_ORDER_X and BYTE_ORDER_Y, and store value in
RESULT with size LEN_RESULT and byte order BYTE_ORDER_RESULT. */
#ifndef DFP_H
#define DFP_H
-#include "doublest.h" /* For DOUBLEST. */
#include "expression.h" /* For enum exp_opcode. */
extern std::string decimal_to_string (const gdb_byte *, int, enum bfd_endian,
int len, enum bfd_endian byte_order);
extern LONGEST decimal_to_longest (const gdb_byte *from, int len,
enum bfd_endian byte_order);
-extern void decimal_from_doublest (DOUBLEST from, gdb_byte *to,
- int len, enum bfd_endian byte_order);
-extern DOUBLEST decimal_to_doublest (const gdb_byte *from, int len,
- enum bfd_endian byte_order);
extern void decimal_binop (enum exp_opcode,
const gdb_byte *, int, enum bfd_endian,
const gdb_byte *, int, enum bfd_endian,
#include "defs.h"
#include "doublest.h"
#include "floatformat.h"
-#include "gdbtypes.h"
#include <math.h> /* ldexp */
#include <algorithm>
floatformat_from_doublest (fmt, &doub, out);
return true;
}
-\f
-/* Extract a floating-point number of type TYPE from a target-order
- byte-stream at ADDR. Returns the value as type DOUBLEST. */
-
-DOUBLEST
-extract_typed_floating (const void *addr, const struct type *type)
-{
- const struct floatformat *fmt = floatformat_from_type (type);
- DOUBLEST retval;
-
- floatformat_to_doublest (fmt, addr, &retval);
- return retval;
-}
-
-/* Store VAL as a floating-point number of type TYPE to a target-order
- byte-stream at ADDR. */
-
-void
-store_typed_floating (void *addr, const struct type *type, DOUBLEST val)
-{
- const struct floatformat *fmt = floatformat_from_type (type);
-
- /* FIXME: kettenis/2001-10-28: It is debatable whether we should
- zero out any remaining bytes in the target buffer when TYPE is
- longer than the actual underlying floating-point format. Perhaps
- we should store a fixed bitpattern in those remaining bytes,
- instead of zero, or perhaps we shouldn't touch those remaining
- bytes at all.
-
- NOTE: cagney/2001-10-28: With the way things currently work, it
- isn't a good idea to leave the end bits undefined. This is
- because GDB writes out the entire sizeof(<floating>) bits of the
- floating-point type even though the value might only be stored
- in, and the target processor may only refer to, the first N <
- TYPE_LENGTH (type) bits. If the end of the buffer wasn't
- initialized, GDB would write undefined data to the target. An
- errant program, refering to that undefined data, would then
- become non-deterministic.
-
- See also the function convert_typed_floating below. */
- memset (addr, 0, TYPE_LENGTH (type));
-
- floatformat_from_doublest (fmt, &val, addr);
-}
-
-/* Convert a floating-point number of type FROM_TYPE from a
- target-order byte-stream at FROM to a floating-point number of type
- TO_TYPE, and store it to a target-order byte-stream at TO. */
-
-void
-convert_typed_floating (const void *from, const struct type *from_type,
- void *to, const struct type *to_type)
-{
- const struct floatformat *from_fmt = floatformat_from_type (from_type);
- const struct floatformat *to_fmt = floatformat_from_type (to_type);
-
- if (from_fmt == NULL || to_fmt == NULL)
- {
- /* If we don't know the floating-point format of FROM_TYPE or
- TO_TYPE, there's not much we can do. We might make the
- assumption that if the length of FROM_TYPE and TO_TYPE match,
- their floating-point format would match too, but that
- assumption might be wrong on targets that support
- floating-point types that only differ in endianness for
- example. So we warn instead, and zero out the target buffer. */
- warning (_("Can't convert floating-point number to desired type."));
- memset (to, 0, TYPE_LENGTH (to_type));
- }
- else if (from_fmt == to_fmt)
- {
- /* We're in business. The floating-point format of FROM_TYPE
- and TO_TYPE match. However, even though the floating-point
- format matches, the length of the type might still be
- different. Make sure we don't overrun any buffers. See
- comment in store_typed_floating for a discussion about
- zeroing out remaining bytes in the target buffer. */
- memset (to, 0, TYPE_LENGTH (to_type));
- memcpy (to, from, std::min (TYPE_LENGTH (from_type),
- TYPE_LENGTH (to_type)));
- }
- else
- {
- /* The floating-point types don't match. The best we can do
- (apart from simulating the target FPU) is converting to the
- widest floating-point type supported by the host, and then
- again to the desired type. */
- DOUBLEST d;
-
- floatformat_to_doublest (from_fmt, from, &d);
- floatformat_from_doublest (to_fmt, &d, to);
- }
-}
#ifndef DOUBLEST_H
#define DOUBLEST_H
-struct type;
struct floatformat;
/* Use `long double' if the host compiler supports it. (Note that this is not
#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"
#else
typedef double DOUBLEST;
-# 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
extern size_t floatformat_totalsize_bytes (const struct floatformat *fmt);
-extern DOUBLEST extract_typed_floating (const void *addr,
- const struct type *type);
-extern void store_typed_floating (void *addr, const struct type *type,
- DOUBLEST val);
-extern void convert_typed_floating (const void *from,
- const struct type *from_type,
- void *to, const struct type *to_type);
-
#endif
#include "target.h"
#include "language.h"
#include "demangle.h"
-#include "doublest.h"
#include "regcache.h"
#include "block.h"
-#include "dfp.h"
#include "target-float.h"
#include "objfiles.h"
#include "valprint.h"
return unpack_long (value_type (val), value_contents (val));
}
-DOUBLEST
-value_as_double (struct value *val)
-{
- DOUBLEST foo;
- int inv;
-
- foo = unpack_double (value_type (val), value_contents (val), &inv);
- if (inv)
- error (_("Invalid floating value found in program."));
- return foo;
-}
-
/* Extract a value as a C pointer. Does not deallocate the value.
Note that val's type may not actually be a pointer; value_as_long
handles all the cases. */
return 0; /* Placate lint. */
}
-/* Return a double value from the specified type and address.
- INVP points to an int which is set to 0 for valid value,
- 1 for invalid value (bad float format). In either case,
- the returned double is OK to use. Argument is in target
- format, result is in host format. */
-
-DOUBLEST
-unpack_double (struct type *type, const gdb_byte *valaddr, int *invp)
-{
- enum bfd_endian byte_order = gdbarch_byte_order (get_type_arch (type));
- enum type_code code;
- int len;
- int nosign;
-
- *invp = 0; /* Assume valid. */
- type = check_typedef (type);
- code = TYPE_CODE (type);
- len = TYPE_LENGTH (type);
- nosign = TYPE_UNSIGNED (type);
- if (code == TYPE_CODE_FLT)
- {
- if (!target_float_is_valid (valaddr, type))
- {
- *invp = 1;
- return 0.0;
- }
-
- return extract_typed_floating (valaddr, type);
- }
- else if (code == TYPE_CODE_DECFLOAT)
- return decimal_to_doublest (valaddr, len, byte_order);
- else if (nosign)
- {
- /* Unsigned -- be sure we compensate for signed LONGEST. */
- return (ULONGEST) unpack_long (type, valaddr);
- }
- else
- {
- /* Signed -- we are OK with unpack_long. */
- return unpack_long (type, valaddr);
- }
-}
-
/* Unpack raw data (copied from debugee, target byte order) at VALADDR
as a CORE_ADDR, assuming the raw data is described by type TYPE.
We don't assume any alignment for the raw data. Return value is in
return result;
}
-struct value *
-value_from_double (struct type *type, DOUBLEST num)
-{
- struct value *val = allocate_value (type);
- struct type *base_type = check_typedef (type);
- enum type_code code = TYPE_CODE (base_type);
-
- if (code == TYPE_CODE_FLT)
- {
- store_typed_floating (value_contents_raw (val), base_type, num);
- }
- else
- error (_("Unexpected type encountered for floating constant."));
-
- return val;
-}
-
-struct value *
-value_from_decfloat (struct type *type, const gdb_byte *dec)
-{
- struct value *val = allocate_value (type);
-
- memcpy (value_contents_raw (val), dec, TYPE_LENGTH (type));
- return val;
-}
-
/* Extract a value from the history file. Input will be of the form
$digits or $$digits. See block comment above 'write_dollar_variable'
for details. */
#if !defined (VALUE_H)
#define VALUE_H 1
-#include "doublest.h"
#include "frame.h" /* For struct frame_id. */
struct block;
extern bool is_floating_value (struct value *val);
extern LONGEST value_as_long (struct value *val);
-extern DOUBLEST value_as_double (struct value *val);
extern CORE_ADDR value_as_address (struct value *val);
extern LONGEST unpack_long (struct type *type, const gdb_byte *valaddr);
-extern DOUBLEST unpack_double (struct type *type, const gdb_byte *valaddr,
- int *invp);
extern CORE_ADDR unpack_pointer (struct type *type, const gdb_byte *valaddr);
extern LONGEST unpack_field_as_long (struct type *type,
extern struct value *value_from_longest (struct type *type, LONGEST num);
extern struct value *value_from_ulongest (struct type *type, ULONGEST num);
extern struct value *value_from_pointer (struct type *type, CORE_ADDR addr);
-extern struct value *value_from_double (struct type *type, DOUBLEST num);
-extern struct value *value_from_decfloat (struct type *type,
- const gdb_byte *decbytes);
extern struct value *value_from_history_ref (const char *, const char **);
extern struct value *value_from_component (struct value *, struct type *,
LONGEST);