[PATCH] gas: fix silent failure of .cfi_sections .sframe on unsupported targets

Indu Bhagat indu.bhagat@oracle.com
Thu Mar 12 19:54:38 GMT 2026


On 3/10/26 5:23 AM, Jens Remus wrote:
> On 3/10/2026 7:07 AM, Indu Bhagat via Binutils wrote:
>> [Resending as I messed up one of the email in the to list in the
>> previous attempt].
>>
>> Starting in Binutils 2.46, the .cfi_sections .sframe directive failed
>> silently when targeting unsupported architectures (e.g., i386 or even
>> x32 on x86_64).  This happened because the sframe_as_bad macro only
>> checked for the command-line flag --gsframe (GEN_SFRAME_ENABLED) and
>> ignored the explicit request via the assembler directive
>> (CFI_EMIT_sframe).
>>
>> This patch ensures that an error is emitted (for unsupported targets) if
>> SFrame is requested via either the command line or the .cfi_sections
>> directive, while maintaining silence for 'opportunistic' sframe
>> generation (GEN_SFRAME_CONFIG_ENABLED).
>>
>> Add two testcases:
>>    - cfi-sframe-x86_64-err-1.d: usage of --32 with .cfi_sections .sframe,
>>    - cfi-sframe-x86_64-err-2.d: usage of --gsframe --32 without
>>      .cfi_sections .sframe
>> GAS is expected to error out in both the cases.
>>
>> This fixes PR gas/33962 - .cfi_sections directive with .sframe on
>> unsupported targets does not error.
>>
>> gas/
>> 	PR gas/33962
>> 	* dw2gencfi.c (dot_cfi_sections): Ensure as_bad is called if
>> 	SFrame was explicitly requested via directive.
>> 	* gen-sframe.h: Remove sframe_as_bad macro.
>> gas/testsuite/
>> 	PR gas/33962
>> 	* gas/cfi-sframe/cfi-sframe-x86_64-err-1.s: New test.
>> 	* gas/cfi-sframe/cfi-sframe-x86_64-err-1.d: New test.
>> 	* gas/cfi-sframe/cfi-sframe-x86_64-err-2.s: New test.
>> 	* gas/cfi-sframe/cfi-sframe-x86_64-err-1.d: New test.
>> 	* gas/cfi-sframe/cfi-sframe.exp: Run the new tests.
> 
> Thank you for fixing this issue!
> 
> 
>> diff --git a/gas/dw2gencfi.c b/gas/dw2gencfi.c
> 
>> @@ -2620,9 +2620,18 @@ cfi_finish (void)
>>   	}
>>         else
>>   #endif
>> -	/* Avoid erroring with DEFAULT_SFRAME for non-default options, like
>> -	   -32 on x86_64.  */
>> -	sframe_as_bad ("%s", _(".sframe not supported for target"));
>> +	/* Issue an error for unsupported targets, like --32 on x86_64.  Avoid
>> +	   erroring when default-enabled at configure-time though, because we
>> +	   interpret default-enabled as "opportunistic SFrames".  Users don't
>> +	   want to be bothered by something preventing emission of SFrames in
>> +	   such a case.  */
>> +	{
>> +	  if (flag_gen_sframe == GEN_SFRAME_ENABLED
> 
> This issues an error for --gsframe[-N].
> 

Yes. Because command line takes precedence.

>> +	      || ((all_cfi_sections & CFI_EMIT_sframe) != 0
>> +		  && flag_gen_sframe != GEN_SFRAME_DISABLED
>> +		  && flag_gen_sframe != GEN_SFRAME_CONFIG_ENABLED))
> 
> IIUC this issues an error for .cfi_sections .sframe, but only if not
> --gsframe=no, which takes precedence, and not 'opportunistic' SFrame
> generation (GEN_SFRAME_CONFIG_ENABLED).
> 

Correct.

> Why should .cfi_sections .sframe be ignored when used with
> 'opportunistic' SFrame generation (GEN_SFRAME_CONFIG_ENABLED)?
> 

Umm, .cfi_sections .sframe is not being ignored with 
GEN_SFRAME_CONFIG_ENABLED, its only that the error is silenced when this 
occurs for unsupported target.

I think you meant to ask why silence that error:
'Opportunistic' SFrame is for the use case of distro wide builds.  If 
there is user code that builds with --32 or --x32 (in case x86_64), and 
gas is built with --enable-default-sframe, there will be errors of 
unsupported target.  These are considered noise in this setup, and hence 
the desire to silence them.

Does that make sense ?

>> +	    as_bad (_(".sframe not supported for target"));
>> +	}
>>       }
>>   
>>     if ((all_cfi_sections & CFI_EMIT_debug_frame) != 0)
> 
>> diff --git a/gas/gen-sframe.h b/gas/gen-sframe.h
> 
>> @@ -21,16 +21,6 @@
>>   #ifndef GENSFRAME_H
>>   #define GENSFRAME_H
>>   
>> -/* Errors shouldn't be emitted either if SFrames are default-enabled, as
>> -   we interpret default-enabled as "opportunistic SFrames".  Users don't
>> -   want to be bothered by something preventing emission of SFrames in
>> -   such a case.  */
>> -#define sframe_as_bad(format, ...) \
>> -  do {					       \
>> -    if (flag_gen_sframe == GEN_SFRAME_ENABLED) \
>> -      as_bad (format, __VA_ARGS__);            \
>> -  } while (0)
>> -
>>   /* The entity is not tracked.  */
>>   #define SFRAME_FRE_ELEM_LOC_NONE	0
>>   /* The location of the tracked entity is based on a register.  May or may not
> Thanks and regards,
> Jens



More information about the Binutils mailing list