From 50637b26f85dc3e59b616f1b01ca8885cf98f0b4 Mon Sep 17 00:00:00 2001 From: Ulrich Weigand Date: Mon, 6 Nov 2017 15:57:31 +0100 Subject: Target FP: Add conversion routines to target-float.{c,h} This patch adds the following conversion routines: - target_float_to_longest - target_float_from_longest - target_float_from_ulongest - target_float_convert which call the equivalent decimal_ routines to handle decimal FP, and call helper routines that currently still go via DOUBLEST to handle binary FP. The target_float_convert routine not only handles BFP<->BFP and DFP<->DFP conversions, but also BFP<->DFP, which are implemented by converting to a string and back. These helpers are used in particular to implement conversion from and to FP in value_cast, without going through DOUBLEST there. In order to implement this for the FP<-integer case, the pack_long / pack_unsigned_long routines are extended to support floating-point values as output (thereby allowing use of value_from_[u]longest with a floating-point target type). This latter change also allows simplification of value_one. gdb/ChangeLog: 2017-11-06 Ulrich Weigand * target-float.c (floatformat_to_longest): New function. (floatformat_from_longest, floatformat_from_ulongest): Likewise. (floatformat_convert): Likewise. (target_float_to_longest): Likewise. (target_float_from_longest, target_float_from_ulongest): Likewise. (target_float_convert): Likewise. * target-float.h (target_float_to_longest): Add prototype. (target_float_from_longest, target_float_from_ulongest): Likewise. (target_float_convert): Likewise. * value.c (unpack_long): Use target_float_to_longest. (pack_long): Allow FP types. Use target_float_from_longest. (pack_unsigned_long): Likewise using target_float_from_ulongest. * valops.c: Include "target-float.h". Do not include "dfp.h". (value_cast): Handle conversions to FP using target_float_convert, value_from_ulongest, and value_from_longest. (value_one): Use value_from_longest for FP types as well. --- gdb/target-float.h | 12 ++++++++++++ 1 file changed, 12 insertions(+) (limited to 'gdb/target-float.h') diff --git a/gdb/target-float.h b/gdb/target-float.h index 317e98e..9ea1812 100644 --- a/gdb/target-float.h +++ b/gdb/target-float.h @@ -32,4 +32,16 @@ extern bool target_float_from_string (gdb_byte *addr, const struct type *type, const std::string &string); +extern LONGEST target_float_to_longest (const gdb_byte *addr, + const struct type *type); +extern void target_float_from_longest (gdb_byte *addr, + const struct type *type, + LONGEST val); +extern void target_float_from_ulongest (gdb_byte *addr, + const struct type *type, + ULONGEST val); +extern void target_float_convert (const gdb_byte *from, + const struct type *from_type, + gdb_byte *to, const struct type *to_type); + #endif -- cgit v1.1