gdb: add target_ops::supports_displaced_step
[deliverable/binutils-gdb.git] / bfd / aout-tic30.c
index 7fcdf6240bb4e6c5b20e836189e1334feec67a32..222d1f0e30d74c57bcc081cfc9170d4610d0fd8a 100644 (file)
@@ -1,5 +1,5 @@
 /* BFD back-end for TMS320C30 a.out binaries.
-   Copyright (C) 1998-2015 Free Software Foundation, Inc.
+   Copyright (C) 1998-2020 Free Software Foundation, Inc.
    Contributed by Steven Haworth (steve@pm.cse.rmit.edu.au)
 
    This file is part of BFD, the Binary File Descriptor library.
 
 #define TARGET_IS_BIG_ENDIAN_P
 #define N_HEADER_IN_TEXT(x)    1
-#define TEXT_START_ADDR        1024
-#define TARGET_PAGE_SIZE       128
-#define SEGMENT_SIZE                   TARGET_PAGE_SIZE
-#define DEFAULT_ARCH           bfd_arch_tic30
+#define TEXT_START_ADDR                1024
+#define TARGET_PAGE_SIZE       128
+#define SEGMENT_SIZE           TARGET_PAGE_SIZE
+#define DEFAULT_ARCH           bfd_arch_tic30
 #define ARCH_SIZE 32
 
 /* Do not "beautify" the CONCAT* macro args.  Traditional C will not
 
 #define MY_reloc_howto(BFD, REL, IN, EX, PC)   tic30_aout_reloc_howto (BFD, REL, & IN, & EX, & PC)
 
-#define MY_final_link_relocate    tic30_aout_final_link_relocate
-#define MY_object_p               tic30_aout_object_p
-#define MY_mkobject               NAME (aout,mkobject)
+#define MY_final_link_relocate   tic30_aout_final_link_relocate
+#define MY_object_p              tic30_aout_object_p
+#define MY_mkobject              NAME (aout,mkobject)
 #define MY_write_object_contents  tic30_aout_write_object_contents
-#define MY_set_sizes              tic30_aout_set_sizes
+#define MY_set_sizes             tic30_aout_set_sizes
 
 #ifndef MY_exec_hdr_flags
 #define MY_exec_hdr_flags 1
@@ -324,14 +324,14 @@ tic30_aout_reloc_howto (bfd *abfd,
  (bfd_get_8 (BFD, ADDR + 2)      )
 
 #define bfd_putb_24(BFD,DATA,ADDR)                             \
- bfd_put_8 (BFD, (bfd_byte) ((DATA >> 16) & 0xFF), ADDR    );  \
+ bfd_put_8 (BFD, (bfd_byte) ((DATA >> 16) & 0xFF), ADDR           );   \
  bfd_put_8 (BFD, (bfd_byte) ((DATA >>  8) & 0xFF), ADDR + 1);  \
- bfd_put_8 (BFD, (bfd_byte) ( DATA        & 0xFF), ADDR + 2)
+ bfd_put_8 (BFD, (bfd_byte) ( DATA       & 0xFF), ADDR + 2)
 
 /* Set parameters about this a.out file that are machine-dependent.
    This routine is called from some_aout_object_p just before it returns.  */
 
