Add XCOFF64 support.
[deliverable/binutils-gdb.git] / bfd / coffcode.h
index ace39e1d1149ec3b5bbff9d70adbdb9352a814b7..08e99f6bae80b38c52ce47e6de834d3f173c6ce2 100644 (file)
@@ -1,5 +1,5 @@
 /* Support for the generic parts of most COFF variants, for BFD.
-   Copyright 1990, 91, 92, 93, 94, 95, 96, 97, 98, 1999
+   Copyright 1990, 91, 92, 93, 94, 95, 96, 97, 98, 99, 2000
    Free Software Foundation, Inc.
    Written by Cygnus Support.
 
@@ -398,7 +398,11 @@ sec_to_styp_flags (sec_name, sec_flags)
     }
   else if (!strncmp (sec_name, ".stab", 5))
     {
+#ifdef COFF_ALIGN_IN_S_FLAGS
+      styp_flags = STYP_DSECT;
+#else
       styp_flags = STYP_INFO;
+#endif
     }
 #ifdef RS6000COFF_C
   else if (!strcmp (sec_name, _PAD))
@@ -436,6 +440,16 @@ sec_to_styp_flags (sec_name, sec_flags)
       styp_flags = STYP_BSS;
     }
 
+#ifdef STYP_CLINK
+  if (sec_flags & SEC_CLINK)
+    styp_flags |= STYP_CLINK;
+#endif
+
+#ifdef STYP_BLOCK
+  if (sec_flags & SEC_BLOCK)
+    styp_flags |= STYP_BLOCK;
+#endif
+
 #ifdef STYP_NOLOAD
   if ((sec_flags & (SEC_NEVER_LOAD | SEC_COFF_SHARED_LIBRARY)) != 0)
     styp_flags |= STYP_NOLOAD;
@@ -533,6 +547,16 @@ styp_to_sec_flags (abfd, hdr, name, section)
   long styp_flags = internal_s->s_flags;
   flagword sec_flags = 0;
 
+#ifdef STYP_BLOCK
+  if (styp_flags & STYP_BLOCK)
+      sec_flags |= SEC_BLOCK;
+#endif  
+
+#ifdef STYP_CLINK
+  if (styp_flags & STYP_CLINK)
+      sec_flags |= SEC_CLINK;
+#endif  
+
 #ifdef STYP_NOLOAD
   if (styp_flags & STYP_NOLOAD)
     {
@@ -760,7 +784,7 @@ styp_to_sec_flags (abfd, hdr, name, section)
        {
          bfd_byte *esymstart, *esym, *esymend;
          int seen_state = 0;
-         char *target_name;
+         char *target_name = NULL;
 
          esymstart = esym = (bfd_byte *) obj_coff_external_syms (abfd);
          esymend = esym + obj_raw_syment_count (abfd) * bfd_coff_symesz (abfd);
@@ -1500,10 +1524,17 @@ coff_set_alignment_hook (abfd, section, scnhdr)
       break;
 #endif
 #ifdef TIC80COFF
-  /* TI tools hijack bits 8-11 for the alignment */
+  /* TI tools puts the alignment power in bits 8-11 */
   i = (hdr->s_flags >> 8) & 0xF ;
+#endif
+#ifdef COFF_DECODE_ALIGNMENT
+  i = COFF_DECODE_ALIGNMENT(hdr->s_flags);
 #endif
   section->alignment_power = i;
+
+#ifdef coff_set_section_load_page
+  coff_set_section_load_page (section, hdr->s_page);
+#endif
 }
 
 #else /* ! COFF_ALIGN_IN_SECTION_HEADER */
@@ -1756,6 +1787,12 @@ coff_set_arch_mach_hook (abfd, filehdr)
       machine = 0;
       break;
 #endif
+#ifdef IA64MAGIC
+    case IA64MAGIC:
+      arch = bfd_arch_ia64;
+      machine = 0;
+      break;
+#endif
 #ifdef A29K_MAGIC_BIG
     case A29K_MAGIC_BIG:
     case A29K_MAGIC_LITTLE:
