вт, 25 февр. 2025 г. в 20:23, Jakub Jelinek <ja...@redhat.com>:
>
> Hi!
>
> 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.
>
> Build tested in x86_64-linux -> avr-none cross, ok for trunk?

OK.

Denis

>
> 2025-02-25  Jakub Jelinek  <ja...@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.jj    2025-02-24 00:06:25.000000000 +0100
> +++ gcc/config/avr/avr.cc       2025-02-25 13:45:58.960806467 +0100
> @@ -2750,10 +2750,19 @@ avr_print_operand (FILE *file, rtx x, in
>                   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 thre 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
>
>
>         Jakub
>

Reply via email to