public inbox for gcc-patches@gcc.gnu.org
 help / color / mirror / Atom feed
From: Segher Boessenkool <segher@kernel.crashing.org>
To: Bill Schmidt <wschmidt@linux.ibm.com>
Cc: gcc-patches@gcc.gnu.org, dje.gcc@gmail.com
Subject: Re: [PATCH 06/57] rs6000: Add helper functions for parsing
Date: Fri, 21 May 2021 18:43:30 -0500	[thread overview]
Message-ID: <20210521234330.GG10366@gate.crashing.org> (raw)
In-Reply-To: <784f02c0-f452-c7db-c9a9-94f04cbf1bd2@linux.ibm.com>

Hi!

On Fri, May 21, 2021 at 03:56:09PM -0500, Bill Schmidt wrote:
> On 5/21/21 1:51 PM, Segher Boessenkool wrote:
> >>+/* Exit codes for the shell.  */
> >>+enum exit_codes {
> >>+  EC_INTERR
> >>+};
> >Please define this with some specified value (so append " = 1" or such),
> >or just write "exit(1);" etc. directly.  As it is, a compiler is free to
> >do "exit(0);" for this error value!  Not good.
> >
> >All these exit codes are externally visible, so please just make them
> >explicit.  There isn't much point in having symbolic names for it
> >either, because users will see the raw numbers (reported by their
> >shell), instead.
> >
> >Most generator programs allow to use fatal() etc., this is a much richer
> >environment, no need to reinvent stuff?  Include "errors.h" and link
> >with error.o, and that is all you need AFAIK.
> 
> I'll dump the exit codes, which were an early idea that didn't prove 
> useful in the end.  exit (1) will suffice...
> 
> However, I'd like to keep my approach to diagnostics.  I wrote it this 
> way so that I would have a centralized place to produce the file, line, 
> and column information, which was really helpful while debugging these 
> large input files.  Putting wrappers around the errors.c functions seems 
> at least as messy.

Yes, wrappers is a no-go.  But you could just have added the features
you need to the generic code?  Was there a technical reason not to do
that?  It sounds useful in many places, not just here.

> >>+static int
> >>+match_integer ()
> >>+{
> >>+  int startpos = pos;
> >>+  if (linebuf[pos] == '-')
> >>+    safe_inc_pos ();
> >>+
> >>+  int lastpos = pos - 1;
> >>+  while (isdigit (linebuf[lastpos + 1]))
> >>+    if (++lastpos >= LINELEN - 1)
> >>+      {
> >>+	(*diag) ("line length overrun in match_integer.\n");
> >>+	exit (EC_INTERR);
> >>+      }
> >>+
> >>+  if (lastpos < pos)
> >>+    return MININT;
> >>+
> >>+  pos = lastpos + 1;
> >>+  char *buf = (char *) malloc (lastpos - startpos + 2);
> >>+  memcpy (buf, &linebuf[startpos], lastpos - startpos + 1);
> >>+  buf[lastpos - startpos + 1] = '\0';
> >>+
> >>+  int x;
> >>+  sscanf (buf, "%d", &x);
> >>+  return x;
> >>+}
> >Can't you just use strtol?
> I could, but (a) it's more overhead because of tracking the base, and 

How so?  If you give base 0 it handles all of decimal, hexadecimal, and
octal (with the usual 0x and 0 prefixes).

> (b) I then have to calculate lastpos afterwards.  /shrug

It can stores it in where its second arg points to!

===
  char *endp;
  const char *str = where_the_number_starts_or_some_whitespace_before_it;

  errno = 0;
  long n = strtol (str, &endp, 0);
  if (!*str || errno)
    whoops (...);
===

... and now endp points to the first char that is not part of the
number.  It's one of the cases where errno is *helpful* :-)

