Add prototypes for static functions.
[binutils-gdb.git] / bfd / coffcode.h
index 669cfdefb9f3a350e83bb667973ae4c40c5f71dc..c2c5f31b1b7559832c6bf3a292011c1dcd2b1e8e 100644 (file)
@@ -1,5 +1,6 @@
 /* Support for the generic parts of most COFF variants, for BFD.
-   Copyright 1990, 91, 92, 93, 94, 95, 96, 1997 Free Software Foundation, Inc.
+   Copyright 1990, 91, 92, 93, 94, 95, 96, 97, 1998
+   Free Software Foundation, Inc.
    Written by Cygnus Support.
 
 This file is part of BFD, the Binary File Descriptor library.
@@ -861,6 +862,13 @@ dependent COFF routines:
 .       boolean collect, 
 .       struct bfd_link_hash_entry **hashp));
 .
+. boolean (*_bfd_coff_link_output_has_begun) PARAMS ((
+.      bfd * abfd,
+.       struct coff_final_link_info * pfinfo));
+. boolean (*_bfd_coff_final_link_postscript) PARAMS ((
+.      bfd * abfd,
+.      struct coff_final_link_info * pfinfo));
+.
 .} bfd_coff_backend_data;
 .
 .#define coff_backend_info(abfd) ((bfd_coff_backend_data *) (abfd)->xvec->backend_data)
@@ -975,6 +983,11 @@ dependent COFF routines:
 .        ((coff_backend_info (abfd)->_bfd_coff_link_add_one_symbol)\
 .         (info, abfd, name, flags, section, value, string, cp, coll, hashp))
 .
+.#define bfd_coff_link_output_has_begun(a,p) \
+.        ((coff_backend_info (a)->_bfd_coff_link_output_has_begun) (a,p))
+.#define bfd_coff_final_link_postscript(a,p) \
+.        ((coff_backend_info (a)->_bfd_coff_final_link_postscript) (a,p))
+.
 */
 
 /* See whether the magic number matches.  */
