2003-10-19 Andrew Cagney <cagney@redhat.com>
[deliverable/binutils-gdb.git] / bfd / aout-tic30.c
index f0f4d3d50b509f1a82b764f642372a6b654c3b17..1f37b995d7b3eb4ed7330816457f1cc4b98e9f85 100644 (file)
@@ -1,5 +1,5 @@
 /* BFD back-end for TMS320C30 a.out binaries.
-   Copyright (C) 1998, 1999, 2000 Free Software Foundation, Inc.
+   Copyright 1998, 1999, 2000, 2001, 2002, 2003 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 BYTES_IN_WORD 4
 #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
 
-#define MY(OP) CAT(tic30_aout_,OP)
+/* Do not "beautify" the CONCAT* macro args.  Traditional C will not
+   remove whitespace added here, and thus will fail to concatenate
+   the tokens.  */
+#define MY(OP) CONCAT2 (tic30_aout_,OP)
 #define TARGETNAME "a.out-tic30"
-#define NAME(x,y) CAT3(tic30_aout,_32_,y)
+#define NAME(x,y) CONCAT3 (tic30_aout,_32_,y)
 
 #include "bfd.h"
 #include "sysdep.h"
@@ -53,11 +55,27 @@ static bfd_reloc_status_type tic30_aout_relocate_contents
 static bfd_reloc_status_type tic30_aout_final_link_relocate
   PARAMS ((reloc_howto_type *, bfd *, asection *, bfd_byte *, bfd_vma,
           bfd_vma, bfd_vma));
-static const bfd_target *tic30_aout_object_p PARAMS ((bfd *));
-static boolean tic30_aout_write_object_contents PARAMS ((bfd *));
-static boolean tic30_aout_set_sizes PARAMS ((bfd *));
-
-#define MY_reloc_howto(BFD,REL,IN,EX,PC) tic30_aout_reloc_howto(BFD,REL,&IN,&EX,&PC)
+static const bfd_target *tic30_aout_object_p
+  PARAMS ((bfd *));
+static bfd_boolean tic30_aout_write_object_contents
+  PARAMS ((bfd *));
+static bfd_boolean tic30_aout_set_sizes
+  PARAMS ((bfd *));
+static const bfd_target * tic30_aout_callback
+  PARAMS ((bfd *));
+static bfd_boolean MY_bfd_copy_private_section_data
+  PARAMS ((bfd *, asection *, bfd *, asection *));
+static bfd_boolean MY_bfd_final_link
+  PARAMS ((bfd *, struct bfd_link_info *));
+reloc_howto_type * tic30_aout_reloc_type_lookup
+  PARAMS ((bfd *, bfd_reloc_code_real_type));
+enum machine_type tic30_aout_machine_type
+  PARAMS ((enum bfd_architecture, unsigned long, bfd_boolean *));
+bfd_boolean tic30_aout_set_arch_mach
+  PARAMS ((bfd *, enum bfd_architecture, unsigned long));
+
+#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)
@@ -101,7 +119,7 @@ static boolean tic30_aout_set_sizes PARAMS ((bfd *));
 #define MY_finish_dynamic_link 0
 #endif
 
-static CONST struct aout_backend_data tic30_aout_backend_data =
+static const struct aout_backend_data tic30_aout_backend_data =
 {
   MY_zmagic_contiguous,
   MY_text_includes_header,
@@ -130,26 +148,27 @@ static CONST struct aout_backend_data tic30_aout_backend_data =
    2) to get the 32-bit addresses in the format the TMS320C30 likes
    it.  */
 reloc_howto_type tic30_aout_howto_table[] =
