* dwarf2dbg.c (dwarf2_gen_line_info): Mirror the section symbol
[deliverable/binutils-gdb.git] / gas / config / obj-coff.c
index 394bc19f74bb229a7da735e0ad7affe318a190d1..a6bdaeee7617ab2e7ef8e55467417aaf90d7f024 100644 (file)
@@ -1,5 +1,5 @@
 /* coff object file format
-   Copyright (C) 1989, 90, 91, 92, 93, 94, 95, 96, 1997
+   Copyright (C) 1989, 90, 91, 92, 93, 94, 95, 96, 97, 98, 1999
    Free Software Foundation, Inc.
 
    This file is part of GAS.
@@ -30,6 +30,7 @@
 #define KEEP_RELOC_INFO
 #endif
 
+static void obj_coff_bss PARAMS ((int));
 const char *s_get_name PARAMS ((symbolS * s));
 static symbolS *def_symbol_in_progress;
 
@@ -129,7 +130,7 @@ tag_insert (name, symbolP)
 
   if ((error_string = hash_jam (tag_hash, name, (char *) symbolP)))
     {
-      as_fatal ("Inserting \"%s\" into structure table failed: %s",
+      as_fatal (_("Inserting \"%s\" into structure table failed: %s"),
                name, error_string);
     }
 }
@@ -165,7 +166,59 @@ tag_find_or_make (name)
   return symbolP;
 }
 
+/* We accept the .bss directive to set the section for backward
+   compatibility with earlier versions of gas.  */
+
+static void
+obj_coff_bss (ignore)
+     int ignore;
+{
+  if (*input_line_pointer == '\n')
+    subseg_new (".bss", get_absolute_expression ());
+  else
+    s_lcomm (0);
+}
+
+/* Handle .weak.  This is a GNU extension.  */
+
+static void
+obj_coff_weak (ignore)
+     int ignore;
+{
+  char *name;
+  int c;
+  symbolS *symbolP;
+  do
+    {
+      name = input_line_pointer;
+      c = get_symbol_end ();
+      symbolP = symbol_find_or_make (name);
+      *input_line_pointer = c;
+      SKIP_WHITESPACE ();
+
+#ifdef BFD_ASSEMLER
+      S_SET_WEAK (symbolP);
+#endif
+
+#ifdef TE_PE
+      S_SET_STORAGE_CLASS (symbolP, C_NT_WEAK);
+#else
+      S_SET_STORAGE_CLASS (symbolP, C_WEAKEXT);
+#endif
+
+      if (c == ',')
+       {
+         input_line_pointer++;
+         SKIP_WHITESPACE ();
+         if (*input_line_pointer == '\n')
+           c = '\n';
+       }
+    }
+  while (c == ',');
 
+  demand_empty_rest_of_line ();
+}
 
 #ifdef BFD_ASSEMBLER
 
@@ -196,8 +249,8 @@ SA_SET_SYM_ENDNDX (sym, val)
 {
   combined_entry_type *entry, *p;
 
-  entry = &coffsymbol (sym->bsym)->native[1];
-  p = coffsymbol (val->bsym)->native;
+  entry = &coffsymbol (symbol_get_bfdsym (sym))->native[1];
+  p = coffsymbol (symbol_get_bfdsym (val))->native;
   entry->u.auxent.x_sym.x_fcnary.x_fcn.x_endndx.p = p;
   entry->fix_end = 1;
 }
@@ -209,8 +262,8 @@ SA_SET_SYM_TAGNDX (sym, val)
 {
   combined_entry_type *entry, *p;
 
-  entry = &coffsymbol (sym->bsym)->native[1];
-  p = coffsymbol (val->bsym)->native;
+  entry = &coffsymbol (symbol_get_bfdsym (sym))->native[1];
+  p = coffsymbol (symbol_get_bfdsym (val))->native;
   entry->u.auxent.x_sym.x_tagndx.p = p;
   entry->fix_tag = 1;
 }
@@ -219,7 +272,7 @@ static int
 S_GET_DATA_TYPE (sym)
      symbolS *sym;
 {
-  return coffsymbol (sym->bsym)->native->u.syment.n_type;
+  return coffsymbol (symbol_get_bfdsym (sym))->native->u.syment.n_type;
 }
 
 int
@@ -227,7 +280,7 @@ S_SET_DATA_TYPE (sym, val)
      symbolS *sym;
      int val;
 {
-  coffsymbol (sym->bsym)->native->u.syment.n_type = val;
+  coffsymbol (symbol_get_bfdsym (sym))->native->u.syment.n_type = val;
   return val;
 }
 
@@ -235,7 +288,7 @@ int
 S_GET_STORAGE_CLASS (sym)
      symbolS *sym;
 {
-  return coffsymbol (sym->bsym)->native->u.syment.n_sclass;
+  return coffsymbol (symbol_get_bfdsym (sym))->native->u.syment.n_sclass;
 }
 
 int
@@ -243,7 +296,7 @@ S_SET_STORAGE_CLASS (sym, val)
      symbolS *sym;
      int val;
 {
-  coffsymbol (sym->bsym)->native->u.syment.n_sclass = val;
+  coffsymbol (symbol_get_bfdsym (sym))->native->u.syment.n_sclass = val;
   return val;
 }
 
@@ -258,21 +311,17 @@ c_symbol_merge (debug, normal)
   S_SET_STORAGE_CLASS (normal, S_GET_STORAGE_CLASS (debug));
 
   if (S_GET_NUMBER_AUXILIARY (debug) > S_GET_NUMBER_AUXILIARY (normal))
