* config/obj-coff.c (fixup_segment): Delete sy_mri_common assertion.
[external/binutils.git] / gas / config / obj-coff.c
1 /* coff object file format
2    Copyright 1989, 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998,
3    1999, 2000, 2001, 2002, 2003, 2004, 2005
4    Free Software Foundation, Inc.
5
6    This file is part of GAS.
7
8    GAS is free software; you can redistribute it and/or modify
9    it under the terms of the GNU General Public License as published by
10    the Free Software Foundation; either version 2, or (at your option)
11    any later version.
12
13    GAS is distributed in the hope that it will be useful,
14    but WITHOUT ANY WARRANTY; without even the implied warranty of
15    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16    GNU General Public License for more details.
17
18    You should have received a copy of the GNU General Public License
19    along with GAS; see the file COPYING.  If not, write to the Free
20    Software Foundation, 59 Temple Place - Suite 330, Boston, MA
21    02111-1307, USA.  */
22
23 #define OBJ_HEADER "obj-coff.h"
24
25 #include "as.h"
26 #include "obstack.h"
27 #include "subsegs.h"
28
29 #ifdef TE_PE
30 #include "coff/pe.h"
31 #endif
32
33 /* I think this is probably always correct.  */
34 #ifndef KEEP_RELOC_INFO
35 #define KEEP_RELOC_INFO
36 #endif
37
38 /* The BFD_ASSEMBLER version of obj_coff_section will use this macro to set
39    a new section's attributes when a directive has no valid flags or the
40    "w" flag is used. This default should be appropriate for most.  */
41 #ifndef TC_COFF_SECTION_DEFAULT_ATTRIBUTES
42 #define TC_COFF_SECTION_DEFAULT_ATTRIBUTES (SEC_LOAD | SEC_DATA)
43 #endif
44
45 /* This is used to hold the symbol built by a sequence of pseudo-ops
46    from .def and .endef.  */
47 static symbolS *def_symbol_in_progress;
48 #ifdef TE_PE
49 /* PE weak alternate symbols begin with this string.  */
50 static const char weak_altprefix[] = ".weak.";
51 #endif /* TE_PE */
52
53 typedef struct
54   {
55     unsigned long chunk_size;
56     unsigned long element_size;
57     unsigned long size;
58     char *data;
59     unsigned long pointer;
60   }
61 stack;
62
63 static stack *stack_init PARAMS ((unsigned long, unsigned long));
64 static char *stack_push PARAMS ((stack *, char *));
65 static char *stack_pop PARAMS ((stack *));
66 static void tag_init PARAMS ((void));
67 static void tag_insert PARAMS ((const char *, symbolS *));
68 static symbolS *tag_find PARAMS ((char *));
69 static symbolS *tag_find_or_make PARAMS ((char *));
70 static void obj_coff_bss PARAMS ((int));
71 #ifdef BFD_ASSEMBLER
72 static void obj_coff_weak PARAMS ((int));
73 #endif
74 const char *s_get_name PARAMS ((symbolS * s));
75 static void obj_coff_ln PARAMS ((int));
76 static void obj_coff_def PARAMS ((int));
77 static void obj_coff_endef PARAMS ((int));
78 static void obj_coff_dim PARAMS ((int));
79 static void obj_coff_line PARAMS ((int));
80 static void obj_coff_size PARAMS ((int));
81 static void obj_coff_scl PARAMS ((int));
82 static void obj_coff_tag PARAMS ((int));
83 static void obj_coff_val PARAMS ((int));
84 static void obj_coff_type PARAMS ((int));
85 static void obj_coff_ident PARAMS ((int));
86 #ifdef BFD_ASSEMBLER
87 static void obj_coff_loc PARAMS((int));
88 #endif
89 \f
90 /* stack stuff */
91
92 static stack *
93 stack_init (chunk_size, element_size)
94      unsigned long chunk_size;
95      unsigned long element_size;
96 {
97   stack *st;
98
99   st = (stack *) malloc (sizeof (stack));
100   if (!st)
101     return 0;
102   st->data = malloc (chunk_size);
103   if (!st->data)
104     {
105       free (st);
106       return 0;
107     }
108   st->pointer = 0;
109   st->size = chunk_size;
110   st->chunk_size = chunk_size;
111   st->element_size = element_size;
112   return st;
113 }
114
115 static char *
116 stack_push (st, element)
117      stack *st;
118      char *element;
119 {
120   if (st->pointer + st->element_size >= st->size)
121     {
122       st->size += st->chunk_size;
123       if ((st->data = xrealloc (st->data, st->size)) == (char *) 0)
124         return (char *) 0;
125     }
126   memcpy (st->data + st->pointer, element, st->element_size);
127   st->pointer += st->element_size;
128   return st->data + st->pointer;
129 }
130
131 static char *
132 stack_pop (st)
133      stack *st;
134 {
135   if (st->pointer < st->element_size)
136     {
137       st->pointer = 0;
138       return (char *) 0;
139     }
140   st->pointer -= st->element_size;
141   return st->data + st->pointer;
142 }
143 \f
144 /*
145  * Maintain a list of the tagnames of the structures.
146  */
147
148 static struct hash_control *tag_hash;
149
150 static void
151 tag_init ()
152 {
153   tag_hash = hash_new ();
154 }
155
156 static void
157 tag_insert (name, symbolP)
158      const char *name;
159      symbolS *symbolP;
160 {
161   const char *error_string;
162
163   if ((error_string = hash_jam (tag_hash, name, (char *) symbolP)))
164     {
165       as_fatal (_("Inserting \"%s\" into structure table failed: %s"),
166                 name, error_string);
167     }
168 }
169
170 static symbolS *
171 tag_find (name)
172      char *name;
173 {
174 #ifdef STRIP_UNDERSCORE
175   if (*name == '_')
176     name++;
177 #endif /* STRIP_UNDERSCORE */
178   return (symbolS *) hash_find (tag_hash, name);
179 }
180
181 static symbolS *
182 tag_find_or_make (name)
183      char *name;
184 {
185   symbolS *symbolP;
186
187   if ((symbolP = tag_find (name)) == NULL)
188     {
189       symbolP = symbol_new (name, undefined_section,
190                             0, &zero_address_frag);
191
192       tag_insert (S_GET_NAME (symbolP), symbolP);
193 #ifdef BFD_ASSEMBLER
194       symbol_table_insert (symbolP);
195 #endif
196     }                           /* not found */
197
198   return symbolP;
199 }
200
201 /* We accept the .bss directive to set the section for backward
202    compatibility with earlier versions of gas.  */
203
204 static void
205 obj_coff_bss (ignore)
206      int ignore ATTRIBUTE_UNUSED;
207 {
208   if (*input_line_pointer == '\n')
209     subseg_new (".bss", get_absolute_expression ());
210   else
211     s_lcomm (0);
212 }
213
214 #ifdef BFD_ASSEMBLER
215
216 static segT fetch_coff_debug_section PARAMS ((void));
217 static void SA_SET_SYM_TAGNDX PARAMS ((symbolS *, symbolS *));
218 static int S_GET_DATA_TYPE PARAMS ((symbolS *));
219 void c_symbol_merge PARAMS ((symbolS *, symbolS *));
220 static void add_lineno PARAMS ((fragS *, addressT, int));
221
222 #define GET_FILENAME_STRING(X) \
223 ((char*) (&((X)->sy_symbol.ost_auxent->x_file.x_n.x_offset))[1])
224
225 /* @@ Ick.  */
226 static segT
227 fetch_coff_debug_section ()
228 {
229   static segT debug_section;
230   if (!debug_section)
231     {
232       const asymbol *s;
233       s = bfd_make_debug_symbol (stdoutput, (char *) 0, 0);
234       assert (s != 0);
235       debug_section = s->section;
236     }
237   return debug_section;
238 }
239
240 void
241 SA_SET_SYM_ENDNDX (sym, val)
242      symbolS *sym;
243      symbolS *val;
244 {
245   combined_entry_type *entry, *p;
246
247   entry = &coffsymbol (symbol_get_bfdsym (sym))->native[1];
248   p = coffsymbol (symbol_get_bfdsym (val))->native;
249   entry->u.auxent.x_sym.x_fcnary.x_fcn.x_endndx.p = p;
250   entry->fix_end = 1;
251 }
252
253 static void
254 SA_SET_SYM_TAGNDX (sym, val)
255      symbolS *sym;
256      symbolS *val;
257 {
258   combined_entry_type *entry, *p;
259
260   entry = &coffsymbol (symbol_get_bfdsym (sym))->native[1];
261   p = coffsymbol (symbol_get_bfdsym (val))->native;
262   entry->u.auxent.x_sym.x_tagndx.p = p;
263   entry->fix_tag = 1;
264 }
265
266 static int
267 S_GET_DATA_TYPE (sym)
268      symbolS *sym;
269 {
270   return coffsymbol (symbol_get_bfdsym (sym))->native->u.syment.n_type;
271 }
272
273 int
274 S_SET_DATA_TYPE (sym, val)
275      symbolS *sym;
276      int val;
277 {
278   coffsymbol (symbol_get_bfdsym (sym))->native->u.syment.n_type = val;
279   return val;
280 }
281
282 int
283 S_GET_STORAGE_CLASS (sym)
284      symbolS *sym;
285 {
286   return coffsymbol (symbol_get_bfdsym (sym))->native->u.syment.n_sclass;
287 }
288
289 int
290 S_SET_STORAGE_CLASS (sym, val)
291      symbolS *sym;
292      int val;
293 {
294   coffsymbol (symbol_get_bfdsym (sym))->native->u.syment.n_sclass = val;
295   return val;
296 }
297
298 /* Merge a debug symbol containing debug information into a normal symbol.  */
299
300 void
301 c_symbol_merge (debug, normal)
302      symbolS *debug;
303      symbolS *normal;
304 {
305   S_SET_DATA_TYPE (normal, S_GET_DATA_TYPE (debug));
306   S_SET_STORAGE_CLASS (normal, S_GET_STORAGE_CLASS (debug));
307
308   if (S_GET_NUMBER_AUXILIARY (debug) > S_GET_NUMBER_AUXILIARY (normal))
309     {
310       /* take the most we have */
311       S_SET_NUMBER_AUXILIARY (normal, S_GET_NUMBER_AUXILIARY (debug));
312     }
313
314   if (S_GET_NUMBER_AUXILIARY (debug) > 0)
315     {
316       /* Move all the auxiliary information.  */
317       memcpy (SYM_AUXINFO (normal), SYM_AUXINFO (debug),
318               (S_GET_NUMBER_AUXILIARY (debug)
319                * sizeof (*SYM_AUXINFO (debug))));
320     }
321
322   /* Move the debug flags.  */
323   SF_SET_DEBUG_FIELD (normal, SF_GET_DEBUG_FIELD (debug));
324 }
325
326 void
327 c_dot_file_symbol (const char *filename, int appfile ATTRIBUTE_UNUSED)
328 {
329   symbolS *symbolP;
330
331   /* BFD converts filename to a .file symbol with an aux entry.  It
332      also handles chaining.  */
333   symbolP = symbol_new (filename, bfd_abs_section_ptr, 0, &zero_address_frag);
334
335   S_SET_STORAGE_CLASS (symbolP, C_FILE);
336   S_SET_NUMBER_AUXILIARY (symbolP, 1);
337
338   symbol_get_bfdsym (symbolP)->flags = BSF_DEBUGGING;
339
340 #ifndef NO_LISTING
341   {
342     extern int listing;
343     if (listing)
344       {
345         listing_source_file (filename);
346       }
347   }
348 #endif
349
350   /* Make sure that the symbol is first on the symbol chain */
351   if (symbol_rootP != symbolP)
352     {
353       symbol_remove (symbolP, &symbol_rootP, &symbol_lastP);
354       symbol_insert (symbolP, symbol_rootP, &symbol_rootP, &symbol_lastP);
355     }                           /* if not first on the list */
356 }
357
358 /* Line number handling */
359
360 struct line_no {
361   struct line_no *next;
362   fragS *frag;
363   alent l;
364 };
365
366 int coff_line_base;
367
368 /* Symbol of last function, which we should hang line#s off of.  */
369 static symbolS *line_fsym;
370
371 #define in_function()           (line_fsym != 0)
372 #define clear_function()        (line_fsym = 0)
373 #define set_function(F)         (line_fsym = (F), coff_add_linesym (F))
374
375 \f
376 void
377 coff_obj_symbol_new_hook (symbolP)
378      symbolS *symbolP;
379 {
380   long   sz = (OBJ_COFF_MAX_AUXENTRIES + 1) * sizeof (combined_entry_type);
381   char * s  = (char *) xmalloc (sz);
382
383   memset (s, 0, sz);
384   coffsymbol (symbol_get_bfdsym (symbolP))->native = (combined_entry_type *) s;
385
386   S_SET_DATA_TYPE (symbolP, T_NULL);
387   S_SET_STORAGE_CLASS (symbolP, 0);
388   S_SET_NUMBER_AUXILIARY (symbolP, 0);
389
390   if (S_IS_STRING (symbolP))
391     SF_SET_STRING (symbolP);
392
393   if (S_IS_LOCAL (symbolP))
394     SF_SET_LOCAL (symbolP);
395 }
396
397 \f
398 /*
399  * Handle .ln directives.
400  */
401
402 static symbolS *current_lineno_sym;
403 static struct line_no *line_nos;
404 /* @@ Blindly assume all .ln directives will be in the .text section...  */
405 int coff_n_line_nos;
406
407 static void
408 add_lineno (frag, offset, num)
409      fragS *frag;
410      addressT offset;
411      int num;
412 {
413   struct line_no *new_line =
414     (struct line_no *) xmalloc (sizeof (struct line_no));
415   if (!current_lineno_sym)
416     {
417       abort ();
418     }
419
420 #ifndef OBJ_XCOFF
421   /* The native aix assembler accepts negative line number */
422
423   if (num <= 0)
424     {
425       /* Zero is used as an end marker in the file.  */
426       as_warn (_("Line numbers must be positive integers\n"));
427       num = 1;
428     }
429 #endif /* OBJ_XCOFF */
430   new_line->next = line_nos;
431   new_line->frag = frag;
432   new_line->l.line_number = num;
433   new_line->l.u.offset = offset;
434   line_nos = new_line;
435   coff_n_line_nos++;
436 }
437
438 void
439 coff_add_linesym (sym)
440      symbolS *sym;
441 {
442   if (line_nos)
443     {
444       coffsymbol (symbol_get_bfdsym (current_lineno_sym))->lineno =
445         (alent *) line_nos;
446       coff_n_line_nos++;
447       line_nos = 0;
448     }
449   current_lineno_sym = sym;
450 }
451
452 static void
453 obj_coff_ln (appline)
454      int appline;
455 {
456   int l;
457
458   if (! appline && def_symbol_in_progress != NULL)
459     {
460       as_warn (_(".ln pseudo-op inside .def/.endef: ignored."));
461       demand_empty_rest_of_line ();
462       return;
463     }
464
465   l = get_absolute_expression ();
466
467   /* If there is no lineno symbol, treat a .ln
468      directive as if it were a .appline directive.  */
469   if (appline || current_lineno_sym == NULL)
470     new_logical_line ((char *) NULL, l - 1);
471   else
472     add_lineno (frag_now, frag_now_fix (), l);
473
474 #ifndef NO_LISTING
475   {
476     extern int listing;
477
478     if (listing)
479       {
480         if (! appline)
481           l += coff_line_base - 1;
482         listing_source_line (l);
483       }
484   }
485 #endif
486
487   demand_empty_rest_of_line ();
488 }
489
490 /* .loc is essentially the same as .ln; parse it for assembler
491    compatibility.  */
492
493 static void
494 obj_coff_loc (ignore)
495      int ignore ATTRIBUTE_UNUSED;
496 {
497   int lineno;
498
499   /* FIXME: Why do we need this check?  We need it for ECOFF, but why
500      do we need it for COFF?  */
501   if (now_seg != text_section)
502     {
503       as_warn (_(".loc outside of .text"));
504       demand_empty_rest_of_line ();
505       return;
506     }
507
508   if (def_symbol_in_progress != NULL)
509     {
510       as_warn (_(".loc pseudo-op inside .def/.endef: ignored."));
511       demand_empty_rest_of_line ();
512       return;
513     }
514
515   /* Skip the file number.  */
516   SKIP_WHITESPACE ();
517   get_absolute_expression ();
518   SKIP_WHITESPACE ();
519
520   lineno = get_absolute_expression ();
521
522 #ifndef NO_LISTING
523   {
524     extern int listing;
525
526     if (listing)
527       {
528         lineno += coff_line_base - 1;
529         listing_source_line (lineno);
530       }
531   }
532 #endif
533
534   demand_empty_rest_of_line ();
535
536   add_lineno (frag_now, frag_now_fix (), lineno);
537 }
538
539 /* Handle the .ident pseudo-op.  */
540
541 static void
542 obj_coff_ident (ignore)
543      int ignore ATTRIBUTE_UNUSED;
544 {
545   segT current_seg = now_seg;
546   subsegT current_subseg = now_subseg;
547
548 #ifdef TE_PE
549   {
550     segT sec;
551
552     /* We could put it in .comment, but that creates an extra section
553        that shouldn't be loaded into memory, which requires linker
554        changes...  For now, until proven otherwise, use .rdata.  */
555     sec = subseg_new (".rdata$zzz", 0);
556     bfd_set_section_flags (stdoutput, sec,
557                            ((SEC_ALLOC | SEC_LOAD | SEC_READONLY | SEC_DATA)
558                             & bfd_applicable_section_flags (stdoutput)));
559   }
560 #else
561   subseg_new (".comment", 0);
562 #endif
563
564   stringer (1);
565   subseg_set (current_seg, current_subseg);
566 }
567
568 /*
569  *                      def()
570  *
571  * Handle .def directives.
572  *
573  * One might ask : why can't we symbol_new if the symbol does not
574  * already exist and fill it with debug information.  Because of
575  * the C_EFCN special symbol. It would clobber the value of the
576  * function symbol before we have a chance to notice that it is
577  * a C_EFCN. And a second reason is that the code is more clear this
578  * way. (at least I think it is :-).
579  *
580  */
581
582 #define SKIP_SEMI_COLON()       while (*input_line_pointer++ != ';')
583 #define SKIP_WHITESPACES()      while (*input_line_pointer == ' ' || \
584                                        *input_line_pointer == '\t') \
585     input_line_pointer++;
586
587 static void
588 obj_coff_def (what)
589      int what ATTRIBUTE_UNUSED;
590 {
591   char name_end;                /* Char after the end of name */
592   char *symbol_name;            /* Name of the debug symbol */
593   char *symbol_name_copy;       /* Temporary copy of the name */
594   unsigned int symbol_name_length;
595
596   if (def_symbol_in_progress != NULL)
597     {
598       as_warn (_(".def pseudo-op used inside of .def/.endef: ignored."));
599       demand_empty_rest_of_line ();
600       return;
601     }                           /* if not inside .def/.endef */
602
603   SKIP_WHITESPACES ();
604
605   symbol_name = input_line_pointer;
606 #ifdef STRIP_UNDERSCORE
607   if (symbol_name[0] == '_' && symbol_name[1] != 0)
608     symbol_name++;
609 #endif /* STRIP_UNDERSCORE */
610
611   name_end = get_symbol_end ();
612   symbol_name_length = strlen (symbol_name);
613   symbol_name_copy = xmalloc (symbol_name_length + 1);
614   strcpy (symbol_name_copy, symbol_name);
615 #ifdef tc_canonicalize_symbol_name
616   symbol_name_copy = tc_canonicalize_symbol_name (symbol_name_copy);
617 #endif
618
619   /* Initialize the new symbol */
620   def_symbol_in_progress = symbol_make (symbol_name_copy);
621   symbol_set_frag (def_symbol_in_progress, &zero_address_frag);
622   S_SET_VALUE (def_symbol_in_progress, 0);
623
624   if (S_IS_STRING (def_symbol_in_progress))
625     SF_SET_STRING (def_symbol_in_progress);
626
627   *input_line_pointer = name_end;
628
629   demand_empty_rest_of_line ();
630 }
631
632 unsigned int dim_index;
633
634 static void
635 obj_coff_endef (ignore)
636      int ignore ATTRIBUTE_UNUSED;
637 {
638   symbolS *symbolP = NULL;
639
640   /* DIM BUG FIX sac@cygnus.com */
641   dim_index = 0;
642   if (def_symbol_in_progress == NULL)
643     {
644       as_warn (_(".endef pseudo-op used outside of .def/.endef: ignored."));
645       demand_empty_rest_of_line ();
646       return;
647     }                           /* if not inside .def/.endef */
648
649   /* Set the section number according to storage class.  */
650   switch (S_GET_STORAGE_CLASS (def_symbol_in_progress))
651     {
652     case C_STRTAG:
653     case C_ENTAG:
654     case C_UNTAG:
655       SF_SET_TAG (def_symbol_in_progress);
656       /* intentional fallthrough */
657     case C_FILE:
658     case C_TPDEF:
659       SF_SET_DEBUG (def_symbol_in_progress);
660       S_SET_SEGMENT (def_symbol_in_progress, fetch_coff_debug_section ());
661       break;
662
663     case C_EFCN:
664       SF_SET_LOCAL (def_symbol_in_progress);    /* Do not emit this symbol.  */
665       /* intentional fallthrough */
666     case C_BLOCK:
667       SF_SET_PROCESS (def_symbol_in_progress);  /* Will need processing before writing */
668       /* intentional fallthrough */
669     case C_FCN:
670       {
671         const char *name;
672         S_SET_SEGMENT (def_symbol_in_progress, text_section);
673
674         name = S_GET_NAME (def_symbol_in_progress);
675         if (name[0] == '.' && name[2] == 'f' && name[3] == '\0')
676           {
677             switch (name[1])
678               {
679               case 'b':
680                 /* .bf */
681                 if (! in_function ())
682                   as_warn (_("`%s' symbol without preceding function"), name);
683                 /* Will need relocating.  */
684                 SF_SET_PROCESS (def_symbol_in_progress);
685                 clear_function ();
686                 break;
687 #ifdef TE_PE
688               case 'e':
689                 /* .ef */
690                 /* The MS compilers output the actual endline, not the
691                    function-relative one... we want to match without
692                    changing the assembler input.  */
693                 SA_SET_SYM_LNNO (def_symbol_in_progress,
694                                  (SA_GET_SYM_LNNO (def_symbol_in_progress)
695                                   + coff_line_base));
696                 break;
697 #endif
698               }
699           }
700       }
701       break;
702
703 #ifdef C_AUTOARG
704     case C_AUTOARG:
705 #endif /* C_AUTOARG */
706     case C_AUTO:
707     case C_REG:
708     case C_ARG:
709     case C_REGPARM:
710     case C_FIELD:
711
712     /* According to the COFF documentation:
713
714        http://osr5doc.sco.com:1996/topics/COFF_SectNumFld.html
715
716        A special section number (-2) marks symbolic debugging symbols,
717        including structure/union/enumeration tag names, typedefs, and
718        the name of the file. A section number of -1 indicates that the
719        symbol has a value but is not relocatable. Examples of
720        absolute-valued symbols include automatic and register variables,
721        function arguments, and .eos symbols.
722
723        But from Ian Lance Taylor:
724
725        http://sources.redhat.com/ml/binutils/2000-08/msg00202.html
726
727        the actual tools all marked them as section -1. So the GNU COFF
728        assembler follows historical COFF assemblers.
729
730        However, it causes problems for djgpp
731
732        http://sources.redhat.com/ml/binutils/2000-08/msg00210.html
733
734        By defining STRICTCOFF, a COFF port can make the assembler to
735        follow the documented behavior.  */
736 #ifdef STRICTCOFF
737     case C_MOS:
738     case C_MOE:
739     case C_MOU:
740     case C_EOS:
741 #endif
742       SF_SET_DEBUG (def_symbol_in_progress);
743       S_SET_SEGMENT (def_symbol_in_progress, absolute_section);
744       break;
745
746 #ifndef STRICTCOFF
747     case C_MOS:
748     case C_MOE:
749     case C_MOU:
750     case C_EOS:
751       S_SET_SEGMENT (def_symbol_in_progress, absolute_section);
752       break;
753 #endif
754
755     case C_EXT:
756     case C_WEAKEXT:
757 #ifdef TE_PE
758     case C_NT_WEAK:
759 #endif
760     case C_STAT:
761     case C_LABEL:
762       /* Valid but set somewhere else (s_comm, s_lcomm, colon) */
763       break;
764
765     default:
766     case C_USTATIC:
767     case C_EXTDEF:
768     case C_ULABEL:
769       as_warn (_("unexpected storage class %d"),
770                S_GET_STORAGE_CLASS (def_symbol_in_progress));
771       break;
772     }                           /* switch on storage class */
773
774   /* Now that we have built a debug symbol, try to find if we should
775      merge with an existing symbol or not.  If a symbol is C_EFCN or
776      absolute_section or untagged SEG_DEBUG it never merges.  We also
777      don't merge labels, which are in a different namespace, nor
778      symbols which have not yet been defined since they are typically
779      unique, nor do we merge tags with non-tags.  */
780
781   /* Two cases for functions.  Either debug followed by definition or
782      definition followed by debug.  For definition first, we will
783      merge the debug symbol into the definition.  For debug first, the
784      lineno entry MUST point to the definition function or else it
785      will point off into space when obj_crawl_symbol_chain() merges
786      the debug symbol into the real symbol.  Therefor, let's presume
787      the debug symbol is a real function reference.  */
788
789   /* FIXME-SOON If for some reason the definition label/symbol is
790      never seen, this will probably leave an undefined symbol at link
791      time.  */
792
793   if (S_GET_STORAGE_CLASS (def_symbol_in_progress) == C_EFCN
794       || S_GET_STORAGE_CLASS (def_symbol_in_progress) == C_LABEL
795       || (!strcmp (bfd_get_section_name (stdoutput,
796                                          S_GET_SEGMENT (def_symbol_in_progress)),
797                    "*DEBUG*")
798           && !SF_GET_TAG (def_symbol_in_progress))
799       || S_GET_SEGMENT (def_symbol_in_progress) == absolute_section
800       || ! symbol_constant_p (def_symbol_in_progress)
801       || (symbolP = symbol_find_base (S_GET_NAME (def_symbol_in_progress),
802                                       DO_NOT_STRIP)) == NULL
803       || SF_GET_TAG (def_symbol_in_progress) != SF_GET_TAG (symbolP))
804     {
805       /* If it already is at the end of the symbol list, do nothing */
806       if (def_symbol_in_progress != symbol_lastP)
807         {
808           symbol_remove (def_symbol_in_progress, &symbol_rootP, &symbol_lastP);
809           symbol_append (def_symbol_in_progress, symbol_lastP, &symbol_rootP,
810                          &symbol_lastP);
811         }
812     }
813   else
814     {
815       /* This symbol already exists, merge the newly created symbol
816          into the old one.  This is not mandatory. The linker can
817          handle duplicate symbols correctly. But I guess that it save
818          a *lot* of space if the assembly file defines a lot of
819          symbols. [loic] */
820
821       /* The debug entry (def_symbol_in_progress) is merged into the
822          previous definition.  */
823
824       c_symbol_merge (def_symbol_in_progress, symbolP);
825       symbol_remove (def_symbol_in_progress, &symbol_rootP, &symbol_lastP);
826
827       def_symbol_in_progress = symbolP;
828
829       if (SF_GET_FUNCTION (def_symbol_in_progress)
830           || SF_GET_TAG (def_symbol_in_progress)
831           || S_GET_STORAGE_CLASS (def_symbol_in_progress) == C_STAT)
832         {
833           /* For functions, and tags, and static symbols, the symbol
834              *must* be where the debug symbol appears.  Move the
835              existing symbol to the current place.  */
836           /* If it already is at the end of the symbol list, do nothing */
837           if (def_symbol_in_progress != symbol_lastP)
838             {
839               symbol_remove (def_symbol_in_progress, &symbol_rootP, &symbol_lastP);
840               symbol_append (def_symbol_in_progress, symbol_lastP, &symbol_rootP, &symbol_lastP);
841             }
842         }
843     }
844
845   if (SF_GET_TAG (def_symbol_in_progress))
846     {
847       symbolS *oldtag;
848
849       oldtag = symbol_find_base (S_GET_NAME (def_symbol_in_progress),
850                                  DO_NOT_STRIP);
851       if (oldtag == NULL || ! SF_GET_TAG (oldtag))
852         tag_insert (S_GET_NAME (def_symbol_in_progress),
853                     def_symbol_in_progress);
854     }
855
856   if (SF_GET_FUNCTION (def_symbol_in_progress))
857     {
858       know (sizeof (def_symbol_in_progress) <= sizeof (long));
859       set_function (def_symbol_in_progress);
860       SF_SET_PROCESS (def_symbol_in_progress);
861
862       if (symbolP == NULL)
863         {
864           /* That is, if this is the first time we've seen the
865              function...  */
866           symbol_table_insert (def_symbol_in_progress);
867         } /* definition follows debug */
868     } /* Create the line number entry pointing to the function being defined */
869
870   def_symbol_in_progress = NULL;
871   demand_empty_rest_of_line ();
872 }
873
874 static void
875 obj_coff_dim (ignore)
876      int ignore ATTRIBUTE_UNUSED;
877 {
878   int dim_index;
879
880   if (def_symbol_in_progress == NULL)
881     {
882       as_warn (_(".dim pseudo-op used outside of .def/.endef: ignored."));
883       demand_empty_rest_of_line ();
884       return;
885     }                           /* if not inside .def/.endef */
886
887   S_SET_NUMBER_AUXILIARY (def_symbol_in_progress, 1);
888
889   for (dim_index = 0; dim_index < DIMNUM; dim_index++)
890     {
891       SKIP_WHITESPACES ();
892       SA_SET_SYM_DIMEN (def_symbol_in_progress, dim_index,
893                         get_absolute_expression ());
894
895       switch (*input_line_pointer)
896         {
897         case ',':
898           input_line_pointer++;
899           break;
900
901         default:
902           as_warn (_("badly formed .dim directive ignored"));
903           /* intentional fallthrough */
904         case '\n':
905         case ';':
906           dim_index = DIMNUM;
907           break;
908         }
909     }
910
911   demand_empty_rest_of_line ();
912 }
913
914 static void
915 obj_coff_line (ignore)
916      int ignore ATTRIBUTE_UNUSED;
917 {
918   int this_base;
919
920   if (def_symbol_in_progress == NULL)
921     {
922       /* Probably stabs-style line?  */
923       obj_coff_ln (0);
924       return;
925     }
926
927   this_base = get_absolute_expression ();
928   if (!strcmp (".bf", S_GET_NAME (def_symbol_in_progress)))
929     coff_line_base = this_base;
930
931   S_SET_NUMBER_AUXILIARY (def_symbol_in_progress, 1);
932   SA_SET_SYM_LNNO (def_symbol_in_progress, this_base);
933
934   demand_empty_rest_of_line ();
935
936 #ifndef NO_LISTING
937   if (strcmp (".bf", S_GET_NAME (def_symbol_in_progress)) == 0)
938     {
939       extern int listing;
940
941       if (listing)
942         listing_source_line ((unsigned int) this_base);
943     }
944 #endif
945 }
946
947 static void
948 obj_coff_size (ignore)
949      int ignore ATTRIBUTE_UNUSED;
950 {
951   if (def_symbol_in_progress == NULL)
952     {
953       as_warn (_(".size pseudo-op used outside of .def/.endef ignored."));
954       demand_empty_rest_of_line ();
955       return;
956     }                           /* if not inside .def/.endef */
957
958   S_SET_NUMBER_AUXILIARY (def_symbol_in_progress, 1);
959   SA_SET_SYM_SIZE (def_symbol_in_progress, get_absolute_expression ());
960   demand_empty_rest_of_line ();
961 }
962
963 static void
964 obj_coff_scl (ignore)
965      int ignore ATTRIBUTE_UNUSED;
966 {
967   if (def_symbol_in_progress == NULL)
968     {
969       as_warn (_(".scl pseudo-op used outside of .def/.endef ignored."));
970       demand_empty_rest_of_line ();
971       return;
972     }                           /* if not inside .def/.endef */
973
974   S_SET_STORAGE_CLASS (def_symbol_in_progress, get_absolute_expression ());
975   demand_empty_rest_of_line ();
976 }
977
978 static void
979 obj_coff_tag (ignore)
980      int ignore ATTRIBUTE_UNUSED;
981 {
982   char *symbol_name;
983   char name_end;
984
985   if (def_symbol_in_progress == NULL)
986     {
987       as_warn (_(".tag pseudo-op used outside of .def/.endef ignored."));
988       demand_empty_rest_of_line ();
989       return;
990     }
991
992   S_SET_NUMBER_AUXILIARY (def_symbol_in_progress, 1);
993   symbol_name = input_line_pointer;
994   name_end = get_symbol_end ();
995
996 #ifdef tc_canonicalize_symbol_name
997   symbol_name = tc_canonicalize_symbol_name (symbol_name);
998 #endif
999
1000   /* Assume that the symbol referred to by .tag is always defined.
1001      This was a bad assumption.  I've added find_or_make. xoxorich.  */
1002   SA_SET_SYM_TAGNDX (def_symbol_in_progress,
1003                      tag_find_or_make (symbol_name));
1004   if (SA_GET_SYM_TAGNDX (def_symbol_in_progress) == 0L)
1005     {
1006       as_warn (_("tag not found for .tag %s"), symbol_name);
1007     }                           /* not defined */
1008
1009   SF_SET_TAGGED (def_symbol_in_progress);
1010   *input_line_pointer = name_end;
1011
1012   demand_empty_rest_of_line ();
1013 }
1014
1015 static void
1016 obj_coff_type (ignore)
1017      int ignore ATTRIBUTE_UNUSED;
1018 {
1019   if (def_symbol_in_progress == NULL)
1020     {
1021       as_warn (_(".type pseudo-op used outside of .def/.endef ignored."));
1022       demand_empty_rest_of_line ();
1023       return;
1024     }                           /* if not inside .def/.endef */
1025
1026   S_SET_DATA_TYPE (def_symbol_in_progress, get_absolute_expression ());
1027
1028   if (ISFCN (S_GET_DATA_TYPE (def_symbol_in_progress)) &&
1029       S_GET_STORAGE_CLASS (def_symbol_in_progress) != C_TPDEF)
1030     {
1031       SF_SET_FUNCTION (def_symbol_in_progress);
1032     }                           /* is a function */
1033
1034   demand_empty_rest_of_line ();
1035 }
1036
1037 static void
1038 obj_coff_val (ignore)
1039      int ignore ATTRIBUTE_UNUSED;
1040 {
1041   if (def_symbol_in_progress == NULL)
1042     {
1043       as_warn (_(".val pseudo-op used outside of .def/.endef ignored."));
1044       demand_empty_rest_of_line ();
1045       return;
1046     }                           /* if not inside .def/.endef */
1047
1048   if (is_name_beginner (*input_line_pointer))
1049     {
1050       char *symbol_name = input_line_pointer;
1051       char name_end = get_symbol_end ();
1052
1053 #ifdef tc_canonicalize_symbol_name
1054   symbol_name = tc_canonicalize_symbol_name (symbol_name);
1055 #endif
1056       if (!strcmp (symbol_name, "."))
1057         {
1058           symbol_set_frag (def_symbol_in_progress, frag_now);
1059           S_SET_VALUE (def_symbol_in_progress, (valueT) frag_now_fix ());
1060           /* If the .val is != from the .def (e.g. statics) */
1061         }
1062       else if (strcmp (S_GET_NAME (def_symbol_in_progress), symbol_name))
1063         {
1064           expressionS exp;
1065
1066           exp.X_op = O_symbol;
1067           exp.X_add_symbol = symbol_find_or_make (symbol_name);
1068           exp.X_op_symbol = NULL;
1069           exp.X_add_number = 0;
1070           symbol_set_value_expression (def_symbol_in_progress, &exp);
1071
1072           /* If the segment is undefined when the forward reference is
1073              resolved, then copy the segment id from the forward
1074              symbol.  */
1075           SF_SET_GET_SEGMENT (def_symbol_in_progress);
1076
1077           /* FIXME: gcc can generate address expressions here in
1078              unusual cases (search for "obscure" in sdbout.c).  We
1079              just ignore the offset here, thus generating incorrect
1080              debugging information.  We ignore the rest of the line
1081              just below.  */
1082         }
1083       /* Otherwise, it is the name of a non debug symbol and its value
1084          will be calculated later.  */
1085       *input_line_pointer = name_end;
1086     }
1087   else
1088     {
1089       S_SET_VALUE (def_symbol_in_progress, get_absolute_expression ());
1090     }                           /* if symbol based */
1091
1092   demand_empty_rest_of_line ();
1093 }
1094
1095 #ifdef TE_PE
1096
1097 /* Return nonzero if name begins with weak alternate symbol prefix.  */
1098
1099 static int
1100 weak_is_altname (const char * name)
1101 {
1102   return ! strncmp (name, weak_altprefix, sizeof (weak_altprefix) - 1);
1103 }
1104
1105 /* Return the name of the alternate symbol
1106    name corresponding to a weak symbol's name.  */
1107
1108 static const char *
1109 weak_name2altname (const char * name)
1110 {
1111   char *alt_name;
1112
1113   alt_name = xmalloc (sizeof (weak_altprefix) + strlen (name));
1114   strcpy (alt_name, weak_altprefix);
1115   return strcat (alt_name, name);
1116 }
1117
1118 /* Return the name of the weak symbol corresponding to an 
1119    alterate symbol.  */
1120
1121 static const char *
1122 weak_altname2name (const char * name)
1123 {
1124   char * weak_name;
1125   char * dot;
1126
1127   assert (weak_is_altname (name));
1128
1129   weak_name = xstrdup (name + 6);
1130   if ((dot = strchr (weak_name, '.')))
1131     *dot = 0;
1132   return weak_name;
1133 }
1134
1135 /* Make a weak symbol name unique by
1136    appending the name of an external symbol.  */
1137
1138 static const char *
1139 weak_uniquify (const char * name)
1140 {
1141   char *ret;
1142   const char * unique = "";
1143
1144 #ifdef USE_UNIQUE
1145   if (an_external_name != NULL)
1146     unique = an_external_name;
1147 #endif
1148   assert (weak_is_altname (name));
1149
1150   if (strchr (name + sizeof (weak_altprefix), '.'))
1151     return name;
1152
1153   ret = xmalloc (strlen (name) + strlen (unique) + 2);
1154   strcpy (ret, name);
1155   strcat (ret, ".");
1156   strcat (ret, unique);
1157   return ret;
1158 }
1159
1160 #endif  /* TE_PE */
1161
1162 /* Handle .weak.  This is a GNU extension in formats other than PE. */
1163
1164 static void
1165 obj_coff_weak (int ignore ATTRIBUTE_UNUSED)
1166 {
1167   char *name;
1168   int c;
1169   symbolS *symbolP;
1170 #ifdef TE_PE
1171   symbolS *alternateP;
1172 #endif
1173
1174   do
1175     {
1176       name = input_line_pointer;
1177       c = get_symbol_end ();
1178       if (*name == 0)
1179         {
1180           as_warn (_("badly formed .weak directive ignored"));
1181           ignore_rest_of_line ();
1182           return;
1183         }
1184       c = 0;
1185       symbolP = symbol_find_or_make (name);
1186       *input_line_pointer = c;
1187       SKIP_WHITESPACE ();
1188
1189 #if defined BFD_ASSEMBLER || defined S_SET_WEAK
1190       S_SET_WEAK (symbolP);
1191 #endif
1192
1193 #ifdef TE_PE
1194       /* See _Microsoft Portable Executable and Common Object
1195          File Format Specification_, section 5.5.3.
1196          Create a symbol representing the alternate value.
1197          coff_frob_symbol will set the value of this symbol from
1198          the value of the weak symbol itself.  */
1199       S_SET_STORAGE_CLASS (symbolP, C_NT_WEAK);
1200       S_SET_NUMBER_AUXILIARY (symbolP, 1);
1201       SA_SET_SYM_FSIZE (symbolP, IMAGE_WEAK_EXTERN_SEARCH_LIBRARY);
1202
1203       alternateP = symbol_find_or_make (weak_name2altname (name));
1204       S_SET_EXTERNAL (alternateP);
1205       S_SET_STORAGE_CLASS (alternateP, C_NT_WEAK);
1206
1207       SA_SET_SYM_TAGNDX (symbolP, alternateP);
1208 #endif
1209
1210       if (c == ',')
1211         {
1212           input_line_pointer++;
1213           SKIP_WHITESPACE ();
1214           if (*input_line_pointer == '\n')
1215             c = '\n';
1216         }
1217
1218     }
1219   while (c == ',');
1220
1221   demand_empty_rest_of_line ();
1222 }
1223
1224 void
1225 coff_obj_read_begin_hook ()
1226 {
1227   /* These had better be the same.  Usually 18 bytes.  */
1228 #ifndef BFD_HEADERS
1229   know (sizeof (SYMENT) == sizeof (AUXENT));
1230   know (SYMESZ == AUXESZ);
1231 #endif
1232   tag_init ();
1233 }
1234
1235 symbolS *coff_last_function;
1236 #ifndef OBJ_XCOFF
1237 static symbolS *coff_last_bf;
1238 #endif
1239
1240 void
1241 coff_frob_symbol (symp, punt)
1242      symbolS *symp;
1243      int *punt;
1244 {
1245   static symbolS *last_tagP;
1246   static stack *block_stack;
1247   static symbolS *set_end;
1248   symbolS *next_set_end = NULL;
1249
1250   if (symp == &abs_symbol)
1251     {
1252       *punt = 1;
1253       return;
1254     }
1255
1256   if (current_lineno_sym)
1257     coff_add_linesym ((symbolS *) 0);
1258
1259   if (!block_stack)
1260     block_stack = stack_init (512, sizeof (symbolS*));
1261
1262 #ifdef TE_PE
1263   if (S_GET_STORAGE_CLASS (symp) == C_NT_WEAK
1264       && ! S_IS_WEAK (symp)
1265       && weak_is_altname (S_GET_NAME (symp)))
1266     {
1267       /* This is a weak alternate symbol.  All processing of
1268          PECOFFweak symbols is done here, through the alternate.  */
1269       symbolS *weakp = symbol_find (weak_altname2name (S_GET_NAME (symp)));
1270
1271       assert (weakp);
1272       assert (S_GET_NUMBER_AUXILIARY (weakp) == 1);
1273
1274       if (symbol_equated_p (weakp))
1275         {
1276           /* The weak symbol has an alternate specified; symp is unneeded.  */
1277           S_SET_STORAGE_CLASS (weakp, C_NT_WEAK);
1278           SA_SET_SYM_TAGNDX (weakp,
1279             symbol_get_value_expression (weakp)->X_add_symbol);
1280
1281           S_CLEAR_EXTERNAL (symp);
1282           *punt = 1;
1283           return;
1284         }
1285       else
1286         {
1287           /* The weak symbol has been assigned an alternate value.
1288              Copy this value to symp, and set symp as weakp's alternate.  */
1289           if (S_GET_STORAGE_CLASS (weakp) != C_NT_WEAK)
1290             {
1291               S_SET_STORAGE_CLASS (symp, S_GET_STORAGE_CLASS (weakp));
1292               S_SET_STORAGE_CLASS (weakp, C_NT_WEAK);
1293             }
1294
1295           if (S_IS_DEFINED (weakp))
1296             {
1297               /* This is a defined weak symbol.  Copy value information
1298                  from the weak symbol itself to the alternate symbol.  */
1299               symbol_set_value_expression (symp,
1300                                            symbol_get_value_expression (weakp));
1301               symbol_set_frag (symp, symbol_get_frag (weakp));
1302               S_SET_SEGMENT (symp, S_GET_SEGMENT (weakp));
1303             }
1304           else
1305             {
1306               /* This is an undefined weak symbol.
1307                  Define the alternate symbol to zero.  */
1308               S_SET_VALUE (symp, 0);
1309               S_SET_SEGMENT (symp, absolute_section);
1310             }
1311
1312           S_SET_NAME (symp, weak_uniquify (S_GET_NAME (symp)));
1313           S_SET_STORAGE_CLASS (symp, C_EXT);
1314
1315           S_SET_VALUE (weakp, 0);
1316           S_SET_SEGMENT (weakp, undefined_section);
1317         }
1318     }
1319 #else /* TE_PE */
1320   if (S_IS_WEAK (symp))
1321     S_SET_STORAGE_CLASS (symp, C_WEAKEXT);
1322 #endif /* TE_PE */
1323
1324   if (!S_IS_DEFINED (symp)
1325       && !S_IS_WEAK (symp)
1326       && S_GET_STORAGE_CLASS (symp) != C_STAT)
1327     S_SET_STORAGE_CLASS (symp, C_EXT);
1328
1329   if (!SF_GET_DEBUG (symp))
1330     {
1331       symbolS * real;
1332
1333       if (!SF_GET_LOCAL (symp)
1334           && !SF_GET_STATICS (symp)
1335           && S_GET_STORAGE_CLASS (symp) != C_LABEL
1336           && symbol_constant_p(symp)
1337           && (real = symbol_find_base (S_GET_NAME (symp), DO_NOT_STRIP))
1338           && S_GET_STORAGE_CLASS (real) == C_NULL
1339           && real != symp)
1340         {
1341           c_symbol_merge (symp, real);
1342           *punt = 1;
1343           return;
1344         }
1345
1346       if (!S_IS_DEFINED (symp) && !SF_GET_LOCAL (symp))
1347         {
1348           assert (S_GET_VALUE (symp) == 0);
1349           S_SET_EXTERNAL (symp);
1350         }
1351       else if (S_GET_STORAGE_CLASS (symp) == C_NULL)
1352         {
1353           if (S_GET_SEGMENT (symp) == text_section
1354               && symp != seg_info (text_section)->sym)
1355             S_SET_STORAGE_CLASS (symp, C_LABEL);
1356           else
1357             S_SET_STORAGE_CLASS (symp, C_STAT);
1358         }
1359
1360       if (SF_GET_PROCESS (symp))
1361         {
1362           if (S_GET_STORAGE_CLASS (symp) == C_BLOCK)
1363             {
1364               if (!strcmp (S_GET_NAME (symp), ".bb"))
1365                 stack_push (block_stack, (char *) &symp);
1366               else
1367                 {
1368                   symbolS *begin;
1369
1370                   begin = *(symbolS **) stack_pop (block_stack);
1371                   if (begin == 0)
1372                     as_warn (_("mismatched .eb"));
1373                   else
1374                     next_set_end = begin;
1375                 }
1376             }
1377
1378           if (coff_last_function == 0 && SF_GET_FUNCTION (symp))
1379             {
1380               union internal_auxent *auxp;
1381
1382               coff_last_function = symp;
1383               if (S_GET_NUMBER_AUXILIARY (symp) < 1)
1384                 S_SET_NUMBER_AUXILIARY (symp, 1);
1385               auxp = SYM_AUXENT (symp);
1386               memset (auxp->x_sym.x_fcnary.x_ary.x_dimen, 0,
1387                       sizeof (auxp->x_sym.x_fcnary.x_ary.x_dimen));
1388             }
1389
1390           if (S_GET_STORAGE_CLASS (symp) == C_EFCN)
1391             {
1392               if (coff_last_function == 0)
1393                 as_fatal (_("C_EFCN symbol out of scope"));
1394               SA_SET_SYM_FSIZE (coff_last_function,
1395                                 (long) (S_GET_VALUE (symp)
1396                                         - S_GET_VALUE (coff_last_function)));
1397               next_set_end = coff_last_function;
1398               coff_last_function = 0;
1399             }
1400         }
1401
1402       if (S_IS_EXTERNAL (symp))
1403         S_SET_STORAGE_CLASS (symp, C_EXT);
1404       else if (SF_GET_LOCAL (symp))
1405         *punt = 1;
1406
1407       if (SF_GET_FUNCTION (symp))
1408         symbol_get_bfdsym (symp)->flags |= BSF_FUNCTION;
1409
1410       /* more ...  */
1411     }
1412
1413   /* Double check weak symbols.  */
1414   if (S_IS_WEAK (symp) && S_IS_COMMON (symp))
1415     as_bad (_("Symbol `%s' can not be both weak and common"),
1416             S_GET_NAME (symp));
1417
1418   if (SF_GET_TAG (symp))
1419     last_tagP = symp;
1420   else if (S_GET_STORAGE_CLASS (symp) == C_EOS)
1421     next_set_end = last_tagP;
1422
1423 #ifdef OBJ_XCOFF
1424   /* This is pretty horrible, but we have to set *punt correctly in
1425      order to call SA_SET_SYM_ENDNDX correctly.  */
1426   if (! symbol_used_in_reloc_p (symp)
1427       && ((symbol_get_bfdsym (symp)->flags & BSF_SECTION_SYM) != 0
1428           || (! (S_IS_EXTERNAL (symp) || S_IS_WEAK (symp))
1429               && ! symbol_get_tc (symp)->output
1430               && S_GET_STORAGE_CLASS (symp) != C_FILE)))
1431     *punt = 1;
1432 #endif
1433
1434   if (set_end != (symbolS *) NULL
1435       && ! *punt
1436       && ((symbol_get_bfdsym (symp)->flags & BSF_NOT_AT_END) != 0
1437           || (S_IS_DEFINED (symp)
1438               && ! S_IS_COMMON (symp)
1439               && (! S_IS_EXTERNAL (symp) || SF_GET_FUNCTION (symp)))))
1440     {
1441       SA_SET_SYM_ENDNDX (set_end, symp);
1442       set_end = NULL;
1443     }
1444
1445   if (next_set_end != NULL)
1446     {
1447       if (set_end != NULL)
1448         as_warn ("Warning: internal error: forgetting to set endndx of %s",
1449                  S_GET_NAME (set_end));
1450       set_end = next_set_end;
1451     }
1452
1453 #ifndef OBJ_XCOFF
1454   if (! *punt
1455       && S_GET_STORAGE_CLASS (symp) == C_FCN
1456       && strcmp (S_GET_NAME (symp), ".bf") == 0)
1457     {
1458       if (coff_last_bf != NULL)
1459         SA_SET_SYM_ENDNDX (coff_last_bf, symp);
1460       coff_last_bf = symp;
1461     }
1462 #endif
1463   if (coffsymbol (symbol_get_bfdsym (symp))->lineno)
1464     {
1465       int i;
1466       struct line_no *lptr;
1467       alent *l;
1468
1469       lptr = (struct line_no *) coffsymbol (symbol_get_bfdsym (symp))->lineno;
1470       for (i = 0; lptr; lptr = lptr->next)
1471         i++;
1472       lptr = (struct line_no *) coffsymbol (symbol_get_bfdsym (symp))->lineno;
1473
1474       /* We need i entries for line numbers, plus 1 for the first
1475          entry which BFD will override, plus 1 for the last zero
1476          entry (a marker for BFD).  */
1477       l = (alent *) xmalloc ((i + 2) * sizeof (alent));
1478       coffsymbol (symbol_get_bfdsym (symp))->lineno = l;
1479       l[i + 1].line_number = 0;
1480       l[i + 1].u.sym = NULL;
1481       for (; i > 0; i--)
1482         {
1483           if (lptr->frag)
1484             lptr->l.u.offset += lptr->frag->fr_address / OCTETS_PER_BYTE;
1485           l[i] = lptr->l;
1486           lptr = lptr->next;
1487         }
1488     }
1489 }
1490
1491 void
1492 coff_adjust_section_syms (abfd, sec, x)
1493      bfd *abfd ATTRIBUTE_UNUSED;
1494      asection *sec;
1495      PTR x ATTRIBUTE_UNUSED;
1496 {
1497   symbolS *secsym;
1498   segment_info_type *seginfo = seg_info (sec);
1499   int nlnno, nrelocs = 0;
1500
1501   /* RS/6000 gas creates a .debug section manually in ppc_frob_file in
1502      tc-ppc.c.  Do not get confused by it.  */
1503   if (seginfo == NULL)
1504     return;
1505
1506   if (!strcmp (sec->name, ".text"))
1507     nlnno = coff_n_line_nos;
1508   else
1509     nlnno = 0;
1510   {
1511     /* @@ Hope that none of the fixups expand to more than one reloc
1512        entry...  */
1513     fixS *fixp = seginfo->fix_root;
1514     while (fixp)
1515       {
1516         if (! fixp->fx_done)
1517           nrelocs++;
1518         fixp = fixp->fx_next;
1519       }
1520   }
1521   if (bfd_get_section_size (sec) == 0
1522       && nrelocs == 0
1523       && nlnno == 0
1524       && sec != text_section
1525       && sec != data_section
1526       && sec != bss_section)
1527     return;
1528   secsym = section_symbol (sec);
1529   /* This is an estimate; we'll plug in the real value using
1530      SET_SECTION_RELOCS later */
1531   SA_SET_SCN_NRELOC (secsym, nrelocs);
1532   SA_SET_SCN_NLINNO (secsym, nlnno);
1533 }
1534
1535 void
1536 coff_frob_file_after_relocs ()
1537 {
1538   bfd_map_over_sections (stdoutput, coff_adjust_section_syms, (char*) 0);
1539 }
1540
1541 /* Implement the .section pseudo op:
1542         .section name {, "flags"}
1543                   ^         ^
1544                   |         +--- optional flags: 'b' for bss
1545                   |                              'i' for info
1546                   +-- section name               'l' for lib
1547                                                  'n' for noload
1548                                                  'o' for over
1549                                                  'w' for data
1550                                                  'd' (apparently m88k for data)
1551                                                  'x' for text
1552                                                  'r' for read-only data
1553                                                  's' for shared data (PE)
1554    But if the argument is not a quoted string, treat it as a
1555    subsegment number.
1556
1557    Note the 'a' flag is silently ignored.  This allows the same
1558    .section directive to be parsed in both ELF and COFF formats.  */
1559
1560 void
1561 obj_coff_section (ignore)
1562      int ignore ATTRIBUTE_UNUSED;
1563 {
1564   /* Strip out the section name */
1565   char *section_name;
1566   char c;
1567   char *name;
1568   unsigned int exp;
1569   flagword flags, oldflags;
1570   asection *sec;
1571
1572   if (flag_mri)
1573     {
1574       char type;
1575
1576       s_mri_sect (&type);
1577       return;
1578     }
1579
1580   section_name = input_line_pointer;
1581   c = get_symbol_end ();
1582
1583   name = xmalloc (input_line_pointer - section_name + 1);
1584   strcpy (name, section_name);
1585
1586   *input_line_pointer = c;
1587
1588   SKIP_WHITESPACE ();
1589
1590   exp = 0;
1591   flags = SEC_NO_FLAGS;
1592
1593   if (*input_line_pointer == ',')
1594     {
1595       ++input_line_pointer;
1596       SKIP_WHITESPACE ();
1597       if (*input_line_pointer != '"')
1598         exp = get_absolute_expression ();
1599       else
1600         {
1601           ++input_line_pointer;
1602           while (*input_line_pointer != '"'
1603                  && ! is_end_of_line[(unsigned char) *input_line_pointer])
1604             {
1605               switch (*input_line_pointer)
1606                 {
1607                 case 'b': flags |= SEC_ALLOC; flags &=~ SEC_LOAD; break;
1608                 case 'n': flags &=~ SEC_LOAD; flags |= SEC_NEVER_LOAD; break;
1609
1610                 case 's': flags |= SEC_COFF_SHARED; /* fall through */
1611                 case 'd': flags |= SEC_DATA | SEC_LOAD; /* fall through */
1612                 case 'w': flags &=~ SEC_READONLY; break;
1613
1614                 case 'a': break; /* For compatibility with ELF.  */
1615                 case 'x': flags |= SEC_CODE | SEC_LOAD; break;
1616                 case 'r': flags |= SEC_DATA | SEC_LOAD | SEC_READONLY; break;
1617
1618                 case 'i': /* STYP_INFO */
1619                 case 'l': /* STYP_LIB */
1620                 case 'o': /* STYP_OVER */
1621                   as_warn (_("unsupported section attribute '%c'"),
1622                            *input_line_pointer);
1623                   break;
1624
1625                 default:
1626                   as_warn(_("unknown section attribute '%c'"),
1627                           *input_line_pointer);
1628                   break;
1629                 }
1630               ++input_line_pointer;
1631             }
1632           if (*input_line_pointer == '"')
1633             ++input_line_pointer;
1634         }
1635     }
1636
1637   sec = subseg_new (name, (subsegT) exp);
1638
1639   oldflags = bfd_get_section_flags (stdoutput, sec);
1640   if (oldflags == SEC_NO_FLAGS)
1641     {
1642       /* Set section flags for a new section just created by subseg_new.
1643          Provide a default if no flags were parsed.  */
1644       if (flags == SEC_NO_FLAGS)
1645         flags = TC_COFF_SECTION_DEFAULT_ATTRIBUTES;
1646
1647 #ifdef COFF_LONG_SECTION_NAMES
1648       /* Add SEC_LINK_ONCE and SEC_LINK_DUPLICATES_DISCARD to .gnu.linkonce
1649          sections so adjust_reloc_syms in write.c will correctly handle
1650          relocs which refer to non-local symbols in these sections.  */
1651       if (strncmp (name, ".gnu.linkonce", sizeof (".gnu.linkonce") - 1) == 0)
1652         flags |= SEC_LINK_ONCE | SEC_LINK_DUPLICATES_DISCARD;
1653 #endif
1654
1655       if (! bfd_set_section_flags (stdoutput, sec, flags))
1656         as_warn (_("error setting flags for \"%s\": %s"),
1657                  bfd_section_name (stdoutput, sec),
1658                  bfd_errmsg (bfd_get_error ()));
1659     }
1660   else if (flags != SEC_NO_FLAGS)
1661     {
1662       /* This section's attributes have already been set. Warn if the
1663          attributes don't match.  */
1664       flagword matchflags = (SEC_ALLOC | SEC_LOAD | SEC_READONLY | SEC_CODE
1665                              | SEC_DATA | SEC_COFF_SHARED | SEC_NEVER_LOAD);
1666       if ((flags ^ oldflags) & matchflags)
1667         as_warn (_("Ignoring changed section attributes for %s"), name);
1668     }
1669
1670   demand_empty_rest_of_line ();
1671 }
1672
1673 void
1674 coff_adjust_symtab ()
1675 {
1676   if (symbol_rootP == NULL
1677       || S_GET_STORAGE_CLASS (symbol_rootP) != C_FILE)
1678     c_dot_file_symbol ("fake", 0);
1679 }
1680
1681 void
1682 coff_frob_section (sec)
1683      segT sec;
1684 {
1685   segT strsec;
1686   char *p;
1687   fragS *fragp;
1688   bfd_vma size, n_entries, mask;
1689   bfd_vma align_power = (bfd_vma)sec->alignment_power + OCTETS_PER_BYTE_POWER;
1690
1691   /* The COFF back end in BFD requires that all section sizes be
1692      rounded up to multiples of the corresponding section alignments,
1693      supposedly because standard COFF has no other way of encoding alignment
1694      for sections.  If your COFF flavor has a different way of encoding
1695      section alignment, then skip this step, as TICOFF does.  */
1696   size = bfd_get_section_size (sec);
1697   mask = ((bfd_vma) 1 << align_power) - 1;
1698 #if !defined(TICOFF)
1699   if (size & mask)
1700     {
1701       bfd_vma new_size;
1702       fragS *last;
1703
1704       new_size = (size + mask) & ~mask;
1705       bfd_set_section_size (stdoutput, sec, new_size);
1706
1707       /* If the size had to be rounded up, add some padding in
1708          the last non-empty frag.  */
1709       fragp = seg_info (sec)->frchainP->frch_root;
1710       last = seg_info (sec)->frchainP->frch_last;
1711       while (fragp->fr_next != last)
1712         fragp = fragp->fr_next;
1713       last->fr_address = size;
1714       fragp->fr_offset += new_size - size;
1715     }
1716 #endif
1717
1718   /* If the section size is non-zero, the section symbol needs an aux
1719      entry associated with it, indicating the size.  We don't know
1720      all the values yet; coff_frob_symbol will fill them in later.  */
1721 #ifndef TICOFF
1722   if (size != 0
1723       || sec == text_section
1724       || sec == data_section
1725       || sec == bss_section)
1726 #endif
1727     {
1728       symbolS *secsym = section_symbol (sec);
1729
1730       S_SET_STORAGE_CLASS (secsym, C_STAT);
1731       S_SET_NUMBER_AUXILIARY (secsym, 1);
1732       SF_SET_STATICS (secsym);
1733       SA_SET_SCN_SCNLEN (secsym, size);
1734     }
1735
1736   /* @@ these should be in a "stabs.h" file, or maybe as.h */
1737 #ifndef STAB_SECTION_NAME
1738 #define STAB_SECTION_NAME ".stab"
1739 #endif
1740 #ifndef STAB_STRING_SECTION_NAME
1741 #define STAB_STRING_SECTION_NAME ".stabstr"
1742 #endif
1743   if (strcmp (STAB_STRING_SECTION_NAME, sec->name))
1744     return;
1745
1746   strsec = sec;
1747   sec = subseg_get (STAB_SECTION_NAME, 0);
1748   /* size is already rounded up, since other section will be listed first */
1749   size = bfd_get_section_size (strsec);
1750
1751   n_entries = bfd_get_section_size (sec) / 12 - 1;
1752
1753   /* Find first non-empty frag.  It should be large enough.  */
1754   fragp = seg_info (sec)->frchainP->frch_root;
1755   while (fragp && fragp->fr_fix == 0)
1756     fragp = fragp->fr_next;
1757   assert (fragp != 0 && fragp->fr_fix >= 12);
1758
1759   /* Store the values.  */
1760   p = fragp->fr_literal;
1761   bfd_h_put_16 (stdoutput, n_entries, (bfd_byte *) p + 6);
1762   bfd_h_put_32 (stdoutput, size, (bfd_byte *) p + 8);
1763 }
1764
1765 void
1766 obj_coff_init_stab_section (seg)
1767      segT seg;
1768 {
1769   char *file;
1770   char *p;
1771   char *stabstr_name;
1772   unsigned int stroff;
1773
1774   /* Make space for this first symbol.  */
1775   p = frag_more (12);
1776   /* Zero it out.  */
1777   memset (p, 0, 12);
1778   as_where (&file, (unsigned int *) NULL);
1779   stabstr_name = (char *) xmalloc (strlen (seg->name) + 4);
1780   strcpy (stabstr_name, seg->name);
1781   strcat (stabstr_name, "str");
1782   stroff = get_stab_string_offset (file, stabstr_name);
1783   know (stroff == 1);
1784   md_number_to_chars (p, stroff, 4);
1785 }
1786
1787 #ifdef DEBUG
1788 /* for debugging */
1789 const char *
1790 s_get_name (s)
1791      symbolS *s;
1792 {
1793   return ((s == NULL) ? "(NULL)" : S_GET_NAME (s));
1794 }
1795
1796 void
1797 symbol_dump ()
1798 {
1799   symbolS *symbolP;
1800
1801   for (symbolP = symbol_rootP; symbolP; symbolP = symbol_next (symbolP))
1802     {
1803       printf (_("0x%lx: \"%s\" type = %ld, class = %d, segment = %d\n"),
1804              (unsigned long) symbolP,
1805              S_GET_NAME(symbolP),
1806              (long) S_GET_DATA_TYPE(symbolP),
1807              S_GET_STORAGE_CLASS(symbolP),
1808              (int) S_GET_SEGMENT(symbolP));
1809     }
1810 }
1811
1812 #endif /* DEBUG */
1813
1814 #else /* not BFD_ASSEMBLER */
1815
1816 #include "frags.h"
1817 /* This is needed because we include internal bfd things.  */
1818 #include <time.h>
1819
1820 #include "libbfd.h"
1821 #include "libcoff.h"
1822
1823 /* The NOP_OPCODE is for the alignment fill value.  Fill with nop so
1824    that we can stick sections together without causing trouble.  */
1825 #ifndef NOP_OPCODE
1826 #define NOP_OPCODE 0x00
1827 #endif
1828
1829 /* The zeroes if symbol name is longer than 8 chars */
1830 #define S_SET_ZEROES(s,v)               ((s)->sy_symbol.ost_entry.n_zeroes = (v))
1831
1832 #define MIN(a,b) ((a) < (b)? (a) : (b))
1833
1834 /* This vector is used to turn a gas internal segment number into a
1835    section number suitable for insertion into a coff symbol table.
1836    This must correspond to seg_info_off_by_4.  */
1837
1838 const short seg_N_TYPE[] =
1839 {                               /* in: segT   out: N_TYPE bits */
1840   C_ABS_SECTION,
1841   1,    2,  3,   4,    5,   6,   7,   8,   9,  10,
1842   11,  12,  13,  14,  15,  16,  17,  18,  19,  20,
1843   21,  22,  23,  24,  25,  26,  27,  28,  29,  30,
1844   31,  32,  33,  34,  35,  36,  37,  38,  39,  40,
1845   C_UNDEF_SECTION,              /* SEG_UNKNOWN */
1846   C_UNDEF_SECTION,              /* SEG_GOOF */
1847   C_UNDEF_SECTION,              /* SEG_EXPR */
1848   C_DEBUG_SECTION,              /* SEG_DEBUG */
1849   C_NTV_SECTION,                /* SEG_NTV */
1850   C_PTV_SECTION,                /* SEG_PTV */
1851   C_REGISTER_SECTION,           /* SEG_REGISTER */
1852 };
1853
1854 int function_lineoff = -1;      /* Offset in line#s where the last function
1855                                    started (the odd entry for line #0) */
1856
1857 /* Structure used to keep the filenames which
1858    are too long around so that we can stick them
1859    into the string table.  */
1860 struct filename_list
1861 {
1862   const char *filename;
1863   struct filename_list *next;
1864 };
1865
1866 static struct filename_list *filename_list_head;
1867 static struct filename_list *filename_list_tail;
1868
1869 static symbolS *last_line_symbol;
1870
1871 /* Add 4 to the real value to get the index and compensate the
1872    negatives. This vector is used by S_GET_SEGMENT to turn a coff
1873    section number into a segment number.  */
1874
1875 bfd *abfd;
1876 static symbolS *previous_file_symbol;
1877 static int line_base;
1878
1879 void c_symbol_merge PARAMS ((symbolS *, symbolS *));
1880 symbolS *c_section_symbol PARAMS ((char *, int));
1881 void obj_coff_section PARAMS ((int));
1882 void do_relocs_for PARAMS ((bfd *, object_headers *, unsigned long *));
1883 char * symbol_to_chars PARAMS ((bfd *, char *, symbolS *));
1884 void w_strings PARAMS ((char *));
1885
1886 static void fixup_segment PARAMS ((segment_info_type *, segT));
1887 static void fixup_mdeps PARAMS ((fragS *, object_headers *, segT));
1888 static void fill_section PARAMS ((bfd *,  object_headers *, unsigned long *));
1889 static int c_line_new PARAMS ((symbolS *, long, int, fragS *));
1890 static void w_symbols PARAMS ((bfd *, char *, symbolS *));
1891 static void adjust_stab_section PARAMS ((bfd *, segT));
1892 static void obj_coff_lcomm PARAMS ((int));
1893 static void obj_coff_text PARAMS ((int));
1894 static void obj_coff_data PARAMS ((int));
1895 static unsigned int count_entries_in_chain PARAMS ((unsigned int));
1896 static void coff_header_append PARAMS ((bfd *, object_headers *));
1897 static unsigned int yank_symbols PARAMS ((void));
1898 static unsigned int glue_symbols PARAMS ((symbolS **, symbolS **));
1899 static unsigned int tie_tags PARAMS ((void));
1900 static void crawl_symbols PARAMS ((object_headers *, bfd *));
1901 static void do_linenos_for PARAMS ((bfd *, object_headers *, unsigned long *));
1902 static void remove_subsegs PARAMS ((void));
1903
1904
1905
1906 /* When not using BFD_ASSEMBLER, we permit up to 40 sections.
1907
1908    This array maps a COFF section number into a gas section number.
1909    Because COFF uses negative section numbers, you must add 4 to the
1910    COFF section number when indexing into this array; this is done via
1911    the SEG_INFO_FROM_SECTION_NUMBER macro.  This must correspond to
1912    seg_N_TYPE.  */
1913
1914 static const segT seg_info_off_by_4[] =
1915 {
1916  SEG_PTV,
1917  SEG_NTV,
1918  SEG_DEBUG,
1919  SEG_ABSOLUTE,
1920  SEG_UNKNOWN,
1921  SEG_E0,  SEG_E1,  SEG_E2,  SEG_E3,  SEG_E4,
1922  SEG_E5,  SEG_E6,  SEG_E7,  SEG_E8,  SEG_E9,
1923  SEG_E10, SEG_E11, SEG_E12, SEG_E13, SEG_E14,
1924  SEG_E15, SEG_E16, SEG_E17, SEG_E18, SEG_E19,
1925  SEG_E20, SEG_E21, SEG_E22, SEG_E23, SEG_E24,
1926  SEG_E25, SEG_E26, SEG_E27, SEG_E28, SEG_E29,
1927  SEG_E30, SEG_E31, SEG_E32, SEG_E33, SEG_E34,
1928  SEG_E35, SEG_E36, SEG_E37, SEG_E38, SEG_E39,
1929  (segT) 40,
1930  (segT) 41,
1931  (segT) 42,
1932  (segT) 43,
1933  (segT) 44,
1934  (segT) 45,
1935  (segT) 0,
1936  (segT) 0,
1937  (segT) 0,
1938  SEG_REGISTER
1939 };
1940
1941 #define SEG_INFO_FROM_SECTION_NUMBER(x) (seg_info_off_by_4[(x)+4])
1942
1943 static relax_addressT relax_align PARAMS ((relax_addressT, long));
1944
1945 static relax_addressT
1946 relax_align (address, alignment)
1947      relax_addressT address;
1948      long alignment;
1949 {
1950   relax_addressT mask;
1951   relax_addressT new_address;
1952
1953   mask = ~((~0) << alignment);
1954   new_address = (address + mask) & (~mask);
1955   return (new_address - address);
1956 }
1957
1958 segT
1959 s_get_segment (x)
1960      symbolS * x;
1961 {
1962   return SEG_INFO_FROM_SECTION_NUMBER (x->sy_symbol.ost_entry.n_scnum);
1963 }
1964
1965 static unsigned int size_section PARAMS ((bfd *, unsigned int));
1966
1967 /* Calculate the size of the frag chain and fill in the section header
1968    to contain all of it, also fill in the addr of the sections.  */
1969
1970 static unsigned int
1971 size_section (abfd, idx)
1972      bfd *abfd ATTRIBUTE_UNUSED;
1973      unsigned int idx;
1974 {
1975   unsigned int size = 0;
1976   fragS *frag = segment_info[idx].frchainP->frch_root;
1977
1978   while (frag)
1979     {
1980       size = frag->fr_address;
1981       if (frag->fr_address != size)
1982         {
1983           fprintf (stderr, _("Out of step\n"));
1984           size = frag->fr_address;
1985         }
1986
1987       switch (frag->fr_type)
1988         {
1989 #ifdef TC_COFF_SIZEMACHDEP
1990         case rs_machine_dependent:
1991           size += TC_COFF_SIZEMACHDEP (frag);
1992           break;
1993 #endif
1994         case rs_space:
1995         case rs_fill:
1996         case rs_org:
1997           size += frag->fr_fix;
1998           size += frag->fr_offset * frag->fr_var;
1999           break;
2000         case rs_align:
2001         case rs_align_code:
2002         case rs_align_test:
2003           {
2004             addressT off;
2005
2006             size += frag->fr_fix;
2007             off = relax_align (size, frag->fr_offset);
2008             if (frag->fr_subtype != 0 && off > frag->fr_subtype)
2009               off = 0;
2010             size += off;
2011           }
2012           break;
2013         default:
2014           BAD_CASE (frag->fr_type);
2015           break;
2016         }
2017       frag = frag->fr_next;
2018     }
2019   segment_info[idx].scnhdr.s_size = size;
2020   return size;
2021 }
2022
2023 static unsigned int
2024 count_entries_in_chain (idx)
2025      unsigned int idx;
2026 {
2027   unsigned int nrelocs;
2028   fixS *fixup_ptr;
2029
2030   /* Count the relocations.  */
2031   fixup_ptr = segment_info[idx].fix_root;
2032   nrelocs = 0;
2033   while (fixup_ptr != (fixS *) NULL)
2034     {
2035       if (fixup_ptr->fx_done == 0 && TC_COUNT_RELOC (fixup_ptr))
2036         {
2037 #if defined(TC_A29K) || defined(TC_OR32)
2038           if (fixup_ptr->fx_r_type == RELOC_CONSTH)
2039             nrelocs += 2;
2040           else
2041             nrelocs++;
2042 #else
2043           nrelocs++;
2044 #endif
2045         }
2046
2047       fixup_ptr = fixup_ptr->fx_next;
2048     }
2049   return nrelocs;
2050 }
2051
2052 #ifdef TE_AUX
2053
2054 static int compare_external_relocs PARAMS ((const PTR, const PTR));
2055
2056 /* AUX's ld expects relocations to be sorted.  */
2057
2058 static int
2059 compare_external_relocs (x, y)
2060      const PTR x;
2061      const PTR y;
2062 {
2063   struct external_reloc *a = (struct external_reloc *) x;
2064   struct external_reloc *b = (struct external_reloc *) y;
2065   bfd_vma aadr = bfd_getb32 (a->r_vaddr);
2066   bfd_vma badr = bfd_getb32 (b->r_vaddr);
2067   return (aadr < badr ? -1 : badr < aadr ? 1 : 0);
2068 }
2069
2070 #endif
2071
2072 /* Output all the relocations for a section.  */
2073
2074 void
2075 do_relocs_for (abfd, h, file_cursor)
2076      bfd * abfd;
2077      object_headers * h;
2078      unsigned long *file_cursor;
2079 {
2080   unsigned int nrelocs;
2081   unsigned int idx;
2082   unsigned long reloc_start = *file_cursor;
2083
2084   for (idx = SEG_E0; idx < SEG_LAST; idx++)
2085     {
2086       if (segment_info[idx].scnhdr.s_name[0])
2087         {
2088           struct external_reloc *ext_ptr;
2089           struct external_reloc *external_reloc_vec;
2090           unsigned int external_reloc_size;
2091           unsigned int base = segment_info[idx].scnhdr.s_paddr;
2092           fixS *fix_ptr = segment_info[idx].fix_root;
2093           nrelocs = count_entries_in_chain (idx);
2094
2095           if (nrelocs)
2096             /* Bypass this stuff if no relocs.  This also incidentally
2097                avoids a SCO bug, where free(malloc(0)) tends to crash.  */
2098             {
2099               external_reloc_size = nrelocs * RELSZ;
2100               external_reloc_vec =
2101                 (struct external_reloc *) malloc (external_reloc_size);
2102
2103               ext_ptr = external_reloc_vec;
2104
2105               /* Fill in the internal coff style reloc struct from the
2106                  internal fix list.  */
2107               while (fix_ptr)
2108                 {
2109                   struct internal_reloc intr;
2110
2111                   /* Only output some of the relocations.  */
2112                   if (fix_ptr->fx_done == 0 && TC_COUNT_RELOC (fix_ptr))
2113                     {
2114 #ifdef TC_RELOC_MANGLE
2115                       TC_RELOC_MANGLE (&segment_info[idx], fix_ptr, &intr,
2116                                        base);
2117 #else
2118                       symbolS *dot;
2119                       symbolS *symbol_ptr = fix_ptr->fx_addsy;
2120
2121                       intr.r_type = TC_COFF_FIX2RTYPE (fix_ptr);
2122                       intr.r_vaddr =
2123                         base + fix_ptr->fx_frag->fr_address + fix_ptr->fx_where;
2124
2125 #ifdef TC_KEEP_FX_OFFSET
2126                       intr.r_offset = fix_ptr->fx_offset;
2127 #else
2128                       intr.r_offset = 0;
2129 #endif
2130
2131                       while (symbol_ptr->sy_value.X_op == O_symbol
2132                              && (! S_IS_DEFINED (symbol_ptr)
2133                                  || S_IS_COMMON (symbol_ptr)))
2134                         {
2135                           symbolS *n;
2136
2137                           /* We must avoid looping, as that can occur
2138                              with a badly written program.  */
2139                           n = symbol_ptr->sy_value.X_add_symbol;
2140                           if (n == symbol_ptr)
2141                             break;
2142                           symbol_ptr = n;
2143                         }
2144
2145                       /* Turn the segment of the symbol into an offset.  */
2146                       if (symbol_ptr)
2147                         {
2148                           resolve_symbol_value (symbol_ptr);
2149                           if (! symbol_ptr->sy_resolved)
2150                             {
2151                               char *file;
2152                               unsigned int line;
2153
2154                               if (expr_symbol_where (symbol_ptr, &file, &line))
2155                                 as_bad_where (file, line,
2156                                               _("unresolved relocation"));
2157                               else
2158                                 as_bad (_("bad relocation: symbol `%s' not in symbol table"),
2159                                         S_GET_NAME (symbol_ptr));
2160                             }
2161
2162                           dot = segment_info[S_GET_SEGMENT (symbol_ptr)].dot;
2163                           if (dot)
2164                             intr.r_symndx = dot->sy_number;
2165                           else
2166                             intr.r_symndx = symbol_ptr->sy_number;
2167                         }
2168                       else
2169                         intr.r_symndx = -1;
2170 #endif
2171                       (void) bfd_coff_swap_reloc_out (abfd, &intr, ext_ptr);
2172                       ext_ptr++;
2173 #if defined(TC_A29K)
2174                       /* The 29k has a special kludge for the high 16 bit
2175                          reloc.  Two relocations are emitted, R_IHIHALF,
2176                          and R_IHCONST. The second one doesn't contain a
2177                          symbol, but uses the value for offset.  */
2178                       if (intr.r_type == R_IHIHALF)
2179                         {
2180                           /* Now emit the second bit.  */
2181                           intr.r_type = R_IHCONST;
2182                           intr.r_symndx = fix_ptr->fx_addnumber;
2183                           (void) bfd_coff_swap_reloc_out (abfd, &intr, ext_ptr);
2184                           ext_ptr++;
2185                         }
2186 #endif
2187 #if defined(TC_OR32)
2188                       /* The or32 has a special kludge for the high 16 bit
2189                          reloc.  Two relocations are emitted, R_IHIHALF,
2190                          and R_IHCONST. The second one doesn't contain a
2191                          symbol, but uses the value for offset.  */
2192                       if (intr.r_type == R_IHIHALF)
2193                         {
2194                           /* Now emit the second bit.  */
2195                           intr.r_type = R_IHCONST;
2196                           intr.r_symndx = fix_ptr->fx_addnumber;
2197                           (void) bfd_coff_swap_reloc_out (abfd, & intr, ext_ptr);
2198                           ext_ptr ++;
2199                         }
2200 #endif
2201                     }
2202
2203                   fix_ptr = fix_ptr->fx_next;
2204                 }
2205 #ifdef TE_AUX
2206               /* Sort the reloc table.  */
2207               qsort ((PTR) external_reloc_vec, nrelocs,
2208                      sizeof (struct external_reloc), compare_external_relocs);
2209 #endif
2210               /* Write out the reloc table.  */
2211               bfd_bwrite ((PTR) external_reloc_vec,
2212                           (bfd_size_type) external_reloc_size, abfd);
2213               free (external_reloc_vec);
2214
2215               /* Fill in section header info.  */
2216               segment_info[idx].scnhdr.s_relptr = *file_cursor;
2217               *file_cursor += external_reloc_size;
2218               segment_info[idx].scnhdr.s_nreloc = nrelocs;
2219             }
2220           else
2221             {
2222               /* No relocs.  */
2223               segment_info[idx].scnhdr.s_relptr = 0;
2224             }
2225         }
2226     }
2227
2228   /* Set relocation_size field in file headers.  */
2229   H_SET_RELOCATION_SIZE (h, *file_cursor - reloc_start, 0);
2230 }
2231
2232 /* Run through a frag chain and write out the data to go with it, fill
2233    in the scnhdrs with the info on the file positions.  */
2234
2235 static void
2236 fill_section (abfd, h, file_cursor)
2237      bfd * abfd;
2238      object_headers *h ATTRIBUTE_UNUSED;
2239      unsigned long *file_cursor;
2240 {
2241   unsigned int i;
2242   unsigned int paddr = 0;
2243
2244   for (i = SEG_E0; i < SEG_UNKNOWN; i++)
2245     {
2246       unsigned int offset = 0;
2247       struct internal_scnhdr *s = &(segment_info[i].scnhdr);
2248
2249       PROGRESS (1);
2250
2251       if (s->s_name[0])
2252         {
2253           fragS *frag = segment_info[i].frchainP->frch_root;
2254           char *buffer = NULL;
2255
2256           if (s->s_size == 0)
2257             s->s_scnptr = 0;
2258           else
2259             {
2260               buffer = xmalloc (s->s_size);
2261               s->s_scnptr = *file_cursor;
2262             }
2263           know (s->s_paddr == paddr);
2264
2265           if (strcmp (s->s_name, ".text") == 0)
2266             s->s_flags |= STYP_TEXT;
2267           else if (strcmp (s->s_name, ".data") == 0)
2268             s->s_flags |= STYP_DATA;
2269           else if (strcmp (s->s_name, ".bss") == 0)
2270             {
2271               s->s_scnptr = 0;
2272               s->s_flags |= STYP_BSS;
2273
2274               /* @@ Should make the i386 and a29k coff targets define
2275                  COFF_NOLOAD_PROBLEM, and have only one test here.  */
2276 #ifndef TC_I386
2277 #ifndef TC_A29K
2278 #ifndef TC_OR32
2279 #ifndef COFF_NOLOAD_PROBLEM
2280               /* Apparently the SVR3 linker (and exec syscall) and UDI
2281                  mondfe progrem are confused by noload sections.  */
2282               s->s_flags |= STYP_NOLOAD;
2283 #endif
2284 #endif
2285 #endif
2286 #endif
2287             }
2288           else if (strcmp (s->s_name, ".lit") == 0)
2289             s->s_flags = STYP_LIT | STYP_TEXT;
2290           else if (strcmp (s->s_name, ".init") == 0)
2291             s->s_flags |= STYP_TEXT;
2292           else if (strcmp (s->s_name, ".fini") == 0)
2293             s->s_flags |= STYP_TEXT;
2294           else if (strncmp (s->s_name, ".comment", 8) == 0)
2295             s->s_flags |= STYP_INFO;
2296
2297           while (frag)
2298             {
2299               unsigned int fill_size;
2300               switch (frag->fr_type)
2301                 {
2302                 case rs_machine_dependent:
2303                   if (frag->fr_fix)
2304                     {
2305                       memcpy (buffer + frag->fr_address,
2306                               frag->fr_literal,
2307                               (unsigned int) frag->fr_fix);
2308                       offset += frag->fr_fix;
2309                     }
2310
2311                   break;
2312                 case rs_space:
2313                 case rs_fill:
2314                 case rs_align:
2315                 case rs_align_code:
2316                 case rs_align_test:
2317                 case rs_org:
2318                   if (frag->fr_fix)
2319                     {
2320                       memcpy (buffer + frag->fr_address,
2321                               frag->fr_literal,
2322                               (unsigned int) frag->fr_fix);
2323                       offset += frag->fr_fix;
2324                     }
2325
2326                   fill_size = frag->fr_var;
2327                   if (fill_size && frag->fr_offset > 0)
2328                     {
2329                       unsigned int count;
2330                       unsigned int off = frag->fr_fix;
2331                       for (count = frag->fr_offset; count; count--)
2332                         {
2333                           if (fill_size + frag->fr_address + off <= s->s_size)
2334                             {
2335                               memcpy (buffer + frag->fr_address + off,
2336                                       frag->fr_literal + frag->fr_fix,
2337                                       fill_size);
2338                               off += fill_size;
2339                               offset += fill_size;
2340                             }
2341                         }
2342                     }
2343                   break;
2344                 case rs_broken_word:
2345                   break;
2346                 default:
2347                   abort ();
2348                 }
2349               frag = frag->fr_next;
2350             }
2351
2352           if (s->s_size != 0)
2353             {
2354               if (s->s_scnptr != 0)
2355                 {
2356                   bfd_bwrite (buffer, s->s_size, abfd);
2357                   *file_cursor += s->s_size;
2358                 }
2359               free (buffer);
2360             }
2361           paddr += s->s_size;
2362         }
2363     }
2364 }
2365
2366 /* Coff file generation & utilities.  */
2367
2368 static void
2369 coff_header_append (abfd, h)
2370      bfd * abfd;
2371      object_headers * h;
2372 {
2373   unsigned int i;
2374   char buffer[1000];
2375   char buffero[1000];
2376 #ifdef COFF_LONG_SECTION_NAMES
2377   unsigned long string_size = 4;
2378 #endif
2379
2380   bfd_seek (abfd, (file_ptr) 0, 0);
2381
2382 #ifndef OBJ_COFF_OMIT_OPTIONAL_HEADER
2383   H_SET_MAGIC_NUMBER (h, COFF_MAGIC);
2384   H_SET_VERSION_STAMP (h, 0);
2385   H_SET_ENTRY_POINT (h, 0);
2386   H_SET_TEXT_START (h, segment_info[SEG_E0].frchainP->frch_root->fr_address);
2387   H_SET_DATA_START (h, segment_info[SEG_E1].frchainP->frch_root->fr_address);
2388   H_SET_SIZEOF_OPTIONAL_HEADER (h, bfd_coff_swap_aouthdr_out(abfd, &h->aouthdr,
2389                                                              buffero));
2390 #else /* defined (OBJ_COFF_OMIT_OPTIONAL_HEADER) */
2391   H_SET_SIZEOF_OPTIONAL_HEADER (h, 0);
2392 #endif /* defined (OBJ_COFF_OMIT_OPTIONAL_HEADER) */
2393
2394   i = bfd_coff_swap_filehdr_out (abfd, &h->filehdr, buffer);
2395
2396   bfd_bwrite (buffer, (bfd_size_type) i, abfd);
2397   bfd_bwrite (buffero, (bfd_size_type) H_GET_SIZEOF_OPTIONAL_HEADER (h), abfd);
2398
2399   for (i = SEG_E0; i < SEG_LAST; i++)
2400     {
2401       if (segment_info[i].scnhdr.s_name[0])
2402         {
2403           unsigned int size;
2404
2405 #ifdef COFF_LONG_SECTION_NAMES
2406           /* Support long section names as found in PE.  This code
2407              must coordinate with that in write_object_file and
2408              w_strings.  */
2409           if (strlen (segment_info[i].name) > SCNNMLEN)
2410             {
2411               memset (segment_info[i].scnhdr.s_name, 0, SCNNMLEN);
2412               sprintf (segment_info[i].scnhdr.s_name, "/%lu", string_size);
2413               string_size += strlen (segment_info[i].name) + 1;
2414             }
2415 #endif
2416           size = bfd_coff_swap_scnhdr_out (abfd,
2417                                            &(segment_info[i].scnhdr),
2418                                            buffer);
2419           if (size == 0)
2420             as_bad (_("bfd_coff_swap_scnhdr_out failed"));
2421           bfd_bwrite (buffer, (bfd_size_type) size, abfd);
2422         }
2423     }
2424 }
2425
2426 char *
2427 symbol_to_chars (abfd, where, symbolP)
2428      bfd * abfd;
2429      char *where;
2430      symbolS * symbolP;
2431 {
2432   unsigned int numaux = symbolP->sy_symbol.ost_entry.n_numaux;
2433   unsigned int i;
2434   valueT val;
2435
2436   /* Turn any symbols with register attributes into abs symbols.  */
2437   if (S_GET_SEGMENT (symbolP) == reg_section)
2438     S_SET_SEGMENT (symbolP, absolute_section);
2439
2440   /* At the same time, relocate all symbols to their output value.  */
2441 #ifndef TE_PE
2442   val = (segment_info[S_GET_SEGMENT (symbolP)].scnhdr.s_paddr
2443          + S_GET_VALUE (symbolP));
2444 #else
2445   val = S_GET_VALUE (symbolP);
2446 #endif
2447
2448   S_SET_VALUE (symbolP, val);
2449
2450   symbolP->sy_symbol.ost_entry.n_value = val;
2451
2452   where += bfd_coff_swap_sym_out (abfd, &symbolP->sy_symbol.ost_entry,
2453                                   where);
2454
2455   for (i = 0; i < numaux; i++)
2456     {
2457       where += bfd_coff_swap_aux_out (abfd,
2458                                       &symbolP->sy_symbol.ost_auxent[i],
2459                                       S_GET_DATA_TYPE (symbolP),
2460                                       S_GET_STORAGE_CLASS (symbolP),
2461                                       i, numaux, where);
2462     }
2463
2464   return where;
2465 }
2466
2467 void
2468 coff_obj_symbol_new_hook (symbolP)
2469      symbolS *symbolP;
2470 {
2471   char underscore = 0;          /* Symbol has leading _  */
2472
2473   /* Effective symbol.  */
2474   /* Store the pointer in the offset.  */
2475   S_SET_ZEROES (symbolP, 0L);
2476   S_SET_DATA_TYPE (symbolP, T_NULL);
2477   S_SET_STORAGE_CLASS (symbolP, 0);
2478   S_SET_NUMBER_AUXILIARY (symbolP, 0);
2479   /* Additional information.  */
2480   symbolP->sy_symbol.ost_flags = 0;
2481   /* Auxiliary entries.  */
2482   memset ((char *) &symbolP->sy_symbol.ost_auxent[0], 0, AUXESZ);
2483
2484   if (S_IS_STRING (symbolP))
2485     SF_SET_STRING (symbolP);
2486   if (!underscore && S_IS_LOCAL (symbolP))
2487     SF_SET_LOCAL (symbolP);
2488 }
2489
2490 /* Handle .ln directives.  */
2491
2492 static void
2493 obj_coff_ln (appline)
2494      int appline;
2495 {
2496   int l;
2497
2498   if (! appline && def_symbol_in_progress != NULL)
2499     {
2500       /* Wrong context.  */
2501       as_warn (_(".ln pseudo-op inside .def/.endef: ignored."));
2502       demand_empty_rest_of_line ();
2503       return;
2504     }
2505
2506   l = get_absolute_expression ();
2507   c_line_new (0, frag_now_fix (), l, frag_now);
2508
2509   if (appline)
2510     new_logical_line ((char *) NULL, l - 1);
2511
2512 #ifndef NO_LISTING
2513   {
2514     extern int listing;
2515
2516     if (listing)
2517       {
2518         if (! appline)
2519           l += line_base - 1;
2520         listing_source_line ((unsigned int) l);
2521       }
2522
2523   }
2524 #endif
2525   demand_empty_rest_of_line ();
2526 }
2527
2528 /* Handle .def directives.
2529  
2530   One might ask : why can't we symbol_new if the symbol does not
2531   already exist and fill it with debug information.  Because of
2532   the C_EFCN special symbol. It would clobber the value of the
2533   function symbol before we have a chance to notice that it is
2534   a C_EFCN. And a second reason is that the code is more clear this
2535   way. (at least I think it is :-).  */
2536
2537 #define SKIP_SEMI_COLON()       while (*input_line_pointer++ != ';')
2538 #define SKIP_WHITESPACES()      while (*input_line_pointer == ' ' || \
2539                                       *input_line_pointer == '\t') \
2540                                          input_line_pointer++;
2541
2542 static void
2543 obj_coff_def (what)
2544      int what ATTRIBUTE_UNUSED;
2545 {
2546   char name_end;                /* Char after the end of name.  */
2547   char *symbol_name;            /* Name of the debug symbol.  */
2548   char *symbol_name_copy;       /* Temporary copy of the name.  */
2549   unsigned int symbol_name_length;
2550
2551   if (def_symbol_in_progress != NULL)
2552     {
2553       as_warn (_(".def pseudo-op used inside of .def/.endef: ignored."));
2554       demand_empty_rest_of_line ();
2555       return;
2556     }
2557
2558   SKIP_WHITESPACES ();
2559
2560   def_symbol_in_progress = (symbolS *) obstack_alloc (&notes, sizeof (*def_symbol_in_progress));
2561   memset (def_symbol_in_progress, 0, sizeof (*def_symbol_in_progress));
2562
2563   symbol_name = input_line_pointer;
2564   name_end = get_symbol_end ();
2565   symbol_name_length = strlen (symbol_name);
2566   symbol_name_copy = xmalloc (symbol_name_length + 1);
2567   strcpy (symbol_name_copy, symbol_name);
2568 #ifdef tc_canonicalize_symbol_name
2569   symbol_name_copy = tc_canonicalize_symbol_name (symbol_name_copy);
2570 #endif
2571
2572   /* Initialize the new symbol.  */
2573 #ifdef STRIP_UNDERSCORE
2574   S_SET_NAME (def_symbol_in_progress, (*symbol_name_copy == '_'
2575                                        ? symbol_name_copy + 1
2576                                        : symbol_name_copy));
2577 #else /* STRIP_UNDERSCORE */
2578   S_SET_NAME (def_symbol_in_progress, symbol_name_copy);
2579 #endif /* STRIP_UNDERSCORE */
2580   /* free(symbol_name_copy); */
2581   def_symbol_in_progress->sy_name_offset = (unsigned long) ~0;
2582   def_symbol_in_progress->sy_number = ~0;
2583   def_symbol_in_progress->sy_frag = &zero_address_frag;
2584   S_SET_VALUE (def_symbol_in_progress, 0);
2585
2586   if (S_IS_STRING (def_symbol_in_progress))
2587     SF_SET_STRING (def_symbol_in_progress);
2588
2589   *input_line_pointer = name_end;
2590
2591   demand_empty_rest_of_line ();
2592 }
2593
2594 unsigned int dim_index;
2595
2596 static void
2597 obj_coff_endef (ignore)
2598      int ignore ATTRIBUTE_UNUSED;
2599 {
2600   symbolS *symbolP = 0;
2601   /* DIM BUG FIX sac@cygnus.com */
2602   dim_index = 0;
2603   if (def_symbol_in_progress == NULL)
2604     {
2605       as_warn (_(".endef pseudo-op used outside of .def/.endef: ignored."));
2606       demand_empty_rest_of_line ();
2607       return;
2608     }
2609
2610   /* Set the section number according to storage class.  */
2611   switch (S_GET_STORAGE_CLASS (def_symbol_in_progress))
2612     {
2613     case C_STRTAG:
2614     case C_ENTAG:
2615     case C_UNTAG:
2616       SF_SET_TAG (def_symbol_in_progress);
2617       /* Intentional fallthrough.  */
2618
2619     case C_FILE:
2620     case C_TPDEF:
2621       SF_SET_DEBUG (def_symbol_in_progress);
2622       S_SET_SEGMENT (def_symbol_in_progress, SEG_DEBUG);
2623       break;
2624
2625     case C_EFCN:
2626       /* Do not emit this symbol.  */
2627       SF_SET_LOCAL (def_symbol_in_progress);
2628       /* Intentional fallthrough. */
2629       
2630     case C_BLOCK:
2631       /* Will need processing before writing.  */
2632       SF_SET_PROCESS (def_symbol_in_progress);
2633       /* Intentional fallthrough.  */
2634
2635     case C_FCN:
2636       S_SET_SEGMENT (def_symbol_in_progress, SEG_E0);
2637
2638       if (strcmp (S_GET_NAME (def_symbol_in_progress), ".bf") == 0)
2639         {                       /* .bf */
2640           if (function_lineoff < 0)
2641             fprintf (stderr, _("`.bf' symbol without preceding function\n"));
2642
2643           SA_GET_SYM_LNNOPTR (last_line_symbol) = function_lineoff;
2644
2645           SF_SET_PROCESS (last_line_symbol);
2646           SF_SET_ADJ_LNNOPTR (last_line_symbol);
2647           SF_SET_PROCESS (def_symbol_in_progress);
2648           function_lineoff = -1;
2649         }
2650
2651       /* Value is always set to .  */
2652       def_symbol_in_progress->sy_frag = frag_now;
2653       S_SET_VALUE (def_symbol_in_progress, (valueT) frag_now_fix ());
2654       break;
2655
2656 #ifdef C_AUTOARG
2657     case C_AUTOARG:
2658 #endif /* C_AUTOARG */
2659     case C_AUTO:
2660     case C_REG:
2661     case C_MOS:
2662     case C_MOE:
2663     case C_MOU:
2664     case C_ARG:
2665     case C_REGPARM:
2666     case C_FIELD:
2667     case C_EOS:
2668       SF_SET_DEBUG (def_symbol_in_progress);
2669       S_SET_SEGMENT (def_symbol_in_progress, absolute_section);
2670       break;
2671
2672     case C_EXT:
2673     case C_WEAKEXT:
2674 #ifdef TE_PE
2675     case C_NT_WEAK:
2676 #endif
2677     case C_STAT:
2678     case C_LABEL:
2679       /* Valid but set somewhere else (s_comm, s_lcomm, colon).  */
2680       break;
2681
2682     case C_USTATIC:
2683     case C_EXTDEF:
2684     case C_ULABEL:
2685       as_warn (_("unexpected storage class %d"), S_GET_STORAGE_CLASS (def_symbol_in_progress));
2686       break;
2687     }
2688
2689   /* Now that we have built a debug symbol, try to find if we should
2690      merge with an existing symbol or not.  If a symbol is C_EFCN or
2691      absolute_section or untagged SEG_DEBUG it never merges.  We also
2692      don't merge labels, which are in a different namespace, nor
2693      symbols which have not yet been defined since they are typically
2694      unique, nor do we merge tags with non-tags.  */
2695
2696   /* Two cases for functions.  Either debug followed by definition or
2697      definition followed by debug.  For definition first, we will
2698      merge the debug symbol into the definition.  For debug first, the
2699      lineno entry MUST point to the definition function or else it
2700      will point off into space when crawl_symbols() merges the debug
2701      symbol into the real symbol.  Therefor, let's presume the debug
2702      symbol is a real function reference.  */
2703
2704   /* FIXME-SOON If for some reason the definition label/symbol is
2705      never seen, this will probably leave an undefined symbol at link
2706      time.  */
2707
2708   if (S_GET_STORAGE_CLASS (def_symbol_in_progress) == C_EFCN
2709       || S_GET_STORAGE_CLASS (def_symbol_in_progress) == C_LABEL
2710       || (S_GET_SEGMENT (def_symbol_in_progress) == SEG_DEBUG
2711           && !SF_GET_TAG (def_symbol_in_progress))
2712       || S_GET_SEGMENT (def_symbol_in_progress) == absolute_section
2713       || def_symbol_in_progress->sy_value.X_op != O_constant
2714       || (symbolP = symbol_find_base (S_GET_NAME (def_symbol_in_progress), DO_NOT_STRIP)) == NULL
2715       || (SF_GET_TAG (def_symbol_in_progress) != SF_GET_TAG (symbolP)))
2716     {
2717       symbol_append (def_symbol_in_progress, symbol_lastP, &symbol_rootP,
2718                      &symbol_lastP);
2719     }
2720   else
2721     {
2722       /* This symbol already exists, merge the newly created symbol
2723          into the old one.  This is not mandatory. The linker can
2724          handle duplicate symbols correctly. But I guess that it save
2725          a *lot* of space if the assembly file defines a lot of
2726          symbols. [loic] */
2727
2728       /* The debug entry (def_symbol_in_progress) is merged into the
2729          previous definition.  */
2730
2731       c_symbol_merge (def_symbol_in_progress, symbolP);
2732       /* FIXME-SOON Should *def_symbol_in_progress be free'd? xoxorich.  */
2733       def_symbol_in_progress = symbolP;
2734
2735       if (SF_GET_FUNCTION (def_symbol_in_progress)
2736           || SF_GET_TAG (def_symbol_in_progress)
2737           || S_GET_STORAGE_CLASS (def_symbol_in_progress) == C_STAT)
2738         {
2739           /* For functions, and tags, and static symbols, the symbol
2740              *must* be where the debug symbol appears.  Move the
2741              existing symbol to the current place.  */
2742           /* If it already is at the end of the symbol list, do nothing.  */
2743           if (def_symbol_in_progress != symbol_lastP)
2744             {
2745               symbol_remove (def_symbol_in_progress, &symbol_rootP,
2746                              &symbol_lastP);
2747               symbol_append (def_symbol_in_progress, symbol_lastP,
2748                              &symbol_rootP, &symbol_lastP);
2749             }
2750         }
2751     }
2752
2753   if (SF_GET_TAG (def_symbol_in_progress))
2754     {
2755       symbolS *oldtag;
2756
2757       oldtag = symbol_find_base (S_GET_NAME (def_symbol_in_progress),
2758                                  DO_NOT_STRIP);
2759       if (oldtag == NULL || ! SF_GET_TAG (oldtag))
2760         tag_insert (S_GET_NAME (def_symbol_in_progress),
2761                     def_symbol_in_progress);
2762     }
2763
2764   if (SF_GET_FUNCTION (def_symbol_in_progress))
2765     {
2766       know (sizeof (def_symbol_in_progress) <= sizeof (long));
2767       function_lineoff
2768         = c_line_new (def_symbol_in_progress, 0, 0, &zero_address_frag);
2769
2770       SF_SET_PROCESS (def_symbol_in_progress);
2771
2772       if (symbolP == NULL)
2773         {
2774           /* That is, if this is the first time we've seen the
2775              function...  */
2776           symbol_table_insert (def_symbol_in_progress);
2777         }
2778     }
2779
2780   def_symbol_in_progress = NULL;
2781   demand_empty_rest_of_line ();
2782 }
2783
2784 static void
2785 obj_coff_dim (ignore)
2786      int ignore ATTRIBUTE_UNUSED;
2787 {
2788   int dim_index;
2789
2790   if (def_symbol_in_progress == NULL)
2791     {
2792       as_warn (_(".dim pseudo-op used outside of .def/.endef: ignored."));
2793       demand_empty_rest_of_line ();
2794       return;
2795     }
2796
2797   S_SET_NUMBER_AUXILIARY (def_symbol_in_progress, 1);
2798
2799   for (dim_index = 0; dim_index < DIMNUM; dim_index++)
2800     {
2801       SKIP_WHITESPACES ();
2802       SA_SET_SYM_DIMEN (def_symbol_in_progress, dim_index,
2803                         get_absolute_expression ());
2804
2805       switch (*input_line_pointer)
2806         {
2807         case ',':
2808           input_line_pointer++;
2809           break;
2810
2811         default:
2812           as_warn (_("badly formed .dim directive ignored"));
2813           /* Intentional fallthrough.  */
2814
2815         case '\n':
2816         case ';':
2817           dim_index = DIMNUM;
2818           break;
2819         }
2820     }
2821
2822   demand_empty_rest_of_line ();
2823 }
2824
2825 static void
2826 obj_coff_line (ignore)
2827      int ignore ATTRIBUTE_UNUSED;
2828 {
2829   int this_base;
2830   const char *name;
2831
2832   if (def_symbol_in_progress == NULL)
2833     {
2834       obj_coff_ln (0);
2835       return;
2836     }
2837
2838   name = S_GET_NAME (def_symbol_in_progress);
2839   this_base = get_absolute_expression ();
2840
2841   /* Only .bf symbols indicate the use of a new base line number; the
2842      line numbers associated with .ef, .bb, .eb are relative to the
2843      start of the containing function.  */
2844   if (!strcmp (".bf", name))
2845     {
2846         line_base = this_base;
2847
2848 #ifndef NO_LISTING
2849       {
2850         extern int listing;
2851         if (listing)
2852           listing_source_line ((unsigned int) line_base);
2853       }
2854 #endif
2855     }
2856
2857   S_SET_NUMBER_AUXILIARY (def_symbol_in_progress, 1);
2858   SA_SET_SYM_LNNO (def_symbol_in_progress, this_base);
2859
2860   demand_empty_rest_of_line ();
2861 }
2862
2863 static void
2864 obj_coff_size (ignore)
2865      int ignore ATTRIBUTE_UNUSED;
2866 {
2867   if (def_symbol_in_progress == NULL)
2868     {
2869       as_warn (_(".size pseudo-op used outside of .def/.endef ignored."));
2870       demand_empty_rest_of_line ();
2871       return;
2872     }
2873
2874   S_SET_NUMBER_AUXILIARY (def_symbol_in_progress, 1);
2875   SA_SET_SYM_SIZE (def_symbol_in_progress, get_absolute_expression ());
2876   demand_empty_rest_of_line ();
2877 }
2878
2879 static void
2880 obj_coff_scl (ignore)
2881      int ignore ATTRIBUTE_UNUSED;
2882 {
2883   if (def_symbol_in_progress == NULL)
2884     {
2885       as_warn (_(".scl pseudo-op used outside of .def/.endef ignored."));
2886       demand_empty_rest_of_line ();
2887       return;
2888     }
2889
2890   S_SET_STORAGE_CLASS (def_symbol_in_progress, get_absolute_expression ());
2891   demand_empty_rest_of_line ();
2892 }
2893
2894 static void
2895 obj_coff_tag (ignore)
2896      int ignore ATTRIBUTE_UNUSED;
2897 {
2898   char *symbol_name;
2899   char name_end;
2900
2901   if (def_symbol_in_progress == NULL)
2902     {
2903       as_warn (_(".tag pseudo-op used outside of .def/.endef ignored."));
2904       demand_empty_rest_of_line ();
2905       return;
2906     }
2907
2908   S_SET_NUMBER_AUXILIARY (def_symbol_in_progress, 1);
2909   symbol_name = input_line_pointer;
2910   name_end = get_symbol_end ();
2911 #ifdef tc_canonicalize_symbol_name
2912   symbol_name = tc_canonicalize_symbol_name (symbol_name);
2913 #endif
2914
2915   /* Assume that the symbol referred to by .tag is always defined.
2916      This was a bad assumption.  I've added find_or_make. xoxorich.  */
2917   SA_SET_SYM_TAGNDX (def_symbol_in_progress,
2918                      (long) tag_find_or_make (symbol_name));
2919   if (SA_GET_SYM_TAGNDX (def_symbol_in_progress) == 0L)
2920     as_warn (_("tag not found for .tag %s"), symbol_name);
2921
2922   SF_SET_TAGGED (def_symbol_in_progress);
2923   *input_line_pointer = name_end;
2924
2925   demand_empty_rest_of_line ();
2926 }
2927
2928 static void
2929 obj_coff_type (ignore)
2930      int ignore ATTRIBUTE_UNUSED;
2931 {
2932   if (def_symbol_in_progress == NULL)
2933     {
2934       as_warn (_(".type pseudo-op used outside of .def/.endef ignored."));
2935       demand_empty_rest_of_line ();
2936       return;
2937     }
2938
2939   S_SET_DATA_TYPE (def_symbol_in_progress, get_absolute_expression ());
2940
2941   if (ISFCN (S_GET_DATA_TYPE (def_symbol_in_progress)) &&
2942       S_GET_STORAGE_CLASS (def_symbol_in_progress) != C_TPDEF)
2943     SF_SET_FUNCTION (def_symbol_in_progress);
2944
2945   demand_empty_rest_of_line ();
2946 }
2947
2948 static void
2949 obj_coff_val (ignore)
2950      int ignore ATTRIBUTE_UNUSED;
2951 {
2952   if (def_symbol_in_progress == NULL)
2953     {
2954       as_warn (_(".val pseudo-op used outside of .def/.endef ignored."));
2955       demand_empty_rest_of_line ();
2956       return;
2957     }
2958
2959   if (is_name_beginner (*input_line_pointer))
2960     {
2961       char *symbol_name = input_line_pointer;
2962       char name_end = get_symbol_end ();
2963
2964 #ifdef tc_canonicalize_symbol_name
2965   symbol_name = tc_canonicalize_symbol_name (symbol_name);
2966 #endif
2967
2968       if (!strcmp (symbol_name, "."))
2969         {
2970           def_symbol_in_progress->sy_frag = frag_now;
2971           S_SET_VALUE (def_symbol_in_progress, (valueT) frag_now_fix ());
2972           /* If the .val is != from the .def (e.g. statics).  */
2973         }
2974       else if (strcmp (S_GET_NAME (def_symbol_in_progress), symbol_name))
2975         {
2976           def_symbol_in_progress->sy_value.X_op = O_symbol;
2977           def_symbol_in_progress->sy_value.X_add_symbol =
2978             symbol_find_or_make (symbol_name);
2979           def_symbol_in_progress->sy_value.X_op_symbol = NULL;
2980           def_symbol_in_progress->sy_value.X_add_number = 0;
2981
2982           /* If the segment is undefined when the forward reference is
2983              resolved, then copy the segment id from the forward
2984              symbol.  */
2985           SF_SET_GET_SEGMENT (def_symbol_in_progress);
2986
2987           /* FIXME: gcc can generate address expressions here in
2988              unusual cases (search for "obscure" in sdbout.c).  We
2989              just ignore the offset here, thus generating incorrect
2990              debugging information.  We ignore the rest of the line
2991              just below.  */
2992         }
2993       /* Otherwise, it is the name of a non debug symbol and
2994          its value will be calculated later.  */
2995       *input_line_pointer = name_end;
2996
2997       /* FIXME: this is to avoid an error message in the
2998          FIXME case mentioned just above.  */
2999       while (! is_end_of_line[(unsigned char) *input_line_pointer])
3000         ++input_line_pointer;
3001     }
3002   else
3003     {
3004       S_SET_VALUE (def_symbol_in_progress,
3005                    (valueT) get_absolute_expression ());
3006     }                           /* if symbol based */
3007
3008   demand_empty_rest_of_line ();
3009 }
3010
3011 #ifdef TE_PE
3012
3013 /* Handle the .linkonce pseudo-op.  This is parsed by s_linkonce in
3014    read.c, which then calls this object file format specific routine.  */
3015
3016 void
3017 obj_coff_pe_handle_link_once (type)
3018      enum linkonce_type type;
3019 {
3020   seg_info (now_seg)->scnhdr.s_flags |= IMAGE_SCN_LNK_COMDAT;
3021
3022   /* We store the type in the seg_info structure, and use it to set up
3023      the auxiliary entry for the section symbol in c_section_symbol.  */
3024   seg_info (now_seg)->linkonce = type;
3025 }
3026
3027 #endif /* TE_PE */
3028
3029 void
3030 coff_obj_read_begin_hook ()
3031 {
3032   /* These had better be the same.  Usually 18 bytes.  */
3033 #ifndef BFD_HEADERS
3034   know (sizeof (SYMENT) == sizeof (AUXENT));
3035   know (SYMESZ == AUXESZ);
3036 #endif
3037   tag_init ();
3038 }
3039
3040 /* This function runs through the symbol table and puts all the
3041    externals onto another chain.  */
3042
3043 /* The chain of globals.  */
3044 symbolS *symbol_globalP;
3045 symbolS *symbol_global_lastP;
3046
3047 /* The chain of externals.  */
3048 symbolS *symbol_externP;
3049 symbolS *symbol_extern_lastP;
3050
3051 stack *block_stack;
3052 symbolS *last_functionP;
3053 static symbolS *last_bfP;
3054 symbolS *last_tagP;
3055
3056 static unsigned int
3057 yank_symbols ()
3058 {
3059   symbolS *symbolP;
3060   unsigned int symbol_number = 0;
3061   unsigned int last_file_symno = 0;
3062
3063   struct filename_list *filename_list_scan = filename_list_head;
3064
3065   for (symbolP = symbol_rootP;
3066        symbolP;
3067        symbolP = symbolP ? symbol_next (symbolP) : symbol_rootP)
3068     {
3069       if (symbolP->sy_mri_common)
3070         {
3071           if (S_GET_STORAGE_CLASS (symbolP) == C_EXT
3072 #ifdef TE_PE
3073               || S_GET_STORAGE_CLASS (symbolP) == C_NT_WEAK
3074 #endif
3075               || S_GET_STORAGE_CLASS (symbolP) == C_WEAKEXT)
3076             as_bad (_("%s: global symbols not supported in common sections"),
3077                     S_GET_NAME (symbolP));
3078           symbol_remove (symbolP, &symbol_rootP, &symbol_lastP);
3079           continue;
3080         }
3081
3082       if (!SF_GET_DEBUG (symbolP))
3083         {
3084           /* Debug symbols do not need all this rubbish.  */
3085           symbolS *real_symbolP;
3086
3087           /* L* and C_EFCN symbols never merge.  */
3088           if (!SF_GET_LOCAL (symbolP)
3089               && !SF_GET_STATICS (symbolP)
3090               && S_GET_STORAGE_CLASS (symbolP) != C_LABEL
3091               && symbolP->sy_value.X_op == O_constant
3092               && (real_symbolP = symbol_find_base (S_GET_NAME (symbolP), DO_NOT_STRIP))
3093               && real_symbolP != symbolP)
3094             {
3095               /* FIXME-SOON: where do dups come from?
3096                  Maybe tag references before definitions? xoxorich.  */
3097               /* Move the debug data from the debug symbol to the
3098                  real symbol. Do NOT do the opposite (i.e. move from
3099                  real symbol to debug symbol and remove real symbol from the
3100                  list.) Because some pointers refer to the real symbol
3101                  whereas no pointers refer to the debug symbol.  */
3102               c_symbol_merge (symbolP, real_symbolP);
3103               /* Replace the current symbol by the real one.  */
3104               /* The symbols will never be the last or the first
3105                  because : 1st symbol is .file and 3 last symbols are
3106                  .text, .data, .bss.  */
3107               symbol_remove (real_symbolP, &symbol_rootP, &symbol_lastP);
3108               symbol_insert (real_symbolP, symbolP, &symbol_rootP, &symbol_lastP);
3109               symbol_remove (symbolP, &symbol_rootP, &symbol_lastP);
3110               symbolP = real_symbolP;
3111             }
3112
3113           if (flag_readonly_data_in_text && (S_GET_SEGMENT (symbolP) == SEG_E1))
3114             S_SET_SEGMENT (symbolP, SEG_E0);
3115
3116           resolve_symbol_value (symbolP);
3117
3118           if (S_GET_STORAGE_CLASS (symbolP) == C_NULL)
3119             {
3120               if (!S_IS_DEFINED (symbolP) && !SF_GET_LOCAL (symbolP))
3121                 {
3122                   S_SET_EXTERNAL (symbolP);
3123                 }
3124
3125               else if (S_GET_SEGMENT (symbolP) == SEG_E0)
3126                 S_SET_STORAGE_CLASS (symbolP, C_LABEL);
3127
3128               else
3129                 S_SET_STORAGE_CLASS (symbolP, C_STAT);
3130             }
3131
3132           /* Mainly to speed up if not -g.  */
3133           if (SF_GET_PROCESS (symbolP))
3134             {
3135               /* Handle the nested blocks auxiliary info.  */
3136               if (S_GET_STORAGE_CLASS (symbolP) == C_BLOCK)
3137                 {
3138                   if (!strcmp (S_GET_NAME (symbolP), ".bb"))
3139                     stack_push (block_stack, (char *) &symbolP);
3140                   else
3141                     {
3142                       /* .eb */
3143                       symbolS *begin_symbolP;
3144
3145                       begin_symbolP = *(symbolS **) stack_pop (block_stack);
3146                       if (begin_symbolP == (symbolS *) 0)
3147                         as_warn (_("mismatched .eb"));
3148                       else
3149                         SA_SET_SYM_ENDNDX (begin_symbolP, symbol_number + 2);
3150                     }
3151                 }
3152               /* If we are able to identify the type of a function, and we
3153                are out of a function (last_functionP == 0) then, the
3154                function symbol will be associated with an auxiliary
3155                entry.  */
3156               if (last_functionP == (symbolS *) 0 &&
3157                   SF_GET_FUNCTION (symbolP))
3158                 {
3159                   last_functionP = symbolP;
3160
3161                   if (S_GET_NUMBER_AUXILIARY (symbolP) < 1)
3162                     S_SET_NUMBER_AUXILIARY (symbolP, 1);
3163                 }
3164               if (S_GET_STORAGE_CLASS (symbolP) == C_FCN)
3165                 {
3166                   if (strcmp (S_GET_NAME (symbolP), ".bf") == 0)
3167                     {
3168                       if (last_bfP != NULL)
3169                         SA_SET_SYM_ENDNDX (last_bfP, symbol_number);
3170                       last_bfP = symbolP;
3171                     }
3172                 }
3173               else if (S_GET_STORAGE_CLASS (symbolP) == C_EFCN)
3174                 {
3175                   /* I don't even know if this is needed for sdb. But
3176                      the standard assembler generates it, so...  */
3177                   if (last_functionP == (symbolS *) 0)
3178                     as_fatal (_("C_EFCN symbol out of scope"));
3179                   SA_SET_SYM_FSIZE (last_functionP,
3180                                     (long) (S_GET_VALUE (symbolP) -
3181                                             S_GET_VALUE (last_functionP)));
3182                   SA_SET_SYM_ENDNDX (last_functionP, symbol_number);
3183                  last_functionP = (symbolS *) 0;
3184                 }
3185             }
3186         }
3187       else if (SF_GET_TAG (symbolP))
3188         {
3189           /* First descriptor of a structure must point to
3190              the first slot after the structure description.  */
3191           last_tagP = symbolP;
3192
3193         }
3194       else if (S_GET_STORAGE_CLASS (symbolP) == C_EOS)
3195         {
3196           /* +2 take in account the current symbol.  */
3197           SA_SET_SYM_ENDNDX (last_tagP, symbol_number + 2);
3198         }
3199       else if (S_GET_STORAGE_CLASS (symbolP) == C_FILE)
3200         {
3201           /* If the filename was too long to fit in the
3202              auxent, put it in the string table.  */
3203           if (SA_GET_FILE_FNAME_ZEROS (symbolP) == 0
3204               && SA_GET_FILE_FNAME_OFFSET (symbolP) != 0)
3205             {
3206               SA_SET_FILE_FNAME_OFFSET (symbolP, string_byte_count);
3207               string_byte_count += strlen (filename_list_scan->filename) + 1;
3208               filename_list_scan = filename_list_scan->next;
3209             }
3210           if (S_GET_VALUE (symbolP))
3211             {
3212               S_SET_VALUE (symbolP, last_file_symno);
3213               last_file_symno = symbol_number;
3214             }
3215         }
3216
3217 #ifdef tc_frob_coff_symbol
3218       tc_frob_coff_symbol (symbolP);
3219 #endif
3220
3221       /* We must put the external symbols apart. The loader
3222          does not bomb if we do not. But the references in
3223          the endndx field for a .bb symbol are not corrected
3224          if an external symbol is removed between .bb and .be.
3225          I.e in the following case :
3226          [20] .bb endndx = 22
3227          [21] foo external
3228          [22] .be
3229          ld will move the symbol 21 to the end of the list but
3230          endndx will still be 22 instead of 21.  */
3231
3232       if (SF_GET_LOCAL (symbolP))
3233         {
3234           /* Remove C_EFCN and LOCAL (L...) symbols.  */
3235           /* Next pointer remains valid.  */
3236           symbol_remove (symbolP, &symbol_rootP, &symbol_lastP);
3237
3238         }
3239       else if (symbolP->sy_value.X_op == O_symbol
3240                && (! S_IS_DEFINED (symbolP) || S_IS_COMMON (symbolP)))
3241         {
3242           /* Skip symbols which were equated to undefined or common
3243              symbols.  */
3244           symbol_remove (symbolP, &symbol_rootP, &symbol_lastP);
3245         }
3246       else if (!S_IS_DEFINED (symbolP)
3247                && !S_IS_DEBUG (symbolP)
3248                && !SF_GET_STATICS (symbolP)
3249                && (S_GET_STORAGE_CLASS (symbolP) == C_EXT
3250 #ifdef TE_PE
3251                    || S_GET_STORAGE_CLASS (symbolP) == C_NT_WEAK
3252 #endif
3253                    || S_GET_STORAGE_CLASS (symbolP) == C_WEAKEXT))
3254         {
3255           /* If external, Remove from the list.  */
3256           symbolS *hold = symbol_previous (symbolP);
3257
3258           symbol_remove (symbolP, &symbol_rootP, &symbol_lastP);
3259           symbol_clear_list_pointers (symbolP);
3260           symbol_append (symbolP, symbol_extern_lastP, &symbol_externP, &symbol_extern_lastP);
3261           symbolP = hold;
3262         }
3263       else if (! S_IS_DEBUG (symbolP)
3264                && ! SF_GET_STATICS (symbolP)
3265                && ! SF_GET_FUNCTION (symbolP)
3266                && (S_GET_STORAGE_CLASS (symbolP) == C_EXT
3267 #ifdef TE_PE
3268                    || S_GET_STORAGE_CLASS (symbolP) == C_NT_WEAK
3269 #endif
3270                    || S_GET_STORAGE_CLASS (symbolP) == C_NT_WEAK))
3271         {
3272           symbolS *hold = symbol_previous (symbolP);
3273
3274           /* The O'Reilly COFF book says that defined global symbols
3275              come at the end of the symbol table, just before
3276              undefined global symbols.  */
3277           symbol_remove (symbolP, &symbol_rootP, &symbol_lastP);
3278           symbol_clear_list_pointers (symbolP);
3279           symbol_append (symbolP, symbol_global_lastP, &symbol_globalP,
3280                          &symbol_global_lastP);
3281           symbolP = hold;
3282         }
3283       else
3284         {
3285           if (SF_GET_STRING (symbolP))
3286             {
3287               symbolP->sy_name_offset = string_byte_count;
3288               string_byte_count += strlen (S_GET_NAME (symbolP)) + 1;
3289             }
3290           else
3291             {
3292               symbolP->sy_name_offset = 0;
3293             }
3294
3295           symbolP->sy_number = symbol_number;
3296           symbol_number += 1 + S_GET_NUMBER_AUXILIARY (symbolP);
3297         }
3298     }
3299
3300   return symbol_number;
3301 }
3302
3303 static unsigned int
3304 glue_symbols (head, tail)
3305      symbolS **head;
3306      symbolS **tail;
3307 {
3308   unsigned int symbol_number = 0;
3309
3310   while (*head != NULL)
3311     {
3312       symbolS *tmp = *head;
3313
3314       /* Append.  */
3315       symbol_remove (tmp, head, tail);
3316       symbol_append (tmp, symbol_lastP, &symbol_rootP, &symbol_lastP);
3317
3318       /* Process.  */
3319       if (SF_GET_STRING (tmp))
3320         {
3321           tmp->sy_name_offset = string_byte_count;
3322           string_byte_count += strlen (S_GET_NAME (tmp)) + 1;
3323         }
3324       else
3325         {
3326           /* Fix "long" names.  */
3327           tmp->sy_name_offset = 0;
3328         }
3329
3330       tmp->sy_number = symbol_number;
3331       symbol_number += 1 + S_GET_NUMBER_AUXILIARY (tmp);
3332     }
3333
3334   return symbol_number;
3335 }
3336
3337 static unsigned int
3338 tie_tags ()
3339 {
3340   unsigned int symbol_number = 0;
3341   symbolS *symbolP;
3342
3343   for (symbolP = symbol_rootP; symbolP; symbolP = symbol_next (symbolP))
3344     {
3345       symbolP->sy_number = symbol_number;
3346
3347       if (SF_GET_TAGGED (symbolP))
3348         {
3349           SA_SET_SYM_TAGNDX
3350             (symbolP,
3351              ((symbolS *) SA_GET_SYM_TAGNDX (symbolP))->sy_number);
3352         }
3353
3354       symbol_number += 1 + S_GET_NUMBER_AUXILIARY (symbolP);
3355     }
3356
3357   return symbol_number;
3358 }
3359
3360
3361 static void
3362 crawl_symbols (h, abfd)
3363      object_headers *h;
3364      bfd *abfd ATTRIBUTE_UNUSED;
3365 {
3366   unsigned int i;
3367
3368   /* Initialize the stack used to keep track of the matching .bb .be.  */
3369
3370   block_stack = stack_init (512, sizeof (symbolS *));
3371
3372   /* The symbol list should be ordered according to the following sequence
3373      order :
3374      . .file symbol
3375      . debug entries for functions
3376      . fake symbols for the sections, including .text .data and .bss
3377      . defined symbols
3378      . undefined symbols
3379      But this is not mandatory. The only important point is to put the
3380      undefined symbols at the end of the list.  */
3381
3382   /* Is there a .file symbol ? If not insert one at the beginning.  */
3383   if (symbol_rootP == NULL
3384       || S_GET_STORAGE_CLASS (symbol_rootP) != C_FILE)
3385     c_dot_file_symbol ("fake", 0);
3386
3387   /* Build up static symbols for the sections, they are filled in later.  */
3388
3389   for (i = SEG_E0; i < SEG_LAST; i++)
3390     if (segment_info[i].scnhdr.s_name[0])
3391       segment_info[i].dot = c_section_symbol ((char *) segment_info[i].name,
3392                                               i - SEG_E0 + 1);
3393
3394   /* Take all the externals out and put them into another chain.  */
3395   H_SET_SYMBOL_TABLE_SIZE (h, yank_symbols ());
3396   /* Take the externals and glue them onto the end.  */
3397   H_SET_SYMBOL_TABLE_SIZE (h,
3398                            (H_GET_SYMBOL_COUNT (h)
3399                             + glue_symbols (&symbol_globalP,
3400                                             &symbol_global_lastP)
3401                             + glue_symbols (&symbol_externP,
3402                                             &symbol_extern_lastP)));
3403
3404   H_SET_SYMBOL_TABLE_SIZE (h, tie_tags ());
3405   know (symbol_globalP == NULL);
3406   know (symbol_global_lastP == NULL);
3407   know (symbol_externP == NULL);
3408   know (symbol_extern_lastP == NULL);
3409 }
3410
3411 /* Find strings by crawling along symbol table chain.  */
3412
3413 void
3414 w_strings (where)
3415      char *where;
3416 {
3417   symbolS *symbolP;
3418   struct filename_list *filename_list_scan = filename_list_head;
3419
3420   /* Gotta do md_ byte-ordering stuff for string_byte_count first - KWK.  */
3421   md_number_to_chars (where, (valueT) string_byte_count, 4);
3422   where += 4;
3423
3424 #ifdef COFF_LONG_SECTION_NAMES
3425   /* Support long section names as found in PE.  This code must
3426      coordinate with that in coff_header_append and write_object_file.  */
3427   {
3428     unsigned int i;
3429
3430     for (i = SEG_E0; i < SEG_LAST; i++)
3431       {
3432         if (segment_info[i].scnhdr.s_name[0]
3433             && strlen (segment_info[i].name) > SCNNMLEN)
3434           {
3435             unsigned int size;
3436
3437             size = strlen (segment_info[i].name) + 1;
3438             memcpy (where, segment_info[i].name, size);
3439             where += size;
3440           }
3441       }
3442   }
3443 #endif /* COFF_LONG_SECTION_NAMES */
3444
3445   for (symbolP = symbol_rootP;
3446        symbolP;
3447        symbolP = symbol_next (symbolP))
3448     {
3449       unsigned int size;
3450
3451       if (SF_GET_STRING (symbolP))
3452         {
3453           size = strlen (S_GET_NAME (symbolP)) + 1;
3454           memcpy (where, S_GET_NAME (symbolP), size);
3455           where += size;
3456         }
3457       if (S_GET_STORAGE_CLASS (symbolP) == C_FILE
3458           && SA_GET_FILE_FNAME_ZEROS (symbolP) == 0
3459           && SA_GET_FILE_FNAME_OFFSET (symbolP) != 0)
3460         {
3461           size = strlen (filename_list_scan->filename) + 1;
3462           memcpy (where, filename_list_scan->filename, size);
3463           filename_list_scan = filename_list_scan ->next;
3464           where += size;
3465         }
3466     }
3467 }
3468
3469 static void
3470 do_linenos_for (abfd, h, file_cursor)
3471      bfd * abfd;
3472      object_headers * h;
3473      unsigned long *file_cursor;
3474 {
3475   unsigned int idx;
3476   unsigned long start = *file_cursor;
3477
3478   for (idx = SEG_E0; idx < SEG_LAST; idx++)
3479     {
3480       segment_info_type *s = segment_info + idx;
3481
3482       if (s->scnhdr.s_nlnno != 0)
3483         {
3484           struct lineno_list *line_ptr;
3485
3486           struct external_lineno *buffer =
3487           (struct external_lineno *) xmalloc (s->scnhdr.s_nlnno * LINESZ);
3488
3489           struct external_lineno *dst = buffer;
3490
3491           /* Run through the table we've built and turn it into its external
3492              form, take this chance to remove duplicates.  */
3493
3494           for (line_ptr = s->lineno_list_head;
3495                line_ptr != (struct lineno_list *) NULL;
3496                line_ptr = line_ptr->next)
3497             {
3498               if (line_ptr->line.l_lnno == 0)
3499                 {
3500                   /* Turn a pointer to a symbol into the symbols' index,
3501                      provided that it has been initialised.  */
3502                   if (line_ptr->line.l_addr.l_symndx)
3503                     line_ptr->line.l_addr.l_symndx =
3504                       ((symbolS *) line_ptr->line.l_addr.l_symndx)->sy_number;
3505                 }
3506               else
3507                 line_ptr->line.l_addr.l_paddr += ((struct frag *) (line_ptr->frag))->fr_address;
3508
3509               (void) bfd_coff_swap_lineno_out (abfd, &(line_ptr->line), dst);
3510               dst++;
3511             }
3512
3513           s->scnhdr.s_lnnoptr = *file_cursor;
3514
3515           bfd_bwrite (buffer, (bfd_size_type) s->scnhdr.s_nlnno * LINESZ, abfd);
3516           free (buffer);
3517
3518           *file_cursor += s->scnhdr.s_nlnno * LINESZ;
3519         }
3520     }
3521
3522   H_SET_LINENO_SIZE (h, *file_cursor - start);
3523 }
3524
3525 /* Now we run through the list of frag chains in a segment and
3526    make all the subsegment frags appear at the end of the
3527    list, as if the seg 0 was extra long.  */
3528
3529 static void
3530 remove_subsegs ()
3531 {
3532   unsigned int i;
3533
3534   for (i = SEG_E0; i < SEG_UNKNOWN; i++)
3535     {
3536       frchainS *head = segment_info[i].frchainP;
3537       fragS dummy;
3538       fragS *prev_frag = &dummy;
3539
3540       while (head && head->frch_seg == i)
3541         {
3542           prev_frag->fr_next = head->frch_root;
3543           prev_frag = head->frch_last;
3544           head = head->frch_next;
3545         }
3546       prev_frag->fr_next = 0;
3547     }
3548 }
3549
3550 unsigned long machine;
3551 int coff_flags;
3552
3553 #ifndef SUB_SEGMENT_ALIGN
3554 #ifdef HANDLE_ALIGN
3555 /* The last subsegment gets an alignment corresponding to the alignment
3556    of the section.  This allows proper nop-filling at the end of
3557    code-bearing sections.  */
3558 #define SUB_SEGMENT_ALIGN(SEG, FRCHAIN)                                 \
3559   (!(FRCHAIN)->frch_next || (FRCHAIN)->frch_next->frch_seg != (SEG)     \
3560    ? get_recorded_alignment (SEG) : 0)
3561 #else
3562 #define SUB_SEGMENT_ALIGN(SEG, FRCHAIN) 1
3563 #endif
3564 #endif
3565
3566 extern void
3567 write_object_file ()
3568 {
3569   int i;
3570   const char *name;
3571   struct frchain *frchain_ptr;
3572
3573   object_headers headers;
3574   unsigned long file_cursor;
3575   bfd *abfd;
3576   unsigned int addr;
3577   abfd = bfd_openw (out_file_name, TARGET_FORMAT);
3578
3579   if (abfd == 0)
3580     {
3581       as_perror (_("FATAL: Can't create %s"), out_file_name);
3582       exit (EXIT_FAILURE);
3583     }
3584   bfd_set_format (abfd, bfd_object);
3585   bfd_set_arch_mach (abfd, BFD_ARCH, machine);
3586
3587   string_byte_count = 4;
3588
3589   /* Run through all the sub-segments and align them up.  Also
3590      close any open frags.  We tack a .fill onto the end of the
3591      frag chain so that any .align's size can be worked by looking
3592      at the next frag.  */
3593   for (frchain_ptr = frchain_root;
3594        frchain_ptr != (struct frchain *) NULL;
3595        frchain_ptr = frchain_ptr->frch_next)
3596     {
3597       int alignment;
3598
3599       subseg_set (frchain_ptr->frch_seg, frchain_ptr->frch_subseg);
3600
3601       alignment = SUB_SEGMENT_ALIGN (now_seg, frchain_ptr);
3602
3603 #ifdef md_do_align
3604       md_do_align (alignment, (char *) NULL, 0, 0, alignment_done);
3605 #endif
3606       if (subseg_text_p (now_seg))
3607         frag_align_code (alignment, 0);
3608       else
3609         frag_align (alignment, 0, 0);
3610
3611 #ifdef md_do_align
3612     alignment_done:
3613 #endif
3614
3615       frag_wane (frag_now);
3616       frag_now->fr_fix = 0;
3617       know (frag_now->fr_next == NULL);
3618     }
3619
3620   remove_subsegs ();
3621
3622   for (i = SEG_E0; i < SEG_UNKNOWN; i++)
3623     relax_segment (segment_info[i].frchainP->frch_root, i);
3624
3625   /* Relaxation has completed.  Freeze all syms.  */
3626   finalize_syms = 1;
3627
3628   H_SET_NUMBER_OF_SECTIONS (&headers, 0);
3629
3630   /* Find out how big the sections are, and set the addresses.  */
3631   addr = 0;
3632   for (i = SEG_E0; i < SEG_UNKNOWN; i++)
3633     {
3634       long size;
3635
3636       segment_info[i].scnhdr.s_paddr = addr;
3637       segment_info[i].scnhdr.s_vaddr = addr;
3638
3639       if (segment_info[i].scnhdr.s_name[0])
3640         {
3641           H_SET_NUMBER_OF_SECTIONS (&headers,
3642                                     H_GET_NUMBER_OF_SECTIONS (&headers) + 1);
3643
3644 #ifdef COFF_LONG_SECTION_NAMES
3645           /* Support long section names as found in PE.  This code
3646              must coordinate with that in coff_header_append and
3647              w_strings.  */
3648           {
3649             unsigned int len;
3650
3651             len = strlen (segment_info[i].name);
3652             if (len > SCNNMLEN)
3653               string_byte_count += len + 1;
3654           }
3655 #endif /* COFF_LONG_SECTION_NAMES */
3656         }
3657
3658       size = size_section (abfd, (unsigned int) i);
3659       addr += size;
3660
3661       /* I think the section alignment is only used on the i960; the
3662          i960 needs it, and it should do no harm on other targets.  */
3663 #ifdef ALIGNMENT_IN_S_FLAGS
3664       segment_info[i].scnhdr.s_flags |= (section_alignment[i] & 0xF) << 8;
3665 #else
3666       segment_info[i].scnhdr.s_align = 1 << section_alignment[i];
3667 #endif
3668
3669       if (i == SEG_E0)
3670         H_SET_TEXT_SIZE (&headers, size);
3671       else if (i == SEG_E1)
3672         H_SET_DATA_SIZE (&headers, size);
3673       else if (i == SEG_E2)
3674         H_SET_BSS_SIZE (&headers, size);
3675     }
3676
3677   /* Turn the gas native symbol table shape into a coff symbol table.  */
3678   crawl_symbols (&headers, abfd);
3679
3680   if (string_byte_count == 4)
3681     string_byte_count = 0;
3682
3683   H_SET_STRING_SIZE (&headers, string_byte_count);
3684
3685 #ifdef tc_frob_file
3686   tc_frob_file ();
3687 #endif
3688
3689   for (i = SEG_E0; i < SEG_UNKNOWN; i++)
3690     {
3691       fixup_mdeps (segment_info[i].frchainP->frch_root, &headers, i);
3692       fixup_segment (&segment_info[i], i);
3693     }
3694
3695   /* Look for ".stab" segments and fill in their initial symbols
3696      correctly.  */
3697   for (i = SEG_E0; i < SEG_UNKNOWN; i++)
3698     {
3699       name = segment_info[i].name;
3700
3701       if (name != NULL
3702           && strncmp (".stab", name, 5) == 0
3703           && strncmp (".stabstr", name, 8) != 0)
3704         adjust_stab_section (abfd, i);
3705     }
3706
3707   file_cursor = H_GET_TEXT_FILE_OFFSET (&headers);
3708
3709   bfd_seek (abfd, (file_ptr) file_cursor, 0);
3710
3711   /* Plant the data.  */
3712   fill_section (abfd, &headers, &file_cursor);
3713
3714   do_relocs_for (abfd, &headers, &file_cursor);
3715
3716   do_linenos_for (abfd, &headers, &file_cursor);
3717
3718   H_SET_FILE_MAGIC_NUMBER (&headers, COFF_MAGIC);
3719 #ifndef OBJ_COFF_OMIT_TIMESTAMP
3720   H_SET_TIME_STAMP (&headers, (long)time((time_t *)0));
3721 #else
3722   H_SET_TIME_STAMP (&headers, 0);
3723 #endif
3724 #ifdef TC_COFF_SET_MACHINE
3725   TC_COFF_SET_MACHINE (&headers);
3726 #endif
3727
3728 #ifndef COFF_FLAGS
3729 #define COFF_FLAGS 0
3730 #endif
3731
3732 #ifdef KEEP_RELOC_INFO
3733   H_SET_FLAGS (&headers, ((H_GET_LINENO_SIZE(&headers) ? 0 : F_LNNO) |
3734                           COFF_FLAGS | coff_flags));
3735 #else
3736   H_SET_FLAGS (&headers, ((H_GET_LINENO_SIZE(&headers)     ? 0 : F_LNNO)   |
3737                           (H_GET_RELOCATION_SIZE(&headers) ? 0 : F_RELFLG) |
3738                           COFF_FLAGS | coff_flags));
3739 #endif
3740
3741   {
3742     unsigned int symtable_size = H_GET_SYMBOL_TABLE_SIZE (&headers);
3743     char *buffer1 = xmalloc (symtable_size + string_byte_count + 1);
3744
3745     H_SET_SYMBOL_TABLE_POINTER (&headers, bfd_tell (abfd));
3746     w_symbols (abfd, buffer1, symbol_rootP);
3747     if (string_byte_count > 0)
3748       w_strings (buffer1 + symtable_size);
3749     bfd_bwrite (buffer1, (bfd_size_type) symtable_size + string_byte_count,
3750                 abfd);
3751     free (buffer1);
3752   }
3753
3754   coff_header_append (abfd, &headers);
3755   {
3756     extern bfd *stdoutput;
3757     stdoutput = abfd;
3758   }
3759 }
3760
3761 /* Add a new segment.  This is called from subseg_new via the
3762    obj_new_segment macro.  */
3763
3764 segT
3765 obj_coff_add_segment (name)
3766      const char *name;
3767 {
3768   unsigned int i;
3769
3770 #ifndef COFF_LONG_SECTION_NAMES
3771   char buf[SCNNMLEN + 1];
3772
3773   strncpy (buf, name, SCNNMLEN);
3774   buf[SCNNMLEN] = '\0';
3775   name = buf;
3776 #endif
3777
3778   for (i = SEG_E0; i < SEG_LAST && segment_info[i].scnhdr.s_name[0]; i++)
3779     if (strcmp (name, segment_info[i].name) == 0)
3780       return (segT) i;
3781
3782   if (i == SEG_LAST)
3783     {
3784       as_bad (_("Too many new sections; can't add \"%s\""), name);
3785       return now_seg;
3786     }
3787
3788   /* Add a new section.  */
3789   strncpy (segment_info[i].scnhdr.s_name, name,
3790            sizeof (segment_info[i].scnhdr.s_name));
3791   segment_info[i].scnhdr.s_flags = STYP_REG;
3792   segment_info[i].name = xstrdup (name);
3793
3794   return (segT) i;
3795 }
3796
3797 /* Implement the .section pseudo op:
3798         .section name {, "flags"}
3799                   ^         ^
3800                   |         +--- optional flags: 'b' for bss
3801                   |                              'i' for info
3802                   +-- section name               'l' for lib
3803                                                  'n' for noload
3804                                                  'o' for over
3805                                                  'w' for data
3806                                                  'd' (apparently m88k for data)
3807                                                  'x' for text
3808                                                  'r' for read-only data
3809    But if the argument is not a quoted string, treat it as a
3810    subsegment number.  */
3811
3812 void
3813 obj_coff_section (ignore)
3814      int ignore ATTRIBUTE_UNUSED;
3815 {
3816   /* Strip out the section name.  */
3817   char *section_name, *name;
3818   char c;
3819   unsigned int exp;
3820   long flags;
3821
3822   if (flag_mri)
3823     {
3824       char type;
3825
3826       s_mri_sect (&type);
3827       flags = 0;
3828       if (type == 'C')
3829         flags = STYP_TEXT;
3830       else if (type == 'D')
3831         flags = STYP_DATA;
3832       segment_info[now_seg].scnhdr.s_flags |= flags;
3833
3834       return;
3835     }
3836
3837   section_name = input_line_pointer;
3838   c = get_symbol_end ();
3839
3840   name = xmalloc (input_line_pointer - section_name + 1);
3841   strcpy (name, section_name);
3842
3843   *input_line_pointer = c;
3844
3845   exp = 0;
3846   flags = 0;
3847
3848   SKIP_WHITESPACE ();
3849   if (*input_line_pointer == ',')
3850     {
3851       ++input_line_pointer;
3852       SKIP_WHITESPACE ();
3853
3854       if (*input_line_pointer != '"')
3855         exp = get_absolute_expression ();
3856       else
3857         {
3858           ++input_line_pointer;
3859           while (*input_line_pointer != '"'
3860                  && ! is_end_of_line[(unsigned char) *input_line_pointer])
3861             {
3862               switch (*input_line_pointer)
3863                 {
3864                 case 'b': flags |= STYP_BSS;    break;
3865                 case 'i': flags |= STYP_INFO;   break;
3866                 case 'l': flags |= STYP_LIB;    break;
3867                 case 'n': flags |= STYP_NOLOAD; break;
3868                 case 'o': flags |= STYP_OVER;   break;
3869                 case 'd':
3870                 case 'w': flags |= STYP_DATA;   break;
3871                 case 'x': flags |= STYP_TEXT;   break;
3872                 case 'r': flags |= STYP_LIT;    break;
3873                 default:
3874                   as_warn(_("unknown section attribute '%c'"),
3875                           *input_line_pointer);
3876                   break;
3877                 }
3878               ++input_line_pointer;
3879             }
3880           if (*input_line_pointer == '"')
3881             ++input_line_pointer;
3882         }
3883     }
3884
3885   subseg_new (name, (subsegT) exp);
3886
3887   segment_info[now_seg].scnhdr.s_flags |= flags;
3888
3889   demand_empty_rest_of_line ();
3890 }
3891
3892 static void
3893 obj_coff_text (ignore)
3894      int ignore ATTRIBUTE_UNUSED;
3895 {
3896   subseg_new (".text", get_absolute_expression ());
3897 }
3898
3899 static void
3900 obj_coff_data (ignore)
3901      int ignore ATTRIBUTE_UNUSED;
3902 {
3903   if (flag_readonly_data_in_text)
3904     subseg_new (".text", get_absolute_expression () + 1000);
3905   else
3906     subseg_new (".data", get_absolute_expression ());
3907 }
3908
3909 static void
3910 obj_coff_ident (ignore)
3911      int ignore ATTRIBUTE_UNUSED;
3912 {
3913   segT current_seg = now_seg;           /* Save current seg.  */
3914   subsegT current_subseg = now_subseg;
3915
3916   subseg_new (".comment", 0);           /* .comment seg.  */
3917   stringer (1);                         /* Read string.  */
3918   subseg_set (current_seg, current_subseg);     /* Restore current seg.  */
3919 }
3920
3921 void
3922 c_symbol_merge (debug, normal)
3923      symbolS *debug;
3924      symbolS *normal;
3925 {
3926   S_SET_DATA_TYPE (normal, S_GET_DATA_TYPE (debug));
3927   S_SET_STORAGE_CLASS (normal, S_GET_STORAGE_CLASS (debug));
3928
3929   if (S_GET_NUMBER_AUXILIARY (debug) > S_GET_NUMBER_AUXILIARY (normal))
3930     S_SET_NUMBER_AUXILIARY (normal, S_GET_NUMBER_AUXILIARY (debug));
3931
3932   if (S_GET_NUMBER_AUXILIARY (debug) > 0)
3933     memcpy ((char *) &normal->sy_symbol.ost_auxent[0],
3934             (char *) &debug->sy_symbol.ost_auxent[0],
3935             (unsigned int) (S_GET_NUMBER_AUXILIARY (debug) * AUXESZ));
3936
3937   /* Move the debug flags.  */
3938   SF_SET_DEBUG_FIELD (normal, SF_GET_DEBUG_FIELD (debug));
3939 }
3940
3941 static int
3942 c_line_new (symbol, paddr, line_number, frag)
3943      symbolS * symbol;
3944      long paddr;
3945      int line_number;
3946      fragS * frag;
3947 {
3948   struct lineno_list *new_line =
3949   (struct lineno_list *) xmalloc (sizeof (struct lineno_list));
3950
3951   segment_info_type *s = segment_info + now_seg;
3952   new_line->line.l_lnno = line_number;
3953
3954   if (line_number == 0)
3955     {
3956       last_line_symbol = symbol;
3957       new_line->line.l_addr.l_symndx = (long) symbol;
3958     }
3959   else
3960     {
3961       new_line->line.l_addr.l_paddr = paddr;
3962     }
3963
3964   new_line->frag = (char *) frag;
3965   new_line->next = (struct lineno_list *) NULL;
3966
3967   if (s->lineno_list_head == (struct lineno_list *) NULL)
3968     s->lineno_list_head = new_line;
3969   else
3970     s->lineno_list_tail->next = new_line;
3971
3972   s->lineno_list_tail = new_line;
3973   return LINESZ * s->scnhdr.s_nlnno++;
3974 }
3975
3976 void
3977 c_dot_file_symbol (const char *filename, int appfile ATTRIBUTE_UNUSED)
3978 {
3979   symbolS *symbolP;
3980
3981   symbolP = symbol_new (".file",
3982                         SEG_DEBUG,
3983                         0,
3984                         &zero_address_frag);
3985
3986   S_SET_STORAGE_CLASS (symbolP, C_FILE);
3987   S_SET_NUMBER_AUXILIARY (symbolP, 1);
3988
3989   if (strlen (filename) > FILNMLEN)
3990     {
3991       /* Filename is too long to fit into an auxent,
3992          we stick it into the string table instead.  We keep
3993          a linked list of the filenames we find so we can emit
3994          them later.  */
3995       struct filename_list *f = ((struct filename_list *)
3996                                  xmalloc (sizeof (struct filename_list)));
3997
3998       f->filename = filename;
3999       f->next = 0;
4000
4001       SA_SET_FILE_FNAME_ZEROS (symbolP, 0);
4002       SA_SET_FILE_FNAME_OFFSET (symbolP, 1);
4003
4004       if (filename_list_tail)
4005         filename_list_tail->next = f;
4006       else
4007         filename_list_head = f;
4008       filename_list_tail = f;
4009     }
4010   else
4011     {
4012       SA_SET_FILE_FNAME (symbolP, filename);
4013     }
4014 #ifndef NO_LISTING
4015   {
4016     extern int listing;
4017     if (listing)
4018       listing_source_file (filename);
4019   }
4020 #endif
4021   SF_SET_DEBUG (symbolP);
4022   S_SET_VALUE (symbolP, (valueT) previous_file_symbol);
4023
4024   previous_file_symbol = symbolP;
4025
4026   /* Make sure that the symbol is first on the symbol chain.  */
4027   if (symbol_rootP != symbolP)
4028     {
4029       symbol_remove (symbolP, &symbol_rootP, &symbol_lastP);
4030       symbol_insert (symbolP, symbol_rootP, &symbol_rootP, &symbol_lastP);
4031     }
4032 }
4033
4034 /* Build a 'section static' symbol.  */
4035
4036 symbolS *
4037 c_section_symbol (name, idx)
4038      char *name;
4039      int idx;
4040 {
4041   symbolS *symbolP;
4042
4043   symbolP = symbol_find_base (name, DO_NOT_STRIP);
4044   if (symbolP == NULL)
4045     symbolP = symbol_new (name, idx, 0, &zero_address_frag);
4046   else
4047     {
4048       /* Mmmm.  I just love violating interfaces.  Makes me feel...dirty.  */
4049       S_SET_SEGMENT (symbolP, idx);
4050       symbolP->sy_frag = &zero_address_frag;
4051     }
4052
4053   S_SET_STORAGE_CLASS (symbolP, C_STAT);
4054   S_SET_NUMBER_AUXILIARY (symbolP, 1);
4055
4056   SF_SET_STATICS (symbolP);
4057
4058 #ifdef TE_DELTA
4059   /* manfred@s-direktnet.de: section symbols *must* have the LOCAL bit cleared,
4060      which is set by the new definition of LOCAL_LABEL in tc-m68k.h.  */
4061   SF_CLEAR_LOCAL (symbolP);
4062 #endif
4063 #ifdef TE_PE
4064   /* If the .linkonce pseudo-op was used for this section, we must
4065      store the information in the auxiliary entry for the section
4066      symbol.  */
4067   if (segment_info[idx].linkonce != LINKONCE_UNSET)
4068     {
4069       int type;
4070
4071       switch (segment_info[idx].linkonce)
4072         {
4073         default:
4074           abort ();
4075         case LINKONCE_DISCARD:
4076           type = IMAGE_COMDAT_SELECT_ANY;
4077           break;
4078         case LINKONCE_ONE_ONLY:
4079           type = IMAGE_COMDAT_SELECT_NODUPLICATES;
4080           break;
4081         case LINKONCE_SAME_SIZE:
4082           type = IMAGE_COMDAT_SELECT_SAME_SIZE;
4083           break;
4084         case LINKONCE_SAME_CONTENTS:
4085           type = IMAGE_COMDAT_SELECT_EXACT_MATCH;
4086           break;
4087         }
4088
4089       SYM_AUXENT (symbolP)->x_scn.x_comdat = type;
4090     }
4091 #endif /* TE_PE */
4092
4093   return symbolP;
4094 }
4095
4096 static void
4097 w_symbols (abfd, where, symbol_rootP)
4098      bfd * abfd;
4099      char *where;
4100      symbolS * symbol_rootP;
4101 {
4102   symbolS *symbolP;
4103   unsigned int i;
4104
4105   /* First fill in those values we have only just worked out.  */
4106   for (i = SEG_E0; i < SEG_LAST; i++)
4107     {
4108       symbolP = segment_info[i].dot;
4109       if (symbolP)
4110         {
4111           SA_SET_SCN_SCNLEN (symbolP, segment_info[i].scnhdr.s_size);
4112           SA_SET_SCN_NRELOC (symbolP, segment_info[i].scnhdr.s_nreloc);
4113           SA_SET_SCN_NLINNO (symbolP, segment_info[i].scnhdr.s_nlnno);
4114         }
4115     }
4116
4117   /* Emit all symbols left in the symbol chain.  */
4118   for (symbolP = symbol_rootP; symbolP; symbolP = symbol_next (symbolP))
4119     {
4120       /* Used to save the offset of the name. It is used to point
4121          to the string in memory but must be a file offset.  */
4122       char *temp;
4123
4124       /* We can't fix the lnnoptr field in yank_symbols with the other
4125          adjustments, because we have to wait until we know where they
4126          go in the file.  */
4127       if (SF_GET_ADJ_LNNOPTR (symbolP))
4128         SA_GET_SYM_LNNOPTR (symbolP) +=
4129           segment_info[S_GET_SEGMENT (symbolP)].scnhdr.s_lnnoptr;
4130
4131       tc_coff_symbol_emit_hook (symbolP);
4132
4133       temp = S_GET_NAME (symbolP);
4134       if (SF_GET_STRING (symbolP))
4135         {
4136           S_SET_OFFSET (symbolP, symbolP->sy_name_offset);
4137           S_SET_ZEROES (symbolP, 0);
4138         }
4139       else
4140         {
4141           memset (symbolP->sy_symbol.ost_entry.n_name, 0, SYMNMLEN);
4142           strncpy (symbolP->sy_symbol.ost_entry.n_name, temp, SYMNMLEN);
4143         }
4144       where = symbol_to_chars (abfd, where, symbolP);
4145       S_SET_NAME (symbolP, temp);
4146     }
4147 }
4148
4149 static void
4150 obj_coff_lcomm (ignore)
4151      int ignore ATTRIBUTE_UNUSED;
4152 {
4153   s_lcomm (0);
4154   return;
4155 }
4156
4157 static void
4158 fixup_mdeps (frags, h, this_segment)
4159      fragS *frags;
4160      object_headers *h ATTRIBUTE_UNUSED;
4161      segT this_segment;
4162 {
4163   subseg_change (this_segment, 0);
4164
4165   while (frags)
4166     {
4167       switch (frags->fr_type)
4168         {
4169         case rs_align:
4170         case rs_align_code:
4171         case rs_align_test:
4172         case rs_org:
4173 #ifdef HANDLE_ALIGN
4174           HANDLE_ALIGN (frags);
4175 #endif
4176           frags->fr_type = rs_fill;
4177           frags->fr_offset =
4178             ((frags->fr_next->fr_address - frags->fr_address - frags->fr_fix)
4179              / frags->fr_var);
4180           break;
4181         case rs_machine_dependent:
4182           md_convert_frag (h, this_segment, frags);
4183           frag_wane (frags);
4184           break;
4185         default:
4186           ;
4187         }
4188       frags = frags->fr_next;
4189     }
4190 }
4191
4192 #if 1
4193
4194 #ifndef TC_FORCE_RELOCATION
4195 #define TC_FORCE_RELOCATION(fix) 0
4196 #endif
4197
4198 static void
4199 fixup_segment (segP, this_segment_type)
4200      segment_info_type * segP;
4201      segT this_segment_type;
4202 {
4203   fixS * fixP;
4204   symbolS *add_symbolP;
4205   symbolS *sub_symbolP;
4206   long add_number;
4207   int size;
4208   char *place;
4209   long where;
4210   char pcrel;
4211   fragS *fragP;
4212   segT add_symbol_segment = absolute_section;
4213
4214   for (fixP = segP->fix_root; fixP; fixP = fixP->fx_next)
4215     {
4216       fragP = fixP->fx_frag;
4217       know (fragP);
4218       where = fixP->fx_where;
4219       place = fragP->fr_literal + where;
4220       size = fixP->fx_size;
4221       add_symbolP = fixP->fx_addsy;
4222       sub_symbolP = fixP->fx_subsy;
4223       add_number = fixP->fx_offset;
4224       pcrel = fixP->fx_pcrel;
4225
4226       /* We want function-relative stabs to work on systems which
4227          may use a relaxing linker; thus we must handle the sym1-sym2
4228          fixups function-relative stabs generates.
4229
4230          Of course, if you actually enable relaxing in the linker, the
4231          line and block scoping information is going to be incorrect
4232          in some cases.  The only way to really fix this is to support
4233          a reloc involving the difference of two symbols.  */
4234       if (linkrelax
4235           && (!sub_symbolP || pcrel))
4236         continue;
4237
4238 #ifdef TC_I960
4239       if (fixP->fx_tcbit && SF_GET_CALLNAME (add_symbolP))
4240         {
4241           /* Relocation should be done via the associated 'bal' entry
4242              point symbol.  */
4243
4244           if (!SF_GET_BALNAME (tc_get_bal_of_call (add_symbolP)))
4245             {
4246               as_bad_where (fixP->fx_file, fixP->fx_line,
4247                             _("No 'bal' entry point for leafproc %s"),
4248                             S_GET_NAME (add_symbolP));
4249               continue;
4250             }
4251           fixP->fx_addsy = add_symbolP = tc_get_bal_of_call (add_symbolP);
4252         }
4253 #endif
4254
4255       /* Make sure the symbols have been resolved; this may not have
4256          happened if these are expression symbols.  */
4257       if (add_symbolP != NULL && ! add_symbolP->sy_resolved)
4258         resolve_symbol_value (add_symbolP);
4259
4260       if (add_symbolP != NULL)
4261         {
4262           /* If this fixup is against a symbol which has been equated
4263              to another symbol, convert it to the other symbol.  */
4264           if (add_symbolP->sy_value.X_op == O_symbol
4265               && (! S_IS_DEFINED (add_symbolP)
4266                   || S_IS_COMMON (add_symbolP)))
4267             {
4268               while (add_symbolP->sy_value.X_op == O_symbol
4269                      && (! S_IS_DEFINED (add_symbolP)
4270                          || S_IS_COMMON (add_symbolP)))
4271                 {
4272                   symbolS *n;
4273
4274                   /* We must avoid looping, as that can occur with a
4275                      badly written program.  */
4276                   n = add_symbolP->sy_value.X_add_symbol;
4277                   if (n == add_symbolP)
4278                     break;
4279                   add_number += add_symbolP->sy_value.X_add_number;
4280                   add_symbolP = n;
4281                 }
4282               fixP->fx_addsy = add_symbolP;
4283               fixP->fx_offset = add_number;
4284             }
4285         }
4286
4287       if (sub_symbolP != NULL && ! sub_symbolP->sy_resolved)
4288         resolve_symbol_value (sub_symbolP);
4289
4290       if (add_symbolP != NULL
4291           && add_symbolP->sy_mri_common)
4292         {
4293           add_number += S_GET_VALUE (add_symbolP);
4294           fixP->fx_offset = add_number;
4295           add_symbolP = fixP->fx_addsy = add_symbolP->sy_value.X_add_symbol;
4296         }
4297
4298       if (add_symbolP)
4299         add_symbol_segment = S_GET_SEGMENT (add_symbolP);
4300
4301       if (sub_symbolP)
4302         {
4303           if (add_symbolP == NULL || add_symbol_segment == absolute_section)
4304             {
4305               if (add_symbolP != NULL)
4306                 {
4307                   add_number += S_GET_VALUE (add_symbolP);
4308                   add_symbolP = NULL;
4309                   fixP->fx_addsy = NULL;
4310                 }
4311
4312               /* It's just -sym.  */
4313               if (S_GET_SEGMENT (sub_symbolP) == absolute_section)
4314                 {
4315                   add_number -= S_GET_VALUE (sub_symbolP);
4316                   fixP->fx_subsy = 0;
4317                   fixP->fx_done = 1;
4318                 }
4319               else
4320                 {
4321 #ifndef TC_M68K
4322                   as_bad_where (fixP->fx_file, fixP->fx_line,
4323                                 _("Negative of non-absolute symbol %s"),
4324                                 S_GET_NAME (sub_symbolP));
4325 #endif
4326                   add_number -= S_GET_VALUE (sub_symbolP);
4327                 }               /* not absolute */
4328
4329               /* if sub_symbol is in the same segment that add_symbol
4330                  and add_symbol is either in DATA, TEXT, BSS or ABSOLUTE.  */
4331             }
4332           else if (S_GET_SEGMENT (sub_symbolP) == add_symbol_segment
4333                    && SEG_NORMAL (add_symbol_segment))
4334             {
4335               /* Difference of 2 symbols from same segment.  Can't
4336                  make difference of 2 undefineds: 'value' means
4337                  something different for N_UNDF.  */
4338 #ifdef TC_I960
4339               /* Makes no sense to use the difference of 2 arbitrary symbols
4340                  as the target of a call instruction.  */
4341               if (fixP->fx_tcbit)
4342                 as_bad_where (fixP->fx_file, fixP->fx_line,
4343                               _("callj to difference of 2 symbols"));
4344 #endif /* TC_I960 */
4345               add_number += S_GET_VALUE (add_symbolP) -
4346                 S_GET_VALUE (sub_symbolP);
4347               add_symbolP = NULL;
4348
4349               if (!TC_FORCE_RELOCATION (fixP))
4350                 {
4351                   fixP->fx_addsy = NULL;
4352                   fixP->fx_subsy = NULL;
4353                   fixP->fx_done = 1;
4354 #ifdef TC_M68K /* is this right? */
4355                   pcrel = 0;
4356                   fixP->fx_pcrel = 0;
4357 #endif
4358                 }
4359             }
4360           else
4361             {
4362               /* Different segments in subtraction.  */
4363               know (!(S_IS_EXTERNAL (sub_symbolP) && (S_GET_SEGMENT (sub_symbolP) == absolute_section)));
4364
4365               if ((S_GET_SEGMENT (sub_symbolP) == absolute_section))
4366                 add_number -= S_GET_VALUE (sub_symbolP);
4367
4368 #ifdef DIFF_EXPR_OK
4369               else if (S_GET_SEGMENT (sub_symbolP) == this_segment_type)
4370                 {
4371                   /* Make it pc-relative.  */
4372                   add_number += (md_pcrel_from (fixP)
4373                                  - S_GET_VALUE (sub_symbolP));
4374                   pcrel = 1;
4375                   fixP->fx_pcrel = 1;
4376                   sub_symbolP = 0;
4377                   fixP->fx_subsy = 0;
4378                 }
4379 #endif
4380               else
4381                 {
4382                   as_bad_where (fixP->fx_file, fixP->fx_line,
4383                                 _("Can't emit reloc {- %s-seg symbol \"%s\"} @ file address %ld."),
4384                                 segment_name (S_GET_SEGMENT (sub_symbolP)),
4385                                 S_GET_NAME (sub_symbolP),
4386                                 (long) (fragP->fr_address + where));
4387                 }
4388             }
4389         }
4390
4391       if (add_symbolP)
4392         {
4393           if (add_symbol_segment == this_segment_type && pcrel)
4394             {
4395               /* This fixup was made when the symbol's segment was
4396                  SEG_UNKNOWN, but it is now in the local segment.
4397                  So we know how to do the address without relocation.  */
4398 #ifdef TC_I960
4399               /* reloc_callj() may replace a 'call' with a 'calls' or a 'bal',
4400                  in which cases it modifies *fixP as appropriate.  In the case
4401                  of a 'calls', no further work is required, and *fixP has been
4402                  set up to make the rest of the code below a no-op.  */
4403               reloc_callj (fixP);
4404 #endif /* TC_I960 */
4405
4406               add_number += S_GET_VALUE (add_symbolP);
4407               add_number -= md_pcrel_from (fixP);
4408
4409               /* We used to do
4410                    add_number -= segP->scnhdr.s_vaddr;
4411                  if defined (TC_I386) || defined (TE_LYNX).  I now
4412                  think that was an error propagated from the case when
4413                  we are going to emit the relocation.  If we are not
4414                  going to emit the relocation, then we just want to
4415                  set add_number to the difference between the symbols.
4416                  This is a case that would only arise when there is a
4417                  PC relative reference from a section other than .text
4418                  to a symbol defined in the same section, and the
4419                  reference is not relaxed.  Since jump instructions on
4420                  the i386 are relaxed, this could only arise with a
4421                  call instruction.  */
4422
4423               pcrel = 0;        /* Lie. Don't want further pcrel processing.  */
4424               if (!TC_FORCE_RELOCATION (fixP))
4425                 {
4426                   fixP->fx_addsy = NULL;
4427                   fixP->fx_done = 1;
4428                 }
4429             }
4430           else
4431             {
4432               switch (add_symbol_segment)
4433                 {
4434                 case absolute_section:
4435 #ifdef TC_I960
4436                   /* See comment about reloc_callj() above.  */
4437                   reloc_callj (fixP);
4438 #endif /* TC_I960 */
4439                   add_number += S_GET_VALUE (add_symbolP);
4440                   add_symbolP = NULL;
4441
4442                   if (!TC_FORCE_RELOCATION (fixP))
4443                     {
4444                       fixP->fx_addsy = NULL;
4445                       fixP->fx_done = 1;
4446                     }
4447                   break;
4448                 default:
4449
4450 #if defined(TC_A29K) || (defined(TE_PE) && defined(TC_I386)) || defined(TC_M88K) || defined(TC_OR32)
4451                   /* This really should be handled in the linker, but
4452                      backward compatibility forbids.  */
4453                   add_number += S_GET_VALUE (add_symbolP);
4454 #else
4455                   add_number += S_GET_VALUE (add_symbolP) +
4456                     segment_info[S_GET_SEGMENT (add_symbolP)].scnhdr.s_paddr;
4457 #endif
4458                   break;
4459
4460                 case SEG_UNKNOWN:
4461 #ifdef TC_I960
4462                   if ((int) fixP->fx_bit_fixP == 13)
4463                     {
4464                       /* This is a COBR instruction.  They have only a
4465                          13-bit displacement and are only to be used
4466                          for local branches: flag as error, don't generate
4467                          relocation.  */
4468                       as_bad_where (fixP->fx_file, fixP->fx_line,
4469                                     _("can't use COBR format with external label"));
4470                       fixP->fx_addsy = NULL;
4471                       fixP->fx_done = 1;
4472                       continue;
4473                     }
4474 #endif /* TC_I960 */
4475 #if ((defined (TC_I386) || defined (TE_LYNX) || defined (TE_AUX)) && !defined(TE_PE)) || defined (COFF_COMMON_ADDEND)
4476                   /* 386 COFF uses a peculiar format in which the
4477                      value of a common symbol is stored in the .text
4478                      segment (I've checked this on SVR3.2 and SCO
4479                      3.2.2) Ian Taylor <ian@cygnus.com>.  */
4480                   /* This is also true for 68k COFF on sysv machines
4481                      (Checked on Motorola sysv68 R3V6 and R3V7.1, and also on
4482                      UNIX System V/M68000, Release 1.0 from ATT/Bell Labs)
4483                      Philippe De Muyter <phdm@info.ucl.ac.be>.  */
4484                   if (S_IS_COMMON (add_symbolP))
4485                     add_number += S_GET_VALUE (add_symbolP);
4486 #endif
4487                   break;
4488
4489                 }
4490             }
4491         }
4492
4493       if (pcrel)
4494         {
4495 #if !defined(TC_M88K) && !(defined(TE_PE) && defined(TC_I386)) && !defined(TC_A29K) && !defined(TC_OR32)
4496           /* This adjustment is not correct on the m88k, for which the
4497              linker does all the computation.  */
4498           add_number -= md_pcrel_from (fixP);
4499 #endif
4500           if (add_symbolP == 0)
4501             fixP->fx_addsy = &abs_symbol;
4502 #if defined (TC_I386) || defined (TE_LYNX) || defined (TC_I960) || defined (TC_M68K)
4503           /* On the 386 we must adjust by the segment vaddr as well.
4504              Ian Taylor.
4505
4506              I changed the i960 to work this way as well.  This is
4507              compatible with the current GNU linker behaviour.  I do
4508              not know what other i960 COFF assemblers do.  This is not
4509              a common case: normally, only assembler code will contain
4510              a PC relative reloc, and only branches which do not
4511              originate in the .text section will have a non-zero
4512              address.
4513
4514              I changed the m68k to work this way as well.  This will
4515              break existing PC relative relocs from sections which do
4516              not start at address 0, but it will make ld -r work.
4517              Ian Taylor, 4 Oct 96.  */
4518
4519           add_number -= segP->scnhdr.s_vaddr;
4520 #endif
4521         }
4522
4523       md_apply_fix3 (fixP, (valueT *) & add_number, this_segment_type);
4524
4525       if (!fixP->fx_bit_fixP && ! fixP->fx_no_overflow)
4526         {
4527 #ifndef TC_M88K
4528           /* The m88k uses the offset field of the reloc to get around
4529              this problem.  */
4530           if ((size == 1
4531                && ((add_number & ~0xFF)
4532                    || (fixP->fx_signed && (add_number & 0x80)))
4533                && ((add_number & ~0xFF) != (-1 & ~0xFF)
4534                    || (add_number & 0x80) == 0))
4535               || (size == 2
4536                   && ((add_number & ~0xFFFF)
4537                       || (fixP->fx_signed && (add_number & 0x8000)))
4538                   && ((add_number & ~0xFFFF) != (-1 & ~0xFFFF)
4539                       || (add_number & 0x8000) == 0)))
4540             {
4541               as_bad_where (fixP->fx_file, fixP->fx_line,
4542                             _("Value of %ld too large for field of %d bytes at 0x%lx"),
4543                             (long) add_number, size,
4544                             (unsigned long) (fragP->fr_address + where));
4545             }
4546 #endif
4547 #ifdef WARN_SIGNED_OVERFLOW_WORD
4548           /* Warn if a .word value is too large when treated as a
4549              signed number.  We already know it is not too negative.
4550              This is to catch over-large switches generated by gcc on
4551              the 68k.  */
4552           if (!flag_signed_overflow_ok
4553               && size == 2
4554               && add_number > 0x7fff)
4555             as_bad_where (fixP->fx_file, fixP->fx_line,
4556                           _("Signed .word overflow; switch may be too large; %ld at 0x%lx"),
4557                           (long) add_number,
4558                           (unsigned long) (fragP->fr_address + where));
4559 #endif
4560         }
4561     }
4562 }
4563
4564 #endif
4565
4566 /* The first entry in a .stab section is special.  */
4567
4568 void
4569 obj_coff_init_stab_section (seg)
4570      segT seg;
4571 {
4572   char *file;
4573   char *p;
4574   char *stabstr_name;
4575   unsigned int stroff;
4576
4577   /* Make space for this first symbol.  */
4578   p = frag_more (12);
4579   /* Zero it out.  */
4580   memset (p, 0, 12);
4581   as_where (&file, (unsigned int *) NULL);
4582   stabstr_name = (char *) alloca (strlen (segment_info[seg].name) + 4);
4583   strcpy (stabstr_name, segment_info[seg].name);
4584   strcat (stabstr_name, "str");
4585   stroff = get_stab_string_offset (file, stabstr_name);
4586   know (stroff == 1);
4587   md_number_to_chars (p, stroff, 4);
4588 }
4589
4590 /* Fill in the counts in the first entry in a .stab section.  */
4591
4592 static void
4593 adjust_stab_section(abfd, seg)
4594      bfd *abfd;
4595      segT seg;
4596 {
4597   segT stabstrseg = SEG_UNKNOWN;
4598   const char *secname, *name2;
4599   char *name;
4600   char *p = NULL;
4601   int i, strsz = 0, nsyms;
4602   fragS *frag = segment_info[seg].frchainP->frch_root;
4603
4604   /* Look for the associated string table section.  */
4605
4606   secname = segment_info[seg].name;
4607   name = (char *) alloca (strlen (secname) + 4);
4608   strcpy (name, secname);
4609   strcat (name, "str");
4610
4611   for (i = SEG_E0; i < SEG_UNKNOWN; i++)
4612     {
4613       name2 = segment_info[i].name;
4614       if (name2 != NULL && strncmp(name2, name, 8) == 0)
4615         {
4616           stabstrseg = i;
4617           break;
4618         }
4619     }
4620
4621   /* If we found the section, get its size.  */
4622   if (stabstrseg != SEG_UNKNOWN)
4623     strsz = size_section (abfd, stabstrseg);
4624
4625   nsyms = size_section (abfd, seg) / 12 - 1;
4626
4627   /* Look for the first frag of sufficient size for the initial stab
4628      symbol, and collect a pointer to it.  */
4629   while (frag && frag->fr_fix < 12)
4630     frag = frag->fr_next;
4631   assert (frag != 0);
4632   p = frag->fr_literal;
4633   assert (p != 0);
4634
4635   /* Write in the number of stab symbols and the size of the string
4636      table.  */
4637   bfd_h_put_16 (abfd, (bfd_vma) nsyms, (bfd_byte *) p + 6);
4638   bfd_h_put_32 (abfd, (bfd_vma) strsz, (bfd_byte *) p + 8);
4639 }
4640
4641 #endif /* not BFD_ASSEMBLER */
4642
4643 const pseudo_typeS coff_pseudo_table[] =
4644 {
4645   {"def", obj_coff_def, 0},
4646   {"dim", obj_coff_dim, 0},
4647   {"endef", obj_coff_endef, 0},
4648   {"line", obj_coff_line, 0},
4649   {"ln", obj_coff_ln, 0},
4650 #ifdef BFD_ASSEMBLER
4651   {"loc", obj_coff_loc, 0},
4652 #endif
4653   {"appline", obj_coff_ln, 1},
4654   {"scl", obj_coff_scl, 0},
4655   {"size", obj_coff_size, 0},
4656   {"tag", obj_coff_tag, 0},
4657   {"type", obj_coff_type, 0},
4658   {"val", obj_coff_val, 0},
4659   {"section", obj_coff_section, 0},
4660   {"sect", obj_coff_section, 0},
4661   /* FIXME: We ignore the MRI short attribute.  */
4662   {"section.s", obj_coff_section, 0},
4663   {"sect.s", obj_coff_section, 0},
4664   /* We accept the .bss directive for backward compatibility with
4665      earlier versions of gas.  */
4666   {"bss", obj_coff_bss, 0},
4667   {"ident", obj_coff_ident, 0},
4668 #ifndef BFD_ASSEMBLER
4669   {"use", obj_coff_section, 0},
4670   {"text", obj_coff_text, 0},
4671   {"data", obj_coff_data, 0},
4672   {"lcomm", obj_coff_lcomm, 0},
4673 #else
4674   {"weak", obj_coff_weak, 0},
4675   {"optim", s_ignore, 0},       /* For sun386i cc (?) */
4676 #endif
4677   {"version", s_ignore, 0},
4678   {"ABORT", s_abort, 0},
4679 #if defined( TC_M88K ) || defined ( TC_TIC4X )
4680   /* The m88k and tic4x uses sdef instead of def.  */
4681   {"sdef", obj_coff_def, 0},
4682 #endif
4683   {NULL, NULL, 0}               /* end sentinel */
4684 };                              /* coff_pseudo_table */
4685 \f
4686 #ifdef BFD_ASSEMBLER
4687
4688 /* Support for a COFF emulation.  */
4689
4690 static void coff_pop_insert PARAMS ((void));
4691 static int coff_separate_stab_sections PARAMS ((void));
4692
4693 static void
4694 coff_pop_insert ()
4695 {
4696   pop_insert (coff_pseudo_table);
4697 }
4698
4699 static int
4700 coff_separate_stab_sections ()
4701 {
4702   return 1;
4703 }
4704
4705 const struct format_ops coff_format_ops =
4706 {
4707   bfd_target_coff_flavour,
4708   0,    /* dfl_leading_underscore */
4709   1,    /* emit_section_symbols */
4710   0,    /* begin */
4711   c_dot_file_symbol,
4712   coff_frob_symbol,
4713   0,    /* frob_file */
4714   0,    /* frob_file_before_adjust */
4715   0,    /* frob_file_before_fix */
4716   coff_frob_file_after_relocs,
4717   0,    /* s_get_size */
4718   0,    /* s_set_size */
4719   0,    /* s_get_align */
4720   0,    /* s_set_align */
4721   0,    /* s_get_other */
4722   0,    /* s_set_other */
4723   0,    /* s_get_desc */
4724   0,    /* s_set_desc */
4725   0,    /* s_get_type */
4726   0,    /* s_set_type */
4727   0,    /* copy_symbol_attributes */
4728   0,    /* generate_asm_lineno */
4729   0,    /* process_stab */
4730   coff_separate_stab_sections,
4731   obj_coff_init_stab_section,
4732   0,    /* sec_sym_ok_for_reloc */
4733   coff_pop_insert,
4734   0,    /* ecoff_set_ext */
4735   coff_obj_read_begin_hook,
4736   coff_obj_symbol_new_hook
4737 };
4738
4739 #endif