* hppa.h (pa_opcodes): Use "cX" completer instead of "cx" in fstqx
[external/binutils.git] / gas / config / obj-aout.c
index eb71397..ce72135 100644 (file)
@@ -1,12 +1,13 @@
 /* a.out object file format
    Copyright 1989, 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1999, 2000,
-   2001, 2002, 2003, 2004, 2005 Free Software Foundation, Inc.
+   2001, 2002, 2003, 2004, 2005, 2007, 2009, 2010, 2012
+   Free Software Foundation, Inc.
 
    This file is part of GAS, the GNU Assembler.
 
    GAS is free software; you can redistribute it and/or modify
    it under the terms of the GNU General Public License as
-   published by the Free Software Foundation; either version 2,
+   published by the Free Software Foundation; either version 3,
    or (at your option) any later version.
 
    GAS is distributed in the hope that it will be useful, but
 #define OBJ_HEADER "obj-aout.h"
 
 #include "as.h"
-#ifdef BFD_ASSEMBLER
 #undef NO_RELOC
 #include "aout/aout64.h"
-#endif
 #include "obstack.h"
 
-#ifndef BFD_ASSEMBLER
-/* in: segT   out: N_TYPE bits.  */
-const short seg_N_TYPE[] =
-{
-  N_ABS,
-  N_TEXT,
-  N_DATA,
-  N_BSS,
-  N_UNDF,                      /* Unknown.  */
-  N_UNDF,                      /* Error.  */
-  N_UNDF,                      /* Expression.  */
-  N_UNDF,                      /* Debug.  */
-  N_UNDF,                      /* Ntv.  */
-  N_UNDF,                      /* Ptv.  */
-  N_REGISTER,                  /* Register.  */
-};
-
-const segT N_TYPE_seg[N_TYPE + 2] =
-{                              /* N_TYPE == 0x1E = 32-2 */
-  SEG_UNKNOWN,                 /* N_UNDF == 0 */
-  SEG_GOOF,
-  SEG_ABSOLUTE,                        /* N_ABS == 2 */
-  SEG_GOOF,
-  SEG_TEXT,                    /* N_TEXT == 4 */
-  SEG_GOOF,
-  SEG_DATA,                    /* N_DATA == 6 */
-  SEG_GOOF,
-  SEG_BSS,                     /* N_BSS == 8 */
-  SEG_GOOF,
-  SEG_GOOF, SEG_GOOF, SEG_GOOF, SEG_GOOF, SEG_GOOF, SEG_GOOF, SEG_GOOF, SEG_GOOF,
-  SEG_GOOF, SEG_GOOF, SEG_GOOF, SEG_GOOF, SEG_GOOF, SEG_GOOF, SEG_GOOF, SEG_GOOF,
-  SEG_GOOF, SEG_GOOF, SEG_GOOF, SEG_GOOF,
-  SEG_REGISTER,                        /* Dummy N_REGISTER for regs = 30.  */
-  SEG_GOOF,
-};
-#endif
-
-#ifdef BFD_ASSEMBLER
-
 void
 obj_aout_frob_symbol (symbolS *sym, int *punt ATTRIBUTE_UNUSED)
 {
   flagword flags;
   asection *sec;
-  int desc, type, other;
+  int type;
 
   flags = symbol_get_bfdsym (sym)->flags;
-  desc = aout_symbol (symbol_get_bfdsym (sym))->desc;
   type = aout_symbol (symbol_get_bfdsym (sym))->type;
-  other = aout_symbol (symbol_get_bfdsym (sym))->other;
   sec = S_GET_SEGMENT (sym);
 
   /* Only frob simple symbols this way right now.  */
   if (! (type & ~ (N_TYPE | N_EXT)))
     {
       if (type == (N_UNDF | N_EXT)
-         && sec == &bfd_abs_section)
+         && sec == bfd_abs_section_ptr)
        {
          sec = bfd_und_section_ptr;
          S_SET_SEGMENT (sym, sec);
@@ -96,8 +54,8 @@ obj_aout_frob_symbol (symbolS *sym, int *punt ATTRIBUTE_UNUSED)
          && (type & N_TYPE) != N_SETD
          && (type & N_TYPE) != N_SETB
          && type != N_WARNING
-         && (sec == &bfd_abs_section
-             || sec == &bfd_und_section))
+         && (sec == bfd_abs_section_ptr
+             || sec == bfd_und_section_ptr))
        return;
       if (flags & BSF_EXPORT)
        type |= N_EXT;
@@ -173,140 +131,9 @@ obj_aout_frob_file_before_fix (void)
     x = bfd_set_section_contents (stdoutput, data_section, &b, (file_ptr) 0,
                                  (bfd_size_type) 1);
 
