forked from Imagelibrary/binutils-gdb
2007-10-25 Wu Zhou <woodzltc@cn.ibm.com>
Thiago Jung Bauermann <bauerman@br.ibm.com> * c-exp.y (YYSTYPE): Add typed_val_decfloat for decimal floating point in YYSTYPE union. (DECFLOAT) Add token and expression element handling code. (parse_number): Parse DFP constants, which end with suffix 'df', 'dd' or 'dl'. Return DECFLOAT. * eval.c (evaluate_subexp_standard): Call value_from_decfloat to handle OP_DECFLOAT. * expression.h (enum exp_opcode): Add an opcode (OP_DECFLOAT) for DFP constants. (union exp_element): Add decfloatconst to represent DFP elements, which is 16 bytes by default. * parse.c (write_exp_elt_decfloatcst): New function to write a decimal float const into the expression. (operator_length_standard): Set operator length for OP_DECFLOAT to 4. * parser-defs.h (write_exp_elt_decfloatcst): Prototype. * valarith.c (value_neg): Add code to handle the negation operation of DFP values. * value.c (value_from_decfloat): New function to get the value from a decimal floating point. * value.h (value_from_decfloat): Prototype.
This commit is contained in:
47
gdb/c-exp.y
47
gdb/c-exp.y
@@ -52,6 +52,7 @@ Boston, MA 02110-1301, USA. */
|
||||
#include "charset.h"
|
||||
#include "block.h"
|
||||
#include "cp-support.h"
|
||||
#include "dfp.h"
|
||||
|
||||
/* Remap normal yacc parser interface names (yyparse, yylex, yyerror, etc),
|
||||
as well as gratuitiously global symbol names, so we can have multiple
|
||||
@@ -130,6 +131,10 @@ void yyerror (char *);
|
||||
DOUBLEST dval;
|
||||
struct type *type;
|
||||
} typed_val_float;
|
||||
struct {
|
||||
gdb_byte val[16];
|
||||
struct type *type;
|
||||
} typed_val_decfloat;
|
||||
struct symbol *sym;
|
||||
struct type *tval;
|
||||
struct stoken sval;
|
||||
@@ -162,6 +167,7 @@ static int parse_number (char *, int, int, YYSTYPE *);
|
||||
|
||||
%token <typed_val_int> INT
|
||||
%token <typed_val_float> FLOAT
|
||||
%token <typed_val_decfloat> DECFLOAT
|
||||
|
||||
/* Both NAME and TYPENAME tokens represent symbols in the input,
|
||||
and both convey their data as strings.
|
||||
@@ -496,6 +502,13 @@ exp : FLOAT
|
||||
write_exp_elt_opcode (OP_DOUBLE); }
|
||||
;
|
||||
|
||||
exp : DECFLOAT
|
||||
{ write_exp_elt_opcode (OP_DECFLOAT);
|
||||
write_exp_elt_type ($1.type);
|
||||
write_exp_elt_decfloatcst ($1.val);
|
||||
write_exp_elt_opcode (OP_DECFLOAT); }
|
||||
;
|
||||
|
||||
exp : variable
|
||||
;
|
||||
|
||||
@@ -1077,6 +1090,40 @@ parse_number (p, len, parsed_float, putithere)
|
||||
char saved_char = p[len];
|
||||
|
||||
p[len] = 0; /* null-terminate the token */
|
||||
|
||||
/* If it ends at "df", "dd" or "dl", take it as type of decimal floating
|
||||
point. Return DECFLOAT. */
|
||||
|
||||
if (p[len - 2] == 'd' && p[len - 1] == 'f')
|
||||
{
|
||||
p[len - 2] = '\0';
|
||||
putithere->typed_val_decfloat.type
|
||||
= builtin_type (current_gdbarch)->builtin_decfloat;
|
||||
decimal_from_string (putithere->typed_val_decfloat.val, 4, p);
|
||||
p[len] = saved_char;
|
||||
return (DECFLOAT);
|
||||
}
|
||||
|
||||
if (p[len - 2] == 'd' && p[len - 1] == 'd')
|
||||
{
|
||||
p[len - 2] = '\0';
|
||||
putithere->typed_val_decfloat.type
|
||||
= builtin_type (current_gdbarch)->builtin_decdouble;
|
||||
decimal_from_string (putithere->typed_val_decfloat.val, 8, p);
|
||||
p[len] = saved_char;
|
||||
return (DECFLOAT);
|
||||
}
|
||||
|
||||
if (p[len - 2] == 'd' && p[len - 1] == 'l')
|
||||
{
|
||||
p[len - 2] = '\0';
|
||||
putithere->typed_val_decfloat.type
|
||||
= builtin_type (current_gdbarch)->builtin_declong;
|
||||
decimal_from_string (putithere->typed_val_decfloat.val, 16, p);
|
||||
p[len] = saved_char;
|
||||
return (DECFLOAT);
|
||||
}
|
||||
|
||||
num = sscanf (p, DOUBLEST_SCAN_FORMAT "%s",
|
||||
&putithere->typed_val_float.dval, s);
|
||||
p[len] = saved_char; /* restore the input stream */
|
||||
|
||||
Reference in New Issue
Block a user