From 229a22cfd2fd3c82a1b57d4af104f361cb0b0a33 Mon Sep 17 00:00:00 2001 From: Andrew Burgess Date: Mon, 18 Nov 2019 12:09:04 +0000 Subject: [PATCH] binutils: Add a new function to initialise DWARF register name state Adds a new API function init_dwarf_regnames_by_bfd_arch_and_mach to initialise the register name state from a BFD architecture and machine type. There should be no user visible changes after this commit. binutils/ChangeLog: * dwarf.c (init_dwarf_regnames_by_bfd_arch_and_mach): New function. * dwarf.h (init_dwarf_regnames_by_bfd_arch_and_mach): Declare. * objdump.c (dump_dwarf): Call new function instead of calling specific initialization routines. Restrucure so that eh_addr_size is still calculated correctly. Change-Id: I346d665d2079a18ec4d04bd41893d0e9dc05e4b3 --- binutils/ChangeLog | 9 +++++++++ binutils/dwarf.c | 48 ++++++++++++++++++++++++++++++++++++++++++++++ binutils/dwarf.h | 2 ++ binutils/objdump.c | 40 ++++---------------------------------- 4 files changed, 63 insertions(+), 36 deletions(-) diff --git a/binutils/ChangeLog b/binutils/ChangeLog index 3aba2f214b..c7cb68ca81 100644 --- a/binutils/ChangeLog +++ b/binutils/ChangeLog @@ -1,3 +1,12 @@ +2019-11-22 Andrew Burgess + + * dwarf.c (init_dwarf_regnames_by_bfd_arch_and_mach): New + function. + * dwarf.h (init_dwarf_regnames_by_bfd_arch_and_mach): Declare. + * objdump.c (dump_dwarf): Call new function instead of calling + specific initialization routines. Restrucure so that eh_addr_size + is still calculated correctly. + 2019-11-22 Andrew Burgess * dwarf.c (init_dwarf_regnames): Renamed to... diff --git a/binutils/dwarf.c b/binutils/dwarf.c index c888aad398..a770c57f60 100644 --- a/binutils/dwarf.c +++ b/binutils/dwarf.c @@ -7625,6 +7625,54 @@ init_dwarf_regnames_by_elf_machine_code (unsigned int e_machine) } } +/* Initialize the DWARF register name lookup state based on the + architecture and specific machine type of a BFD. */ + +void +init_dwarf_regnames_by_bfd_arch_and_mach (enum bfd_architecture arch, + unsigned long mach) +{ + switch (arch) + { + case bfd_arch_i386: + switch (mach) + { + case bfd_mach_x86_64: + case bfd_mach_x86_64_intel_syntax: + case bfd_mach_x86_64_nacl: + case bfd_mach_x64_32: + case bfd_mach_x64_32_intel_syntax: + case bfd_mach_x64_32_nacl: + init_dwarf_regnames_x86_64 (); + break; + + default: + init_dwarf_regnames_i386 (); + break; + } + break; + + case bfd_arch_iamcu: + init_dwarf_regnames_iamcu (); + break; + + case bfd_arch_aarch64: + init_dwarf_regnames_aarch64(); + break; + + case bfd_arch_s390: + init_dwarf_regnames_s390 (); + break; + + case bfd_arch_riscv: + init_dwarf_regnames_riscv (); + break; + + default: + break; + } +} + static const char * regname (unsigned int regno, int row) { diff --git a/binutils/dwarf.h b/binutils/dwarf.h index 204f00ef53..8272de857b 100644 --- a/binutils/dwarf.h +++ b/binutils/dwarf.h @@ -226,6 +226,8 @@ extern unsigned long dwarf_start_die; extern int dwarf_check; extern void init_dwarf_regnames_by_elf_machine_code (unsigned int); +extern void init_dwarf_regnames_by_bfd_arch_and_mach (enum bfd_architecture arch, + unsigned long mach); extern void init_dwarf_regnames_i386 (void); extern void init_dwarf_regnames_iamcu (void); extern void init_dwarf_regnames_x86_64 (void); diff --git a/binutils/objdump.c b/binutils/objdump.c index 115f1fc000..6a1f142a0e 100644 --- a/binutils/objdump.c +++ b/binutils/objdump.c @@ -2975,44 +2975,8 @@ dump_dwarf (bfd *abfd) return; } - eh_addr_size = bfd_arch_bits_per_address (abfd) / 8; - switch (bfd_get_arch (abfd)) { - case bfd_arch_i386: - switch (bfd_get_mach (abfd)) - { - case bfd_mach_x86_64: - case bfd_mach_x86_64_intel_syntax: - case bfd_mach_x86_64_nacl: - case bfd_mach_x64_32: - case bfd_mach_x64_32_intel_syntax: - case bfd_mach_x64_32_nacl: - init_dwarf_regnames_x86_64 (); - break; - - default: - init_dwarf_regnames_i386 (); - break; - } - break; - - case bfd_arch_iamcu: - init_dwarf_regnames_iamcu (); - break; - - case bfd_arch_aarch64: - init_dwarf_regnames_aarch64(); - break; - - case bfd_arch_s390: - init_dwarf_regnames_s390 (); - break; - - case bfd_arch_riscv: - init_dwarf_regnames_riscv (); - break; - case bfd_arch_s12z: /* S12Z has a 24 bit address space. But the only known producer of dwarf_info encodes addresses into 32 bits. */ @@ -3020,9 +2984,13 @@ dump_dwarf (bfd *abfd) break; default: + eh_addr_size = bfd_arch_bits_per_address (abfd) / 8; break; } + init_dwarf_regnames_by_bfd_arch_and_mach (bfd_get_arch (abfd), + bfd_get_mach (abfd)); + bfd_map_over_sections (abfd, dump_dwarf_section, NULL); } -- 2.34.1