Use renamed ARM cpu flag bits
[deliverable/binutils-gdb.git] / bfd / coffcode.h
index fe89a1d4cd586385e38e4f6b5aacc8f9f5c9c644..bdd9769d5bb112c601daa84b89c9ad211c911deb 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.
@@ -587,6 +588,12 @@ styp_to_sec_flags (abfd, hdr, name)
          can't call slurp_symtab, because the linker doesn't want the
          swapped symbols.  */
 
+      /* COMDAT sections are special.  The first symbol is the section
+        symbol, which tells what kind of COMDAT section it is.  The
+        *second* symbol is the "comdat symbol" - the one with the
+        unique name.  GNU uses the section symbol for the unique
+        name; MS uses ".text" for every comdat section.  Sigh.  - DJ */
+
       if (_bfd_coff_get_external_symbols (abfd))
        {
          bfd_byte *esym, *esymend;
@@ -628,10 +635,23 @@ styp_to_sec_flags (abfd, hdr, name)
                                            isym.n_type, isym.n_sclass,
                                            0, isym.n_numaux, (PTR) &aux);
 
+                     /* FIXME: Microsoft uses NODUPLICATES and
+                        ASSOCIATIVE, but gnu uses ANY and SAME_SIZE.
+                        Unfortunately, gnu doesn't do the comdat
+                        symbols right.  So, until we can fix it to do
+                        the right thing, we are temporarily disabling
+                        comdats for the MS types (they're used in
+                        DLLs and C++, but we don't support *their*
+                        C++ libraries anyway - DJ */
+
                      switch (aux.x_scn.x_comdat)
                        {
                        case IMAGE_COMDAT_SELECT_NODUPLICATES:
+#if 0
                          sec_flags |= SEC_LINK_DUPLICATES_ONE_ONLY;
+#else
+                         sec_flags &= ~SEC_LINK_ONCE;
+#endif
                          break;
 
                        default:
@@ -648,8 +668,12 @@ styp_to_sec_flags (abfd, hdr, name)
                          break;
 
                        case IMAGE_COMDAT_SELECT_ASSOCIATIVE:
+#if 0
                          /* FIXME: This is not currently implemented.  */
                          sec_flags |= SEC_LINK_DUPLICATES_DISCARD;
+#else
+                         sec_flags &= ~SEC_LINK_ONCE;
+#endif
                          break;
                        }
 
@@ -862,7 +886,8 @@ dependent COFF routines:
 .       struct bfd_link_hash_entry **hashp));
 .
 . boolean (*_bfd_coff_link_output_has_begun) PARAMS ((
-.      bfd * abfd ));
+.      bfd * abfd,
+.       struct coff_final_link_info * pfinfo));
 . boolean (*_bfd_coff_final_link_postscript) PARAMS ((
 .      bfd * abfd,
 .      struct coff_final_link_info * pfinfo));
@@ -981,8 +1006,8 @@ 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) \
-.        ((coff_backend_info (a)->_bfd_coff_link_output_has_begun) (a))
+.#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))
 .
@@ -1027,6 +1052,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
@@ -1043,9 +1070,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
@@ -1088,12 +1127,10 @@ coff_set_alignment_hook (abfd, section, scnhdr)
     if ((1 << i) >= hdr->s_align)
       break;
 #endif
-/* start-sanitize-tic80 */
 #ifdef TIC80COFF
   /* TI tools hijack bits 8-11 for the alignment */
   i = (hdr->s_flags >> 8) & 0xF ;
 #endif
-/* end-sanitize-tic80 */
   section->alignment_power = i;
 }
 
@@ -1326,9 +1363,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
   
