GASP patch
Ben Elliston
bje@redhat.com
Thu Feb 7 14:29:00 GMT 2002
More information about the Binutils mailing list
Thu Feb 7 14:29:00 GMT 2002
- Previous message (by thread): Special names tha ld needs to recognize for hppa64-hp-hpux11.X
- Next message (by thread): GASP patch
- Messages sorted by: [ date ] [ thread ] [ subject ] [ author ]
I would like to submit the following patch, which corrects GASP's handling of floating point constants (`flonums' in GAS terminology). Previously, a floating point constant such as 12.12 would be converted from the currently specified base into decimal. Worse, the fractional component of a float would be scanned as a separate integer, leading to strange transformations such as 12.001 => 12.1. This patch clarifies GASP's position on flonums and restricts their intepretation to base 10. Thinking that this is probably newsworthy, I've added a note to the NEWS file. New test case files are MIME attached at the end of this message. Okay to commit? [gas ChangeLog] 2002-02-08 Ben Elliston <bje@redhat.com> * NEWS: Document floating point number handling in gasp. * gasp.c: Include <assert.h> and "xregex.h". (is_flonum): New function. (chew_flownum): Likewise. (change_base): Consume flonums from the input, where possible. * doc/gasp.texi (Constants): Document floating point numbers. [gas/testsuite/ChangeLog] 2002-02-08 Ben Elliston <bje@redhat.com> * gasp/flonums.asm: New test. * gasp/flonums.err: New result. * gasp/flonums.out: Likewise. Index: NEWS =================================================================== RCS file: /cvs/src/src/gas/NEWS,v retrieving revision 1.23 diff -u -r1.23 NEWS --- NEWS 2002/01/31 17:32:59 1.23 +++ NEWS 2002/02/07 22:17:24 @@ -1,4 +1,8 @@ -*- text -*- +GASP now correctly parses floating point numbers. Unless the base is explicitly +specified, they are interpreted as decimal numbers regardless of the currently +specified base. + Support for the OpenRISC 32-bit embedded processor by OpenCores. The ARM assembler now accepts -march=..., -mcpu=... and -mfpu=... for Index: gasp.c =================================================================== RCS file: /cvs/src/src/gas/gasp.c,v retrieving revision 1.14 diff -u -r1.14 gasp.c --- gasp.c 2002/01/17 11:28:49 1.14 +++ gasp.c 2002/02/07 22:17:28 @@ -48,6 +48,7 @@ #include "config.h" #include "bin-bugs.h" +#include <assert.h> #include <stdio.h> #include <string.h> #include <getopt.h> @@ -66,6 +67,7 @@ #include "sb.h" #include "macro.h" #include "asintl.h" +#include "xregex.h" char *program_version = "1.2"; @@ -227,6 +229,8 @@ static void hash_add_to_int_table PARAMS ((hash_table *, sb *, int)); static hash_entry *hash_lookup PARAMS ((hash_table *, sb *)); static void checkconst PARAMS ((int, exp_t *)); +static int is_flonum PARAMS ((int, sb *)); +static int chew_flonum PARAMS ((int, sb *, sb *)); static int sb_strtol PARAMS ((int, sb *, int, int *)); static int level_0 PARAMS ((int, sb *, exp_t *)); static int level_1 PARAMS ((int, sb *, exp_t *)); @@ -522,6 +526,59 @@ } } +/* Chew the flonum from the string starting at idx. Adjust idx to + point to the next character after the flonum. */ + +static int +chew_flonum (idx, string, out) + int idx; + sb *string; + sb *out; +{ + sb buf; + regex_t reg; + regmatch_t match; + + /* Duplicate and null terminate `string'. */ + sb_new (&buf); + sb_add_sb (&buf, string); + sb_add_char (&buf, '\0'); + + assert (regcomp (®, "([0-9]*\\.[0-9]+([eE][+-]?[0-9]+)?)", REG_EXTENDED) == 0); + if (regexec (®, &buf.ptr[idx], 1, &match, 0) != 0) + return idx; + + /* Copy the match to the output. */ + assert (match.rm_eo >= match.rm_so); + sb_add_buffer (out, &buf.ptr[idx], match.rm_eo - match.rm_so); + + sb_kill (&buf); + regfree (®); + idx += match.rm_eo; + return idx; +} + +static int +is_flonum (idx, string) + int idx; + sb *string; +{ + sb buf; + regex_t reg; + int rc; + + /* Duplicate and null terminate `string'. */ + sb_new (&buf); + sb_add_sb (&buf, string); + sb_add_char (&buf, '\0'); + + assert (regcomp (®, "^[0-9]*\\.[0-9]+([eE][+-]?[0-9]+)?", REG_EXTENDED) == 0); + rc = regexec (®, &buf.ptr[idx], 0, NULL, 0); + sb_kill (&buf); + regfree (®); + return (rc == 0); +} + /* Turn the number in string at idx into a number of base, fill in ptr, and return the index of the first character not in the number. */ @@ -1131,6 +1188,10 @@ sb_add_char (out, in->ptr[idx]); idx++; } + } + else if (is_flonum (idx, in)) + { + idx = chew_flonum (idx, in, out); } else if (ISDIGIT (in->ptr[idx])) { Index: doc/gasp.texi =================================================================== RCS file: /cvs/src/src/gas/doc/gasp.texi,v retrieving revision 1.3 diff -u -r1.3 gasp.texi --- gasp.texi 2001/03/08 23:24:26 1.3 +++ gasp.texi 2002/02/07 22:17:31 @@ -943,6 +943,11 @@ base 2, @samp{Q} for base 8, @samp{D} for base 10, and @samp{H} for base 16. (You can write this character in lower case if you prefer.) +You can write floating point constants using the same syntax recognised +by GAS @ref{Flonums,,Flonums,as,The GNU Assembler.}. A constraint is +that these constants will be interpreted as decimal values irrespective +of the currently selected base. + @c FIXME! What are rules for recognizing number in deflt base? Whatever @c is left over after parsing other things?? -------------- next part -------------- A non-text attachment was scrubbed... Name: flonums.asm Type: application/octet-stream Size: 287 bytes Desc: not available URL: <https://sourceware.org/pipermail/binutils/attachments/20020207/f2ddb26d/attachment.obj> -------------- next part -------------- A non-text attachment was scrubbed... Name: flonums.out Type: application/octet-stream Size: 573 bytes Desc: not available URL: <https://sourceware.org/pipermail/binutils/attachments/20020207/f2ddb26d/attachment-0001.obj>
- Previous message (by thread): Special names tha ld needs to recognize for hppa64-hp-hpux11.X
- Next message (by thread): GASP patch
- Messages sorted by: [ date ] [ thread ] [ subject ] [ author ]
More information about the Binutils mailing list