@@ -1016,6 +1029,8 @@ coff_new_section_hook (abfd, section)
      bfd * abfd;
      asection * section;
 {
+  combined_entry_type *native;
+
   section->alignment_power = COFF_DEFAULT_SECTION_ALIGNMENT_POWER;
 
 #ifdef RS6000COFF_C
@@ -1032,9 +1047,21 @@ coff_new_section_hook (abfd, section)
 
      @@ The 10 is a guess at a plausible maximum number of aux entries
      (but shouldn't be a constant).  */
-  coffsymbol (section->symbol)->native =
-    (combined_entry_type *) bfd_zalloc (abfd,
-                                       sizeof (combined_entry_type) * 10);
+  native = ((combined_entry_type *)
+           bfd_zalloc (abfd, sizeof (combined_entry_type) * 10));
+  if (native == NULL)
+    return false;
+
+  /* We don't need to set up n_name, n_value, or n_scnum in the native
+     symbol information, since they'll be overriden by the BFD symbol
+     anyhow.  However, we do need to set the type and storage class,
+     in case this symbol winds up getting written out.  The value 0
+     for n_numaux is already correct.  */
+
+  native->u.syment.n_type = T_NULL;
+  native->u.syment.n_sclass = C_STAT;
+
+  coffsymbol (section->symbol)->native = native;
 
   /* The .stab section must be aligned to 2**2 at most, because
      otherwise there may be gaps in the section which gdb will not
@@ -1315,9 +1342,9 @@ coff_mkobject_hook (abfd, filehdr, aouthdr)
     }
 #endif
 
-#if defined  ARM && ! defined COFF_WITH_PE
+#ifdef ARM 
   /* Set the flags field from the COFF header read in */
-  if (! coff_arm_bfd_set_private_flags (abfd, internal_f->f_flags))
+  if (! _bfd_coff_arm_set_private_flags (abfd, internal_f->f_flags))
     coff->flags = 0;
 #endif
   
@@ -1394,7 +1421,7 @@ coff_set_arch_mach_hook (abfd, filehdr)
     case LYNXCOFFMAGIC:
 #endif
       arch = bfd_arch_m68k;
-      machine = 68020;
+      machine = bfd_mach_m68020;
       break;
 #endif
 #ifdef MC88MAGIC
@@ -1593,6 +1620,12 @@ coff_set_arch_mach_hook (abfd, filehdr)
       break;
 #endif
 
+#ifdef TIC30MAGIC
+    case TIC30MAGIC:
+      arch = bfd_arch_tic30;
+      break;
+#endif
+
 /* start-sanitize-tic80 */
 #ifdef TIC80_ARCH_MAGIC
     case TIC80_ARCH_MAGIC:
@@ -1971,6 +2004,12 @@ coff_set_flags (abfd, magicp, flagsp)
       }
       break;
 #endif
+
+#ifdef TIC30MAGIC
+    case bfd_arch_tic30:
+      *magicp = TIC30MAGIC;
+      return true;
+#endif
 /* start-sanitize-tic80 */
 #ifdef TIC80_ARCH_MAGIC
     case bfd_arch_tic80:
@@ -2157,6 +2196,15 @@ coff_set_arch_mach (abfd, arch, machine)
 
 /* Calculate the file position for each section. */
 
+#ifndef I960
+#define ALIGN_SECTIONS_IN_FILE
+#endif
+/* start-sanitize-tic80 */
+#ifdef TIC80COFF
+#undef ALIGN_SECTIONS_IN_FILE
+#endif
+/* end-sanitize-tic80 */
+
 static boolean
 coff_compute_section_file_positions (abfd)
      bfd * abfd;
@@ -2165,11 +2213,10 @@ coff_compute_section_file_positions (abfd)
   asection *previous = (asection *) NULL;
   file_ptr sofar = FILHSZ;
   boolean align_adjust;
-
-#ifndef I960
+  unsigned int count;
+#ifdef ALIGN_SECTIONS_IN_FILE
   file_ptr old_sofar;
 #endif
-  unsigned int count;
 
 #ifdef RS6000COFF_C
   /* On XCOFF, if we have symbols, set up the .debug section.  */
@@ -2255,6 +2302,19 @@ coff_compute_section_file_positions (abfd)
        current != (asection *) NULL;
        current = current->next, ++count)
     {
+#ifdef COFF_IMAGE_WITH_PE
+      /* The NT loader does not want empty section headers, so we omit
+         them.  We don't actually remove the section from the BFD,
+         although we probably should.  This matches code in
+         coff_write_object_contents.  */
+      if (current->_raw_size == 0)
+       {
+         current->target_index = -1;
+         --count;
+         continue;
+       }
+#endif
+
       current->target_index = count;
 
       /* Only deal with sections which have contents */
@@ -2265,7 +2325,7 @@ coff_compute_section_file_positions (abfd)
         which they are aligned in virtual memory.  I960 doesn't
         do this (FIXME) so we can stay in sync with Intel.  960
         doesn't yet page from files... */
-#ifndef I960
+#ifdef ALIGN_SECTIONS_IN_FILE
       if ((abfd->flags & EXEC_P) != 0)
        {
          /* make sure this section is aligned on the right boundary - by
@@ -2316,7 +2376,7 @@ coff_compute_section_file_positions (abfd)
 
       sofar += current->_raw_size;
 
-#ifndef I960
+#ifdef ALIGN_SECTIONS_IN_FILE
       /* make sure that this section is of the right size too */
       if ((abfd->flags & EXEC_P) == 0)
        {
@@ -2695,13 +2755,22 @@ coff_write_object_contents (abfd)
        {
          unsigned int i, count;
          asymbol **psym;
-         coff_symbol_type *csym;
+         coff_symbol_type *csym = NULL;
+         asymbol **psymsec;
 
+         psymsec = NULL;
          count = bfd_get_symcount (abfd);
          for (i = 0, psym = abfd->outsymbols; i < count; i++, psym++)
            {
-             /* Here *PSYM is the section symbol for CURRENT.  */
+             if ((*psym)->section != current)
+               continue;
+
+             /* Remember the location of the first symbol in this
+                 section.  */
+             if (psymsec == NULL)
+               psymsec = psym;
 
+             /* See if this is the section symbol.  */
              if (strcmp ((*psym)->name, current->name) == 0)
                {
                  csym = coff_symbol_from (abfd, *psym);
@@ -2711,6 +2780,9 @@ coff_write_object_contents (abfd)
                      || csym->native->u.syment.n_sclass != C_STAT
                      || csym->native->u.syment.n_type != T_NULL)
                    continue;
+
+                 /* Here *PSYM is the section symbol for CURRENT.  */
+
                  break;
                }
            }
@@ -2747,6 +2819,24 @@ coff_write_object_contents (abfd)
                    IMAGE_COMDAT_SELECT_EXACT_MATCH;
                  break;
                }
+
+             /* The COMDAT symbol must be the first symbol from this
+                 section in the symbol table.  In order to make this
+                 work, we move the COMDAT symbol before the first
+                 symbol we found in the search above.  It's OK to
+                 rearrange the symbol table at this point, because
+                 coff_renumber_symbols is going to rearrange it
+                 further and fix up all the aux entries.  */
+             if (psym != psymsec)
+               {
+                 asymbol *hold;
+                 asymbol **pcopy;
+
+                 hold = *psym;
+                 for (pcopy = psym; pcopy > psymsec; pcopy--)
+                   pcopy[0] = pcopy[-1];
+                 *psymsec = hold;
+               }
            }
        }
 #endif /* COFF_WITH_PE */