@@ -1382,13 +1419,13 @@ coff_set_arch_mach_hook (abfd, filehdr)
       arch = bfd_arch_arm;
       switch (internal_f->f_flags & F_ARM_ARCHITECTURE_MASK)
        {
-       case F_ARM_2:  machine = bfd_mach_arm_2;  break;
-       case F_ARM_2a: machine = bfd_mach_arm_2a; break;
-       case F_ARM_3:  machine = bfd_mach_arm_3;  break;
-       default:
-       case F_ARM_3M: machine = bfd_mach_arm_3M; break;
-       case F_ARM_4:  machine = bfd_mach_arm_4;  break;
-       case F_ARM_4T: machine = bfd_mach_arm_4T; break;
+        case F_ARM_2:  machine = bfd_mach_arm_2;  break;
+        case F_ARM_2a: machine = bfd_mach_arm_2a; break;
+        case F_ARM_3:  machine = bfd_mach_arm_3;  break;
+        default:
+        case F_ARM_3M: machine = bfd_mach_arm_3M; break;
+        case F_ARM_4:  machine = bfd_mach_arm_4;  break;
+        case F_ARM_4T: machine = bfd_mach_arm_4T; break;
        }
       break;
 #endif
@@ -1405,7 +1442,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
@@ -1610,14 +1647,17 @@ coff_set_arch_mach_hook (abfd, filehdr)
       break;
 #endif
 
-/* start-sanitize-tic80 */
 #ifdef TIC80_ARCH_MAGIC
     case TIC80_ARCH_MAGIC:
       arch = bfd_arch_tic80;
       break;
 #endif
-/* end-sanitize-tic80 */
 
+#ifdef MCOREMAGIC
+    case MCOREMAGIC:
+      arch = bfd_arch_mcore;
+      break;
+#endif
     default:                   /* Unreadable input file type */
       arch = bfd_arch_obscure;
       break;
@@ -1994,13 +2034,11 @@ coff_set_flags (abfd, magicp, flagsp)
       *magicp = TIC30MAGIC;
       return true;
 #endif
-/* start-sanitize-tic80 */
 #ifdef TIC80_ARCH_MAGIC
     case bfd_arch_tic80:
       *magicp = TIC80_ARCH_MAGIC;
       return true;
 #endif
-/* end-sanitize-tic80 */
 #ifdef ARMMAGIC
     case bfd_arch_arm:
       * magicp = ARMMAGIC;
@@ -2148,6 +2186,12 @@ coff_set_flags (abfd, magicp, flagsp)
       break;
 #endif
 
+#ifdef MCOREMAGIC
+    case bfd_arch_mcore:
+      * magicp = MCOREMAGIC;
+      return true;
+#endif
+      
     default:                   /* Unknown architecture */
       /* return false;  -- fall through to "return false" below, to avoid
        "statement never reached" errors on the one below. */
@@ -2183,11 +2227,9 @@ coff_set_arch_mach (abfd, arch, machine)
 #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)
@@ -2197,11 +2239,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.  */
@@ -2287,6 +2328,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 */
@@ -2695,12 +2749,10 @@ coff_write_object_contents (abfd)
       section.s_align = (current->alignment_power
                         ? 1 << current->alignment_power
                         : 0);
-/* start-sanitize-tic80 */
 #else
 #ifdef TIC80COFF
       section.s_flags |= (current->alignment_power & 0xF) << 8;
 #endif
-/* end-sanitize-tic80 */
 #endif
 
 #ifdef COFF_IMAGE_WITH_PE
@@ -2727,13 +2779,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);
@@ -2743,6 +2804,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;
                }
            }
@@ -2779,6 +2843,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 */
@@ -2852,11 +2934,9 @@ coff_write_object_contents (abfd)
   else
     internal_f.f_flags |= F_AR32W;
 
-/* start-sanitize-tic80 */
 #ifdef TIC80_TARGET_ID
   internal_f.f_target_id = TIC80_TARGET_ID;
 #endif
-/* end-sanitize-tic80 */
 
   /*
      FIXME, should do something about the other byte orders and
@@ -2895,12 +2975,10 @@ coff_write_object_contents (abfd)
       internal_a.magic = NMAGIC; /* Assume separate i/d */
 #define __A_MAGIC_SET__
 #endif /* A29K */
-/* start-sanitize-tic80 */
 #ifdef TIC80COFF
     internal_a.magic = TIC80_ARCH_MAGIC;
 #define __A_MAGIC_SET__
 #endif /* TIC80 */