-{
-  EMPTY_HOWTO (-1),
-  HOWTO (1, 2, 1, 16, false, 0, 0, tic30_aout_fix_16,
-        "16", false, 0x0000FFFF, 0x0000FFFF, false),
-  HOWTO (2, 2, 2, 24, false, 0, complain_overflow_bitfield, NULL,
-        "24", false, 0x00FFFFFF, 0x00FFFFFF, false),
-  HOWTO (3, 18, 3, 24, false, 0, complain_overflow_bitfield, NULL,
-        "LDP", false, 0x00FF0000, 0x000000FF, false),
-  HOWTO (4, 2, 4, 32, false, 0, complain_overflow_bitfield, tic30_aout_fix_32,
-        "32", false, 0xFFFFFFFF, 0xFFFFFFFF, false),
-  HOWTO (5, 2, 1, 16, true, 0, complain_overflow_signed,
-        tic30_aout_fix_pcrel_16, "PCREL", true, 0x0000FFFF, 0x0000FFFF, true),
-  EMPTY_HOWTO (-1),
-  EMPTY_HOWTO (-1),
-  EMPTY_HOWTO (-1),
-  EMPTY_HOWTO (-1),
-  EMPTY_HOWTO (-1)
-};
-
-extern reloc_howto_type *NAME (aout, reloc_type_lookup) ();
+  {
+    EMPTY_HOWTO (-1),
+    HOWTO (1, 2, 1, 16, FALSE, 0, 0, tic30_aout_fix_16,
+          "16", FALSE, 0x0000FFFF, 0x0000FFFF, FALSE),
+    HOWTO (2, 2, 2, 24, FALSE, 0, complain_overflow_bitfield, NULL,
+          "24", FALSE, 0x00FFFFFF, 0x00FFFFFF, FALSE),
+    HOWTO (3, 18, 3, 24, FALSE, 0, complain_overflow_bitfield, NULL,
+          "LDP", FALSE, 0x00FF0000, 0x000000FF, FALSE),
+    HOWTO (4, 2, 4, 32, FALSE, 0, complain_overflow_bitfield, tic30_aout_fix_32,
+          "32", FALSE, 0xFFFFFFFF, 0xFFFFFFFF, FALSE),
+    HOWTO (5, 2, 1, 16, TRUE, 0, complain_overflow_signed,
+          tic30_aout_fix_pcrel_16, "PCREL", TRUE, 0x0000FFFF, 0x0000FFFF, TRUE),
+    EMPTY_HOWTO (-1),
+    EMPTY_HOWTO (-1),
+    EMPTY_HOWTO (-1),
+    EMPTY_HOWTO (-1),
+    EMPTY_HOWTO (-1)
+  };
+
+extern reloc_howto_type *NAME (aout, reloc_type_lookup)
+  PARAMS ((bfd *, bfd_reloc_code_real_type));
 
 reloc_howto_type *
 tic30_aout_reloc_type_lookup (abfd, code)
@@ -317,10 +336,10 @@ tic30_aout_callback (abfd)
   unsigned int arch_align_power;
   unsigned long arch_align;
 
-  /* Calculate the file positions of the parts of a newly read aout header */
+  /* Calculate the file positions of the parts of a newly read aout header */
   obj_textsec (abfd)->_raw_size = N_TXTSIZE (*execp);
 
-  /* The virtual memory addresses of the sections */
+  /* 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);
@@ -329,11 +348,11 @@ tic30_aout_callback (abfd)
   obj_datasec (abfd)->lma = obj_datasec (abfd)->vma;
   obj_bsssec (abfd)->lma = obj_bsssec (abfd)->vma;
 
-  /* The file offsets of the sections */
+  /* The file offsets of the sections */
   obj_textsec (abfd)->filepos = N_TXTOFF (*execp);
   obj_datasec (abfd)->filepos = N_DATOFF (*execp);
 
-  /* The file offsets of the relocation info */
+  /* The file offsets of the relocation info */
   obj_textsec (abfd)->rel_filepos = N_TRELOFF (*execp);
   obj_datasec (abfd)->rel_filepos = N_DRELOFF (*execp);
 
@@ -345,7 +364,7 @@ tic30_aout_callback (abfd)
 #ifdef SET_ARCH_MACH
   SET_ARCH_MACH (abfd, *execp);
 #else
