binutils: Add a new function to initialise DWARF register name state
authorAndrew Burgess <andrew.burgess@embecosm.com>
Mon, 18 Nov 2019 12:09:04 +0000 (12:09 +0000)
committerAndrew Burgess <andrew.burgess@embecosm.com>
Thu, 28 Nov 2019 00:03:03 +0000 (00:03 +0000)
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
binutils/dwarf.c
binutils/dwarf.h
binutils/objdump.c

index 3aba2f214beb8f94a671be4a87bf8c8e457b7c6f..c7cb68ca81a5ea094f72b3fe1cf2d9c1ef3ba5e8 100644 (file)
@@ -1,3 +1,12 @@
+2019-11-22  Andrew Burgess  <andrew.burgess@embecosm.com>
+
+       * 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  <andrew.burgess@embecosm.com>
 
        * dwarf.c (init_dwarf_regnames): Renamed to...
index c888aad39886c04bc8abb7e00f778568948da225..a770c57f6083416ef2fa32d4526c310366f5bb78 100644 (file)
@@ -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)
 {
index 204f00ef53d3dc49b4aa9c0c498531b342c44547..8272de857b5b9d1dff825d5640f5463ad2c08637 100644 (file)
@@ -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);
index 115f1fc000421d723230747990bff3597ea8b0dd..6a1f142a0ebc8f354c2999ba3c5d91aa8148554f 100644 (file)
@@ -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);
 }
 \f