@@ -1765,6 +1802,8 @@ coff_set_arch_mach_hook (abfd, filehdr)
 #endif
 #ifdef ARMMAGIC
     case ARMMAGIC:
+    case ARMPEMAGIC:
+    case THUMBPEMAGIC:
       arch = bfd_arch_arm;
       switch (internal_f->f_flags & F_ARM_ARCHITECTURE_MASK)
        {
@@ -1862,9 +1901,13 @@ coff_set_arch_mach_hook (abfd, filehdr)
 #endif
 
 #ifdef RS6000COFF_C
+#ifdef XCOFF64
+    case U802TOC64MAGIC:
+#else
     case U802ROMAGIC:
     case U802WRMAGIC:
     case U802TOCMAGIC:
+#endif
       {
        int cputype;
 
@@ -1880,17 +1923,23 @@ coff_set_arch_mach_hook (abfd, filehdr)
              cputype = 0;
            else
              {
-               bfd_byte buf[bfd_coff_symesz (abfd)];
+               bfd_byte *buf;
                struct internal_syment sym;
 
+               buf = (bfd_byte *) bfd_malloc (bfd_coff_symesz (abfd));
                if (bfd_seek (abfd, obj_sym_filepos (abfd), SEEK_SET) != 0
-                   || bfd_read (buf, 1, bfd_coff_symesz (abfd), abfd) != bfd_coff_symesz (abfd))
-                 return false;
-               coff_swap_sym_in (abfd, (PTR) buf, (PTR) &sym);
+                   || (bfd_read (buf, 1, bfd_coff_symesz (abfd), abfd) 
+                       != bfd_coff_symesz (abfd)))
+                 {
+                   free (buf);
+                   return false;
+                 }
+               bfd_coff_swap_sym_in (abfd, (PTR) buf, (PTR) &sym);
                if (sym.n_sclass == C_FILE)
                  cputype = sym.n_type & 0xff;
                else
                  cputype = 0;
+               free (buf);
              }
          }
 
@@ -1907,7 +1956,11 @@ coff_set_arch_mach_hook (abfd, filehdr)
            machine = 0;
 #else
            arch = bfd_arch_rs6000;
+#ifdef XCOFF64
+           machine = 620;
+#else
            machine = 6000;
+#endif
 #endif /* POWERMAC */
            break;
 
@@ -1969,11 +2022,21 @@ coff_set_arch_mach_hook (abfd, filehdr)
 #ifdef SH_ARCH_MAGIC_BIG
     case SH_ARCH_MAGIC_BIG:
     case SH_ARCH_MAGIC_LITTLE:
+#ifdef COFF_WITH_PE
+    case SH_ARCH_MAGIC_WINCE:
+#endif
       arch = bfd_arch_sh;
       machine = 0;
       break;
 #endif
 
+#ifdef MIPS_ARCH_MAGIC_WINCE
+    case MIPS_ARCH_MAGIC_WINCE:
+      arch = bfd_arch_mips;
+      machine = 0;
+      break;
+#endif
+
 #ifdef H8500MAGIC
     case H8500MAGIC:
       arch = bfd_arch_h8500;
@@ -1997,6 +2060,37 @@ coff_set_arch_mach_hook (abfd, filehdr)
       break;
 #endif
 
+#ifdef TICOFF0MAGIC
+#ifdef TICOFF_TARGET_ARCH
+      /* this TI COFF section should be used by all new TI COFF v0 targets */
+    case TICOFF0MAGIC:
+      arch = TICOFF_TARGET_ARCH;
+      break;
+#endif
+#endif
+
+#ifdef TICOFF1MAGIC
+      /* this TI COFF section should be used by all new TI COFF v1/2 targets */
+      /* TI COFF1 and COFF2 use the target_id field to specify which arch */
+    case TICOFF1MAGIC:
+    case TICOFF2MAGIC:
+      switch (internal_f->f_target_id)
+        {
+#ifdef TI_TARGET_ID
+        case TI_TARGET_ID:
+          arch = TICOFF_TARGET_ARCH;
+          break;
+#endif
+        default:
+          arch = bfd_arch_obscure;
+          (*_bfd_error_handler)
+            (_("Unrecognized TI COFF target id '0x%x'"), 
+             internal_f->f_target_id);
+          break;
+        }
+      break;
+#endif
+
 #ifdef TIC80_ARCH_MAGIC
     case TIC80_ARCH_MAGIC:
       arch = bfd_arch_tic80;
