]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
avr: Fix up avr_print_operand diagnostics [PR118991]
authorJakub Jelinek <jakub@redhat.com>
Sun, 2 Mar 2025 10:30:35 +0000 (11:30 +0100)
committerJakub Jelinek <jakub@gcc.gnu.org>
Sun, 2 Mar 2025 10:30:35 +0000 (11:30 +0100)
As can be seen in gcc/po/gcc.pot:
 #: config/avr/avr.cc:2754
 #, c-format
 msgid "bad I/O address 0x"
 msgstr ""

exgettext couldn't retrieve the whole format string in this case,
because it uses a macro in the middle.  output_operand_lossage
is c-format function though, so we can't use %wx to print HOST_WIDE_INT,
and HOST_WIDE_INT_PRINT_HEX_PURE is on some hosts %lx, on others %llx
and on others %I64x so isn't really translatable that way.

As Joseph mentioned in the PR, there is no easy way around this
but go through a temporary buffer, which the following patch does.

2025-03-02  Jakub Jelinek  <jakub@redhat.com>

PR translation/118991
* config/avr/avr.cc (avr_print_operand): Print ival into
a temporary buffer and use %s in output_operand_lossage to make
the diagnostics translatable.

gcc/config/avr/avr.cc

index d53453e25fdfa4041d273328fee15bd29823d601..71c03b4214890a20acb5fb1fb40a7bb865c3d640 100644 (file)
@@ -2750,10 +2750,19 @@ avr_print_operand (FILE *file, rtx x, int code)
                  fprintf (file, HOST_WIDE_INT_PRINT_HEX, ival - sfr0);
              }
            else
-             output_operand_lossage
-               ("bad I/O address 0x" HOST_WIDE_INT_PRINT_HEX_PURE
-                " outside of valid range [0x%x, 0x%x] for %%i operand",
-                ival, sfr0, sfr0 + 0x3f);
+             {
+               char buf[17];
+               /* Printed indirectly through buffer, as
+                  output_operand_lossage is translatable but uses printf
+                  format strings, so HOST_WIDE_INT_PRINT_HEX_PURE macro can't
+                  be used there to make translation possible and how exactly
+                  can be HOST_WIDE_INT printed is host dependent.  */
+               snprintf (buf, sizeof buf, HOST_WIDE_INT_PRINT_HEX_PURE,
+                         ival);
+               output_operand_lossage ("bad I/O address 0x%s outside of "
+                                       "valid range [0x%x, 0x%x] for %%i "
+                                       "operand", buf, sfr0, sfr0 + 0x3f);
+             }
          }
          break; // CONST_INT