Using .macro argument in .error message?

Jan Beulich jbeulich@suse.com
Thu Jun 11 15:17:09 GMT 2026


On 11.06.2026 16:54, Georg-Johann Lay wrote:
> Am 11.06.26 um 16:18 schrieb Jan Beulich:
>> On 11.06.2026 15:42, Georg-Johann Lay wrote:
>>> Am 11.06.26 um 15:22 schrieb Jan Beulich:
>>>> On 10.06.2026 11:54, Georg-Johann Lay wrote:
>>>>> Am 10.06.26 um 11:27 schrieb Jan Beulich:
>>>>>> On 07.06.2026 21:16, Georg-Johann Lay via Binutils wrote:
>>>>>>> Test case err.sx:
>>>>>>>
>>>>>>> .macro Test data
>>>>>>>         .if \data < 0
>>>>>>>             .error "value \data is negative"
>>>>>>>         .endif
>>>>>>> .endm
>>>>>>>
>>>>>>>         Test -1
>>>>>>>
>>>>>>> $ avr-as err.sx -v
>>>>>>> GNU assembler version 2.45.50 (avr) using BFD version (GNU Binutils)
>>>>>>> 2.45.50.20250718
>>>>>>> err.sx: Assembler messages:
>>>>>>> err.sx: Warning: unknown escape '\d' in string; ignored
>>>>>>> err.sx:3: Error: value -1 is negative
>>>>>>> err.sx:7:  Info: macro invoked from here
>>>>>>>
>>>>>>> While the printed error message is as expected, there is a spurious
>>>>>>> warning about using \d in the string.
>>>>>>>
>>>>>>> What am I missing?
>>>>>>>
>>>>>>> As far as I understand, the .error message /must/ be "-quoted.
>>>>>>
>>>>>> Indeed. But AVR is one of the few targets which enable this extra
>>>>>> warning. Why that is or whether it could be changed requires AVR
>>>>>> knowledge, which I don#t have. There's also a surprising set of
>>>>>> characters for which the warning would never appear. I don't know
>>>>>> the history of that set, but it feels pretty arbitrary.
>>>>>
>>>>> Okay, I didn't even notice that it's target specific... The only
>>>>> related place I could find is in gas/config/tc-avr.h:
>>>>>
>>>>> /* If you define this macro, GAS will warn about the use of
>>>>>      nonstandard escape sequences in a string.  */
>>>>> #define ONLY_STANDARD_ESCAPES
>>>>
>>>> This is it, yes.
>>>>
>>>>> Though whatever the behavior wrt. fishy escapes is, resolution
>>>>> of macro arguments should run prior to that, no?
>>>>
>>>> No. Macros are processed after the scrubber (aka "pre-processor") has
>>>> done its work.
>>>
>>> Whatever the technical limitations are; such a warning makes just no sense.
>>
>> The person who had added it likely was of a different opinion. I'm pretty sure
>> things can be improved, and feel free to send a patch, but justifying such a
>> change will likely require some archeology, not just saying "makes no sense".
> 
> What I am trying to say is that warning for an unrecognized escape
> sequence isn't very helpful when the sequence is NOT an escape sequence
> to begin with.  In the example, \data is treated as a .macro parameter,
> so there is no unknown escape sequence `\d' anywhere.

The scrubber can't know this is a macro parameter reference.

>> In particular the architecture's native assembler's behavior also needs taking
>> into account.
> 
> What you mean by "native assembler"?
> 
> avr-as is the only AVR assembler used by GCC.
> There are other assemblers like avra or avrasm2, but they are incompatible in many regards.

Well. The setting of ONLY_STANDARD_ESCAPES for AVR must have a reason. While those
other assemblers may be incompatible in various regards, maybe use of that option
was an attempt to achieve at least some compatibility? (FTAOD - I'm wildly
guessing, as I know nothing about the AVR port.)

Jan


More information about the Binutils mailing list