@@ -2039,6 +2133,10 @@ symname_in_debug_hook (abfd, sym)
 
 #ifdef RS6000COFF_C
 
+#ifdef XCOFF64
+#define FORCE_SYMNAMES_IN_STRINGS
+#endif
+  
 /* Handle the csect auxent of a C_EXT or C_HIDEXT symbol.  */
 
 static boolean coff_pointerize_aux_hook
@@ -2268,7 +2366,11 @@ coff_write_relocs (abfd, first_undef)
 #endif
            if (q->sym_ptr_ptr)
              {
+#ifdef SECTION_RELATIVE_ABSOLUTE_SYMBOL_P
+                if (SECTION_RELATIVE_ABSOLUTE_SYMBOL_P (q,s))
+#else
                if (q->sym_ptr_ptr == bfd_abs_section_ptr->symbol_ptr_ptr)
+#endif
                  /* This is a relocation relative to the absolute symbol.  */
                  n.r_symndx = -1;
                else
@@ -2385,6 +2487,33 @@ coff_set_flags (abfd, magicp, flagsp)
       *magicp = TIC30MAGIC;
       return true;
 #endif
+
+#ifdef TICOFF_DEFAULT_MAGIC
+    case TICOFF_TARGET_ARCH:
+      /* if there's no indication of which version we want, use the default */
+      if (!abfd->xvec )
+        *magicp = TICOFF_DEFAULT_MAGIC;
+      else
+        {
+          /* we may want to output in a different COFF version */
+          switch (abfd->xvec->name[4])
+            {
+            case '0':
+              *magicp = TICOFF0MAGIC;
+              break;
+            case '1':
+              *magicp = TICOFF1MAGIC;
+              break;
+            case '2':
+              *magicp = TICOFF2MAGIC;
+              break;
+            default:
+              return false;
+            }
+        }
+      return true;
+#endif
+
 #ifdef TIC80_ARCH_MAGIC
     case bfd_arch_tic80:
       *magicp = TIC80_ARCH_MAGIC;
@@ -2392,7 +2521,11 @@ coff_set_flags (abfd, magicp, flagsp)
 #endif
 #ifdef ARMMAGIC
     case bfd_arch_arm:
+#ifdef ARM_WINCE
+      * magicp = ARMPEMAGIC;
+#else
       * magicp = ARMMAGIC;
+#endif
       * flagsp = 0;
       if (APCS_SET (abfd))
        {
@@ -2442,6 +2575,12 @@ coff_set_flags (abfd, magicp, flagsp)
       return true;
       break;
 #endif
+#ifdef IA64MAGIC
+    case bfd_arch_ia64:
+      *magicp = IA64MAGIC;
+      return true;
+      break;
+#endif
 #ifdef MC68MAGIC
     case bfd_arch_m68k:
 #ifdef APOLLOM68KMAGIC
@@ -2487,10 +2626,21 @@ coff_set_flags (abfd, magicp, flagsp)
 
 #ifdef SH_ARCH_MAGIC_BIG
     case bfd_arch_sh:
+#ifdef COFF_IMAGE_WITH_PE
+      *magicp = SH_ARCH_MAGIC_WINCE;
+#else
       if (bfd_big_endian (abfd))
        *magicp = SH_ARCH_MAGIC_BIG;
       else
        *magicp = SH_ARCH_MAGIC_LITTLE;
+#endif
+      return true;
+      break;
+#endif
+
+#ifdef MIPS_ARCH_MAGIC_WINCE
+    case bfd_arch_mips:
+      *magicp = MIPS_ARCH_MAGIC_WINCE;
       return true;
       break;
 #endif
@@ -2529,12 +2679,18 @@ coff_set_flags (abfd, magicp, flagsp)
       break;
 #endif
 
-#ifdef U802TOCMAGIC
+#ifdef RS6000COFF_C
     case bfd_arch_rs6000:
 #ifndef PPCMAGIC
     case bfd_arch_powerpc:
 #endif
-      *magicp = U802TOCMAGIC;
+#ifdef XCOFF64
+      if (bfd_get_mach (abfd) == 620 && !strncmp (abfd->xvec->name,"aix", 3))
+       *magicp = U802TOC64MAGIC; 
+      else
+#else
+       *magicp = U802TOCMAGIC; 
+#endif
       return true;
       break;
 #endif
@@ -2604,7 +2760,7 @@ sort_by_secaddr (arg1, arg2)
 #ifndef I960
 #define ALIGN_SECTIONS_IN_FILE
 #endif
-#ifdef TIC80COFF
+#if defined(TIC80COFF) || defined(TICOFF)
 #undef ALIGN_SECTIONS_IN_FILE
 #endif
 
@@ -2642,8 +2798,8 @@ coff_compute_section_file_positions (abfd)
              size_t len;
 
              len = strlen (bfd_asymbol_name (*symp));
-             if (len > SYMNMLEN)
-               sz += len + 3;
+             if (len > SYMNMLEN || bfd_coff_force_symnames_in_strings (abfd))
+               sz += len + 1 + bfd_coff_debug_string_prefix_length (abfd);
            }
        }
       if (sz > 0)