> >>+  int lastpos = pos - 1;
> >>+  while (linebuf[lastpos + 1] != ']')
> >>+    if (++lastpos >= LINELEN - 1)
> >Please don't use side effects in "if" conditions.
> 
> Really?  Is it actually better to write
> 
>   while (linebuf[lastpos + a] != ']')
>     {
>       ++lastpos;
>       if (lastpos >= LINELEN - 1)
>         ...
>     }

  for (int lastpost = pos - 1; linebuf[lastpos + 1] != ']'; lastpos++)
    {
      if (lastpos >= LINELEN - 1)
        ...

      ...
    }

> Frankly I don't see it...and I don't see anything in the GNU or GCC 
> coding conventions about this.  I'd rather keep what I have.

The most used side effect in conditionals is assignment.  This saves a
few keystrokes, and maybe a whole line in the code, but it makes the
code a lot harder to comprehend.

In your code it does not matter so very much, since you exit if there
is an error anyway, but it makes it a lot harder to verify what the code
does in all cases, and to check that that is what is wanted.

> >>+      {
> >>+	(*diag) ("line length overrun.\n");
> >>+	exit (EC_INTERR);
> >>+      }
> >I don't think you shoulod check for line length overrun in any of these
> >functions, btw?  Just check where you read them in, and that is plenty?
> 
> Yes -- I think if I check in advance_line for a line that doesn't end in 
> \n, that will make a lot of those things superfluous.
> 
> I've been a little reluctant to do that, since eventually I want to 
> support escape-newline processing to avoid long input lines, but I can 
> still work around that when I get to it.

Aha, that explains.  Yeah you should be able to check the length again
when concatenating two lines, and that is all you need?

