gdb: add target_ops::supports_displaced_step
[deliverable/binutils-gdb.git] / bfd / coff-tic4x.c
index 1e95411e9e62c765f1acb5bfbbdb18c1c21dac11..713111b493f2081b15a597e668b7c0f85ec804a4 100644 (file)
@@ -1,6 +1,5 @@
 /* BFD back-end for TMS320C4X coff binaries.
-   Copyright 1996, 1997, 1998, 1999, 2000, 2002, 2003, 2005
-   Free Software Foundation, Inc.
+   Copyright (C) 1996-2020 Free Software Foundation, Inc.
 
    Contributed by Michael Hayes (m.hayes@elec.canterbury.ac.nz)
 
@@ -8,7 +7,7 @@
 
    This program is free software; you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
-   the Free Software Foundation; either version 2 of the License, or
+   the Free Software Foundation; either version 3 of the License, or
    (at your option) any later version.
 
    This program is distributed in the hope that it will be useful,
@@ -21,8 +20,8 @@
    Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA
    02110-1301, USA.  */
 
-#include "bfd.h"
 #include "sysdep.h"
+#include "bfd.h"
 #include "libbfd.h"
 #include "bfdlink.h"
 #include "coff/tic4x.h"
 #undef  F_LSYMS
 #define        F_LSYMS         F_LSYMS_TICOFF
 
-static bfd_boolean ticoff_bfd_is_local_label_name
-    PARAMS ((bfd *, const char *));
-static bfd_reloc_status_type tic4x_relocation
-    PARAMS ((bfd *, arelent *, asymbol *, PTR, asection *, bfd *, char ** ));
-static reloc_howto_type *tic4x_coff_reloc_type_lookup
-    PARAMS ((bfd *, bfd_reloc_code_real_type ));
-static void tic4x_lookup_howto
-    PARAMS ((arelent *, struct internal_reloc * ));
-static reloc_howto_type *coff_tic4x_rtype_to_howto
-    PARAMS ((bfd *, asection *, struct internal_reloc *, struct coff_link_hash_entry *, struct internal_syment *, bfd_vma * ));
-static void tic4x_reloc_processing
-    PARAMS ((arelent *, struct internal_reloc *, asymbol **, bfd *, asection * ));
-
+static reloc_howto_type *
+coff_tic4x_rtype_to_howto (bfd *, asection *, struct internal_reloc *,
+                          struct coff_link_hash_entry *,
+                          struct internal_syment *,  bfd_vma *);
+static void
+tic4x_reloc_processing (arelent *, struct internal_reloc *,
+                       asymbol **, bfd *, asection *);
 
 /* Replace the stock _bfd_coff_is_local_label_name to recognize TI COFF local
    labels.  */
 static bfd_boolean