@@ -3127,6 +3283,9 @@ coff_write_object_contents (abfd)
       section.s_vaddr = current->vma;
       section.s_paddr = current->lma;
       section.s_size =  current->_raw_size;
+#ifdef coff_get_section_load_page
+      section.s_page = coff_get_section_load_page (current); 
+#endif
 
 #ifdef COFF_WITH_PE
       section.s_paddr = 0;
@@ -3168,13 +3327,15 @@ coff_write_object_contents (abfd)
          && ! is_reloc_section)
        hasdebug = true;
 
-#ifdef RS6000COFF_C
+#ifdef RS6000COFF_C 
+#ifndef XCOFF64
       /* Indicate the use of an XCOFF overflow section header.  */
       if (current->reloc_count >= 0xffff || current->lineno_count >= 0xffff)
        {
          section.s_nreloc = 0xffff;
          section.s_nlnno = 0xffff;
        }
+#endif
 #endif
 
       section.s_flags = sec_to_styp_flags (current->name, current->flags);
@@ -3196,10 +3357,13 @@ coff_write_object_contents (abfd)
       section.s_align = (current->alignment_power
                         ? 1 << current->alignment_power
                         : 0);
-#else
-#ifdef TIC80COFF
+#endif
+#ifdef TIC80COFF 
+      /* TI COFF puts the alignment power in bits 8-11 of the flags */
       section.s_flags |= (current->alignment_power & 0xF) << 8;
 #endif
+#ifdef COFF_ENCODE_ALIGNMENT
+      COFF_ENCODE_ALIGNMENT(section, current->alignment_power);
 #endif
 
 #ifdef COFF_IMAGE_WITH_PE
@@ -3389,6 +3553,11 @@ coff_write_object_contents (abfd)
     internal_f.f_flags |= F_AR32W;
 #endif
 
+#ifdef TI_TARGET_ID
+  /* target id is used in TI COFF v1 and later; COFF0 won't use this field,
+     but it doesn't hurt to set it internally */
+  internal_f.f_target_id = TI_TARGET_ID;
+#endif
 #ifdef TIC80_TARGET_ID
   internal_f.f_target_id = TIC80_TARGET_ID;
 #endif
@@ -3430,6 +3599,10 @@ coff_write_object_contents (abfd)
       internal_a.magic = NMAGIC; /* Assume separate i/d */
 #define __A_MAGIC_SET__
 #endif /* A29K */
