gas: improve interaction between read_a_source_file() and s_linefile()
authorJan Beulich <jbeulich@suse.com>
Tue, 14 Feb 2023 07:34:03 +0000 (08:34 +0100)
committerJan Beulich <jbeulich@suse.com>
Tue, 14 Feb 2023 07:34:03 +0000 (08:34 +0100)
read_a_source_file() would bump line numbers only when seeing a newline,
whereas is_end_of_line[] indicates further end-of-line characters, in
particular the nul character. s_linefile() attempts to compensate for
the bump, but was too aggressive with this so far: It should only adjust
when a newline ends the line. To facilitate such a check, the check for
nothing else on the line needs to move ahead, which luckily is easily
possible: The relevant two conditions match, and the function can
simply return from the body of that earlier instance of the conditional.

The more strict treatment in s_linefile() then requires an adjustment
to buffer_and_nest()'s invocation of the function: The line terminator
now needs to be a newline, not nul.

gas/macro.c
gas/read.c

index 763bafbdc3dad99e50e0a594dd028389c202d9fd..f9f2d63e9f7a41eaa92c7c0c84ca51a530c653b2 100644 (file)
@@ -265,7 +265,7 @@ buffer_and_nest (const char *from, const char *to, sb *ptr,
            {
              char saved_eol_char = ptr->ptr[ptr->len];
 
-             ptr->ptr[ptr->len] = '\0';
+             ptr->ptr[ptr->len] = '\n';
              temp_ilp (ptr->ptr + i + 8);
              s_linefile (0);
              restore_ilp ();
index 9f6a7007ebff126dd4d6984b02a775b355f72720..f1099cba1a3f2b4b5ab41516a5f30fec2efc3901 100644 (file)
@@ -2049,18 +2049,22 @@ s_linefile (int ignore ATTRIBUTE_UNUSED)
 
       if (file || flags)
        {
-         linenum--;
+         demand_empty_rest_of_line ();
+
+         /* read_a_source_file() will bump the line number only if the line
+            is terminated by '\n'.  */
+         if (input_line_pointer[-1] == '\n')
+           linenum--;
+
          new_logical_line_flags (file, linenum, flags);
 #ifdef LISTING
          if (listing)
            listing_source_line (linenum);
 #endif
+         return;
        }
     }
-  if (file || flags)
-    demand_empty_rest_of_line ();
-  else
-    ignore_rest_of_line ();
+  ignore_rest_of_line ();
 }
 
 /* Handle the .end pseudo-op.  Actually, the real work is done in