]> git.ipfire.org Git - thirdparty/binutils-gdb.git/commitdiff
binutils: factorize handling of arch-specific DWARF augmentations
authorJose E. Marchesi <jose.marchesi@oracle.com>
Sat, 12 Jul 2025 08:56:45 +0000 (10:56 +0200)
committerJose E. Marchesi <jose.marchesi@oracle.com>
Sat, 12 Jul 2025 09:33:25 +0000 (11:33 +0200)
This patch factorizes the handling of architecture/machine specific
augmentation characters in CIEs.

Based on an idea proposed by Richard Earnshaw.

binutils/ChangeLog:

* dwarf.c (is_mach_augmentation_ftype): New type.
(is_mach_augmentation): New variable.
(is_nomach_augmentation): New function.
(is_aarch64_augmentation): Likewise.
(init_dwarf_by_elf_machine_code): Set is_mach_augmentation as
appropriate.
(init_dwarf_by_bfd_arch_and_mach): Likewise.
(read_cie): Handle architecture-specific augmentation characters
in a generic way.

binutils/dwarf.c

index 89594b5f5f2887beda7739a05dde0507ca070b5f..8540b28aa903ec72777e961a68d267b1900035d1 100644 (file)
@@ -8582,6 +8582,8 @@ typedef struct Frame_Chunk
 }
 Frame_Chunk;
 
+typedef bool (*is_mach_augmentation_ftype) (char c);
+static is_mach_augmentation_ftype is_mach_augmentation;
 typedef const char *(*dwarf_regname_lookup_ftype) (unsigned int);
 static dwarf_regname_lookup_ftype dwarf_regnames_lookup_func;
 static const char *const *dwarf_regnames;
@@ -8894,9 +8896,22 @@ init_dwarf_regnames_loongarch (void)
   dwarf_regnames_lookup_func = regname_internal_by_table_only;
 }
 
+static bool
+is_nomach_augmentation (char c ATTRIBUTE_UNUSED)
+{
+  return false;
+}
+
+static bool
+is_aarch64_augmentation (char c)
+{
+  return (c == 'B');
+}
+
 void
 init_dwarf_by_elf_machine_code (unsigned int e_machine)
 {
+  is_mach_augmentation = is_nomach_augmentation;
   dwarf_regnames_lookup_func = NULL;
   is_aarch64 = false;
 
@@ -8918,6 +8933,7 @@ init_dwarf_by_elf_machine_code (unsigned int e_machine)
 
     case EM_AARCH64:
       init_dwarf_regnames_aarch64 ();
+      is_mach_augmentation = is_aarch64_augmentation;
       break;
 
     case EM_S390:
@@ -8944,6 +8960,7 @@ void
 init_dwarf_by_bfd_arch_and_mach (enum bfd_architecture arch,
                                 unsigned long mach)
 {
+  is_mach_augmentation = is_nomach_augmentation;
   dwarf_regnames_lookup_func = NULL;
   is_aarch64 = false;
 
@@ -8971,6 +8988,7 @@ init_dwarf_by_bfd_arch_and_mach (enum bfd_architecture arch,
 
     case bfd_arch_aarch64:
       init_dwarf_regnames_aarch64();
+      is_mach_augmentation = is_aarch64_augmentation;
       break;
 
     case bfd_arch_s390:
@@ -9216,7 +9234,7 @@ read_cie (unsigned char *start, unsigned char *end,
            fc->fde_encoding = *q++;
          else if (*p == 'S')
            ;
-         else if (*p == 'B')
+         else if (is_mach_augmentation (*p))
            ;
          else
            break;