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

Jens Remus jremus@linux.ibm.com
Fri Mar 13 08:16:57 GMT 2026


On 3/12/2026 8:54 PM, Indu Bhagat wrote:
> 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.

Sorry, my wording was odd.  I meant: Why is an error for .cfi_sections
.sframe being silenced with GEN_SFRAME_CONFIG_ENABLED?

> 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.

I understand and completely agree that if gas is built with
--enable-default-sframe it should silence any SFrame related warnings/
errors, that result from the 'opportunistic' SFrame generation
(GEN_SFRAME_CONFIG_ENABLED).  That is whenever SFrame is generated
solely because of that configure option.

My point is that if gas option --gsframe[-3] is specified or
.cfi_sections .sframe is coded, then SFrame is generated because the
user explicitly requested so and then it should not matter whether the
assembler is built with 'opportunistic' SFrame generation
(GEN_SFRAME_CONFIG_ENABLED) whether issue an error.

> Does that make sense ?

No.  Whenever explicitly requesting SFrame generation and this is not
supported an error/warning should be the result.  The only exception
should be 'opportunistic' SFrame generation (GEN_SFRAME_CONFIG_ENABLED)
from my POV (but not if it is explicitly requested).

> 
>>> +        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
-- 
Jens Remus
Linux on Z Development (D3303)
jremus@de.ibm.com / jremus@linux.ibm.com

IBM Deutschland Research & Development GmbH; Vorsitzender des Aufsichtsrats: Wolfgang Wendt; Geschäftsführung: David Faller; Sitz der Gesellschaft: Ehningen; Registergericht: Amtsgericht Stuttgart, HRB 243294
IBM Data Privacy Statement: https://www.ibm.com/privacy/



More information about the Binutils mailing list