]> git.ipfire.org Git - thirdparty/binutils-gdb.git/commitdiff
gas: fold is_end_of_line[] into lex_type[]
authorJan Beulich <jbeulich@suse.com>
Fri, 7 Mar 2025 07:28:59 +0000 (08:28 +0100)
committerJan Beulich <jbeulich@suse.com>
Fri, 7 Mar 2025 07:28:59 +0000 (08:28 +0100)
... by way of introducing LEX_EOL and LEX_EOS. As a prereq convert the
remaining open-coded accesses.

The Alpha change is actually a functional one: The array slot for '!'
having been set to 1 is very unlikely to have been correct. 1 means "end
of line", when surely "end of statement" was always meant.

gas/cond.c
gas/config/tc-alpha.c
gas/expr.c
gas/listing.c
gas/read.c
gas/read.h

index 9213f918db7fbd47cf968a6c2e2cf7c355796ca4..c14399dc545be96a458d0d3229833e299b591080 100644 (file)
@@ -141,7 +141,7 @@ s_if (int arg)
   if (current_cframe != NULL && current_cframe->ignoring)
     {
       operand.X_add_number = 0;
-      while (! is_end_of_line[(unsigned char) *input_line_pointer])
+      while (! is_end_of_stmt (*input_line_pointer))
        ++input_line_pointer;
     }
   else
@@ -201,7 +201,7 @@ s_ifb (int test_blank)
       int is_eol;
 
       SKIP_WHITESPACE ();
-      is_eol = is_end_of_line[(unsigned char) *input_line_pointer];
+      is_eol = is_end_of_stmt (*input_line_pointer);
       cframe.ignoring = (test_blank == !is_eol);
     }
 