+#ifdef TICOFF_AOUT_MAGIC
+    internal_a.magic = TICOFF_AOUT_MAGIC;
+#define __A_MAGIC_SET__
+#endif
 #ifdef TIC80COFF
     internal_a.magic = TIC80_ARCH_MAGIC;
 #define __A_MAGIC_SET__
@@ -3494,6 +3667,11 @@ coff_write_object_contents (abfd)
 #endif /* LYNXOS */
 #endif /* I386 */
 
+#if defined(IA64)
+#define __A_MAGIC_SET__
+    internal_a.magic = ZMAGIC;
+#endif /* IA64 */
+
 #if defined(SPARC)
 #define __A_MAGIC_SET__
 #if defined(LYNXOS)
@@ -3508,6 +3686,16 @@ coff_write_object_contents (abfd)
     RS6K_AOUTHDR_OMAGIC;
 #endif
 
+#if defined(SH) && defined(COFF_WITH_PE)
+#define __A_MAGIC_SET__
+    internal_a.magic = SH_PE_MAGIC;
+#endif
+
+#if defined(MIPS) && defined(COFF_WITH_PE)
+#define __A_MAGIC_SET__
+    internal_a.magic = MIPS_PE_MAGIC;
+#endif
+
 #ifndef __A_MAGIC_SET__
 #include "Your aouthdr magic number is not being set!"
 #else
@@ -3900,7 +4088,7 @@ coff_slurp_line_table (abfd, asect)
       while (counter < asect->lineno_count)
        {
          struct internal_lineno dst;
-         coff_swap_lineno_in (abfd, src, &dst);
+         bfd_coff_swap_lineno_in (abfd, src, &dst);
          cache_ptr->line_number = dst.l_lnno;
 
          if (cache_ptr->line_number == 0)
@@ -4153,7 +4341,8 @@ coff_slurp_symbol_table (abfd)
 #endif
            case C_REGPARM:     /* register parameter            */
            case C_REG: /* register variable             */
-#ifndef TIC80COFF
+              /* C_AUTOARG conflictes with TI COFF C_UEXT */
+#if !defined (TIC80COFF) && !defined (TICOFF)
 #ifdef C_AUTOARG
            case C_AUTOARG:     /* 960-specific storage class */
 #endif
@@ -4257,6 +4446,11 @@ coff_slurp_symbol_table (abfd)
 #endif
              break;
 
+           case C_STATLAB:     /* Static load time label */
+              dst->symbol.value = src->u.syment.n_value;
+              dst->symbol.flags = BSF_GLOBAL;
+              break;
+
            case C_NULL:
              /* PE DLLs sometimes have zeroed out symbols for some
                  reason.  Just ignore them without a warning.  */
@@ -4275,11 +4469,10 @@ coff_slurp_symbol_table (abfd)
              /* NT uses 0x67 for a weak symbol, not C_ALIAS.  */
            case C_ALIAS:       /* duplicate tag                 */
 #endif
-             /* New storage classes for TIc80 */
-#ifdef TIC80COFF
+             /* New storage classes for TI COFF */ 
+#if defined(TIC80COFF) || defined(TICOFF)
            case C_UEXT:        /* Tentative external definition */
 #endif
-           case C_STATLAB:     /* Static load time label */
            case C_EXTLAB:      /* External load time label */
            case C_HIDDEN:      /* ext symbol in dmert public lib */
            default:
@@ -4836,7 +5029,17 @@ static const bfd_coff_backend_data bfd_coff_std_swap_table =
 #else
   false,
 #endif
-  COFF_DEFAULT_SECTION_ALIGNMENT_POWER,
+  COFF_DEFAULT_SECTION_ALIGNMENT_POWER, 
+#ifdef COFF_FORCE_SYMBOLS_IN_STRINGS
+  true,
+#else
+  false,
+#endif
+#ifdef COFF_DEBUG_STRING_WIDE_PREFIX
+  4,
+#else
+  2,
+#endif
   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,
This page took 0.029685 seconds and 4 git commands to generate.