-/* end-sanitize-tic80 */
 #ifdef I860
     /* FIXME: What are the a.out magic numbers for the i860?  */
     internal_a.magic = 0;
@@ -2947,6 +3025,11 @@ coff_write_object_contents (abfd)
     internal_a.magic = IMAGE_NT_OPTIONAL_HDR_MAGIC;
 #endif
 
+#if defined MCORE_PE
+#define __A_MAGIC_SET__
+    internal_a.magic = IMAGE_NT_OPTIONAL_HDR_MAGIC;
+#endif 
+
 #if defined(I386)
 #define __A_MAGIC_SET__
 #if defined(LYNXOS)
@@ -3000,6 +3083,15 @@ coff_write_object_contents (abfd)
       if (! coff_write_relocs (abfd, firstundef))
        return false;
     }
+#ifdef COFF_LONG_SECTION_NAMES
+  else if (long_section_names)
+    {
+      /* If we have long section names we have to write out the string
+         table even if there are no symbols.  */
+      if (! coff_write_symbols (abfd))
+       return false;
+    }
+#endif
 #ifdef COFF_IMAGE_WITH_PE
 #ifdef PPC_PE
   else if ((abfd->flags & EXEC_P) != 0)
@@ -3339,10 +3431,11 @@ 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",
+                   (_("%s: warning: illegal symbol index %ld in line numbers"),
                     bfd_get_filename (abfd), dst.l_addr.l_symndx);
                  symndx = 0;
                  warned = true;