@@ -3307,7 +3397,8 @@ coff_slurp_line_table (abfd, asect)
 
              warned = false;
              symndx = dst.l_addr.l_symndx;
-             if (symndx < 0 || symndx >= obj_raw_syment_count (abfd))
+             if (symndx < 0
+                 || (unsigned long) symndx >= obj_raw_syment_count (abfd))
                {
                  (*_bfd_error_handler)
                    ("%s: warning: illegal symbol index %ld in line numbers",
@@ -3415,6 +3506,10 @@ coff_slurp_symbol_table (abfd)
 #endif
 
            case C_EXT:
+#if defined ARM
+            case C_THUMBEXT:
+            case C_THUMBEXTFUNC:
+#endif
 #ifdef RS6000COFF_C
            case C_HIDEXT:
 #endif
@@ -3447,7 +3542,7 @@ coff_slurp_symbol_table (abfd)
 
                  dst->symbol.flags = BSF_EXPORT | BSF_GLOBAL;
 
-#if defined (COFF_WITH_PE) || defined (COFF_IMAGE_WITH_PE)
+#if defined COFF_WITH_PE
                  /* PE sets the symbol to a value relative to the
                      start of the section.  */
                  dst->symbol.value = src->u.syment.n_value;
@@ -3483,6 +3578,11 @@ coff_slurp_symbol_table (abfd)
            case C_STAT:        /* static                        */
 #ifdef I960
            case C_LEAFSTAT:    /* static leaf procedure        */
+#endif
+#if defined ARM 
+            case C_THUMBSTAT:   /* Thumb static                  */
+            case C_THUMBLABEL:  /* Thumb label                   */
+            case C_THUMBSTATFUNC:/* Thumb static function        */
 #endif
            case C_LABEL:       /* label                         */
              if (src->u.syment.n_scnum == -2)
@@ -3494,7 +3594,7 @@ coff_slurp_symbol_table (abfd)
                 section, if there is one.  */
              if (dst->symbol.section)
                {
-#if defined (COFF_WITH_PE) || defined (COFF_IMAGE_WITH_PE)
+#if defined COFF_WITH_PE
                  /* PE sets the symbol to a value relative to the
                      start of the section.  */
                  dst->symbol.value = src->u.syment.n_value;
@@ -3604,7 +3704,7 @@ coff_slurp_symbol_table (abfd)
            case C_FCN:         /* ".bf" or ".ef"                */
            case C_EFCN:        /* physical end of function      */
              dst->symbol.flags = BSF_LOCAL;
-#if defined (COFF_WITH_PE) || defined (COFF_IMAGE_WITH_PE)
+#if defined COFF_WITH_PE
              /* PE sets the symbol to a value relative to the start
                 of the section.  */
              dst->symbol.value = src->u.syment.n_value;
@@ -3687,9 +3787,13 @@ coff_slurp_symbol_table (abfd)
 #define OTHER_GLOBAL_CLASS C_LEAFEXT
 #endif
 
+#ifdef COFFARM
+#define OTHER_GLOBAL_CLASS C_THUMBEXT || syment->n_sclass == C_THUMBEXTFUNC
+#else
 #ifdef COFF_WITH_PE
 #define OTHER_GLOBAL_CLASS C_SECTION
 #endif
+#endif
 
 #ifdef OTHER_GLOBAL_CLASS
 
@@ -3697,12 +3801,10 @@ static boolean coff_sym_is_global PARAMS ((bfd *, struct internal_syment *));
 
 static boolean
 coff_sym_is_global (abfd, syment)
-     bfd *abfd;
-     struct internal_syment *syment;
+     bfd * abfd;
+     struct internal_syment * syment;
 {
-  if (syment->n_sclass == OTHER_GLOBAL_CLASS)
-    return true;
-  return false;
+  return (syment->n_sclass == OTHER_GLOBAL_CLASS);
 }
 
 #undef OTHER_GLOBAL_CLASS
@@ -4038,13 +4140,80 @@ dummy_reloc16_extra_cases (abfd, link_info, link_order, reloc, data, src_ptr,
 #define coff_link_add_one_symbol _bfd_generic_link_add_one_symbol
 #endif
 
+#ifndef coff_link_output_has_begun
+#define coff_link_output_has_begun _coff_link_output_has_begun
+static boolean
+_coff_link_output_has_begun (abfd, info)
+     bfd * abfd;
+     struct bfd_link_info * info;
+{
+  return abfd->output_has_begun;
+}
+#endif
+
+#ifndef coff_final_link_postscript
+#define coff_final_link_postscript _coff_final_link_postscript
+static boolean
+_coff_final_link_postscript (abfd, pfinfo)
+     bfd * abfd;
+     struct coff_final_link_info * pfinfo;
+{
+  return true;
+}
+#endif
+
+#ifndef coff_SWAP_aux_in
+#define coff_SWAP_aux_in coff_swap_aux_in
+#endif
+#ifndef coff_SWAP_sym_in
+#define coff_SWAP_sym_in coff_swap_sym_in
+#endif
+#ifndef coff_SWAP_lineno_in
+#define coff_SWAP_lineno_in coff_swap_lineno_in
+#endif
+#ifndef coff_SWAP_aux_out
+#define coff_SWAP_aux_out coff_swap_aux_out
+#endif
+#ifndef coff_SWAP_sym_out
+#define coff_SWAP_sym_out coff_swap_sym_out
+#endif
+#ifndef coff_SWAP_lineno_out
+#define coff_SWAP_lineno_out coff_swap_lineno_out
+#endif
+#ifndef coff_SWAP_reloc_out
+#define coff_SWAP_reloc_out coff_swap_reloc_out
+#endif
+#ifndef coff_SWAP_filehdr_out
+#define coff_SWAP_filehdr_out coff_swap_filehdr_out
+#endif
+#ifndef coff_SWAP_aouthdr_out
+#define coff_SWAP_aouthdr_out coff_swap_aouthdr_out
+#endif
+#ifndef coff_SWAP_scnhdr_out
+#define coff_SWAP_scnhdr_out coff_swap_scnhdr_out
+#endif
+#ifndef coff_SWAP_reloc_in
+#define coff_SWAP_reloc_in coff_swap_reloc_in
+#endif
+#ifndef coff_SWAP_filehdr_in
+#define coff_SWAP_filehdr_in coff_swap_filehdr_in
+#endif
+#ifndef coff_SWAP_aouthdr_in
+#define coff_SWAP_aouthdr_in coff_swap_aouthdr_in
+#endif
+#ifndef coff_SWAP_scnhdr_in
+#define coff_SWAP_scnhdr_in coff_swap_scnhdr_in
+#endif
+
+
+
 static CONST bfd_coff_backend_data bfd_coff_std_swap_table =
 {
-  coff_swap_aux_in, coff_swap_sym_in, coff_swap_lineno_in,
-  coff_swap_aux_out, coff_swap_sym_out,
-  coff_swap_lineno_out, coff_swap_reloc_out,
-  coff_swap_filehdr_out, coff_swap_aouthdr_out,
-  coff_swap_scnhdr_out,
+  coff_SWAP_aux_in, coff_SWAP_sym_in, coff_SWAP_lineno_in,
+  coff_SWAP_aux_out, coff_SWAP_sym_out,
+  coff_SWAP_lineno_out, coff_SWAP_reloc_out,
+  coff_SWAP_filehdr_out, coff_SWAP_aouthdr_out,
+  coff_SWAP_scnhdr_out,
   FILHSZ, AOUTSZ, SCNHSZ, SYMESZ, AUXESZ, RELSZ, LINESZ,
 #ifdef COFF_LONG_FILENAMES
   true,
@@ -4057,14 +4226,15 @@ static CONST bfd_coff_backend_data bfd_coff_std_swap_table =
   false,
 #endif
   COFF_DEFAULT_SECTION_ALIGNMENT_POWER,
-  coff_swap_filehdr_in, coff_swap_aouthdr_in, coff_swap_scnhdr_in,
-  coff_swap_reloc_in, coff_bad_format_hook, coff_set_arch_mach_hook,
+  coff_SWAP_filehdr_in, coff_SWAP_aouthdr_in, coff_SWAP_scnhdr_in,
+  coff_SWAP_reloc_in, coff_bad_format_hook, coff_set_arch_mach_hook,
   coff_mkobject_hook, styp_to_sec_flags, coff_set_alignment_hook,
   coff_slurp_symbol_table, symname_in_debug_hook, coff_pointerize_aux_hook,
   coff_print_aux, coff_reloc16_extra_cases, coff_reloc16_estimate,
   coff_sym_is_global, coff_compute_section_file_positions,
   coff_start_final_link, coff_relocate_section, coff_rtype_to_howto,
-  coff_adjust_symndx, coff_link_add_one_symbol
+  coff_adjust_symndx, coff_link_add_one_symbol,
+  coff_link_output_has_begun, coff_final_link_postscript
 };
 
 #ifndef coff_close_and_cleanup