-static const bfd_target *
+static bfd_cleanup
 tic30_aout_callback (bfd *abfd)
 {
   struct internal_exec *execp = exec_hdr (abfd);
@@ -339,32 +339,32 @@ tic30_aout_callback (bfd *abfd)
   unsigned long arch_align;
 
   /* Calculate the file positions of the parts of a newly read aout header.  */
-  obj_textsec (abfd)->size = N_TXTSIZE (*execp);
+  obj_textsec (abfd)->size = N_TXTSIZE (execp);
 
   /* The virtual memory addresses of the sections.  */
-  obj_textsec (abfd)->vma = N_TXTADDR (*execp);
-  obj_datasec (abfd)->vma = N_DATADDR (*execp);
-  obj_bsssec (abfd)->vma = N_BSSADDR (*execp);
+  obj_textsec (abfd)->vma = N_TXTADDR (execp);
+  obj_datasec (abfd)->vma = N_DATADDR (execp);
+  obj_bsssec (abfd)->vma = N_BSSADDR (execp);
 
   obj_textsec (abfd)->lma = obj_textsec (abfd)->vma;
   obj_datasec (abfd)->lma = obj_datasec (abfd)->vma;
   obj_bsssec (abfd)->lma = obj_bsssec (abfd)->vma;
 
   /* The file offsets of the sections.  */
-  obj_textsec (abfd)->filepos = N_TXTOFF (*execp);
-  obj_datasec (abfd)->filepos = N_DATOFF (*execp);
+  obj_textsec (abfd)->filepos = N_TXTOFF (execp);
+  obj_datasec (abfd)->filepos = N_DATOFF (execp);
 
   /* The file offsets of the relocation info.  */
-  obj_textsec (abfd)->rel_filepos = N_TRELOFF (*execp);
-  obj_datasec (abfd)->rel_filepos = N_DRELOFF (*execp);
+  obj_textsec (abfd)->rel_filepos = N_TRELOFF (execp);
+  obj_datasec (abfd)->rel_filepos = N_DRELOFF (execp);
 
   /* The file offsets of the string table and symbol table.  */
-  obj_sym_filepos (abfd) = N_SYMOFF (*execp);
-  obj_str_filepos (abfd) = N_STROFF (*execp);
+  obj_sym_filepos (abfd) = N_SYMOFF (execp);
+  obj_str_filepos (abfd) = N_STROFF (execp);
 
   /* Determine the architecture and machine type of the object file.  */
 #ifdef SET_ARCH_MACH
-  SET_ARCH_MACH (abfd, *execp);
+  SET_ARCH_MACH (abfd, execp);
 #else
   bfd_default_set_arch_mach (abfd, DEFAULT_ARCH, 0L);
 #endif
@@ -388,7 +388,7 @@ tic30_aout_callback (bfd *abfd)
       obj_datasec (abfd)->alignment_power = arch_align_power;
       obj_bsssec (abfd)->alignment_power = arch_align_power;
     }
-  return abfd->xvec;
+  return _bfd_no_cleanup;
 }
 
 static bfd_reloc_status_type
