вт, 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 >