-    /* take the most we have */
-    S_SET_NUMBER_AUXILIARY (normal, S_GET_NUMBER_AUXILIARY (debug));
+    {
+      /* take the most we have */
+      S_SET_NUMBER_AUXILIARY (normal, S_GET_NUMBER_AUXILIARY (debug));
+    }
 
   if (S_GET_NUMBER_AUXILIARY (debug) > 0)
     {
       /* Move all the auxiliary information.  */
-      /* @@ How many fields do we want to preserve?  Would it make more
-        sense to pick and choose those we want to copy?  Should look
-        into this further....  [raeburn:19920512.2209EST]  */
-      alent *linenos;
-      linenos = coffsymbol (normal->bsym)->lineno;
-      memcpy ((char *) &coffsymbol (normal->bsym)->native,
-             (char *) &coffsymbol (debug->bsym)->native,
-             S_GET_NUMBER_AUXILIARY(debug) * AUXESZ);
-      coffsymbol (normal->bsym)->lineno = linenos;
+      memcpy (SYM_AUXINFO (normal), SYM_AUXINFO (debug),
+             (S_GET_NUMBER_AUXILIARY (debug)
+              * sizeof (*SYM_AUXINFO (debug))));
     }
 
   /* Move the debug flags. */
@@ -290,7 +339,7 @@ c_dot_file_symbol (filename)
   S_SET_STORAGE_CLASS (symbolP, C_FILE);
   S_SET_NUMBER_AUXILIARY (symbolP, 1);
 
