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