-  assert (x);
-}
-
-#else /* ! BFD_ASSEMBLER */
-
-/* Relocation.  */
-
-/** Crawl along a fixS chain. Emit the segment's relocations.  */
-
-void
-obj_emit_relocations (char **where,
-                     fixS *fixP,               /* Fixup chain for this segment.  */
-                     relax_addressT segment_address_in_file)
-{
-  for (; fixP; fixP = fixP->fx_next)
-    if (fixP->fx_done == 0)
-      {
-       symbolS *sym;
-
-       sym = fixP->fx_addsy;
-       while (sym->sy_value.X_op == O_symbol
-              && (! S_IS_DEFINED (sym) || S_IS_COMMON (sym)))
-         sym = sym->sy_value.X_add_symbol;
-       fixP->fx_addsy = sym;
-
-       if (! sym->sy_resolved && ! S_IS_DEFINED (sym))
-         {
-           char *file;
-           unsigned int line;
-
-           if (expr_symbol_where (sym, &file, &line))
-             as_bad_where (file, line, _("unresolved relocation"));
-           else
-             as_bad (_("bad relocation: symbol `%s' not in symbol table"),
-                     S_GET_NAME (sym));
-         }
-
-       tc_aout_fix_to_chars (*where, fixP, segment_address_in_file);
-       *where += md_reloc_size;
-      }
-}
-
-#ifndef obj_header_append
-/* Aout file generation & utilities.  */
-
-/* An AOUT header on disk is laid out in target byte order.  */
-
-void
-obj_header_append (char **where, object_headers *headers)
-{
-  char *p;
-
-  tc_headers_hook (headers);
-
-#ifdef __A_OUT_GNU_H__
-#define SIZEOF_HEADER(PIECE) (sizeof (((struct exec_bytes *) 0)->PIECE))
-#else
-#define SIZEOF_HEADER(PIECE) 4
-#endif
-#define DO(PIECE) \
-  md_number_to_chars (p, headers->header.PIECE, SIZEOF_HEADER (PIECE)); \
-  p += SIZEOF_HEADER (PIECE);
-
-  p = *where;
-  DO (a_info);
-  DO (a_text);
-  DO (a_data);
-  DO (a_bss);
-  DO (a_syms);
-  DO (a_entry);
-  DO (a_trsize);
-  DO (a_drsize);
-  *where = p;
-#undef DO
-#undef SIZEOF_HEADER
-}
-#endif /* ! defined (obj_header_append) */
-
-void
-obj_symbol_to_chars (char **where, symbolS *symbolP)
-{
-  char *p = *where;
-  md_number_to_chars (p, S_GET_OFFSET (symbolP), 4);
-  p += 4;
-  /* Can't use S_GET_TYPE here as it masks.  */
-  *p++ = symbolP->sy_symbol.n_type;
-  *p++ = symbolP->sy_symbol.n_other;
-  md_number_to_chars (p, S_GET_DESC (symbolP), 2);
-  p += 2;
-  md_number_to_chars (p, S_GET_VALUE (symbolP), 4);
-  p += 4;
-  *where = p;
-}
-
-void
-obj_emit_symbols (char **where, symbolS *symbol_rootP)
-{
-  symbolS *symbolP;
-
-  /* Emit all symbols left in the symbol chain.  */
-  for (symbolP = symbol_rootP; symbolP; symbolP = symbol_next (symbolP))
-    {
-      /* Used to save the offset of the name. It is used to point
-        to the string in memory but must be a file offset.  */
-      char *temp;
-
-      temp = S_GET_NAME (symbolP);
-      S_SET_OFFSET (symbolP, symbolP->sy_name_offset);
-
-      /* Any symbol still undefined and is not a dbg symbol is made N_EXT.  */
-      if (!S_IS_DEBUG (symbolP) && !S_IS_DEFINED (symbolP))
-       S_SET_EXTERNAL (symbolP);
-
-      /* Adjust the type of a weak symbol.  */
-      if (S_GET_WEAK (symbolP))
-       {
-         switch (S_GET_TYPE (symbolP))
-           {
-           case N_UNDF: S_SET_TYPE (symbolP, N_WEAKU); break;
-           case N_ABS:  S_SET_TYPE (symbolP, N_WEAKA); break;
-           case N_TEXT: S_SET_TYPE (symbolP, N_WEAKT); break;
-           case N_DATA: S_SET_TYPE (symbolP, N_WEAKD); break;
-           case N_BSS:  S_SET_TYPE (symbolP, N_WEAKB); break;
-           default: as_bad (_("%s: bad type for weak symbol"), temp); break;
-           }
-       }
-
-      obj_symbol_to_chars (where, symbolP);
-      S_SET_NAME (symbolP, temp);
-    }
+  gas_assert (x);
 }
 
-#endif /* ! BFD_ASSEMBLER */
-
 static void
 obj_aout_line (int ignore ATTRIBUTE_UNUSED)
 {
@@ -381,136 +208,6 @@ obj_aout_type (int ignore ATTRIBUTE_UNUSED)
   s_ignore (0);
 }
 