@@ -3356,7 +3449,7 @@ coff_slurp_line_table (abfd, asect)
              if (sym->lineno != NULL && ! warned)
                {
                  (*_bfd_error_handler)
-                   ("%s: warning: duplicate line number information for `%s'",
+                   (_("%s: warning: duplicate line number information for `%s'"),
                     bfd_get_filename (abfd),
                     bfd_asymbol_name (&sym->symbol));
                }
@@ -3447,7 +3540,8 @@ coff_slurp_symbol_table (abfd)
 #endif
 
            case C_EXT:
-#ifdef ARM
+           case C_WEAKEXT:
+#if defined ARM
             case C_THUMBEXT:
             case C_THUMBEXTFUNC:
 #endif
@@ -3460,7 +3554,7 @@ coff_slurp_symbol_table (abfd)
 #ifdef COFF_WITH_PE
             /* PE uses storage class 0x68 to denote a section symbol */
             case C_SECTION:
-           /* PE uses storage class 0x67 for a weak external symbol.  */
+           /* PE uses storage class 0x69 for a weak external symbol.  */
            case C_NT_WEAK:
 #endif
              if ((src->u.syment.n_scnum) == 0)
@@ -3483,7 +3577,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;
@@ -3512,15 +3606,23 @@ coff_slurp_symbol_table (abfd)
 #ifdef COFF_WITH_PE
              if (src->u.syment.n_sclass == C_NT_WEAK)
                dst->symbol.flags = BSF_WEAK;
+             if (src->u.syment.n_sclass == C_SECTION
+                 && src->u.syment.n_scnum > 0)
+               {
+                 dst->symbol.flags = BSF_LOCAL;
+               }
 #endif
 
+             if (src->u.syment.n_sclass == C_WEAKEXT)
+               dst->symbol.flags = BSF_WEAK;
+
              break;
 
            case C_STAT:        /* static                        */
 #ifdef I960
            case C_LEAFSTAT:    /* static leaf procedure        */
 #endif
-#ifdef ARM
+#if defined ARM 
             case C_THUMBSTAT:   /* Thumb static                  */
             case C_THUMBLABEL:  /* Thumb label                   */
             case C_THUMBSTATFUNC:/* Thumb static function        */
@@ -3535,7 +3637,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;
@@ -3557,15 +3659,11 @@ coff_slurp_symbol_table (abfd)
 #endif
            case C_REGPARM:     /* register parameter            */
            case C_REG: /* register variable             */
-/* start-sanitize-tic80 */
 #ifndef TIC80COFF
-/* end-sanitize-tic80 */
 #ifdef C_AUTOARG
            case C_AUTOARG:     /* 960-specific storage class */
 #endif
-/* start-sanitize-tic80 */
 #endif
-/* end-sanitize-tic80 */
            case C_TPDEF:       /* type definition               */
            case C_ARG:
            case C_AUTO:        /* automatic variable */
@@ -3645,7 +3743,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;
@@ -3668,18 +3766,16 @@ coff_slurp_symbol_table (abfd)
              /* NT uses 0x67 for a weak symbol, not C_ALIAS.  */
            case C_ALIAS:       /* duplicate tag                 */
 #endif
-/* start-sanitize-tic80 */
              /* New storage classes for TIc80 */
 #ifdef TIC80COFF
            case C_UEXT:        /* Tentative external definition */
 #endif
            case C_STATLAB:     /* Static load time label */
            case C_EXTLAB:      /* External load time label */
-/* end-sanitize-tic80 */
            case C_HIDDEN:      /* ext symbol in dmert public lib */
            default:
              (*_bfd_error_handler)
-               ("%s: Unrecognized storage class %d for %s symbol `%s'",
+               (_("%s: Unrecognized storage class %d for %s symbol `%s'"),
                 bfd_get_filename (abfd), src->u.syment.n_sclass,
                 dst->symbol.section->name, dst->symbol.name);
              dst->symbol.flags = BSF_DEBUGGING;
@@ -3729,11 +3825,7 @@ coff_slurp_symbol_table (abfd)
 #endif
 
 #ifdef COFFARM
-#ifdef COFF_WITH_PE
-#define OTHER_GLOBAL_CLASS C_SECTION || syment->n_sclass == C_THUMBEXT
-#else
 #define OTHER_GLOBAL_CLASS C_THUMBEXT || syment->n_sclass == C_THUMBEXTFUNC
-#endif
 #else
 #ifdef COFF_WITH_PE
 #define OTHER_GLOBAL_CLASS C_SECTION
@@ -3867,7 +3959,7 @@ coff_slurp_reloc_table (abfd, asect, symbols)
          if (dst.r_symndx < 0 || dst.r_symndx >= obj_conv_table_size (abfd))
            {
              (*_bfd_error_handler)
-               ("%s: warning: illegal symbol index %ld in relocs",
+               (_("%s: warning: illegal symbol index %ld in relocs"),
                 bfd_get_filename (abfd), dst.r_symndx);
              cache_ptr->sym_ptr_ptr = bfd_abs_section_ptr->symbol_ptr_ptr;
              ptr = NULL;
@@ -3905,7 +3997,7 @@ coff_slurp_reloc_table (abfd, asect, symbols)
       if (cache_ptr->howto == NULL)
        {
          (*_bfd_error_handler)
-           ("%s: illegal relocation type %d at address 0x%lx",
+           (_("%s: illegal relocation type %d at address 0x%lx"),
             bfd_get_filename (abfd), dst.r_type, (long) dst.r_vaddr);
          bfd_set_error (bfd_error_bad_value);
          return false;
@@ -4086,19 +4178,26 @@ dummy_reloc16_extra_cases (abfd, link_info, link_order, reloc, data, src_ptr,
 #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
+  PARAMS ((bfd *, struct coff_final_link_info *));
+
 static boolean
-_coff_link_output_has_begun (abfd)
+coff_link_output_has_begun (abfd, info)
      bfd * abfd;
+     struct coff_final_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
+  PARAMS ((bfd *, struct coff_final_link_info *));
+
 static boolean
-_coff_final_link_postscript (abfd, pfinfo)
+coff_final_link_postscript (abfd, pfinfo)
      bfd * abfd;
      struct coff_final_link_info * pfinfo;
 {
@@ -4243,3 +4342,7 @@ static CONST bfd_coff_backend_data bfd_coff_std_swap_table =
 #ifndef coff_bfd_relax_section
 #define coff_bfd_relax_section             bfd_generic_relax_section
 #endif
+
+#ifndef coff_bfd_gc_sections
+#define coff_bfd_gc_sections               bfd_generic_gc_sections
+#endif
This page took 0.030589 seconds and 4 git commands to generate.