]> git.ipfire.org Git - thirdparty/binutils-gdb.git/commitdiff
gas: multi-byte warning adjustments
authorJan Beulich <jbeulich@suse.com>
Thu, 11 Jul 2024 10:26:36 +0000 (12:26 +0200)
committerJan Beulich <jbeulich@suse.com>
Thu, 11 Jul 2024 10:26:36 +0000 (12:26 +0200)
First input_scrub_next_buffer()'s invocation was wrong, leading to input
only being checked from the last newline till the end of the current
buffer. Correcting the invocation, however, leads to duplicate checking
unless -f (or the #NO_APP equivalent thereof) is in effect. Move the
invocation to input_file_give_next_buffer(), to restrict it accordingly.

Then, when macros contain multi-byte characters, warning about them
again in every expansion isn't useful. Suppress such warnings from
sb_scrub_and_add_sb().

gas/app.c
gas/as.h
gas/input-file.c
gas/input-scrub.c
gas/sb.c
gas/testsuite/gas/all/gas.exp
gas/testsuite/gas/all/multibyte3.l [new file with mode: 0644]
gas/testsuite/gas/all/multibyte3.s [new file with mode: 0644]

index 955de0fbf0399e33d39442a3e41ad990d0658269..b268b66b8f0517b8d99573a8d082af049f4854a1 100644 (file)
--- a/gas/app.c
+++ b/gas/app.c
@@ -406,7 +406,8 @@ scan_for_multibyte_characters (const unsigned char *  start,
    This is the way the old code used to work.  */
 
 size_t
-do_scrub_chars (size_t (*get) (char *, size_t), char *tostart, size_t tolen)
+do_scrub_chars (size_t (*get) (char *, size_t), char *tostart, size_t tolen,
+               bool check_multibyte)
 {
   char *to = tostart;
   char *toend = tostart + tolen;
@@ -510,7 +511,7 @@ do_scrub_chars (size_t (*get) (char *, size_t), char *tostart, size_t tolen)
       from = input_buffer;
       fromend = from + fromlen;
 
-      if (multibyte_handling == multibyte_warn)
+      if (check_multibyte)
        (void) scan_for_multibyte_characters ((const unsigned char *) from,
                                              (const unsigned char* ) fromend,
                                              true /* Generate warnings.  */);
index 69d7ae2cd178ed17b23681fbf225ffdff70c9334..fe0fae4ce0d500f33de9905b0dd5096f19a49033 100644 (file)
--- a/gas/as.h
+++ b/gas/as.h
@@ -496,7 +496,7 @@ void   input_scrub_insert_line (const char *);
 void   input_scrub_insert_file (char *);
 char * input_scrub_new_file (const char *);
 char * input_scrub_next_buffer (char **bufp);
-size_t do_scrub_chars (size_t (*get) (char *, size_t), char *, size_t);
+size_t do_scrub_chars (size_t (*get) (char *, size_t), char *, size_t, bool);
 size_t do_scrub_pending (void);
 bool   scan_for_multibyte_characters (const unsigned char *, const unsigned char *, bool);
 int    gen_to_words (LITTLENUM_TYPE *, int, long);
index 9ec255b30537980728e32ebe6b2b86a8f8610310..89f03a98be8ea8fc3ef7d6f8725b7fe5e5a6a536 100644 (file)
@@ -240,9 +240,20 @@ input_file_give_next_buffer (char *where /* Where to place 1st character of new
      Since the assembler shouldn't do any output to stdout, we
      don't bother to synch output and input.  */
   if (preprocess)
-    size = do_scrub_chars (input_file_get, where, BUFFER_SIZE);
+    size = do_scrub_chars (input_file_get, where, BUFFER_SIZE,
+                           multibyte_handling == multibyte_warn);
   else
-    size = input_file_get (where, BUFFER_SIZE);
+    {
+      size = input_file_get (where, BUFFER_SIZE);
+
+      if (multibyte_handling == multibyte_warn)
+       {
+         const unsigned char *start = (const unsigned char *) where;
+
+         (void) scan_for_multibyte_characters (start, start + size,
+                                               true /* Generate warnings */);
+       }
+    }
 
   if (size)
     return_value = where + size;
index 5bfdc5367096912897e8b98b2e88622fc4b00853..776d15ea0873816771b3b5f22d89b9a400e85e87 100644 (file)
@@ -386,11 +386,6 @@ input_scrub_next_buffer (char **bufp)
          ++p;
        }
 
-      if (multibyte_handling == multibyte_warn)
-       (void) scan_for_multibyte_characters ((const unsigned char *) p,
-                                             (const unsigned char *) limit,
-                                             true /* Generate warnings */);
-
       /* We found a newline in the newly read chars.  */
       partial_where = p;
       partial_size = limit - p;
index f451da004e823497fa532095a8fbb20850be98cc..e96355d265919eb88d56f9317acee210c4b172bf 100644 (file)
--- a/gas/sb.c
+++ b/gas/sb.c
@@ -124,7 +124,7 @@ sb_scrub_and_add_sb (sb *ptr, sb *s)
        break;
       sb_check (ptr, copy);
       ptr->len += do_scrub_chars (scrub_from_sb, ptr->ptr + ptr->len,
-                                 ptr->max - ptr->len);
+                                 ptr->max - ptr->len, false);
     }
 
   sb_to_scrub = 0;
index 32363c500b511d5961230ce20f2cb1ccd2316cf3..24376a728d86d0fc2fa2b782e452f4897c017249 100644 (file)
@@ -535,3 +535,5 @@ run_dump_test "pr27384"
 run_dump_test "pr27381"
 run_dump_test "multibyte1"
 run_dump_test "multibyte2"
+run_list_test "multibyte3" "--multibyte-handling=warn"
+run_list_test "multibyte3" "-f --multibyte-handling=warn"
diff --git a/gas/testsuite/gas/all/multibyte3.l b/gas/testsuite/gas/all/multibyte3.l
new file mode 100644 (file)
index 0000000..9f6f8d2
--- /dev/null
@@ -0,0 +1,10 @@
+[^:]*: Assembler messages:
+[^:]*: Warning: multibyte character \(.*\) encountered in .*
+[^:]*: Warning: multibyte character \(.*\) encountered in .*
+[^:]*: Warning: multibyte character \(.*\) encountered in .*
+[^:]*: Warning: multibyte character \(.*\) encountered in .*
+[^:]*: Warning: multibyte character \(.*\) encountered in .*
+[^:]*: Warning: multibyte character \(.*\) encountered in .*
+[^:]*: Warning: multibyte character \(.*\) encountered in .*
+[^:]*: Warning: multibyte character \(.*\) encountered in .*
+[^:]*:[0-9]+: Warning: end of input
diff --git a/gas/testsuite/gas/all/multibyte3.s b/gas/testsuite/gas/all/multibyte3.s
new file mode 100644 (file)
index 0000000..303acfa
--- /dev/null
@@ -0,0 +1,11 @@
+       .macro m
+UmlautÜ\@:
+       .endm
+
+UmlautÄ:
+       .irpc c,szß
+UmlautÖ\@\c\():
+       m
+       .endr
+
+       .warning "end of input"