]> git.ipfire.org Git - thirdparty/binutils-gdb.git/commitdiff
libsframe: refactor code for dumping section flags
authorIndu Bhagat <indu.bhagat@oracle.com>
Wed, 21 May 2025 04:22:21 +0000 (21:22 -0700)
committerIndu Bhagat <indu.bhagat@oracle.com>
Wed, 28 May 2025 04:58:13 +0000 (21:58 -0700)
To prepare code for accommodating new flag additions easily as the
format evolves.

libsframe/
        * sframe-dump.c (SFRAME_HEADER_FLAGS_STR_MAX_LEN): Rename from.
        (struct dump_flags_helper): New helper struct definition.
        (dump_sframe_header_flags): .. to here.  New definition.
        (SFRAME_FLAGS_STR_MAX_LEN): Rename to.
        (MAX_NUM_FLAGS): New definition.
        (dump_sframe_header): Move some implementation from here ..

libsframe/sframe-dump.c

index 1fa508d9bad2029a5e416581d8cad738ed544925..d6f838d4fc099239ea1d2a199d5fed3c1d345d8b 100644 (file)
@@ -23,8 +23,6 @@
 #include <inttypes.h>
 #include "sframe-impl.h"
 
-#define SFRAME_HEADER_FLAGS_STR_MAX_LEN 50
-
 /* Return TRUE if the SFrame section is associated with the aarch64 ABIs.  */
 
 static bool
@@ -40,12 +38,63 @@ is_sframe_abi_arch_aarch64 (sframe_decoder_ctx *sfd_ctx)
   return aarch64_p;
 }
 
+struct dump_flags_helper
+{
+  uint8_t flag;
+  const char *flag_str;
+};
+
 static void
-dump_sframe_header (sframe_decoder_ctx *sfd_ctx)
+dump_sframe_header_flags (sframe_decoder_ctx *sfd_ctx)
 {
-  uint8_t ver;
   uint8_t flags;
   char *flags_str;
+  bool first_p = true;
+
+  flags = sframe_decoder_get_flags (sfd_ctx);
+  if (!flags)
+    {
+      printf ("    Flags: NONE\n");
+      return;
+    }
+
+  /* PS: Keep SFRAME_FLAGS_STR_MAX_LEN in sync if adding more members to
+     this array.  */
+#define SFRAME_FLAGS_STR_MAX_LEN 50
+#define MAX_NUM_FLAGS 2
+  const struct dump_flags_helper flags_helper[MAX_NUM_FLAGS] = {
+      { SFRAME_F_FDE_SORTED, "SFRAME_F_FDE_SORTED"},
+      { SFRAME_F_FRAME_POINTER, "SFRAME_F_FRAME_POINTER"}
+  };
+
+  /* Prepare SFrame section flags string.  */
+  flags_str = (char*) calloc (SFRAME_FLAGS_STR_MAX_LEN, sizeof (char));
+
+  for (unsigned int i = 0; i < MAX_NUM_FLAGS; i++)
+    {
+      if (flags & flags_helper[i].flag)
+       {
+         strcpy (flags_str, flags_helper[i].flag_str);
+         flags = (flags & ~flags_helper[i].flag);
+         if (flags)
+           strcat (flags_str, ",");
+
+         if (first_p)
+           {
+             printf ("    Flags: %s\n", flags_str);
+             first_p = false;
+           }
+         else
+           printf ("           %s\n", flags_str);
+       }
+    }
+  free (flags_str);
+}
+
+static void
+dump_sframe_header (sframe_decoder_ctx *sfd_ctx)
+{
+  uint8_t ver;
   const char *ver_str = NULL;
   int8_t cfa_fixed_fp_offset;
   int8_t cfa_fixed_ra_offset;
@@ -57,33 +106,10 @@ dump_sframe_header (sframe_decoder_ctx *sfd_ctx)
        "SFRAME_VERSION_1",
        "SFRAME_VERSION_2" };
 
-  /* PS: Keep SFRAME_HEADER_FLAGS_STR_MAX_LEN in sync if adding more members to
-     this array.  */
-  const char *flag_names[]
-    = { "SFRAME_F_FDE_SORTED",
-       "SFRAME_F_FRAME_POINTER" };
-
   ver = sframe_decoder_get_version (sfd_ctx);
   if (ver <= SFRAME_VERSION)
     ver_str = version_names[ver];
 
-  /* Prepare SFrame section flags string.  */
-  flags = header->sfh_preamble.sfp_flags;
-  flags_str = (char*) calloc (SFRAME_HEADER_FLAGS_STR_MAX_LEN, sizeof (char));
-  if (flags)
-    {
-      if (flags & SFRAME_F_FDE_SORTED)
-       strcpy (flags_str, flag_names[0]);
-      if (flags & SFRAME_F_FRAME_POINTER)
-       {
-         if (strlen (flags_str) > 0)
-           strcpy (flags_str, ",");
-         strcpy (flags_str, flag_names[1]);
-       }
-    }
-  else
-    strcpy (flags_str, "NONE");
-
   /* CFA fixed FP and RA offsets.  */
   cfa_fixed_fp_offset = header->sfh_cfa_fixed_fp_offset;
   cfa_fixed_ra_offset = header->sfh_cfa_fixed_ra_offset;
@@ -93,15 +119,15 @@ dump_sframe_header (sframe_decoder_ctx *sfd_ctx)
   printf ("  %s :\n", subsec_name);
   printf ("\n");
   printf ("    Version: %s\n", ver_str);
-  printf ("    Flags: %s\n", flags_str);
+
+  dump_sframe_header_flags (sfd_ctx);
+
   if (cfa_fixed_fp_offset != SFRAME_CFA_FIXED_FP_INVALID)
     printf ("    CFA fixed FP offset: %d\n", cfa_fixed_fp_offset);
   if (cfa_fixed_ra_offset != SFRAME_CFA_FIXED_RA_INVALID)
     printf ("    CFA fixed RA offset: %d\n", cfa_fixed_ra_offset);
   printf ("    Num FDEs: %d\n", sframe_decoder_get_num_fidx (sfd_ctx));
   printf ("    Num FREs: %d\n", header->sfh_num_fres);
-
-  free (flags_str);
 }
 
 static void