]> git.ipfire.org Git - thirdparty/binutils-gdb.git/commitdiff
gas: ld: libsframe: Support for SFrame FDEs without any FREs
authorJens Remus <jremus@linux.ibm.com>
Wed, 15 Oct 2025 15:45:48 +0000 (17:45 +0200)
committerJens Remus <jremus@linux.ibm.com>
Wed, 15 Oct 2025 15:45:48 +0000 (17:45 +0200)
Allow SFrame sections without any FREs, that can occur if they solely
contain FDEs without any FREs.  For FDEs without and FREs set the
offset to the first FRE to zero.

libsframe/
* sframe.c (sframe_encoder_write_sframe): Allow SFrame sections
without any FREs.  For FDEs without any FREs set the offset to
the first FRE to zero.

gas/
* gen-sframe.c (output_sframe_funcdesc): For FDEs without any
FREs set the offset to the first FRE to zero.

Signed-off-by: Jens Remus <jremus@linux.ibm.com>
gas/gen-sframe.c
libsframe/sframe.c

index b9db87f6c64c7d03f2629038eeed8e7d7e861f00..8643ee8731e85f5c391c2b23d4a7cfe7d4221b08 100644 (file)
@@ -652,12 +652,18 @@ output_sframe_funcdesc (symbolS *start_of_fre_section,
                                  sfde_func_size));
 
   /* Offset to the first frame row entry.  */
-  exp.X_op = O_subtract;
-  exp.X_add_symbol = fre_symbol; /* Minuend.  */
-  exp.X_op_symbol = start_of_fre_section; /* Subtrahend.  */
-  exp.X_add_number = 0;
-  emit_expr (&exp, sizeof_member (sframe_func_desc_entry,
-                                 sfde_func_start_fre_off));
+  if (sframe_fde->num_fres == 0)
+    /* For FDEs without any FREs, set sfde_func_start_fre_off to zero.  */
+    out_four (0);
+  else
+    {
+      exp.X_op = O_subtract;
+      exp.X_add_symbol = fre_symbol; /* Minuend.  */
+      exp.X_op_symbol = start_of_fre_section; /* Subtrahend.  */
+      exp.X_add_number = 0;
+      emit_expr (&exp, sizeof_member (sframe_func_desc_entry,
+                                     sfde_func_start_fre_off));
+    }
 
   /* Number of FREs.  */
   out_four (sframe_fde->num_fres);
index 85500791f8ac2462870e779a28a4f5b615efcc77..b70b0e880c9b07bbb7d85f875bbf0f494c30a634 100644 (file)
@@ -1882,7 +1882,7 @@ sframe_encoder_write_sframe (sframe_encoder_ctx *encoder)
      - buffers must be malloc'd by the caller.  */
   if ((contents == NULL) || (buf_size < hdr_size))
     return sframe_set_errno (&err, SFRAME_ERR_BUF_INVAL);
-  if (fr_info == NULL)
+  if (ehp->sfh_num_fres > 0 && fr_info == NULL)
     return sframe_set_errno (&err, SFRAME_ERR_FRE_INVAL);
 
   /* Write out the FRE table first.
@@ -1905,6 +1905,13 @@ sframe_encoder_write_sframe (sframe_encoder_ctx *encoder)
       fre_type = sframe_get_fre_type (fdep);
       num_fres = fdep->sfde_func_num_fres;
 
+      /* For FDEs without any FREs, set sfde_func_start_fre_off to zero.  */
+      if (num_fres == 0)
+       fdep->sfde_func_start_fre_off = 0;
+
+      if (num_fres > 0 && fr_info == NULL)
+       return sframe_set_errno (&err, SFRAME_ERR_FRE_INVAL);
+
       for (j = 0; j < num_fres; j++)
        {
          fre_index = global + j;