[PATCH,V4 4/9] include: sframe: doc: define new flag SFRAME_F_FDE_FUNC_START_ADDR_PCREL

Indu Bhagat indu.bhagat@oracle.com
Mon Jun 30 07:14:08 GMT 2025


On 6/27/25 12:10 AM, Jan Beulich wrote:
> On 19.06.2025 08:24, Indu Bhagat wrote:
>> --- a/include/sframe-api.h
>> +++ b/include/sframe-api.h
>> @@ -36,6 +36,14 @@ typedef struct sframe_encoder_ctx sframe_encoder_ctx;
>>   #define MAX_OFFSET_BYTES  \
>>     ((SFRAME_FRE_OFFSET_4B * 2 * MAX_NUM_STACK_OFFSETS))
>>   
>> +/* Set of all defined flags known to this implementation.  Any flag other than
>> +   these, if set, is deemed invalid.  This is used for sanity checking to
>> +   ensure that the implementation only admits sections with flags defined in
>> +   the specific version.  */
>> +#define SFRAME_F_ALL_FLAGS \
>> +  (SFRAME_F_FDE_SORTED | SFRAME_F_FRAME_POINTER \
>> +   | SFRAME_F_FDE_FUNC_START_ADDR_PCREL)
> 
> While I think I can guess why you decided to put this here, ...
> 
>> --- a/include/sframe.h
>> +++ b/include/sframe.h
>> @@ -82,9 +82,15 @@ extern "C"
>>   /* Various flags for SFrame.  */
>>   
>>   /* Function Descriptor Entries are sorted on PC.  */
>> -#define SFRAME_F_FDE_SORTED	0x1
>> +#define SFRAME_F_FDE_SORTED		    0x1
>>   /* Functions preserve frame pointer.  */
>> -#define SFRAME_F_FRAME_POINTER 0x2
>> +#define SFRAME_F_FRAME_POINTER		    0x2
>> +/* Function start address in SFrame FDE is encoded as the distance from the
>> +   location of the sfde_func_start_address to the start PC of the function.
>> +   If absent, the function start address in SFrame FDE is encoded as the
>> +   distance from the start of the SFrame FDE section to the start PC of the
>> +   function.  */
>> +#define SFRAME_F_FDE_FUNC_START_ADDR_PCREL  0x4
>>   
>>   #define SFRAME_CFA_FIXED_FP_INVALID 0
>>   #define SFRAME_CFA_FIXED_RA_INVALID 0
> 
> ... I think it would be better overall if it was put next to where all the
> flags are defined. This way it's going to be less likely that an addition here
> would not be accompanied (right away) by an update to SFRAME_F_ALL_FLAGS.
> 

Okay.  I have now moved it to include/sframe.h like so:

/* Set of all defined flags in SFrame V2.  */
#define SFRAME_V2_F_ALL_FLAGS \
   (SFRAME_F_FDE_SORTED | SFRAME_F_FRAME_POINTER \
    | SFRAME_F_FDE_FUNC_START_PCREL)


>> --- a/libsframe/doc/sframe-spec.texi
>> +++ b/libsframe/doc/sframe-spec.texi
>> @@ -128,6 +128,17 @@ the data structure.
>>   @item
>>   The above two imply that each SFrame function descriptor entry has a fixed size
>>   of 20 bytes instead of its size of 17 bytes in SFrame format version 1.
>> +@item
>> +A new flag SFRAME_F_FDE_FUNC_START_ADDR_PCREL, released as an errata to SFrame
> 
> Nit: Aiui singular is "erratum". Also, when you use the word "released", don't
> you rather mean "as an erratum correction"? Finally, as to indentifier length:
> Do you think omitting the "ADDR" infix would be undue for whatever reason?
> 

Omitting "ADDR" infix: Sure, its a good idea.

Now I have:

  - Add a new flag SFRAME_F_FDE_FUNC_START_PCREL, as an erratum to SFrame
    Version 2, to indicate the encoding of the SFrame FDE function start
    address field:

>> --- a/libsframe/sframe.c
>> +++ b/libsframe/sframe.c
>> @@ -205,12 +205,11 @@ flip_fde (sframe_func_desc_entry *fdep)
>>   static bool
>>   sframe_header_sanity_check_p (sframe_header *hp)
>>   {
>> -  unsigned char all_flags = SFRAME_F_FDE_SORTED | SFRAME_F_FRAME_POINTER;
>>     /* Check preamble is valid.  */
>>     if (hp->sfh_preamble.sfp_magic != SFRAME_MAGIC
>>         || (hp->sfh_preamble.sfp_version != SFRAME_VERSION_1
>>   	  && hp->sfh_preamble.sfp_version != SFRAME_VERSION_2)
>> -      || (hp->sfh_preamble.sfp_flags | all_flags) != all_flags)
>> +      || hp->sfh_preamble.sfp_flags & ~SFRAME_F_ALL_FLAGS)
> 
> Nit: Please parenthesize the & expression, to clarify precedence.
> 

OK.



More information about the Binutils mailing list