-  symbolP->bsym->flags = BSF_DEBUGGING;
+  symbol_get_bfdsym (symbolP)->flags = BSF_DEBUGGING;
 
 #ifndef NO_LISTING
   {
@@ -332,21 +381,20 @@ void
 coff_obj_symbol_new_hook (symbolP)
      symbolS *symbolP;
 {
-  char underscore = 0;         /* Symbol has leading _ */
+  long   sz = (OBJ_COFF_MAX_AUXENTRIES + 1) * sizeof (combined_entry_type);
+  char * s  = (char *) xmalloc (sz);
+  
+  memset (s, 0, sz);
+  coffsymbol (symbol_get_bfdsym (symbolP))->native = (combined_entry_type *) s;
 
-  {
-    long sz = (OBJ_COFF_MAX_AUXENTRIES + 1) * sizeof (combined_entry_type);
-    char *s = (char *) xmalloc (sz);
-    memset (s, 0, sz);
-    coffsymbol (symbolP->bsym)->native = (combined_entry_type *) s;
-  }
   S_SET_DATA_TYPE (symbolP, T_NULL);
   S_SET_STORAGE_CLASS (symbolP, 0);
   S_SET_NUMBER_AUXILIARY (symbolP, 0);
 
   if (S_IS_STRING (symbolP))
     SF_SET_STRING (symbolP);
-  if (!underscore && S_IS_LOCAL (symbolP))
+  
+  if (S_IS_LOCAL (symbolP))
     SF_SET_LOCAL (symbolP);
 }
 
@@ -386,7 +434,8 @@ coff_add_linesym (sym)
 {
   if (line_nos)
     {
-      coffsymbol (current_lineno_sym->bsym)->lineno = (alent *) line_nos;
+      coffsymbol (symbol_get_bfdsym (current_lineno_sym))->lineno =
+       (alent *) line_nos;
       coff_n_line_nos++;
       line_nos = 0;
     }
@@ -401,7 +450,7 @@ obj_coff_ln (appline)
 
   if (! appline && def_symbol_in_progress != NULL)
     {
-      as_warn (".ln pseudo-op inside .def/.endef: ignored.");
+      as_warn (_(".ln pseudo-op inside .def/.endef: ignored."));
       demand_empty_rest_of_line ();
       return;
     }
@@ -461,7 +510,7 @@ obj_coff_def (what)
 
   if (def_symbol_in_progress != NULL)
     {
-      as_warn (".def pseudo-op used inside of .def/.endef: ignored.");
+      as_warn (_(".def pseudo-op used inside of .def/.endef: ignored."));
       demand_empty_rest_of_line ();
       return;
     }                          /* if not inside .def/.endef */
@@ -484,7 +533,7 @@ obj_coff_def (what)
 
   /* Initialize the new symbol */
   def_symbol_in_progress = symbol_make (symbol_name_copy);
-  def_symbol_in_progress->sy_frag = &zero_address_frag;
+  symbol_set_frag (def_symbol_in_progress, &zero_address_frag);
   S_SET_VALUE (def_symbol_in_progress, 0);
 
   if (S_IS_STRING (def_symbol_in_progress))
@@ -502,11 +551,12 @@ obj_coff_endef (ignore)
      int ignore;
 {
   symbolS *symbolP;
+
   /* DIM BUG FIX sac@cygnus.com */
   dim_index = 0;
   if (def_symbol_in_progress == NULL)
     {
-      as_warn (".endef pseudo-op used outside of .def/.endef: ignored.");
+      as_warn (_(".endef pseudo-op used outside of .def/.endef: ignored."));
       demand_empty_rest_of_line ();
       return;
     }                          /* if not inside .def/.endef */
@@ -536,11 +586,11 @@ obj_coff_endef (ignore)
        CONST char *name;
        S_SET_SEGMENT (def_symbol_in_progress, text_section);
 
-       name = bfd_asymbol_name (def_symbol_in_progress->bsym);
+       name = S_GET_NAME (def_symbol_in_progress);
        if (name[1] == 'b' && name[2] == 'f')
          {
            if (! in_function ())
-             as_warn ("`%s' symbol without preceding function", name);
+             as_warn (_("`%s' symbol without preceding function"), name);
 /*         SA_SET_SYM_LNNO (def_symbol_in_progress, 12345);*/
            /* Will need relocating */
            SF_SET_PROCESS (def_symbol_in_progress);
@@ -569,15 +619,20 @@ obj_coff_endef (ignore)
       break;
 
     case C_EXT:
+    case C_WEAKEXT:
+#ifdef TE_PE
+    case C_NT_WEAK:
+#endif
     case C_STAT:
     case C_LABEL:
       /* Valid but set somewhere else (s_comm, s_lcomm, colon) */
       break;
 
+    default:
     case C_USTATIC:
     case C_EXTDEF:
     case C_ULABEL:
-      as_warn ("unexpected storage class %d",
+      as_warn (_("unexpected storage class %d"),
               S_GET_STORAGE_CLASS (def_symbol_in_progress));
       break;
     }                          /* switch on storage class */
@@ -679,7 +734,7 @@ obj_coff_dim (ignore)
 
   if (def_symbol_in_progress == NULL)
     {
-      as_warn (".dim pseudo-op used outside of .def/.endef: ignored.");
+      as_warn (_(".dim pseudo-op used outside of .def/.endef: ignored."));
       demand_empty_rest_of_line ();
       return;
     }                          /* if not inside .def/.endef */
@@ -699,7 +754,7 @@ obj_coff_dim (ignore)
          break;
 
        default:
-         as_warn ("badly formed .dim directive ignored");
+         as_warn (_("badly formed .dim directive ignored"));
          /* intentional fallthrough */
        case '\n':
        case ';':
@@ -750,7 +805,7 @@ obj_coff_size (ignore)
 {
   if (def_symbol_in_progress == NULL)
     {
-      as_warn (".size pseudo-op used outside of .def/.endef ignored.");
+      as_warn (_(".size pseudo-op used outside of .def/.endef ignored."));
       demand_empty_rest_of_line ();
       return;
     }                          /* if not inside .def/.endef */
@@ -766,7 +821,7 @@ obj_coff_scl (ignore)
 {
   if (def_symbol_in_progress == NULL)
     {
-      as_warn (".scl pseudo-op used outside of .def/.endef ignored.");
+      as_warn (_(".scl pseudo-op used outside of .def/.endef ignored."));
       demand_empty_rest_of_line ();
       return;
     }                          /* if not inside .def/.endef */
@@ -784,7 +839,7 @@ obj_coff_tag (ignore)
 
   if (def_symbol_in_progress == NULL)
     {
-      as_warn (".tag pseudo-op used outside of .def/.endef ignored.");
+      as_warn (_(".tag pseudo-op used outside of .def/.endef ignored."));
       demand_empty_rest_of_line ();
       return;
     }
@@ -803,7 +858,7 @@ obj_coff_tag (ignore)
                     tag_find_or_make (symbol_name));
   if (SA_GET_SYM_TAGNDX (def_symbol_in_progress) == 0L)
     {
-      as_warn ("tag not found for .tag %s", symbol_name);
+      as_warn (_("tag not found for .tag %s"), symbol_name);
     }                          /* not defined */
 
   SF_SET_TAGGED (def_symbol_in_progress);
@@ -818,7 +873,7 @@ obj_coff_type (ignore)
 {
   if (def_symbol_in_progress == NULL)
     {
-      as_warn (".type pseudo-op used outside of .def/.endef ignored.");
+      as_warn (_(".type pseudo-op used outside of .def/.endef ignored."));
       demand_empty_rest_of_line ();
       return;
     }                          /* if not inside .def/.endef */
@@ -840,7 +895,7 @@ obj_coff_val (ignore)
 {
   if (def_symbol_in_progress == NULL)
     {
-      as_warn (".val pseudo-op used outside of .def/.endef ignored.");
+      as_warn (_(".val pseudo-op used outside of .def/.endef ignored."));
       demand_empty_rest_of_line ();
       return;
     }                          /* if not inside .def/.endef */
@@ -855,17 +910,19 @@ obj_coff_val (ignore)
 #endif
       if (!strcmp (symbol_name, "."))
        {
-         def_symbol_in_progress->sy_frag = frag_now;
+         symbol_set_frag (def_symbol_in_progress, frag_now);
          S_SET_VALUE (def_symbol_in_progress, (valueT) frag_now_fix ());
          /* If the .val is != from the .def (e.g. statics) */
        }
       else if (strcmp (S_GET_NAME (def_symbol_in_progress), symbol_name))
        {
-         def_symbol_in_progress->sy_value.X_op = O_symbol;
-         def_symbol_in_progress->sy_value.X_add_symbol =
-           symbol_find_or_make (symbol_name);
-         def_symbol_in_progress->sy_value.X_op_symbol = NULL;
-         def_symbol_in_progress->sy_value.X_add_number = 0;
+         expressionS exp;
+
+         exp.X_op = O_symbol;
+         exp.X_add_symbol = symbol_find_or_make (symbol_name);
+         exp.X_op_symbol = NULL;
+         exp.X_add_number = 0;
+         symbol_set_value_expression (def_symbol_in_progress, &exp);
 
          /* If the segment is undefined when the forward reference is
             resolved, then copy the segment id from the forward
@@ -920,7 +977,18 @@ coff_frob_symbol (symp, punt)
   if (!block_stack)
     block_stack = stack_init (512, sizeof (symbolS*));
 
-  if (!S_IS_DEFINED (symp) && S_GET_STORAGE_CLASS (symp) != C_STAT)
+  if (S_IS_WEAK (symp))
+    {
+#ifdef TE_PE
+      S_SET_STORAGE_CLASS (symp, C_NT_WEAK);
+#else
+      S_SET_STORAGE_CLASS (symp, C_WEAKEXT);
+#endif
+    }
+
+  if (!S_IS_DEFINED (symp)
+      && !S_IS_WEAK (symp)
+      && S_GET_STORAGE_CLASS (symp) != C_STAT)
     S_SET_STORAGE_CLASS (symp, C_EXT);
 
   if (!SF_GET_DEBUG (symp))
@@ -958,7 +1026,7 @@ coff_frob_symbol (symp, punt)
                  symbolS *begin;
                  begin = *(symbolS **) stack_pop (block_stack);
                  if (begin == 0)
-                   as_warn ("mismatched .eb");
+                   as_warn (_("mismatched .eb"));
                  else
                    next_set_end = begin;
                }
@@ -969,14 +1037,15 @@ coff_frob_symbol (symp, punt)
              coff_last_function = symp;
              if (S_GET_NUMBER_AUXILIARY (symp) < 1)
                S_SET_NUMBER_AUXILIARY (symp, 1);
-             auxp = &coffsymbol (symp->bsym)->native[1].u.auxent;
+             auxp =
+               &coffsymbol (symbol_get_bfdsym (symp))->native[1].u.auxent;
              memset (auxp->x_sym.x_fcnary.x_ary.x_dimen, 0,
                      sizeof (auxp->x_sym.x_fcnary.x_ary.x_dimen));
            }
          if (S_GET_STORAGE_CLASS (symp) == C_EFCN)
            {
              if (coff_last_function == 0)
-               as_fatal ("C_EFCN symbol out of scope");
+               as_fatal (_("C_EFCN symbol out of scope"));
              SA_SET_SYM_FSIZE (coff_last_function,
                                (long) (S_GET_VALUE (symp)
                                        - S_GET_VALUE (coff_last_function)));
@@ -990,7 +1059,7 @@ coff_frob_symbol (symp, punt)
        *punt = 1;
 
       if (SF_GET_FUNCTION (symp))
-       symp->bsym->flags |= BSF_FUNCTION;
+       symbol_get_bfdsym (symp)->flags |= BSF_FUNCTION;
 
       /* more ... */
     }
@@ -1004,7 +1073,7 @@ coff_frob_symbol (symp, punt)
   /* This is pretty horrible, but we have to set *punt correctly in
      order to call SA_SET_SYM_ENDNDX correctly.  */
   if (! symp->sy_used_in_reloc
-      && ((symp->bsym->flags & BSF_SECTION_SYM) != 0
+      && ((symbol_get_bfdsym (symp)->flags & BSF_SECTION_SYM) != 0
          || (! S_IS_EXTERNAL (symp)
              && ! symp->sy_tc.output
              && S_GET_STORAGE_CLASS (symp) != C_FILE)))
@@ -1013,7 +1082,7 @@ coff_frob_symbol (symp, punt)
 
   if (set_end != (symbolS *) NULL
       && ! *punt
-      && ((symp->bsym->flags & BSF_NOT_AT_END) != 0
+      && ((symbol_get_bfdsym (symp)->flags & BSF_NOT_AT_END) != 0
          || (S_IS_DEFINED (symp)
              && ! S_IS_COMMON (symp)
              && (! S_IS_EXTERNAL (symp) || SF_GET_FUNCTION (symp)))))
@@ -1035,22 +1104,22 @@ coff_frob_symbol (symp, punt)
       coff_last_bf = symp;
     }
 
-  if (coffsymbol (symp->bsym)->lineno)
+  if (coffsymbol (symbol_get_bfdsym (symp))->lineno)
     {
       int i;
       struct line_no *lptr;
       alent *l;
 
-      lptr = (struct line_no *) coffsymbol (symp->bsym)->lineno;
+      lptr = (struct line_no *) coffsymbol (symbol_get_bfdsym (symp))->lineno;
       for (i = 0; lptr; lptr = lptr->next)
        i++;
-      lptr = (struct line_no *) coffsymbol (symp->bsym)->lineno;
+      lptr = (struct line_no *) coffsymbol (symbol_get_bfdsym (symp))->lineno;
 
       /* We need i entries for line numbers, plus 1 for the first
         entry which BFD will override, plus 1 for the last zero
         entry (a marker for BFD).  */
       l = (alent *) xmalloc ((i + 2) * sizeof (alent));
-      coffsymbol (symp->bsym)->lineno = l;
+      coffsymbol (symbol_get_bfdsym (symp))->lineno = l;
       l[i + 1].line_number = 0;
       l[i + 1].u.sym = NULL;
       for (; i > 0; i--)
@@ -1088,8 +1157,9 @@ coff_adjust_section_syms (abfd, sec, x)
     fixS *fixp = seginfo->fix_root;
     while (fixp)
       {
+       if (! fixp->fx_done)
+         nrelocs++;
        fixp = fixp->fx_next;
-       nrelocs++;
       }
   }
   if (bfd_get_section_size_before_reloc (sec) == 0
@@ -1105,7 +1175,7 @@ coff_adjust_section_syms (abfd, sec, x)
 }
 
 void
-coff_frob_file ()
+coff_frob_file_after_relocs ()
 {
   bfd_map_over_sections (stdoutput, coff_adjust_section_syms, (char*) 0);
 }
@@ -1184,12 +1254,12 @@ obj_coff_section (ignore)
                case 'i': /* STYP_INFO */
                case 'l': /* STYP_LIB */
                case 'o': /* STYP_OVER */
-                 as_warn ("unsupported section attribute '%c'",
+                 as_warn (_("unsupported section attribute '%c'"),
                           *input_line_pointer);
                  break;
 
                default:
-                 as_warn("unknown section attribute '%c'",
+                 as_warn(_("unknown section attribute '%c'"),
                          *input_line_pointer);
                  break;
                }
@@ -1204,8 +1274,14 @@ obj_coff_section (ignore)
 
   if (flags != SEC_NO_FLAGS)
     {
+      flagword oldflags;
+
+      oldflags = bfd_get_section_flags (stdoutput, sec);
+      oldflags &= SEC_LINK_ONCE | SEC_LINK_DUPLICATES;
+      flags |= oldflags;
+
       if (! bfd_set_section_flags (stdoutput, sec, flags))
-       as_warn ("error setting flags for \"%s\": %s",
+       as_warn (_("error setting flags for \"%s\": %s"),
                 bfd_section_name (stdoutput, sec),
                 bfd_errmsg (bfd_get_error ()));
     }
@@ -1324,7 +1400,7 @@ symbol_dump ()
 
   for (symbolP = symbol_rootP; symbolP; symbolP = symbol_next (symbolP))
     {
-      printf("0x%lx: \"%s\" type = %ld, class = %d, segment = %d\n",
+      printf(_("0x%lx: \"%s\" type = %ld, class = %d, segment = %d\n"),
             (unsigned long) symbolP,
             S_GET_NAME(symbolP),
             (long) S_GET_DATA_TYPE(symbolP),
@@ -1433,7 +1509,6 @@ static void adjust_stab_section PARAMS ((bfd *abfd, segT seg));
 static void obj_coff_lcomm PARAMS ((int));
 static void obj_coff_text PARAMS ((int));
 static void obj_coff_data PARAMS ((int));
-static void obj_coff_bss PARAMS ((int));
 static void obj_coff_ident PARAMS ((int));
 void obj_coff_section PARAMS ((int));
 
@@ -1519,7 +1594,7 @@ size_section (abfd, idx)
       size = frag->fr_address;
       if (frag->fr_address != size)
        {
-         fprintf (stderr, "Out of step\n");
+         fprintf (stderr, _("Out of step\n"));
          size = frag->fr_address;
        }
 
@@ -1684,7 +1759,7 @@ do_relocs_for (abfd, h, file_cursor)
                      /* Turn the segment of the symbol into an offset.  */
                      if (symbol_ptr)
                        {
-                         resolve_symbol_value (symbol_ptr);
+                         resolve_symbol_value (symbol_ptr, 1);
                          if (! symbol_ptr->sy_resolved)
                            {
                              char *file;
@@ -1692,9 +1767,9 @@ do_relocs_for (abfd, h, file_cursor)
 
                              if (expr_symbol_where (symbol_ptr, &file, &line))
                                as_bad_where (file, line,
-                                             "unresolved relocation");
+                                             _("unresolved relocation"));
                              else
-                               as_bad ("bad relocation: symbol `%s' not in symbol table",
+                               as_bad (_("bad relocation: symbol `%s' not in symbol table"),
                                        S_GET_NAME (symbol_ptr));
                            }
                          dot = segment_info[S_GET_SEGMENT (symbol_ptr)].dot;
@@ -1954,7 +2029,7 @@ coff_header_append (abfd, h)
                                           &(segment_info[i].scnhdr),
                                           buffer);
          if (size == 0)
-           as_bad ("bfd_coff_swap_scnhdr_out failed");
+           as_bad (_("bfd_coff_swap_scnhdr_out failed"));
          bfd_write (buffer, size, 1, abfd);
        }
     }
@@ -2039,7 +2114,7 @@ obj_coff_ln (appline)
 
   if (! appline && def_symbol_in_progress != NULL)
     {
-      as_warn (".ln pseudo-op inside .def/.endef: ignored.");
+      as_warn (_(".ln pseudo-op inside .def/.endef: ignored."));
       demand_empty_rest_of_line ();
       return;
     }                          /* wrong context */
@@ -2096,7 +2171,7 @@ obj_coff_def (what)
 
   if (def_symbol_in_progress != NULL)
     {
-      as_warn (".def pseudo-op used inside of .def/.endef: ignored.");
+      as_warn (_(".def pseudo-op used inside of .def/.endef: ignored."));
       demand_empty_rest_of_line ();
       return;
     }                          /* if not inside .def/.endef */
@@ -2149,7 +2224,7 @@ obj_coff_endef (ignore)
   dim_index = 0;
   if (def_symbol_in_progress == NULL)
     {
-      as_warn (".endef pseudo-op used outside of .def/.endef: ignored.");
+      as_warn (_(".endef pseudo-op used outside of .def/.endef: ignored."));
       demand_empty_rest_of_line ();
       return;
     }                          /* if not inside .def/.endef */
@@ -2181,7 +2256,7 @@ obj_coff_endef (ignore)
        {                       /* .bf */
          if (function_lineoff < 0)
            {
-             fprintf (stderr, "`.bf' symbol without preceding function\n");
+             fprintf (stderr, _("`.bf' symbol without preceding function\n"));
            }                   /* missing function symbol */
          SA_GET_SYM_LNNOPTR (last_line_symbol) = function_lineoff;
 
@@ -2212,6 +2287,10 @@ obj_coff_endef (ignore)
       break;
 
     case C_EXT:
+    case C_WEAKEXT:
+#ifdef TE_PE
+    case C_NT_WEAK:
+#endif
     case C_STAT:
     case C_LABEL:
       /* Valid but set somewhere else (s_comm, s_lcomm, colon) */
@@ -2220,7 +2299,7 @@ obj_coff_endef (ignore)
     case C_USTATIC:
     case C_EXTDEF:
     case C_ULABEL:
-      as_warn ("unexpected storage class %d", S_GET_STORAGE_CLASS (def_symbol_in_progress));
+      as_warn (_("unexpected storage class %d"), S_GET_STORAGE_CLASS (def_symbol_in_progress));
       break;
     }                          /* switch on storage class */
 
@@ -2327,7 +2406,7 @@ obj_coff_dim (ignore)
 
   if (def_symbol_in_progress == NULL)
     {
-      as_warn (".dim pseudo-op used outside of .def/.endef: ignored.");
+      as_warn (_(".dim pseudo-op used outside of .def/.endef: ignored."));
       demand_empty_rest_of_line ();
       return;
     }                          /* if not inside .def/.endef */
@@ -2347,7 +2426,7 @@ obj_coff_dim (ignore)
          break;
 
        default:
-         as_warn ("badly formed .dim directive ignored");
+         as_warn (_("badly formed .dim directive ignored"));
          /* intentional fallthrough */
        case '\n':
        case ';':
@@ -2410,7 +2489,7 @@ obj_coff_size (ignore)
 {
   if (def_symbol_in_progress == NULL)
     {
-      as_warn (".size pseudo-op used outside of .def/.endef ignored.");
+      as_warn (_(".size pseudo-op used outside of .def/.endef ignored."));
       demand_empty_rest_of_line ();
       return;
     }                          /* if not inside .def/.endef */
@@ -2426,7 +2505,7 @@ obj_coff_scl (ignore)
 {
   if (def_symbol_in_progress == NULL)
     {
-      as_warn (".scl pseudo-op used outside of .def/.endef ignored.");
+      as_warn (_(".scl pseudo-op used outside of .def/.endef ignored."));
       demand_empty_rest_of_line ();
       return;
     }                          /* if not inside .def/.endef */
@@ -2444,7 +2523,7 @@ obj_coff_tag (ignore)
 
   if (def_symbol_in_progress == NULL)
     {
-      as_warn (".tag pseudo-op used outside of .def/.endef ignored.");
+      as_warn (_(".tag pseudo-op used outside of .def/.endef ignored."));
       demand_empty_rest_of_line ();
       return;
     }
@@ -2462,7 +2541,7 @@ obj_coff_tag (ignore)
                     (long) tag_find_or_make (symbol_name));
   if (SA_GET_SYM_TAGNDX (def_symbol_in_progress) == 0L)
     {
-      as_warn ("tag not found for .tag %s", symbol_name);
+      as_warn (_("tag not found for .tag %s"), symbol_name);
     }                          /* not defined */
 
   SF_SET_TAGGED (def_symbol_in_progress);
@@ -2477,7 +2556,7 @@ obj_coff_type (ignore)
 {
   if (def_symbol_in_progress == NULL)
     {
-      as_warn (".type pseudo-op used outside of .def/.endef ignored.");
+      as_warn (_(".type pseudo-op used outside of .def/.endef ignored."));
       demand_empty_rest_of_line ();
       return;
     }                          /* if not inside .def/.endef */
@@ -2499,7 +2578,7 @@ obj_coff_val (ignore)
 {
   if (def_symbol_in_progress == NULL)
     {
-      as_warn (".val pseudo-op used outside of .def/.endef ignored.");
+      as_warn (_(".val pseudo-op used outside of .def/.endef ignored."));
       demand_empty_rest_of_line ();
       return;
     }                          /* if not inside .def/.endef */
@@ -2617,8 +2696,12 @@ yank_symbols ()
     {
       if (symbolP->sy_mri_common)
        {
-         if (S_GET_STORAGE_CLASS (symbolP) == C_EXT)
-           as_bad ("%s: global symbols not supported in common sections",
+         if (S_GET_STORAGE_CLASS (symbolP) == C_EXT
+#ifdef TE_PE
+             || S_GET_STORAGE_CLASS (symbolP) == C_NT_WEAK
+#endif
+             || S_GET_STORAGE_CLASS (symbolP) == C_WEAKEXT)
+           as_bad (_("%s: global symbols not supported in common sections"),
                    S_GET_NAME (symbolP));
          symbol_remove (symbolP, &symbol_rootP, &symbol_lastP);
          continue;
@@ -2660,7 +2743,7 @@ yank_symbols ()
              S_SET_SEGMENT (symbolP, SEG_E0);
            }                   /* push data into text */
 
-         resolve_symbol_value (symbolP);
+         resolve_symbol_value (symbolP, 1);
 
          if (S_GET_STORAGE_CLASS (symbolP) == C_NULL)
            {
@@ -2691,7 +2774,7 @@ yank_symbols ()
                      register symbolS *begin_symbolP;
                      begin_symbolP = *(symbolS **) stack_pop (block_stack);
                      if (begin_symbolP == (symbolS *) 0)
-                       as_warn ("mismatched .eb");
+                       as_warn (_("mismatched .eb"));
                      else
                        SA_SET_SYM_ENDNDX (begin_symbolP, symbol_number + 2);
                    }
@@ -2731,7 +2814,7 @@ yank_symbols ()
                  /* I don't even know if this is needed for sdb. But
                     the standard assembler generates it, so...  */
                  if (last_functionP == (symbolS *) 0)
-                   as_fatal ("C_EFCN symbol out of scope");
+                   as_fatal (_("C_EFCN symbol out of scope"));
                  SA_SET_SYM_FSIZE (last_functionP,
                                    (long) (S_GET_VALUE (symbolP) -
                                            S_GET_VALUE (last_functionP)));
@@ -2802,9 +2885,13 @@ yank_symbols ()
        }
       else if (!S_IS_DEFINED (symbolP)
               && !S_IS_DEBUG (symbolP)
-              && !SF_GET_STATICS (symbolP) &&
-              S_GET_STORAGE_CLASS (symbolP) == C_EXT)
-       {                       /* C_EXT && !SF_GET_FUNCTION(symbolP))  */
+              && !SF_GET_STATICS (symbolP)
+              && (S_GET_STORAGE_CLASS (symbolP) == C_EXT
+#ifdef TE_PE
+                  || S_GET_STORAGE_CLASS (symbolP) == C_NT_WEAK
+#endif
+                  || S_GET_STORAGE_CLASS (symbolP) == C_WEAKEXT))
+       {
          /* if external, Remove from the list */
          symbolS *hold = symbol_previous (symbolP);
 
@@ -2816,7 +2903,11 @@ yank_symbols ()
       else if (! S_IS_DEBUG (symbolP)
               && ! SF_GET_STATICS (symbolP)
               && ! SF_GET_FUNCTION (symbolP)
-              && S_GET_STORAGE_CLASS (symbolP) == C_EXT)
+              && (S_GET_STORAGE_CLASS (symbolP) == C_EXT
+#ifdef TE_PE
+                  || S_GET_STORAGE_CLASS (symbolP) == C_NT_WEAK
+#endif
+                  || S_GET_STORAGE_CLASS (symbolP) == C_NT_WEAK))
        {
          symbolS *hold = symbol_previous (symbolP);
 
@@ -3126,7 +3217,7 @@ write_object_file ()
 
   if (abfd == 0)
     {
-      as_perror ("FATAL: Can't create %s", out_file_name);
+      as_perror (_("FATAL: Can't create %s"), out_file_name);
       exit (EXIT_FAILURE);
     }
   bfd_set_format (abfd, bfd_object);
@@ -3204,7 +3295,11 @@ write_object_file ()
 
       /* I think the section alignment is only used on the i960; the
         i960 needs it, and it should do no harm on other targets.  */
+#ifdef ALIGNMENT_IN_S_FLAGS
+      segment_info[i].scnhdr.s_flags |= (section_alignment[i] & 0xF) << 8;
+#else
       segment_info[i].scnhdr.s_align = 1 << section_alignment[i];
+#endif
 
       if (i == SEG_E0)
        H_SET_TEXT_SIZE (&headers, size);
@@ -3296,7 +3391,7 @@ write_object_file ()
   /* Recent changes to write need this, but where it should
      go is up to Ken.. */
   if (bfd_close_all_done (abfd) == false)
-    as_fatal ("Can't close %s: %s", out_file_name,
+    as_fatal (_("Can't close %s: %s"), out_file_name,
              bfd_errmsg (bfd_get_error ()));
 #else
   {
@@ -3330,7 +3425,7 @@ obj_coff_add_segment (name)
 
   if (i == SEG_LAST)
     {
-      as_bad ("Too many new sections; can't add \"%s\"", name);
+      as_bad (_("Too many new sections; can't add \"%s\""), name);
       return now_seg;
     }
 
@@ -3422,7 +3517,7 @@ obj_coff_section (ignore)
                case 'x': flags |= STYP_TEXT;   break;
                case 'r': flags |= STYP_LIT;    break;
                default:
-                 as_warn("unknown section attribute '%c'",
+                 as_warn(_("unknown section attribute '%c'"),
                          *input_line_pointer);
                  break;
                }
@@ -3459,16 +3554,6 @@ obj_coff_data (ignore)
     subseg_new (".data", get_absolute_expression ());
 }
 
-static void
-obj_coff_bss (ignore)
-     int ignore;
-{
-  if (*input_line_pointer == '\n')     /* .bss                 */
-    subseg_new(".bss", get_absolute_expression());
-  else                                 /* .bss id,expr         */
-    obj_coff_lcomm(0);
-}
-
 static void
 obj_coff_ident (ignore)
      int ignore;
@@ -3617,9 +3702,15 @@ c_section_symbol (name, idx)
 {
   symbolS *symbolP;
 
-  symbolP = symbol_new (name, idx,
-                       0,
-                       &zero_address_frag);
+  symbolP = symbol_find_base (name, DO_NOT_STRIP);
+  if (symbolP == NULL)
+    symbolP = symbol_new (name, idx, 0, &zero_address_frag);
+  else
+    {
+      /* Mmmm.  I just love violating interfaces.  Makes me feel...dirty.  */
+      S_SET_SEGMENT (symbolP, idx);
+      symbolP->sy_frag = &zero_address_frag;
+    }
 
   S_SET_STORAGE_CLASS (symbolP, C_STAT);
   S_SET_NUMBER_AUXILIARY (symbolP, 1);
@@ -3744,19 +3835,19 @@ obj_coff_lcomm (ignore)
   SKIP_WHITESPACE ();
   if (*input_line_pointer != ',')
     {
-      as_bad ("Expected comma after name");
+      as_bad (_("Expected comma after name"));
       ignore_rest_of_line ();
       return;
     }
   if (*input_line_pointer == '\n')
     {
-      as_bad ("Missing size expression");
+      as_bad (_("Missing size expression"));
       return;
     }
   input_line_pointer++;
   if ((temp = get_absolute_expression ()) < 0)
     {
-      as_warn ("lcomm length (%d.) <0! Ignored.", temp);
+      as_warn (_("lcomm length (%d.) <0! Ignored."), temp);
       ignore_rest_of_line ();
       return;
     }
@@ -3784,7 +3875,7 @@ obj_coff_lcomm (ignore)
        }
     }
   else
-    as_bad("Symbol %s already defined", name);
+    as_bad(_("Symbol %s already defined"), name);
 
   demand_empty_rest_of_line();
 #endif
@@ -3878,7 +3969,7 @@ fixup_segment (segP, this_segment_type)
          if (!SF_GET_BALNAME (tc_get_bal_of_call (add_symbolP)))
            {
              as_bad_where (fixP->fx_file, fixP->fx_line,
-                           "No 'bal' entry point for leafproc %s",
+                           _("No 'bal' entry point for leafproc %s"),
                            S_GET_NAME (add_symbolP));
              continue;
            }
@@ -3889,7 +3980,7 @@ fixup_segment (segP, this_segment_type)
       /* Make sure the symbols have been resolved; this may not have
          happened if these are expression symbols.  */
       if (add_symbolP != NULL && ! add_symbolP->sy_resolved)
-       resolve_symbol_value (add_symbolP);
+       resolve_symbol_value (add_symbolP, 1);
 
       if (add_symbolP != NULL)
        {
@@ -3919,7 +4010,7 @@ fixup_segment (segP, this_segment_type)
        }
 
       if (sub_symbolP != NULL && ! sub_symbolP->sy_resolved)
-       resolve_symbol_value (sub_symbolP);
+       resolve_symbol_value (sub_symbolP, 1);
 
       if (add_symbolP != NULL
          && add_symbolP->sy_mri_common)
@@ -3957,7 +4048,7 @@ fixup_segment (segP, this_segment_type)
                {
 #ifndef TC_M68K
                  as_bad_where (fixP->fx_file, fixP->fx_line,
-                               "Negative of non-absolute symbol %s",
+                               _("Negative of non-absolute symbol %s"),
                                S_GET_NAME (sub_symbolP));
 #endif
                  add_number -= S_GET_VALUE (sub_symbolP);
@@ -3978,7 +4069,7 @@ fixup_segment (segP, this_segment_type)
              if (fixP->fx_tcbit)
                {
                  as_bad_where (fixP->fx_file, fixP->fx_line,
-                               "callj to difference of 2 symbols");
+                               _("callj to difference of 2 symbols"));
                }
 #endif /* TC_I960 */
              add_number += S_GET_VALUE (add_symbolP) -
@@ -4024,7 +4115,7 @@ fixup_segment (segP, this_segment_type)
              else
                {
                  as_bad_where (fixP->fx_file, fixP->fx_line,
-                               "Can't emit reloc {- %s-seg symbol \"%s\"} @ file address %ld.",
+                               _("Can't emit reloc {- %s-seg symbol \"%s\"} @ file address %ld."),
                                segment_name (S_GET_SEGMENT (sub_symbolP)),
                                S_GET_NAME (sub_symbolP),
                                (long) (fragP->fr_address + where));
@@ -4114,7 +4205,7 @@ fixup_segment (segP, this_segment_type)
                       * relocation.
                       */
                      as_bad_where (fixP->fx_file, fixP->fx_line,
-                                   "can't use COBR format with external label");
+                                   _("can't use COBR format with external label"));
                      fixP->fx_addsy = NULL;
                      fixP->fx_done = 1;
                      continue;
@@ -4171,6 +4262,12 @@ fixup_segment (segP, this_segment_type)
 #endif
        }                       /* if pcrel */
 
+#ifdef MD_APPLY_FIX3
+      md_apply_fix3 (fixP, (valueT *) &add_number, this_segment_type);
+#else
+      md_apply_fix (fixP, add_number);
+#endif
+
       if (!fixP->fx_bit_fixP && ! fixP->fx_no_overflow)
        {
 #ifndef TC_M88K
@@ -4188,7 +4285,7 @@ fixup_segment (segP, this_segment_type)
                      || (add_number & 0x8000) == 0)))
            {
              as_bad_where (fixP->fx_file, fixP->fx_line,
-                           "Value of %ld too large for field of %d bytes at 0x%lx",
+                           _("Value of %ld too large for field of %d bytes at 0x%lx"),
                            (long) add_number, size,
                            (unsigned long) (fragP->fr_address + where));
            }
@@ -4202,18 +4299,11 @@ fixup_segment (segP, this_segment_type)
              && size == 2
              && add_number > 0x7fff)
            as_bad_where (fixP->fx_file, fixP->fx_line,
-                         "Signed .word overflow; switch may be too large; %ld at 0x%lx",
+                         _("Signed .word overflow; switch may be too large; %ld at 0x%lx"),
                          (long) add_number,
                          (unsigned long) (fragP->fr_address + where));
 #endif
        }                       /* not a bit fix */
-      /* Once this fix has been applied, we don't have to output
-        anything nothing more need be done.  */
-#ifdef MD_APPLY_FIX3
-      md_apply_fix3 (fixP, &add_number, this_segment_type);
-#else
-      md_apply_fix (fixP, add_number);
-#endif
     }                          /* For each fixS in this segment. */
 }                              /* fixup_segment() */
 
@@ -4314,11 +4404,14 @@ const pseudo_typeS obj_pseudo_table[] =
   /* FIXME: We ignore the MRI short attribute.  */
   {"section.s", obj_coff_section, 0},
   {"sect.s", obj_coff_section, 0},
+  /* We accept the .bss directive for backward compatibility with
+     earlier versions of gas.  */
+  {"bss", obj_coff_bss, 0},
+  {"weak", obj_coff_weak, 0},
 #ifndef BFD_ASSEMBLER
   {"use", obj_coff_section, 0},
   {"text", obj_coff_text, 0},
   {"data", obj_coff_data, 0},
-  {"bss", obj_coff_bss, 0},
   {"lcomm", obj_coff_lcomm, 0},
   {"ident", obj_coff_ident, 0},
 #else
@@ -4363,8 +4456,8 @@ const struct format_ops coff_format_ops =
   0,
   1,
   coff_frob_symbol,
-  coff_frob_file,
   no_func,
+  coff_frob_file_after_relocs,
   0, 0,
   0, 0,
   0,
This page took 0.038804 seconds and 4 git commands to generate.