-#ifndef BFD_ASSEMBLER
-
-void
-obj_crawl_symbol_chain (object_headers *headers)
-{
-  symbolS *symbolP;
-  symbolS **symbolPP;
-  int symbol_number = 0;
-
-  tc_crawl_symbol_chain (headers);
-
-  symbolPP = &symbol_rootP;    /*->last symbol chain link.  */
-  while ((symbolP = *symbolPP) != NULL)
-    {
-      if (symbolP->sy_mri_common)
-       {
-         if (S_IS_EXTERNAL (symbolP))
-           as_bad (_("%s: global symbols not supported in common sections"),
-                   S_GET_NAME (symbolP));
-         *symbolPP = symbol_next (symbolP);
-         continue;
-       }
-
-      if (flag_readonly_data_in_text && (S_GET_SEGMENT (symbolP) == SEG_DATA))
-       {
-         S_SET_SEGMENT (symbolP, SEG_TEXT);
-       }
-
-      resolve_symbol_value (symbolP);
-
-      /* Skip symbols which were equated to undefined or common
-        symbols.  Also skip defined uncommon symbols which can
-        be resolved since in this case they should have been
-        resolved to a non-symbolic constant.  */
-      if (symbolP->sy_value.X_op == O_symbol
-         && (! S_IS_DEFINED (symbolP)
-             || S_IS_COMMON (symbolP)
-             || symbol_resolved_p (symbolP)))
-       {
-         *symbolPP = symbol_next (symbolP);
-         continue;
-       }
-
-      /* OK, here is how we decide which symbols go out into the brave
-        new symtab.  Symbols that do are:
-
-        * symbols with no name (stabd's?)
-        * symbols with debug info in their N_TYPE
-
-        Symbols that don't are:
-        * symbols that are registers
-        * symbols with \1 as their 3rd character (numeric labels)
-        * "local labels" as defined by S_LOCAL_NAME(name) if the -L
-        switch was passed to gas.
-
-        All other symbols are output.  We complain if a deleted
-        symbol was marked external.  */
-
-      if (!S_IS_REGISTER (symbolP)
-         && (!S_GET_NAME (symbolP)
-             || S_IS_DEBUG (symbolP)
-             || !S_IS_DEFINED (symbolP)
-             || S_IS_EXTERNAL (symbolP)
-             || (S_GET_NAME (symbolP)[0] != '\001'
-                 && (flag_keep_locals || !S_LOCAL_NAME (symbolP)))))
-       {
-         symbolP->sy_number = symbol_number++;
-
-         /* The + 1 after strlen account for the \0 at the
-                          end of each string */
-         if (!S_IS_STABD (symbolP))
-           {
-             /* Ordinary case.  */
-             symbolP->sy_name_offset = string_byte_count;
-             string_byte_count += strlen (S_GET_NAME (symbolP)) + 1;
-           }
-         else                  /* .Stabd case.  */
-           symbolP->sy_name_offset = 0;
-         symbolPP = &symbolP->sy_next;
-       }
-      else
-       {
-         if (S_IS_EXTERNAL (symbolP) || !S_IS_DEFINED (symbolP))
-           /* This warning should never get triggered any more.
-              Well, maybe if you're doing twisted things with
-              register names...  */
-           as_bad (_("Local symbol %s never defined."),
-                   decode_local_label_name (S_GET_NAME (symbolP)));
-
-         /* Unhook it from the chain */
-         *symbolPP = symbol_next (symbolP);
-       }
-    }
-
-  H_SET_SYMBOL_TABLE_SIZE (headers, symbol_number);
-}
-
-/* Find strings by crawling along symbol table chain.  */
-
-void
-obj_emit_strings (char **where)
-{
-  symbolS *symbolP;
-
-  md_number_to_chars (*where, string_byte_count, 4);
-  *where += 4;
-
-  for (symbolP = symbol_rootP; symbolP; symbolP = symbol_next (symbolP))
-    if (S_GET_NAME (symbolP))
-      append (where, S_GET_NAME (symbolP),
-             (unsigned long) (strlen (S_GET_NAME (symbolP)) + 1));
-}
-
-#ifndef AOUT_VERSION
-#define AOUT_VERSION 0
-#endif
-
-void
-obj_pre_write_hook (object_headers *headers)
-{
-  H_SET_DYNAMIC (headers, 0);
-  H_SET_VERSION (headers, AOUT_VERSION);
-  H_SET_MACHTYPE (headers, AOUT_MACHTYPE);
-  tc_aout_pre_write_hook (headers);
-}
-
-#endif /* ! BFD_ASSEMBLER */
-
-#ifdef BFD_ASSEMBLER
-
 /* Support for an AOUT emulation.  */
 
 static void
@@ -612,9 +309,10 @@ const struct format_ops aout_format_ops =
   aout_pop_insert,
   0,   /* ecoff_set_ext.  */
   0,   /* read_begin_hook.  */
-  0    /* symbol_new_hook.  */
+  0,   /* symbol_new_hook.  */
+  0,   /* symbol_clone_hook.  */
+  0    /* adjust_symtab.  */
 };
-#endif /* BFD_ASSEMBLER */
 
 const pseudo_typeS aout_pseudo_table[] =
 {