Checking for errors repeatedly is so error-prone :-(


Segher

  reply	other threads:[~2021-05-21 23:44 UTC|newest]

Thread overview: 99+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2021-04-27 15:32 [PATCH 00/57] Replace the Power target-specific built-in machinery Bill Schmidt
2021-04-27 15:32 ` [PATCH 01/57] Allow targets to specify build dependencies for out_object_file Bill Schmidt
2021-04-27 15:57   ` Jakub Jelinek
2021-04-27 16:14     ` Bill Schmidt
2021-04-27 16:47       ` Jakub Jelinek
2021-04-27 17:44         ` Bill Schmidt
2021-04-27 15:32 ` [PATCH 02/57] Support scanning of build-time GC roots in gengtype Bill Schmidt
2021-05-11 16:01   ` Bill Schmidt
2021-05-20 22:24     ` Segher Boessenkool
2021-06-04 19:03       ` Bill Schmidt
2021-06-07 10:39         ` Richard Sandiford
2021-06-07 12:35           ` Bill Schmidt
2021-06-07 13:36             ` Richard Biener
2021-06-07 15:38               ` Bill Schmidt
2021-06-07 17:45                 ` Richard Biener
2021-06-07 17:48                   ` Bill Schmidt
2021-06-08 20:45                     ` Bill Schmidt
2021-06-09 10:53                       ` Richard Biener
2021-06-09 10:54                         ` Richard Biener
2021-06-09 12:53                           ` Bill Schmidt
2021-05-20 22:19   ` Segher Boessenkool
2021-04-27 15:32 ` [PATCH 03/57] rs6000: Initial create of rs6000-gen-builtins.c Bill Schmidt
2021-05-20 22:32   ` Segher Boessenkool
2021-04-27 15:32 ` [PATCH 04/57] rs6000: Add initial input files Bill Schmidt
2021-05-20 22:46   ` Segher Boessenkool
2021-05-21 12:58     ` Bill Schmidt
2021-04-27 15:32 ` [PATCH 05/57] rs6000: Add file support and functions for diagnostic support Bill Schmidt
2021-05-20 23:03   ` Segher Boessenkool
2021-05-21 13:06     ` Bill Schmidt
2021-04-27 15:32 ` [PATCH 06/57] rs6000: Add helper functions for parsing Bill Schmidt
2021-05-21 18:51   ` Segher Boessenkool
2021-05-21 20:56     ` Bill Schmidt
2021-05-21 23:43       ` Segher Boessenkool [this message]
2021-06-01 15:50         ` Bill Schmidt
2021-05-23 22:37       ` Bernhard Reutner-Fischer
2021-05-24 21:35         ` Segher Boessenkool
2021-04-27 15:32 ` [PATCH 07/57] rs6000: Add functions for matching types, part 1 of 3 Bill Schmidt
2021-05-21 20:50   ` Segher Boessenkool
2021-04-27 15:32 ` [PATCH 08/57] rs6000: Add functions for matching types, part 2 " Bill Schmidt
2021-05-21 21:36   ` Segher Boessenkool
2021-04-27 15:32 ` [PATCH 09/57] rs6000: Add functions for matching types, part 3 " Bill Schmidt
2021-05-21 21:46   ` Segher Boessenkool
2021-04-27 15:32 ` [PATCH 10/57] rs6000: Red-black tree implementation for balanced tree search Bill Schmidt
2021-05-21 22:29   ` Segher Boessenkool
2021-04-27 15:32 ` [PATCH 11/57] rs6000: Main function with stubs for parsing and output Bill Schmidt
2021-04-27 15:32 ` [PATCH 12/57] rs6000: Parsing built-in input file, part 1 of 3 Bill Schmidt
2021-04-27 15:32 ` [PATCH 13/57] rs6000: Parsing built-in input file, part 2 " Bill Schmidt
2021-04-27 15:32 ` [PATCH 14/57] rs6000: Parsing built-in input file, part 3 " Bill Schmidt
2021-04-27 15:32 ` [PATCH 15/57] rs6000: Parsing of overload input file Bill Schmidt
2021-04-27 15:32 ` [PATCH 16/57] rs6000: Build and store function type identifiers Bill Schmidt
2021-04-27 15:32 ` [PATCH 17/57] rs6000: Write output to the builtin definition include file Bill Schmidt
2021-04-27 15:32 ` [PATCH 18/57] rs6000: Write output to the builtins header file Bill Schmidt
2021-04-27 15:32 ` [PATCH 19/57] rs6000: Write output to the builtins init file, part 1 of 3 Bill Schmidt
2021-04-27 15:32 ` [PATCH 20/57] rs6000: Write output to the builtins init file, part 2 " Bill Schmidt
2021-04-27 15:32 ` [PATCH 21/57] rs6000: Write output to the builtins init file, part 3 " Bill Schmidt
2021-04-27 15:32 ` [PATCH 22/57] rs6000: Write static initializations for built-in table Bill Schmidt
2021-04-27 15:32 ` [PATCH 23/57] rs6000: Write static initializations for overload tables Bill Schmidt
2021-04-27 15:32 ` [PATCH 24/57] rs6000: Incorporate new builtins code into the build machinery Bill Schmidt
2021-04-27 15:33 ` [PATCH 25/57] rs6000: Add gengtype handling to " Bill Schmidt
2021-04-27 15:33 ` [PATCH 26/57] rs6000: Add the rest of the [altivec] stanza to the builtins file Bill Schmidt
2021-04-27 15:33 ` [PATCH 27/57] rs6000: Add VSX builtins Bill Schmidt
2021-04-27 15:33 ` [PATCH 28/57] rs6000: Add available-everywhere and ancient builtins Bill Schmidt
2021-04-27 15:33 ` [PATCH 29/57] rs6000: Add power7 and power7-64 builtins Bill Schmidt
2021-04-27 15:33 ` [PATCH 30/57] rs6000: Add power8-vector builtins Bill Schmidt
2021-04-27 15:33 ` [PATCH 31/57] rs6000: Add Power9 builtins Bill Schmidt
2021-04-27 15:33 ` [PATCH 32/57] rs6000: Add more type nodes to support builtin processing Bill Schmidt
2021-04-27 15:33 ` [PATCH 33/57] rs6000: Add Power10 builtins Bill Schmidt
2021-04-27 15:33 ` [PATCH 34/57] rs6000: Add MMA builtins Bill Schmidt
2021-04-27 15:33 ` [PATCH 35/57] rs6000: Add miscellaneous builtins Bill Schmidt
2021-04-27 15:33 ` [PATCH 36/57] rs6000: Add Cell builtins Bill Schmidt
2021-04-27 15:33 ` [PATCH 37/57] rs6000: Add remaining overloads Bill Schmidt
2021-04-27 15:33 ` [PATCH 38/57] rs6000: Execute the automatic built-in initialization code Bill Schmidt
2021-04-27 15:33 ` [PATCH 39/57] rs6000: Darwin builtin support Bill Schmidt
2021-04-30 20:05   ` Iain Sandoe
2021-04-27 15:33 ` [PATCH 40/57] rs6000: Add sanity to V2DI_type_node definitions Bill Schmidt
2021-04-27 15:33 ` [PATCH 41/57] rs6000: Always initialize vector_pair and vector_quad nodes Bill Schmidt
2021-04-27 15:33 ` [PATCH 42/57] rs6000: Handle overloads during program parsing Bill Schmidt
2021-04-27 15:33 ` [PATCH 43/57] rs6000: Handle gimple folding of target built-ins Bill Schmidt
2021-04-27 15:33 ` [PATCH 44/57] rs6000: Support for vectorizing built-in functions Bill Schmidt
2021-04-27 15:33 ` [PATCH 45/57] rs6000: Builtin expansion, part 1 Bill Schmidt
2021-04-27 15:33 ` [PATCH 46/57] rs6000: Builtin expansion, part 2 Bill Schmidt
2021-04-27 15:33 ` [PATCH 47/57] rs6000: Builtin expansion, part 3 Bill Schmidt
2021-04-27 15:33 ` [PATCH 48/57] rs6000: Builtin expansion, part 4 Bill Schmidt
2021-04-27 15:33 ` [PATCH 49/57] rs6000: Builtin expansion, part 5 Bill Schmidt
2021-04-27 15:33 ` [PATCH 50/57] rs6000: Builtin expansion, part 6 Bill Schmidt
2021-04-27 15:33 ` [PATCH 51/57] rs6000: Update rs6000_builtin_decl Bill Schmidt
2021-04-27 15:33 ` [PATCH 52/57] rs6000: Miscellaneous uses of rs6000_builtin_decls_x Bill Schmidt
2021-04-27 15:33 ` [PATCH 53/57] rs6000: Debug support Bill Schmidt
2021-04-27 15:33 ` [PATCH 54/57] rs6000: Update altivec.h for automated interfaces Bill Schmidt
2021-04-27 15:33 ` [PATCH 55/57] rs6000: Test case adjustments Bill Schmidt
2021-04-27 15:33 ` [PATCH 56/57] rs6000: Enable the new builtin support Bill Schmidt
2021-04-27 15:33 ` [PATCH 57/57] rs6000: Adjust to late-breaking change Bill Schmidt
2021-04-30 12:38 ` [PATCH "58/57"] rs6000: Avoid problems with undefined decimal float types Bill Schmidt
2021-04-30 12:42 ` [PATCH "59/57"] rs6000: Fix builtins that should have been available everywhere Bill Schmidt
2021-04-30 18:55 ` [PATCH "60/57"] rs6000: Fix AltiVec builtin marked as VSX Bill Schmidt
2021-05-11 15:57 ` [PATCH 00/57] Replace the Power target-specific built-in machinery Bill Schmidt
2021-05-11 23:20   ` Segher Boessenkool
2021-05-20 21:57 ` Segher Boessenkool
2021-05-21 12:53   ` Bill Schmidt

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20210521234330.GG10366@gate.crashing.org \
    --to=segher@kernel.crashing.org \
    --cc=dje.gcc@gmail.com \
    --cc=gcc-patches@gcc.gnu.org \
    --cc=wschmidt@linux.ibm.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).