aboutsummaryrefslogtreecommitdiff
path: root/gas/read.c
diff options
context:
space:
mode:
authorJan Beulich <jbeulich@suse.com>2021-08-11 08:34:18 +0200
committerJan Beulich <jbeulich@suse.com>2021-08-11 08:34:18 +0200
commitbcd17d4f518dcd9ffa8b2217f3e215df331bfb1b (patch)
tree72635b13727200fefa81f0e6a89a8cd992915444 /gas/read.c
parentde133cf98cdf4cb3d1461ef10c83ce72df7399c7 (diff)
downloadgdb-bcd17d4f518dcd9ffa8b2217f3e215df331bfb1b.zip
gdb-bcd17d4f518dcd9ffa8b2217f3e215df331bfb1b.tar.gz
gdb-bcd17d4f518dcd9ffa8b2217f3e215df331bfb1b.tar.bz2
gas: make 2nd argument of .dcb.* consistently optional
Unlike the forms consuming/producing integer data, the floating point ones so far required the 2nd argument to be present, contrary to documentation. To avoid code duplication, split float_length() out of hex_float() (taking the opportunity to adjust error message wording).
Diffstat (limited to 'gas/read.c')
-rw-r--r--gas/read.c130
1 files changed, 75 insertions, 55 deletions
diff --git a/gas/read.c b/gas/read.c
index 7333a2e..cd82c83 100644
--- a/gas/read.c
+++ b/gas/read.c
@@ -3639,6 +3639,68 @@ s_nops (int ignore ATTRIBUTE_UNUSED)
*p = val.X_add_number;
}
+/* Obtain the size of a floating point number, given a type. */
+
+static int
+float_length (int float_type, int *pad_p)
+{
+ int length, pad = 0;
+
+ switch (float_type)
+ {
+ case 'b':
+ case 'B':
+ case 'h':
+ case 'H':
+ length = 2;
+ break;
+
+ case 'f':
+ case 'F':
+ case 's':
+ case 'S':
+ length = 4;
+ break;
+
+ case 'd':
+ case 'D':
+ case 'r':
+ case 'R':
+ length = 8;
+ break;
+
+ case 'x':
+ case 'X':
+#ifdef X_PRECISION
+ length = X_PRECISION * sizeof (LITTLENUM_TYPE);
+ pad = X_PRECISION_PAD * sizeof (LITTLENUM_TYPE);
+ if (!length)
+#endif
+ length = 12;
+ break;
+
+ case 'p':
+ case 'P':
+#ifdef P_PRECISION
+ length = P_PRECISION * sizeof (LITTLENUM_TYPE);
+ pad = P_PRECISION_PAD * sizeof (LITTLENUM_TYPE);
+ if (!length)
+#endif
+ length = 12;
+ break;
+
+ default:
+ as_bad (_("unknown floating type '%c'"), float_type);
+ length = -1;
+ break;
+ }
+
+ if (pad_p)
+ *pad_p = pad;
+
+ return length;
+}
+
static int
parse_one_float (int float_type, char temp[MAXIMUM_NUMBER_OF_CHARS_FOR_FLOAT])
{
@@ -3709,16 +3771,19 @@ s_float_space (int float_type)
SKIP_WHITESPACE ();
if (*input_line_pointer != ',')
{
- as_bad (_("missing value"));
- ignore_rest_of_line ();
- if (flag_mri)
- mri_comment_end (stop, stopc);
- return;
+ int pad;
+
+ flen = float_length (float_type, &pad);
+ if (flen >= 0)
+ memset (temp, 0, flen += pad);
}
+ else
+ {
+ ++input_line_pointer;
- ++input_line_pointer;
+ flen = parse_one_float (float_type, temp);
+ }
- flen = parse_one_float (float_type, temp);
if (flen < 0)
{
if (flag_mri)
@@ -4847,56 +4912,11 @@ parse_repeat_cons (expressionS *exp, unsigned int nbytes)
static int
hex_float (int float_type, char *bytes)
{
- int length, pad = 0;
+ int pad, length = float_length (float_type, &pad);
int i;
- switch (float_type)
- {
- case 'b':
- case 'B':
- case 'h':
- case 'H':
- length = 2;
- break;
-
- case 'f':
- case 'F':
- case 's':
- case 'S':
- length = 4;
- break;
-
- case 'd':
- case 'D':
- case 'r':
- case 'R':
- length = 8;
- break;
-
- case 'x':
- case 'X':
-#ifdef X_PRECISION
- length = X_PRECISION * sizeof (LITTLENUM_TYPE);
- pad = X_PRECISION_PAD * sizeof (LITTLENUM_TYPE);
- if (!length)
-#endif
- length = 12;
- break;
-
- case 'p':
- case 'P':
-#ifdef P_PRECISION
- length = P_PRECISION * sizeof (LITTLENUM_TYPE);
- pad = P_PRECISION_PAD * sizeof (LITTLENUM_TYPE);
- if (!length)
-#endif
- length = 12;
- break;
-
- default:
- as_bad (_("unknown floating type type '%c'"), float_type);
- return -1;
- }
+ if (length < 0)
+ return length;
/* It would be nice if we could go through expression to parse the
hex constant, but if we get a bignum it's a pain to sort it into