[PATCH] gas: sframe: command line option takes precedence

Sam James sam@gentoo.org
Tue Jul 22 11:38:36 GMT 2025


Jan Beulich <jbeulich@suse.com> writes:

> On 18.07.2025 21:06, Indu Bhagat wrote:
>> On 7/18/25 11:33 AM, Indu Bhagat wrote:
>>> On 7/18/25 1:25 AM, Jan Beulich wrote:
>>>> On 18.07.2025 09:21, Indu Bhagat via Binutils wrote:
>>>>> --- a/gas/as.h
>>>>> +++ b/gas/as.h
>>>>> @@ -355,8 +355,15 @@ COMMON int flag_execstack;
>>>>>   /* TRUE if .note.GNU-stack section with SEC_CODE should be created */
>>>>>   COMMON int flag_noexecstack;
>>>>> -/* TRUE if .sframe section should be created.  */
>>>>> -COMMON int flag_gen_sframe;
>>>>> +enum gen_sframe_option
>>>>> +{
>>>>> +  GEN_SFRAME_NONE = 0,
>>>>
>>>> Maybe better GEN_SFRAME_DEFAULT, seeing Sam's plan to allow controlling the
>>>> default from configure?
>>>>
>>>
>>> I think GEN_SFRAME_DEFAULT will be confusing.  Related response below..
>
> As will be NONE - it can be read as similar/equivalent to DISABLED.
>
>>>>> --- a/gas/dw2gencfi.c
>>>>> +++ b/gas/dw2gencfi.c
>>>>> @@ -2596,10 +2596,13 @@ cfi_finish (void)
>>>>>         flag_traditional_format = save_flag_traditional_format;
>>>>>       }
>>>>> -  /* Generate SFrame section if the user specifies:
>>>>> -    - the command line option to gas, or
>>>>> -    - .sframe in the .cfi_sections directive.  */
>>>>> -  if (flag_gen_sframe || (all_cfi_sections & CFI_EMIT_sframe) != 0)
>>>>> +  /* Generate SFrame section if the user:
>>>>> +    - enables via the command line option, or
>>>>> +    - specifies .sframe in the .cfi_sections directive and does not disable
>>>>> +      via the command line.  */
>>>>> +  if (flag_gen_sframe == GEN_SFRAME_ENABLED
>>>>> +      || ((all_cfi_sections & CFI_EMIT_sframe) != 0
>>>>> +      && flag_gen_sframe != GEN_SFRAME_DISABLED))
>>>>
>>>> With said plan, I'm not sure about this. What's the intended behavior if
>>>> the default is "disabled"? It feels like you need to resolve the default
>>>> anyway after having parsed the command line. At which point I'm not even
>>>> sure anymore that a tristate is needed here.
>>>>
>>>
>>> The intended behavior IMO should be:
>>>    - command line takes precedence over configure time setting and cfi_section directive.
>>>    - .cfi_section directive takes precedence over configure time setting.
>>>
>>> (The command line takes precedence over configure time defaults.) 
>>> So Sam's patch to add configure-time enablement will basically just
>>> initialize the value of flag_gen_sframe to GEN_SFRAME_ENABLED or
>>> GEN_SFRAME_DISABLED based on --enable-sframe/--disable-sframe
>>> respectively at an appropriate time.
>>>
>> 
>> Correction: IMO Sam's patch to add configure-time enablement will
>> basically just initialize the value of flag_gen_sframe to
>> GEN_SFRAME_ENABLED or GEN_SFRAME_NONE based on
>> --enable-sframe/--disable-sframe respectively at an appropriate
>> time.
>> 
>> When --disable-sframe is used, the desired behavior is equivalent to 'passing no --gsframe', and not '--gsframe=no'.
>
> That's one of (at least) two possible behaviors. Sam, can you clarify what
> the plan is?

We want --disable-sframe (or --disable-default-sframe, whatever) at
configure-time to mean "no --gsframe was passed".

i.e. we want --enable-default-sframe to always do something positive (imply
--gsframe/--gsframe=yes when it wasn't otherwise passed), and not for
--disable-default-sframe to ever stop people from enabling SFrames
via a command-line argument.

Now, where a tri-state may be useful (or some way of representing when
we're "default-enabled, not explicitly by the user") is when suppressing
warnings, or an error in this particular place in dw2gencfi.c:


  /* Generate SFrame section if the user specifies:
        - the command line option to gas, or
        - .sframe in the .cfi_sections directive.  */
  if (flag_gen_sframe || (all_cfi_sections & CFI_EMIT_sframe) != 0)
    {
#ifdef support_sframe_p
      if (support_sframe_p () && !SUPPORT_FRAME_LINKONCE)
        {
          segT sframe_seg;
          int alignment = ffs (DWARF2_ADDR_SIZE (stdoutput)) - 1;

          sframe_seg = get_cfi_seg (NULL, ".sframe",
                                    (SEC_ALLOC | SEC_LOAD | SEC_DATA
                                     | DWARF2_EH_FRAME_READ_ONLY),
                                    alignment);
          elf_section_type (sframe_seg) = SHT_GNU_SFRAME;
          output_sframe (sframe_seg);
        }
      else
#endif
        as_bad (_(".sframe not supported for target"));
    }

Having that as_bad call is a real pain for --enable-default-sframe if
`as -32` is used on a x86_64 target.

sam


More information about the Binutils mailing list