[PATCH v3 08/11] s390: Store SFrame CFA offset adjusted

Jan Beulich jbeulich@suse.com
Tue Jul 8 12:36:12 GMT 2025


On 08.07.2025 14:14, Jens Remus wrote:
> On 08.07.2025 10:06, Jan Beulich wrote:
>> On 08.07.2025 09:31, Indu Bhagat wrote:
>>> On 7/7/25 11:49 PM, Jan Beulich wrote:
>>>> On 07.07.2025 19:48, Indu Bhagat wrote:
>>>>> On 7/7/25 8:07 AM, Jens Remus wrote:
>>>>>>>> @@ -134,10 +134,26 @@ sframe_fre_set_cfa_base_reg (struct sframe_row_entry *fre,
>>>>>>>>       fre->merge_candidate = false;
>>>>>>>>     }
>>>>>>>>     +static offsetT
>>>>>>>> +sframe_fre_get_cfa_offset (const struct sframe_row_entry * fre)
>>>>>> The recent fix of relocatable SFrame links now include "sframe-api.h".
>>>>>> This cases above new internal helper to clash with the external SFrame
>>>>>> API function of same name.  For V4 I have prefixed the internal helper
>>>>>> with "__", which I somewhat dislike.  Any better suggestion to resolve?
>>>>>
>>>>> Ugh, I did not like bringing in the "sframe-api.h" at all into
>>>>> gas/gen-sframe.c just for the the SFRAME_F_LD_MUSTHAVE_FLAGS.
> 
> Couldn't SFRAME_F_LD_MUSTHAVE_FLAGS be moved into sframe.h?  Not ideal,
> but would resolve the function name clash issue.

I had specifically asked for it to live next to the individual flag
definitions, so that potential updating of the value is less easy to forget.

>>>> To answer the question below I'd first like to understand why using this
>>>> header in gas/gen-sframe.c is (deemed) bad. It looks quite natural to me
>>>> that to be able to use any part of what's defined there (even if only
>>>> flag values), that header needs including. Or of that was a problem, the
>>>> header may need splitting.
>>>
>>> (sframe-api.h is the implementation header file for consumers using 
>>> libsframe APIs.)  gas has its own SFrame writing logic (via fragment 
>>> creation etc.) and has not needed the libsframe APIs so far.  To include 
>>> it only for SFRAME_F_LD_MUSTHAVE_FLAGS just seemed like tieing up an 
>>> interface which is not necessary.
>>>
>>> Inclusion of sframe-api.h causing collisions like Jens runs into, and 
>>> then needing to bypass them are both unpalatable, I thought.
>>
>> Including that header ought to be permissible anywhere, including gas
>> sources. If gas (and maybe other components) are interested in the
>> #define-s (and possibly types) only, can the header file maybe gain a
>> mode (off by default) by which the function declarations would be
>> hidden?
> 
> Hmm.  Optionally hide everything in sframe-api.h except for
> SFRAME_F_LD_MUSTHAVE_FLAGS?  Not ideal either.

The individual flag values also would need to remain available. And those
must be possible to obtain anyway, by any source file.

>> More generally though I think that it would be better to avoid any
>> name collisions. Two entities of exactly the same name can easily be
>> confusing.
> 
> gen-sframe.c:
> static void sframe_fre_set_cfa_base_reg (struct sframe_row_entry *fre, unsigned int cfa_base_reg)
> static void sframe_fre_set_cfa_offset (struct sframe_row_entry *fre, offsetT cfa_offset)
> 
> sframe-api.h:
> extern int32_t sframe_fre_get_cfa_offset (sframe_decoder_ctx *dtcx, sframe_frame_row_entry *fre, int *errp);
> 
> The following to be added helper in gen-sframe.c follows the existing
> naming scheme:
> static offsetT sframe_fre_get_cfa_offset (const struct sframe_row_entry * fre)
> 
> What do you suggest?  Prefix every helper in gen-sframe.c with one or
> two underscores to identify them as local helpers?  Remove the prefix
> "sframe_" (or even "sframe_fre_") from every helper in gen-sframe.c?
> Rename helpers to {set|get}_sframe_fre_cfa_offset (similar to
> get_dw_fde_start_addrS) or sframe_fre_cfa_offset_{get|set}?  None
> seems ideal.

Personally I'm in favor of removing (imo redundant) prefixes for static
function or variable names. That would be sframe_ here. If for some reason
you think the prefix is helpful, another option might be to simply prefix
static function names with a single underscore.

> As the newly introduced helper is only used in one place it could also
> be open coded as follows to workaround the name clash.  Not ideal either.
> 
> diff --git a/gas/gen-sframe.c b/gas/gen-sframe.c
> @@ -1059,7 +1047,15 @@ sframe_xlate_do_def_cfa_register (struct sframe_xlate_ctx *xlate_ctx,
>      }
>    sframe_fre_set_cfa_base_reg (cur_fre, cfi_insn->u.r);
>    if (last_fre)
> -    sframe_fre_set_cfa_offset (cur_fre, __sframe_fre_get_cfa_offset (last_fre));
> +    {
> +      offsetT cfa_offset = last_fre->cfa_offset;
> +
> +      /* For s390x undo adjustment of CFA offset (to enable 8-bit offsets).  */
> +      if (sframe_get_abi_arch () == SFRAME_ABI_S390X_ENDIAN_BIG)
> +       cfa_offset = SFRAME_V2_FRE_S390X_CFA_OFFSET_DECODE (cfa_offset);
> +
> +      sframe_fre_set_cfa_offset (cur_fre, cfa_offset);
> +    }
> 
>    cur_fre->merge_candidate = false;
> 
> 
> What if I change sframe_xlate_do_def_cfa_register as follows to not to
> use any helpers at all?  I currently prefer that approach.
> 
> diff --git a/gas/gen-sframe.c b/gas/gen-sframe.c
> @@ -1059,8 +1047,8 @@ sframe_xlate_do_def_cfa_register (struct sframe_xlate_ctx *xlate_ctx,
>      }
>    sframe_fre_set_cfa_base_reg (cur_fre, cfi_insn->u.r);
>    if (last_fre)
> -    sframe_fre_set_cfa_offset (cur_fre, __sframe_fre_get_cfa_offset (last_fre));
> -
> +    /* Copy CFA offset value as-is, as it may be encoded (e.g., on s390x).  */
> +    cur_fre->cfa_offset = last_fre->cfa_offset;
>    cur_fre->merge_candidate = false;
> 
>    return SFRAME_XLATE_OK;
> 
> 
> Looking forward for your thoughts!  I would appreciate if we could come
> up with and agree on a solution soon, so that the s390x SFrame support
> could hopefully make it into 2.45.

I'd prefer to leave this part to Indu.

Jan


More information about the Binutils mailing list