@@ -232,7 +232,7 @@ get_mri_string (int terminator, int *len)
     {
       ++s;
       ++input_line_pointer;
-      while (! is_end_of_line[(unsigned char) *input_line_pointer])
+      while (! is_end_of_stmt (*input_line_pointer))
        {
          *s++ = *input_line_pointer++;
          if (s[-1] == '\'')
@@ -247,7 +247,7 @@ get_mri_string (int terminator, int *len)
   else
     {
       while (*input_line_pointer != terminator
-            && ! is_end_of_line[(unsigned char) *input_line_pointer])
+            && ! is_end_of_stmt (*input_line_pointer))
        ++input_line_pointer;
       s = input_line_pointer;
       while (s > ret && is_whitespace (s[-1]))
@@ -330,7 +330,7 @@ s_elseif (int arg)
 
   if (current_cframe == NULL || current_cframe->ignoring)
     {
-      while (! is_end_of_line[(unsigned char) *input_line_pointer])
+      while (! is_end_of_stmt (*input_line_pointer))
        ++input_line_pointer;
 
       if (current_cframe == NULL)
@@ -401,7 +401,7 @@ s_endif (int arg ATTRIBUTE_UNUSED)
 
   if (flag_mri)
     {
-      while (! is_end_of_line[(unsigned char) *input_line_pointer])
+      while (! is_end_of_stmt (*input_line_pointer))
        ++input_line_pointer;
     }
 
@@ -448,7 +448,7 @@ s_else (int arg ATTRIBUTE_UNUSED)
 
   if (flag_mri)
     {
-      while (! is_end_of_line[(unsigned char) *input_line_pointer])
+      while (! is_end_of_stmt (*input_line_pointer))
        ++input_line_pointer;
     }
 
index b39a7c850c36d5b635a349a5cc37d69053c4f18f..d6245e5ed6c9aec0f0a6f6576b48b67be326267a 100644 (file)
@@ -888,7 +888,7 @@ tokenize_arguments (char *str,
 
 #ifdef RELOC_OP_P
   /* ??? Wrest control of ! away from the regular expression parser.  */
-  is_end_of_line[(unsigned char) '!'] = 1;
+  lex_type[(unsigned char) '!'] |= LEX_EOS;
 #endif
 
   while (tok < end_tok && *input_line_pointer)
@@ -1029,21 +1029,21 @@ tokenize_arguments (char *str,
   debug_exp (orig_tok, ntok - (end_tok - tok));
 #endif
 #ifdef RELOC_OP_P
-  is_end_of_line[(unsigned char) '!'] = 0;
+  lex_type[(unsigned char) '!'] &= ~LEX_EOS;
 #endif
 
   return ntok - (end_tok - tok);
 
  err:
 #ifdef RELOC_OP_P
-  is_end_of_line[(unsigned char) '!'] = 0;
+  lex_type[(unsigned char) '!'] &= ~LEX_EOS;
 #endif
   input_line_pointer = old_input_line_pointer;
   return TOKENIZE_ERROR;
 
 #ifdef RELOC_OP_P
  err_report:
-  is_end_of_line[(unsigned char) '!'] = 0;
+  lex_type[(unsigned char) '!'] &= ~LEX_EOS;
 #endif
   input_line_pointer = old_input_line_pointer;
   return TOKENIZE_ERROR_REPORT;
index b22346ebb67e1dfcacd57ad3c38d1e707c471830..099be4361b42baf0a797e569aeaee3e0a53de37d 100644 (file)
@@ -298,7 +298,7 @@ integer_constant (int radix, expressionS *expressionP)
 #define valuesize 32
 #endif
 
-  if (is_end_of_line[(unsigned char) *input_line_pointer])
+  if (is_end_of_stmt (*input_line_pointer))
     {
       expressionP->X_op = O_absent;
       return;
@@ -803,7 +803,7 @@ operand (expressionS *expressionP, enum expr_mode mode)
   SKIP_WHITESPACE ();          /* Leading whitespace is part of operand.  */
   c = *input_line_pointer++;   /* input_line_pointer -> past char in c.  */
 
-  if (is_end_of_line[(unsigned char) c])
+  if (is_end_of_stmt (c))
     goto eol;
 
   switch (c)
@@ -946,7 +946,7 @@ operand (expressionS *expressionP, enum expr_mode mode)
              /* If it says "0f" and it could possibly be a floating point
                 number, make it one.  Otherwise, make it a local label,
                 and try to deal with parsing the rest later.  */
-             if (!is_end_of_line[(unsigned char) input_line_pointer[1]]
+             if (!is_end_of_stmt (input_line_pointer[1])
                  && strchr (FLT_CHARS, 'f') != NULL)
                {
                  char *cp = input_line_pointer + 1;
@@ -1668,7 +1668,7 @@ operatorf (int *num_chars)
   c = *input_line_pointer & 0xff;
   *num_chars = 1;
 
-  if (is_end_of_line[c])
+  if (is_end_of_stmt (c))
     return O_illegal;
 
 #ifdef md_operator
index be71597525c411cc6ec1532ea53b8b8a868983c8..a84541e757ea3b8d0e8271ba80f38fdfe5f47e43 100644 (file)
@@ -362,8 +362,7 @@ listing_newline (char *ps)
          int seen_slash = 0;
 
          for (copy = input_line_pointer;
-              *copy && (seen_quote
-                        || is_end_of_line [(unsigned char) *copy] != 1);
+              seen_quote ? *copy : !is_end_of_line (*copy);
               copy++)
            {
              if (seen_slash)
@@ -1580,7 +1579,7 @@ listing_title (int depth)
     {
       if (quoted
          ? *input_line_pointer == '\"'
-         : is_end_of_line[(unsigned char) *input_line_pointer])
+         : is_end_of_stmt (*input_line_pointer))
        {
          if (listing)
            {
index 2939c68777905a7f51b76f7af53902023179f950..e451721aff982b98562eca84002c78dfc89bf539 100644 (file)
@@ -79,7 +79,7 @@ die horribly;
 #ifndef CR_EOL
 #define LEX_CR LEX_WHITE
 #else
-#define LEX_CR 0
+#define LEX_CR LEX_EOL
 #endif
 
 #ifndef LEX_AT
@@ -118,7 +118,7 @@ die horribly;
 
 /* Used by is_... macros. our ctype[].  */
 char lex_type[256] = {
-  0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, LEX_CR, 0, 0, /* @ABCDEFGHIJKLMNO */
+  0x20, 0, 0, 0, 0, 0, 0, 0, 0, 8, 0x20, 0, 0, LEX_CR, 0, 0, /* @ABCDEFGHIJKLMNO */
   0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,      /* PQRSTUVWXYZ[\]^_ */
   8, 0, 0, LEX_HASH, LEX_DOLLAR, LEX_PCT, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, /* _!"#$%&'()*+,-./ */
   1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, LEX_QM, /* 0123456789:;<=>? */
@@ -136,32 +136,6 @@ char lex_type[256] = {
   3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3
 };
 
-/* In: a character.
-   Out: 1 if this character ends a line.
-       2 if this character is a line separator.  */
-char is_end_of_line[256] = {
-#ifdef CR_EOL
-  1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0,      /* @abcdefghijklmno */
-#else
-  1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0,      /* @abcdefghijklmno */
-#endif
-  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,      /* */
-  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,      /* _!"#$%&'()*+,-./ */
-  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,      /* 0123456789:;<=>? */
-  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,      /* */
-  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,      /* */
-  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,      /* */
-  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,      /* */
-  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,      /* */
-  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,      /* */
-  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,      /* */
-  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,      /* */
-  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,      /* */
-  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,      /* */
-  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,      /* */
-  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0       /* */
-};
-
 #ifndef TC_CASE_SENSITIVE
 char original_case_string[128];
 #endif
@@ -290,8 +264,7 @@ read_begin (void)
 #endif
   /* Use machine dependent syntax.  */
   for (p = tc_line_separator_chars; *p; p++)
-    is_end_of_line[(unsigned char) *p] = 2;
-  /* Use more.  FIXME-SOMEDAY.  */
+    lex_type[(unsigned char) *p] = LEX_EOS;
 
   if (flag_mri)
     lex_type['?'] = LEX_BEGIN_NAME | LEX_NAME;
@@ -944,7 +917,8 @@ read_a_source_file (const char *name)
          /* We now have input_line_pointer->1st char of next line.
             If input_line_pointer [-1] == '\n' then we just
             scanned another line: so bump line counters.  */
-         was_new_line = is_end_of_line[(unsigned char) input_line_pointer[-1]];
+         was_new_line = lex_type[(unsigned char) input_line_pointer[-1]]
+                        & (LEX_EOL | LEX_EOS);
          if (was_new_line)
            {
              symbol_set_value_now (&dot_symbol);
@@ -993,7 +967,7 @@ read_a_source_file (const char *name)
 #endif
 
          next_char = *input_line_pointer;
-         if (was_new_line == 1
+         if ((was_new_line & LEX_EOL)
              && (strchr (line_comment_chars, '#')
                  ? next_char == '#'
                  : next_char && strchr (line_comment_chars, next_char)))
@@ -1087,7 +1061,7 @@ read_a_source_file (const char *name)
                            }
                          if (strncasecmp (rest, "MACRO", 5) == 0
                              && (is_whitespace (rest[5])
-                                 || is_end_of_line[(unsigned char) rest[5]]))
+                                 || is_end_of_stmt (rest[5])))
                            mri_line_macro = 1;
                        }
 
@@ -1343,7 +1317,7 @@ read_a_source_file (const char *name)
            }
 
          /* Empty statement?  */
-         if (is_end_of_line[(unsigned char) next_char])
+         if (is_end_of_stmt (next_char))
            continue;
 
          if ((LOCAL_LABELS_DOLLAR || LOCAL_LABELS_FB) && ISDIGIT (next_char))
@@ -1502,7 +1476,7 @@ mri_comment_field (char *stopcp)
   know (flag_m68k_mri);
 
   for (s = input_line_pointer;
-       ((!is_end_of_line[(unsigned char) *s] && !is_whitespace (*s))
+       ((!is_end_of_stmt (*s) && !is_whitespace (*s))
        || inquote);
        s++)
     {
@@ -1511,7 +1485,7 @@ mri_comment_field (char *stopcp)
     }
 #else
   for (s = input_line_pointer;
-       !is_end_of_line[(unsigned char) *s];
+       !is_end_of_stmt (*s);
        s++)
     ;
 #endif
@@ -1530,7 +1504,7 @@ mri_comment_end (char *stop, int stopc)
 
   input_line_pointer = stop;
   *stop = stopc;
-  while (!is_end_of_line[(unsigned char) *input_line_pointer])
+  while (!is_end_of_stmt (*input_line_pointer))
     ++input_line_pointer;
 }
 
@@ -1562,7 +1536,7 @@ s_align (signed int arg, int bytes_p)
   if (flag_mri)
     stop = mri_comment_field (&stopc);
 
-  if (is_end_of_line[(unsigned char) *input_line_pointer])
+  if (is_end_of_stmt (*input_line_pointer))
     {
       if (arg < 0)
        align = 0;
@@ -2038,7 +2012,7 @@ s_file (int ignore ATTRIBUTE_UNUSED)
         backquote.  */
       if (flag_m68k_mri
          && *input_line_pointer == '\''
-         && is_end_of_line[(unsigned char) input_line_pointer[1]])
+         && is_end_of_stmt (input_line_pointer[1]))
        ++input_line_pointer;
 
       demand_empty_rest_of_line ();
@@ -2161,7 +2135,7 @@ s_linefile (int ignore ATTRIBUTE_UNUSED)
                break;
              }
 
-         if (!is_end_of_line[(unsigned char)*input_line_pointer])
+         if (!is_end_of_stmt (*input_line_pointer))
            file = NULL;
         }
 
@@ -2196,7 +2170,7 @@ s_end (int ignore ATTRIBUTE_UNUSED)
       /* The MRI assembler permits the start symbol to follow .end,
         but we don't support that.  */
       SKIP_WHITESPACE ();
-      if (!is_end_of_line[(unsigned char) *input_line_pointer]
+      if (!is_end_of_stmt (*input_line_pointer)
          && *input_line_pointer != '*'
          && *input_line_pointer != '!')
        as_warn (_("start address not supported"));
@@ -2425,7 +2399,7 @@ s_globl (int ignore ATTRIBUTE_UNUSED)
        {
          input_line_pointer++;
          SKIP_WHITESPACE ();
-         if (is_end_of_line[(unsigned char) *input_line_pointer])
+         if (is_end_of_stmt (*input_line_pointer))
            c = '\n';
        }
 
@@ -2485,7 +2459,7 @@ s_linkonce (int ignore ATTRIBUTE_UNUSED)
 
   type = LINKONCE_DISCARD;
 
-  if (!is_end_of_line[(unsigned char) *input_line_pointer])
+  if (!is_end_of_stmt (*input_line_pointer))
     {
       char *s;
       char c;
@@ -4016,7 +3990,7 @@ demand_empty_rest_of_line (void)
   SKIP_WHITESPACE ();
   if (input_line_pointer > buffer_limit)
     return;
-  if (is_end_of_line[(unsigned char) *input_line_pointer])
+  if (is_end_of_stmt (*input_line_pointer))
     input_line_pointer++;
   else
     {
@@ -5784,7 +5758,7 @@ s_base64 (int dummy ATTRIBUTE_UNUSED)
        {
          c = * input_line_pointer ++;
 
-         if (c >= 256 || is_end_of_line [c])
+         if (c >= 256 || is_end_of_stmt (c))
            {
              as_bad (_("end of line encountered inside .base64 string"));
              ignore_rest_of_line ();
@@ -6311,7 +6285,7 @@ int
 is_it_end_of_statement (void)
 {
   SKIP_WHITESPACE ();
-  return (is_end_of_line[(unsigned char) *input_line_pointer]);
+  return is_end_of_stmt (*input_line_pointer);
 }
 
 void
@@ -6499,7 +6473,7 @@ s_include (int arg ATTRIBUTE_UNUSED)
     {
       SKIP_WHITESPACE ();
       i = 0;
-      while (!is_end_of_line[(unsigned char) *input_line_pointer]
+      while (!is_end_of_stmt (*input_line_pointer)
             && !is_whitespace (*input_line_pointer))
        {
          obstack_1grow (&notes, *input_line_pointer);
@@ -6509,7 +6483,7 @@ s_include (int arg ATTRIBUTE_UNUSED)
 
       obstack_1grow (&notes, '\0');
       filename = (char *) obstack_finish (&notes);
-      while (!is_end_of_line[(unsigned char) *input_line_pointer])
+      while (!is_end_of_stmt (*input_line_pointer))
        ++input_line_pointer;
     }
 
@@ -6795,7 +6769,7 @@ _find_end_of_line (char *s, int mri_string, int insn ATTRIBUTE_UNUSED,
   char inquote = '\0';
   int inescape = 0;
 
-  while (!is_end_of_line[(unsigned char) *s]
+  while (!is_end_of_stmt (*s)
         || (inquote && !ISCNTRL (*s))
         || (inquote == '\'' && flag_mri)
 #ifdef TC_EOL_IN_INSN
@@ -6804,7 +6778,7 @@ _find_end_of_line (char *s, int mri_string, int insn ATTRIBUTE_UNUSED,
         /* PR 6926:  When we are parsing the body of a macro the sequence
            \@ is special - it refers to the invocation count.  If the @
            character happens to be registered as a line-separator character
-           by the target, then the is_end_of_line[] test above will have
+           by the target, then the is_end_of_stmt() test above will have
            returned true, but we need to ignore the line separating
            semantics in this particular case.  */
         || (in_macro && inescape && *s == '@')
index 535f02807b9bcad5be9898dcc7ab1ff5282067f3..f6d016707d830d5d77f40c4df4f0d1dfb107a8cf 100644 (file)
@@ -41,6 +41,8 @@ extern bool input_from_string;
 #define LEX_BEGIN_NAME (2)     /* may begin a name */
 #define LEX_END_NAME   (4)     /* ends a name */
 #define LEX_WHITE      (8)     /* whitespace */
+#define LEX_EOS        (0x10)  /* end of statement */
+#define LEX_EOL        (0x20)  /* end of line */
 
 #define is_name_beginner(c) \
   ( lex_type[(unsigned char) (c)] & LEX_BEGIN_NAME )
@@ -56,12 +58,11 @@ extern bool input_from_string;
 #undef ISBLANK
 
 /* The distinction of "line" and "statement" sadly is blurred by unhelpful
-   naming of e.g. the underlying array.  Most users really mean "end of
-   statement".  Going forward only these wrappers are supposed to be used.  */
+   naming in a few places.  Most users really mean "end of statement".  */
 #define is_end_of_stmt(c) \
-  (is_end_of_line[(unsigned char) (c)])
+  ( lex_type[(unsigned char) (c)] & (LEX_EOS | LEX_EOL) )
 #define is_end_of_line(c) \
-  (is_end_of_line[(unsigned char) (c)] == 1)
+  ( lex_type[(unsigned char) (c)] & LEX_EOL )
 
 #ifndef is_a_char
 #define CHAR_MASK      (0xff)
@@ -70,7 +71,6 @@ extern bool input_from_string;
 #endif /* is_a_char() */
 
 extern char lex_type[];
-extern char is_end_of_line[];
 
 extern int is_it_end_of_statement (void);
 extern char *find_end_of_line (char *, int);