aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJose E. Marchesi <jose.marchesi@oracle.com>2025-07-12 10:56:45 +0200
committerJose E. Marchesi <jose.marchesi@oracle.com>2025-07-12 11:33:25 +0200
commit11d33617e04dc6c54274ce69640218efd26519f5 (patch)
treea5f32333a18f7fb381aaee6e0b3ecacf42aa55fd
parent3e97860c29ae2aee5644fd10cf868d2f1f5c9703 (diff)
downloadgdb-11d33617e04dc6c54274ce69640218efd26519f5.zip
gdb-11d33617e04dc6c54274ce69640218efd26519f5.tar.gz
gdb-11d33617e04dc6c54274ce69640218efd26519f5.tar.bz2
binutils: factorize handling of arch-specific DWARF augmentations
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.
-rw-r--r--binutils/dwarf.c20
1 files changed, 19 insertions, 1 deletions
diff --git a/binutils/dwarf.c b/binutils/dwarf.c
index 89594b5..8540b28 100644
--- a/binutils/dwarf.c
+++ b/binutils/dwarf.c
@@ -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;