-ticoff_bfd_is_local_label_name (abfd, name)
-  bfd *abfd ATTRIBUTE_UNUSED;
-  const char *name;
+ticoff_bfd_is_local_label_name (bfd *abfd ATTRIBUTE_UNUSED,
+                               const char *name)
 {
   if (TICOFF_LOCAL_LABEL_P(name))
     return TRUE;
@@ -69,27 +61,29 @@ ticoff_bfd_is_local_label_name (abfd, name)
    instead of setting BADMAG.  */
 #define BADMAG(x) COFF2_BADMAG(x)
 
-#undef coff_rtype_to_howto
-#define coff_rtype_to_howto coff_tic4x_rtype_to_howto
+#undef  coff_rtype_to_howto
+#define coff_rtype_to_howto    coff_tic4x_rtype_to_howto
+
+#ifndef bfd_pe_print_pdata
+#define bfd_pe_print_pdata     NULL
+#endif
 
 #include "coffcode.h"
 
 static bfd_reloc_status_type
-tic4x_relocation (abfd, reloc_entry, symbol, data, input_section,
-                 output_bfd, error_message)
-  bfd *abfd ATTRIBUTE_UNUSED;
-  arelent *reloc_entry;
-  asymbol *symbol ATTRIBUTE_UNUSED;
-  PTR data ATTRIBUTE_UNUSED;
-  asection *input_section;
-  bfd *output_bfd;
-  char **error_message ATTRIBUTE_UNUSED;
+tic4x_relocation (bfd *abfd ATTRIBUTE_UNUSED,
+                 arelent *reloc_entry,
+                 asymbol *symbol ATTRIBUTE_UNUSED,
+                 void * data ATTRIBUTE_UNUSED,
+                 asection *input_section,
+                 bfd *output_bfd,
+                 char **error_message ATTRIBUTE_UNUSED)
 {
   if (output_bfd != (bfd *) NULL)
     {
       /* This is a partial relocation, and we want to apply the
-        relocation to the reloc entry rather than the raw data.
-        Modify the reloc inplace to reflect what we now know.  */
+        relocation to the reloc entry rather than the raw data.
+        Modify the reloc inplace to reflect what we now know.  */
       reloc_entry->address += input_section->output_offset;
       return bfd_reloc_ok;
     }
@@ -117,14 +111,15 @@ reloc_howto_type tic4x_howto_table[] =
 
 #undef coff_bfd_reloc_type_lookup
 #define coff_bfd_reloc_type_lookup tic4x_coff_reloc_type_lookup
+#undef coff_bfd_reloc_name_lookup
+#define coff_bfd_reloc_name_lookup tic4x_coff_reloc_name_lookup
 
 /* For the case statement use the code values used tc_gen_reloc (defined in
    bfd/reloc.c) to map to the howto table entries.  */
 
 static reloc_howto_type *
-tic4x_coff_reloc_type_lookup (abfd, code)
-    bfd *abfd ATTRIBUTE_UNUSED;
-    bfd_reloc_code_real_type code;
+tic4x_coff_reloc_type_lookup (bfd *abfd ATTRIBUTE_UNUSED,
+                             bfd_reloc_code_real_type code)
 {
   unsigned int type;
   unsigned int i;
@@ -150,14 +145,29 @@ tic4x_coff_reloc_type_lookup (abfd, code)
   return NULL;
 }
 
+static reloc_howto_type *
+tic4x_coff_reloc_name_lookup (bfd *abfd ATTRIBUTE_UNUSED,
+                             const char *r_name)
+{
+  unsigned int i;
+
+  for (i = 0;
+       i < sizeof (tic4x_howto_table) / sizeof (tic4x_howto_table[0]);
+       i++)
+    if (tic4x_howto_table[i].name != NULL
+       && strcasecmp (tic4x_howto_table[i].name, r_name) == 0)
+      return &tic4x_howto_table[i];
+
+  return NULL;
+}
 
 /* Code to turn a r_type into a howto ptr, uses the above howto table.
    Called after some initial checking by the tic4x_rtype_to_howto fn
    below.  */
 static void
-tic4x_lookup_howto (internal, dst)
-     arelent *internal;
-     struct internal_reloc *dst;
+tic4x_lookup_howto (bfd *abfd,
+                   arelent *internal,
+                   struct internal_reloc *dst)
 {
   unsigned int i;
   int bank = (dst->r_symndx == -1) ? HOWTO_BANK : 0;
@@ -171,19 +181,18 @@ tic4x_lookup_howto (internal, dst)
        }
     }
 
-  (*_bfd_error_handler) (_("Unrecognized reloc type 0x%x"),
-                        (unsigned int) dst->r_type);
+  _bfd_error_handler (_("%pB: unsupported relocation type %#x"),
+                     abfd, (unsigned int) dst->r_type);
   abort();
 }
 
 static reloc_howto_type *
-coff_tic4x_rtype_to_howto (abfd, sec, rel, h, sym, addendp)
-     bfd *abfd ATTRIBUTE_UNUSED;
-     asection *sec;
-     struct internal_reloc *rel;
-     struct coff_link_hash_entry *h ATTRIBUTE_UNUSED;
-     struct internal_syment *sym ATTRIBUTE_UNUSED;
-     bfd_vma *addendp;
+coff_tic4x_rtype_to_howto (bfd *abfd,
+                          asection *sec,
+                          struct internal_reloc *rel,
+                          struct coff_link_hash_entry *h ATTRIBUTE_UNUSED,
+                          struct internal_syment *sym ATTRIBUTE_UNUSED,
+                          bfd_vma *addendp)
 {
   arelent genrel;
 
@@ -193,19 +202,18 @@ coff_tic4x_rtype_to_howto (abfd, sec, rel, h, sym, addendp)
        in the output section.  */
     *addendp = (sec->output_section->vma + sec->output_offset) - sec->vma;
 
-  tic4x_lookup_howto (&genrel, rel);
+  tic4x_lookup_howto (abfd, &genrel, rel);
 
   return genrel.howto;
 }
 
 
 static void