-  bfd_default_set_arch_mach (abfd, DEFAULT_ARCH, 0);
+  bfd_default_set_arch_mach (abfd, DEFAULT_ARCH, 0L);
 #endif
 
   /* Now that we know the architecture, set the alignments of the
@@ -405,7 +424,7 @@ tic30_aout_relocate_contents (howto, input_bfd, relocation, location)
      bfd_byte *location;
 {
   bfd_vma x;
-  boolean overflow;
+  bfd_boolean overflow;
 
   if (howto->size < 0)
     relocation = -relocation;
@@ -429,7 +448,9 @@ tic30_aout_relocate_contents (howto, input_bfd, relocation, location)
       x = bfd_get_32 (input_bfd, location);
       break;
     }
-  overflow = false;
+
+  overflow = FALSE;
+
   if (howto->complain_on_overflow != complain_overflow_dont)
     {
       bfd_vma check;
@@ -474,21 +495,23 @@ tic30_aout_relocate_contents (howto, input_bfd, relocation, location)
            bfd_signed_vma reloc_signed_max = (1 << (howto->bitsize - 1)) - 1;
            bfd_signed_vma reloc_signed_min = ~reloc_signed_max;
            if (signed_check > reloc_signed_max || signed_check < reloc_signed_min)
-             overflow = true;
+             overflow = TRUE;
          }
          break;
        case complain_overflow_unsigned:
          {
            bfd_vma reloc_unsigned_max = (((1 << (howto->bitsize - 1)) - 1) << 1) | 1;
            if (check > reloc_unsigned_max)
-             overflow = true;
+             overflow = TRUE;
          }
          break;
        case complain_overflow_bitfield:
          {
            bfd_vma reloc_bits = (((1 << (howto->bitsize - 1)) - 1) << 1) | 1;
-           if ((check & ~reloc_bits) != 0 && (((bfd_vma) signed_check & ~reloc_bits) != (-1 & ~reloc_bits)))
-             overflow = true;
+           if ((check & ~reloc_bits) != 0
+               && (((bfd_vma) signed_check & ~reloc_bits)
+                   != ((bfd_vma) -1 & ~reloc_bits)))
+             overflow = TRUE;
          }
          break;
        default:
@@ -520,18 +543,18 @@ tic30_aout_relocate_contents (howto, input_bfd, relocation, location)
   return overflow ? bfd_reloc_overflow : bfd_reloc_ok;
 }
 
-/* Finish up the reading of an a.out file header */
+/* Finish up the reading of an a.out file header */
 
 static const bfd_target *
 tic30_aout_object_p (abfd)
      bfd *abfd;
 {
-  struct external_exec exec_bytes;     /* Raw exec header from file */
-  struct internal_exec exec;   /* Cleaned-up exec header */
+  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;
 
-  if (bfd_read ((PTR) & exec_bytes, 1, EXEC_BYTES_SIZE, abfd)
-      != EXEC_BYTES_SIZE)
+  if (bfd_bread ((PTR) &exec_bytes, amt, abfd) != amt)
     {
       if (bfd_get_error () != bfd_error_system_call)
        bfd_set_error (bfd_error_wrong_format);
@@ -541,7 +564,7 @@ tic30_aout_object_p (abfd)
 #ifdef SWAP_MAGIC
   exec.a_info = SWAP_MAGIC (exec_bytes.e_info);
 #else
-  exec.a_info = bfd_h_get_32 (abfd, exec_bytes.e_info);
+  exec.a_info = H_GET_32 (abfd, exec_bytes.e_info);
 #endif /* SWAP_MAGIC */
 
   if (N_BADMAG (exec))
@@ -562,10 +585,10 @@ tic30_aout_object_p (abfd)
 
 #ifdef ENTRY_CAN_BE_ZERO
   /* The NEWSOS3 entry-point is/was 0, which (amongst other lossage)
-   * means that it isn't obvious if EXEC_P should be set.
-   * All of the following must be true for an executable:
-   * There must be no relocations, the bfd can be neither an
-   * archive nor an archive element, and the file must be executable.  */
+     means that it isn't obvious if EXEC_P should be set.
+     All of the following must be true for an executable:
+     There must be no relocations, the bfd can be neither an
+     archive nor an archive element, and the file must be executable.  */
 
   if (exec.a_trsize + exec.a_drsize == 0
       && bfd_get_format (abfd) == bfd_object && abfd->my_archive == NULL)
@@ -588,7 +611,7 @@ tic30_aout_object_p (abfd)
    section contents, and copy_private_bfd_data is not called until
    after the section contents have been set.  */
 
-static boolean
+static bfd_boolean
 MY_bfd_copy_private_section_data (ibfd, isec, obfd, osec)
      bfd *ibfd;
      asection *isec ATTRIBUTE_UNUSED;
@@ -597,14 +620,14 @@ MY_bfd_copy_private_section_data (ibfd, isec, obfd, osec)
 {
   if (bfd_get_flavour (obfd) == bfd_target_aout_flavour)
     obj_aout_subformat (obfd) = obj_aout_subformat (ibfd);
-  return true;
+  return TRUE;
 }
 
 /* Write an object file.
    Section contents have already been written.  We write the
    file header, symbols, and relocation.  */
 
-static boolean
+static bfd_boolean
 tic30_aout_write_object_contents (abfd)
      bfd *abfd;
 {
@@ -614,8 +637,9 @@ tic30_aout_write_object_contents (abfd)
   obj_reloc_entry_size (abfd) = RELOC_STD_SIZE;
 
   {
-    bfd_size_type text_size;   /* dummy vars */
+    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);
 
@@ -628,38 +652,40 @@ tic30_aout_write_object_contents (abfd)
 
     if (adata (abfd).exec_bytes_size > 0)
       {
+       bfd_size_type amt;
        if (bfd_seek (abfd, (file_ptr) 0, SEEK_SET) != 0)
-         return false;
-       if (bfd_write ((PTR) & exec_bytes, 1, adata (abfd).exec_bytes_size, abfd) != adata (abfd).exec_bytes_size)
-         return false;
+         return FALSE;
+       amt = adata (abfd).exec_bytes_size;
+       if (bfd_bwrite ((PTR) &exec_bytes, amt, abfd) != amt)
+         return FALSE;
       }
-    /* Now write out reloc info, followed by syms and strings */
 
+    /* Now write out reloc info, followed by syms and strings.  */
     if (bfd_get_outsymbols (abfd) != (asymbol **) NULL
        && bfd_get_symcount (abfd) != 0)
       {
        if (bfd_seek (abfd, (file_ptr) (N_SYMOFF (*execp)), SEEK_SET) != 0)
-         return false;
+         return FALSE;
 
        if (!NAME (aout, write_syms) (abfd))
-         return false;
+         return FALSE;
       }
 
     if (bfd_seek (abfd, (file_ptr) (N_TRELOFF (*execp)), SEEK_SET) != 0)
-      return false;
+      return FALSE;
     if (!NAME (aout, squirt_out_relocs) (abfd, obj_textsec (abfd)))
-      return false;
+      return FALSE;
 
     if (bfd_seek (abfd, (file_ptr) (N_DRELOFF (*execp)), SEEK_SET) != 0)
-      return false;
+      return FALSE;
     if (!NAME (aout, squirt_out_relocs) (abfd, obj_datasec (abfd)))
-      return false;
+      return FALSE;
   }
 
-  return true;
+  return TRUE;
 }
 
-static boolean
+static bfd_boolean
 tic30_aout_set_sizes (abfd)
      bfd *abfd;
 {
@@ -679,7 +705,7 @@ tic30_aout_set_sizes (abfd)
 
   adata (abfd).exec_bytes_size = EXEC_BYTES_SIZE;
 
-  return true;
+  return TRUE;
 }
 
 #ifndef MY_final_link_callback
@@ -710,7 +736,7 @@ MY_final_link_callback (abfd, ptreloff, pdreloff, psymoff)
 /* Final link routine.  We need to use a call back to get the correct
    offsets in the output file.  */
 
-static boolean
+static bfd_boolean
 MY_bfd_final_link (abfd, info)
      bfd *abfd;
      struct bfd_link_info *info;
@@ -745,10 +771,10 @@ MY_bfd_final_link (abfd, info)
     {
       obj_datasec (abfd)->vma = BFD_ALIGN (vma, 4);
     }
+
   if (obj_datasec (abfd)->vma < vma)
-    {
-      obj_datasec (abfd)->vma = BFD_ALIGN (vma, 4);
-    }
+    obj_datasec (abfd)->vma = BFD_ALIGN (vma, 4);
+
   obj_datasec (abfd)->user_set_vma = 1;
   vma = obj_datasec (abfd)->vma;
   obj_datasec (abfd)->filepos = vma + adata (abfd).exec_bytes_size;
@@ -778,40 +804,40 @@ enum machine_type
 tic30_aout_machine_type (arch, machine, unknown)
      enum bfd_architecture arch;
      unsigned long machine ATTRIBUTE_UNUSED;
-     boolean *unknown;
+     bfd_boolean *unknown;
 {
   enum machine_type arch_flags;
 
   arch_flags = M_UNKNOWN;
-  *unknown = true;
+  *unknown = TRUE;
 
   switch (arch)
     {
     case bfd_arch_tic30:
-      *unknown = false;
+      *unknown = FALSE;
       break;
     default:
       arch_flags = M_UNKNOWN;
     }
   if (arch_flags != M_UNKNOWN)
-    *unknown = false;
+    *unknown = FALSE;
   return arch_flags;
 }
 
-boolean
+bfd_boolean
 tic30_aout_set_arch_mach (abfd, arch, machine)
      bfd *abfd;
      enum bfd_architecture arch;
      unsigned long machine;
 {
   if (!bfd_default_set_arch_mach (abfd, arch, machine))
-    return false;
+    return FALSE;
   if (arch != bfd_arch_unknown)
     {
-      boolean unknown;
+      bfd_boolean unknown;
       tic30_aout_machine_type (arch, machine, &unknown);
       if (unknown)
-       return false;
+       return FALSE;
     }
   obj_reloc_entry_size (abfd) = RELOC_STD_SIZE;
   return (*aout_backend_info (abfd)->set_sizes) (abfd);
@@ -873,7 +899,7 @@ tic30_aout_set_arch_mach (abfd, arch, machine)
 #endif
 #ifndef MY_bfd_debug_info_accumulate
 #define MY_bfd_debug_info_accumulate   \
-                       (void (*) PARAMS ((bfd*, struct sec *))) bfd_void
+               (void (*) PARAMS ((bfd*, struct bfd_section *))) bfd_void
 #endif
 
 #ifndef MY_core_file_failing_command
@@ -900,8 +926,8 @@ tic30_aout_set_arch_mach (abfd, arch, machine)
 #ifndef MY_get_symtab_upper_bound
 #define MY_get_symtab_upper_bound NAME(aout,get_symtab_upper_bound)
 #endif
-#ifndef MY_get_symtab
-#define MY_get_symtab NAME(aout,get_symtab)
+#ifndef MY_canonicalize_symtab
+#define MY_canonicalize_symtab NAME(aout,canonicalize_symtab)
 #endif
 #ifndef MY_get_reloc_upper_bound
 #define MY_get_reloc_upper_bound NAME(aout,get_reloc_upper_bound)
@@ -940,6 +966,12 @@ tic30_aout_set_arch_mach (abfd, arch, machine)
 #ifndef MY_bfd_gc_sections
 #define MY_bfd_gc_sections bfd_generic_gc_sections
 #endif
+#ifndef MY_bfd_merge_sections
+#define MY_bfd_merge_sections bfd_generic_merge_sections
+#endif
+#ifndef MY_bfd_discard_group
+#define MY_bfd_discard_group bfd_generic_discard_group
+#endif
 #ifndef MY_bfd_reloc_type_lookup
 #define MY_bfd_reloc_type_lookup tic30_aout_reloc_type_lookup
 #endif
@@ -955,9 +987,15 @@ tic30_aout_set_arch_mach (abfd, arch, machine)
 #ifndef MY_bfd_link_hash_table_create
 #define MY_bfd_link_hash_table_create NAME(aout,link_hash_table_create)
 #endif
+#ifndef MY_bfd_link_hash_table_free
+#define MY_bfd_link_hash_table_free _bfd_generic_link_hash_table_free
+#endif
 #ifndef MY_bfd_link_add_symbols
 #define MY_bfd_link_add_symbols NAME(aout,link_add_symbols)
 #endif
+#ifndef MY_bfd_link_just_syms
+#define MY_bfd_link_just_syms _bfd_generic_link_just_syms
+#endif
 #ifndef MY_bfd_link_split_section
 #define MY_bfd_link_split_section  _bfd_generic_link_split_section
 #endif
This page took 0.031007 seconds and 4 git commands to generate.