@@ -547,13 +547,13 @@ tic30_aout_final_link_relocate (reloc_howto_type *howto,
 
 /* Finish up the reading of an a.out file header.  */
 
-static const bfd_target *
+static bfd_cleanup
 tic30_aout_object_p (bfd *abfd)
 {
   struct external_exec exec_bytes;     /* Raw exec header from file.  */
   struct internal_exec exec;           /* Cleaned-up exec header.  */
-  const bfd_target *target;
-  bfd_size_type amt = EXEC_BYTES_SIZE;
+  bfd_cleanup cleanup;
+  size_t amt = EXEC_BYTES_SIZE;
 
   if (bfd_bread (& exec_bytes, amt, abfd) != amt)
     {
@@ -568,10 +568,10 @@ tic30_aout_object_p (bfd *abfd)
   exec.a_info = H_GET_32 (abfd, exec_bytes.e_info);
 #endif /* SWAP_MAGIC */
 
-  if (N_BADMAG (exec))
+  if (N_BADMAG (&exec))
     return 0;
 #ifdef MACHTYPE_OK
-  if (!(MACHTYPE_OK (N_MACHTYPE (exec))))
+  if (!(MACHTYPE_OK (N_MACHTYPE (&exec))))
     return 0;
 #endif
 
@@ -582,7 +582,7 @@ tic30_aout_object_p (bfd *abfd)
   exec.a_info = SWAP_MAGIC (exec_bytes.e_info);
 #endif
 
-  target = NAME (aout, some_aout_object_p) (abfd, &exec, tic30_aout_callback);
+  cleanup = NAME (aout, some_aout_object_p) (abfd, &exec, tic30_aout_callback);
 
 #ifdef ENTRY_CAN_BE_ZERO
   /* The NEWSOS3 entry-point is/was 0, which (amongst other lossage)
@@ -603,7 +603,7 @@ tic30_aout_object_p (bfd *abfd)
     }
 #endif
 
-  return target;
+  return cleanup;
 }
 
 /* Copy private section data.  This actually does nothing with the
@@ -636,11 +636,8 @@ tic30_aout_write_object_contents (bfd *abfd)
   obj_reloc_entry_size (abfd) = RELOC_STD_SIZE;
 
   {
-    bfd_size_type text_size;   /* Dummy vars.  */
-    file_ptr text_end;
-
     if (adata (abfd).magic == undecided_magic)
-      NAME (aout, adjust_sizes_and_vmas) (abfd, &text_size, &text_end);
+      NAME (aout, adjust_sizes_and_vmas) (abfd);
 
     execp->a_syms = bfd_get_symcount (abfd) * EXTERNAL_NLIST_SIZE;
     execp->a_entry = bfd_get_start_address (abfd);
@@ -664,19 +661,19 @@ tic30_aout_write_object_contents (bfd *abfd)
     if (bfd_get_outsymbols (abfd) != (asymbol **) NULL
        && bfd_get_symcount (abfd) != 0)
       {
-       if (bfd_seek (abfd, (file_ptr) (N_SYMOFF (*execp)), SEEK_SET) != 0)
+       if (bfd_seek (abfd, (file_ptr) (N_SYMOFF (execp)), SEEK_SET) != 0)
          return FALSE;
 
        if (!NAME (aout, write_syms) (abfd))
          return FALSE;
       }
 
-    if (bfd_seek (abfd, (file_ptr) (N_TRELOFF (*execp)), SEEK_SET) != 0)
+    if (bfd_seek (abfd, (file_ptr) (N_TRELOFF (execp)), SEEK_SET) != 0)
       return FALSE;
     if (!NAME (aout, squirt_out_relocs) (abfd, obj_textsec (abfd)))
       return FALSE;
 
-    if (bfd_seek (abfd, (file_ptr) (N_DRELOFF (*execp)), SEEK_SET) != 0)
+    if (bfd_seek (abfd, (file_ptr) (N_DRELOFF (execp)), SEEK_SET) != 0)
       return FALSE;
     if (!NAME (aout, squirt_out_relocs) (abfd, obj_datasec (abfd)))
       return FALSE;
@@ -713,53 +710,87 @@ static bfd_boolean
 MY_bfd_final_link (bfd *abfd, struct bfd_link_info *info)
 {
   struct internal_exec *execp = exec_hdr (abfd);
+  asection *objsym_section;
   file_ptr pos;
   bfd_vma vma = 0;
-  int pad;
 
   /* Set the executable header size to 0, as we don't want one for an
-     output.  */
+     output.  FIXME: Really?  tic30_aout_object_p doesn't accept such
+     an executable!  */
   adata (abfd).exec_bytes_size = 0;
+
   pos = adata (abfd).exec_bytes_size;
+  /* ??? Why are we looking at create_object_symbols_section?  */
+  objsym_section = info->create_object_symbols_section;
+  if (objsym_section != NULL)
+    vma = objsym_section->vma;
+
   /* Text.  */
-  vma = info->create_object_symbols_section->vma;
-  pos += vma;
-  obj_textsec (abfd)->filepos = pos;
-  obj_textsec (abfd)->vma = vma;
-  obj_textsec (abfd)->user_set_vma = 1;
-  pos += obj_textsec (abfd)->size;
-  vma += obj_textsec (abfd)->size;
+  if (obj_textsec (abfd) != NULL)
+    {
+      pos += vma;
+      obj_textsec (abfd)->filepos = pos;
+      obj_textsec (abfd)->vma = vma;
+      obj_textsec (abfd)->user_set_vma = 1;
+      execp->a_text = obj_textsec (abfd)->size;
+      pos += obj_textsec (abfd)->size;
+      vma += obj_textsec (abfd)->size;
+    }
 
   /* Data.  */
-  if (abfd->flags & D_PAGED)
+  if (obj_datasec (abfd) != NULL)
     {
-      if (info->create_object_symbols_section->next->vma > 0)
-       obj_datasec (abfd)->vma = info->create_object_symbols_section->next->vma;
+      if (abfd->flags & D_PAGED)
+       {
+         if (objsym_section != NULL
+             && objsym_section->next != NULL
+             && objsym_section->next->vma != 0)
+           obj_datasec (abfd)->vma = objsym_section->next->vma;
+         else
+           obj_datasec (abfd)->vma = BFD_ALIGN (vma, adata (abfd).segment_size);
+       }
       else
-       obj_datasec (abfd)->vma = BFD_ALIGN (vma, adata (abfd).segment_size);
-    }
-  else
-    obj_datasec (abfd)->vma = BFD_ALIGN (vma, 4);
+       obj_datasec (abfd)->vma = BFD_ALIGN (vma, 4);
+
+      if (obj_datasec (abfd)->vma < vma)
+       obj_datasec (abfd)->vma = BFD_ALIGN (vma, 4);
 
-  if (obj_datasec (abfd)->vma < vma)
-    obj_datasec (abfd)->vma = BFD_ALIGN (vma, 4);
+      pos += obj_datasec (abfd)->vma - vma;
+      obj_datasec (abfd)->filepos = pos;
+      obj_datasec (abfd)->user_set_vma = 1;
 
-  obj_datasec (abfd)->user_set_vma = 1;
-  vma = obj_datasec (abfd)->vma;
-  obj_datasec (abfd)->filepos = vma + adata (abfd).exec_bytes_size;
-  execp->a_text = vma - obj_textsec (abfd)->vma;
-  obj_textsec (abfd)->size = execp->a_text;
+      vma = obj_datasec (abfd)->vma;
+      if (obj_textsec (abfd) != NULL)
+       {
+         execp->a_text = vma - obj_textsec (abfd)->vma;
+         obj_textsec (abfd)->size = execp->a_text;
+       }
+      execp->a_data = obj_datasec (abfd)->size;
+      vma += obj_datasec (abfd)->size;
+    }
 
   /* Since BSS follows data immediately, see if it needs alignment.  */
-  vma += obj_datasec (abfd)->size;
-  pad = align_power (vma, obj_bsssec (abfd)->alignment_power) - vma;
-  obj_datasec (abfd)->size += pad;
-  pos += obj_datasec (abfd)->size;
-  execp->a_data = obj_datasec (abfd)->size;
+  if (obj_bsssec (abfd) != NULL)
+    {
+      int pad;
 
-  /* BSS.  */
-  obj_bsssec (abfd)->vma = vma;
-  obj_bsssec (abfd)->user_set_vma = 1;
+      pad = align_power (vma, obj_bsssec (abfd)->alignment_power) - vma;
+      if (obj_datasec (abfd) != NULL)
+       {
+         obj_datasec (abfd)->size += pad;
+         execp->a_data += pad;
+       }
+      else if (obj_textsec (abfd) != NULL)
+       {
+         obj_textsec (abfd)->size += pad;
+         execp->a_text += pad;
+       }
+
+      /* BSS.  */
+      vma += pad;
+      obj_bsssec (abfd)->vma = vma;
+      obj_bsssec (abfd)->user_set_vma = 1;
+    }
 
   /* We are fully resized, so don't readjust in final_link.  */
   adata (abfd).magic = z_magic;
@@ -831,7 +862,7 @@ tic30_aout_set_arch_mach (bfd *abfd,
   _bfd_archive_bsd_construct_extended_name_table
 #endif
 #ifndef        MY_write_armap
-#define        MY_write_armap                  bsd_write_armap
+#define        MY_write_armap                  _bfd_bsd_write_armap
 #endif
 #ifndef MY_read_ar_hdr
 #define MY_read_ar_hdr                 _bfd_generic_read_ar_hdr
@@ -843,12 +874,12 @@ tic30_aout_set_arch_mach (bfd *abfd,
 #define        MY_truncate_arname              bfd_bsd_truncate_arname
 #endif
 #ifndef MY_update_armap_timestamp
-#define MY_update_armap_timestamp      _bfd_archive_bsd_update_armap_timestamp
+#define MY_update_armap_timestamp      _bfd_archive_bsd_update_armap_timestamp
 #endif
 
 /* No core file defined here -- configure in trad-core.c separately.  */
 #ifndef        MY_core_file_failing_command
-#define        MY_core_file_failing_command    _bfd_nocore_core_file_failing_command
+#define        MY_core_file_failing_command    _bfd_nocore_core_file_failing_command
 #endif
 #ifndef        MY_core_file_failing_signal
 #define        MY_core_file_failing_signal     _bfd_nocore_core_file_failing_signal
@@ -858,21 +889,20 @@ tic30_aout_set_arch_mach (bfd *abfd,
                                _bfd_nocore_core_file_matches_executable_p
 #endif
 #ifndef        MY_core_file_pid
-#define        MY_core_file_pid                _bfd_nocore_core_file_pid
+#define        MY_core_file_pid                _bfd_nocore_core_file_pid
 #endif
 #ifndef        MY_core_file_p
 #define        MY_core_file_p                  _bfd_dummy_target
 #endif
 
 #ifndef MY_bfd_debug_info_start
-#define MY_bfd_debug_info_start                bfd_void
+#define MY_bfd_debug_info_start                _bfd_void_bfd
 #endif
 #ifndef MY_bfd_debug_info_end
-#define MY_bfd_debug_info_end          bfd_void
+#define MY_bfd_debug_info_end          _bfd_void_bfd
 #endif
 #ifndef MY_bfd_debug_info_accumulate
-#define MY_bfd_debug_info_accumulate   \
-               (void (*) (bfd*, struct bfd_section *)) bfd_void
+#define MY_bfd_debug_info_accumulate   _bfd_void_bfd_asection
 #endif
 
 #ifndef MY_core_file_failing_command
@@ -908,6 +938,9 @@ tic30_aout_set_arch_mach (bfd *abfd,
 #ifndef MY_canonicalize_reloc
 #define MY_canonicalize_reloc NAME (aout, canonicalize_reloc)
 #endif
+#ifndef MY_set_reloc
+#define MY_set_reloc _bfd_generic_set_reloc
+#endif
 #ifndef MY_make_empty_symbol
 #define MY_make_empty_symbol NAME (aout, make_empty_symbol)
 #endif
@@ -958,6 +991,9 @@ tic30_aout_set_arch_mach (bfd *abfd,
 #ifndef MY_bfd_is_group_section
 #define MY_bfd_is_group_section bfd_generic_is_group_section
 #endif
+#ifndef MY_bfd_group_name
+#define MY_bfd_group_name bfd_generic_group_name
+#endif
 #ifndef MY_bfd_discard_group
 #define MY_bfd_discard_group bfd_generic_discard_group
 #endif
@@ -968,6 +1004,12 @@ tic30_aout_set_arch_mach (bfd *abfd,
 #ifndef MY_bfd_define_common_symbol
 #define MY_bfd_define_common_symbol bfd_generic_define_common_symbol
 #endif
+#ifndef MY_bfd_link_hide_symbol
+#define MY_bfd_link_hide_symbol _bfd_generic_link_hide_symbol
+#endif
+#ifndef MY_bfd_define_start_stop
+#define MY_bfd_define_start_stop bfd_generic_define_start_stop
+#endif
 #ifndef MY_bfd_reloc_type_lookup
 #define MY_bfd_reloc_type_lookup tic30_aout_reloc_type_lookup
 #endif
@@ -1000,6 +1042,10 @@ tic30_aout_set_arch_mach (bfd *abfd,
 #define MY_bfd_link_split_section  _bfd_generic_link_split_section
 #endif
 
+#ifndef MY_bfd_link_check_relocs
+#define MY_bfd_link_check_relocs   _bfd_generic_link_check_relocs
+#endif
+
 #ifndef MY_bfd_copy_private_bfd_data
 #define MY_bfd_copy_private_bfd_data _bfd_generic_bfd_copy_private_bfd_data
 #endif
@@ -1029,8 +1075,7 @@ tic30_aout_set_arch_mach (bfd *abfd,
 #endif
 
 #ifndef MY_bfd_is_target_special_symbol
-#define MY_bfd_is_target_special_symbol  \
-  ((bfd_boolean (*) (bfd *, asymbol *)) bfd_false)
+#define MY_bfd_is_target_special_symbol _bfd_bool_bfd_asymbol_false
 #endif
 
 #ifndef MY_bfd_free_cached_info
@@ -1092,12 +1137,24 @@ const bfd_target tic30_aout_vec =
   bfd_getb64, bfd_getb_signed_64, bfd_putb64,
   bfd_getb32, bfd_getb_signed_32, bfd_putb32,
   bfd_getb16, bfd_getb_signed_16, bfd_putb16,  /* Headers.  */
-  {_bfd_dummy_target, MY_object_p,             /* bfd_check_format.  */
-   bfd_generic_archive_p, MY_core_file_p},
-  {bfd_false, MY_mkobject,                     /* bfd_set_format.  */
-   _bfd_generic_mkarchive, bfd_false},
-  {bfd_false, MY_write_object_contents,                /* bfd_write_contents.  */
-   _bfd_write_archive_contents, bfd_false},
+  {                            /* bfd_check_format.  */
+    _bfd_dummy_target,
+    MY_object_p,
+    bfd_generic_archive_p,
+    MY_core_file_p
+  },
+  {                            /* bfd_set_format.  */
+    _bfd_bool_bfd_false_error,
+    MY_mkobject,
+    _bfd_generic_mkarchive,
+    _bfd_bool_bfd_false_error
+  },
+  {                            /* bfd_write_contents.  */
+    _bfd_bool_bfd_false_error,
+    MY_write_object_contents,
+    _bfd_write_archive_contents,
+    _bfd_bool_bfd_false_error
+  },
 
   BFD_JUMP_TABLE_GENERIC (MY),
   BFD_JUMP_TABLE_COPY (MY),
This page took 0.038055 seconds and 4 git commands to generate.