-tic4x_reloc_processing (relent, reloc, symbols, abfd, section)
-     arelent *relent;
-     struct internal_reloc *reloc;
-     asymbol **symbols;
-     bfd *abfd;
-     asection *section;
+tic4x_reloc_processing (arelent *relent,
+                       struct internal_reloc *reloc,
+                       asymbol **symbols,
+                       bfd *abfd,
+                       asection *section)
 {
   asymbol *ptr;
 
@@ -214,19 +222,20 @@ tic4x_reloc_processing (relent, reloc, symbols, abfd, section)
   if (reloc->r_symndx != -1)
     {
       if (reloc->r_symndx < 0 || reloc->r_symndx >= obj_conv_table_size (abfd))
-        {
-          (*_bfd_error_handler)
-            (_("%s: warning: illegal symbol index %ld in relocs"),
-             bfd_get_filename (abfd), reloc->r_symndx);
-          relent->sym_ptr_ptr = bfd_abs_section_ptr->symbol_ptr_ptr;
-          ptr = NULL;
-        }
+       {
+         _bfd_error_handler
+           /* xgettext: c-format */
+           (_("%pB: warning: illegal symbol index %ld in relocs"),
+            abfd, reloc->r_symndx);
+         relent->sym_ptr_ptr = bfd_abs_section_ptr->symbol_ptr_ptr;
+         ptr = NULL;
+       }
       else
-        {
-          relent->sym_ptr_ptr = (symbols
-                                 + obj_convert (abfd)[reloc->r_symndx]);
-          ptr = *(relent->sym_ptr_ptr);
-        }
+       {
+         relent->sym_ptr_ptr = (symbols
+                                + obj_convert (abfd)[reloc->r_symndx]);
+         ptr = *(relent->sym_ptr_ptr);
+       }
     }
   else
     {
@@ -248,24 +257,36 @@ tic4x_reloc_processing (relent, reloc, symbols, abfd, section)
   /* !!     relent->section = (asection *) NULL;  */
 
   /* Fill in the relent->howto field from reloc->r_type.  */
-  tic4x_lookup_howto (relent, reloc);
+  tic4x_lookup_howto (abfd, relent, reloc);
 }
 
 
 /* TI COFF v0, DOS tools (little-endian headers).  */
-CREATE_LITTLE_COFF_TARGET_VEC(tic4x_coff0_vec, "coff0-tic4x", HAS_LOAD_PAGE, 0, '_', NULL, (PTR)&ticoff0_swap_table);
+CREATE_LITTLE_COFF_TARGET_VEC(tic4x_coff0_vec, "coff0-tic4x",
+                             0, SEC_CODE | SEC_READONLY, '_',
+                             NULL, &ticoff0_swap_table);
 
 /* TI COFF v0, SPARC tools (big-endian headers).  */
-CREATE_BIGHDR_COFF_TARGET_VEC(tic4x_coff0_beh_vec, "coff0-beh-tic4x", HAS_LOAD_PAGE, 0, '_', &tic4x_coff0_vec, (PTR)&ticoff0_swap_table);
+CREATE_BIGHDR_COFF_TARGET_VEC(tic4x_coff0_beh_vec, "coff0-beh-tic4x",
+                             0, SEC_CODE | SEC_READONLY, '_',
+                             &tic4x_coff0_vec, &ticoff0_swap_table);
 
 /* TI COFF v1, DOS tools (little-endian headers).  */
-CREATE_LITTLE_COFF_TARGET_VEC(tic4x_coff1_vec, "coff1-tic4x", HAS_LOAD_PAGE, 0, '_', &tic4x_coff0_beh_vec, (PTR)&ticoff1_swap_table);
+CREATE_LITTLE_COFF_TARGET_VEC(tic4x_coff1_vec, "coff1-tic4x",
+                             0, SEC_CODE | SEC_READONLY, '_',
+                             &tic4x_coff0_beh_vec, &ticoff1_swap_table);
 
 /* TI COFF v1, SPARC tools (big-endian headers).  */
-CREATE_BIGHDR_COFF_TARGET_VEC(tic4x_coff1_beh_vec, "coff1-beh-tic4x", HAS_LOAD_PAGE, 0, '_', &tic4x_coff1_vec, (PTR)&ticoff1_swap_table);
+CREATE_BIGHDR_COFF_TARGET_VEC(tic4x_coff1_beh_vec, "coff1-beh-tic4x",
+                             0, SEC_CODE | SEC_READONLY, '_',
+                             &tic4x_coff1_vec, &ticoff1_swap_table);
 
 /* TI COFF v2, TI DOS tools output (little-endian headers).  */
-CREATE_LITTLE_COFF_TARGET_VEC(tic4x_coff2_vec, "coff2-tic4x", HAS_LOAD_PAGE, 0, '_', &tic4x_coff1_beh_vec, COFF_SWAP_TABLE);
+CREATE_LITTLE_COFF_TARGET_VEC(tic4x_coff2_vec, "coff2-tic4x",
+                             0, SEC_CODE | SEC_READONLY, '_',
+                             &tic4x_coff1_beh_vec, COFF_SWAP_TABLE);
 
 /* TI COFF v2, TI SPARC tools output (big-endian headers).  */
-CREATE_BIGHDR_COFF_TARGET_VEC(tic4x_coff2_beh_vec, "coff2-beh-tic4x", HAS_LOAD_PAGE, 0, '_', &tic4x_coff2_vec, COFF_SWAP_TABLE);
+CREATE_BIGHDR_COFF_TARGET_VEC(tic4x_coff2_beh_vec, "coff2-beh-tic4x",
+                             0, SEC_CODE | SEC_READONLY, '_',
+                             &tic4x_coff2_vec, COFF_SWAP_TABLE);
This page took 0.026787 seconds and 4 git commands to generate.