* Add support for marker type relocations. These mark areas
[external/binutils.git] / gas / write.c
1 /* write.c - emit .o file
2    Copyright (C) 1986, 1987, 1990, 1991, 1992, 1993 Free Software Foundation, Inc.
3
4    This file is part of GAS, the GNU Assembler.
5
6    GAS is free software; you can redistribute it and/or modify
7    it under the terms of the GNU General Public License as published by
8    the Free Software Foundation; either version 2, or (at your option)
9    any later version.
10
11    GAS is distributed in the hope that it will be useful,
12    but WITHOUT ANY WARRANTY; without even the implied warranty of
13    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14    GNU General Public License for more details.
15
16    You should have received a copy of the GNU General Public License
17    along with GAS; see the file COPYING.  If not, write to
18    the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.  */
19
20 /* This thing should be set up to do byteordering correctly.  But... */
21
22 #include "as.h"
23 #include "subsegs.h"
24 #include "obstack.h"
25 #include "output-file.h"
26
27 /* The NOP_OPCODE is for the alignment fill value.  Fill it with a nop
28    instruction so that the disassembler does not choke on it.  */
29 #ifndef NOP_OPCODE
30 #define NOP_OPCODE 0x00
31 #endif
32
33 #ifndef WORKING_DOT_WORD
34 extern CONST int md_short_jump_size;
35 extern CONST int md_long_jump_size;
36 #endif
37
38 #ifndef BFD_ASSEMBLER
39
40 #ifndef MANY_SEGMENTS
41 struct frag *text_frag_root;
42 struct frag *data_frag_root;
43 struct frag *bss_frag_root;
44
45 struct frag *text_last_frag;    /* Last frag in segment. */
46 struct frag *data_last_frag;    /* Last frag in segment. */
47 static struct frag *bss_last_frag;      /* Last frag in segment. */
48 #endif
49
50 #if ! defined (BFD_ASSEMBLER) && ! defined (BFD)
51 static object_headers headers;
52 static char *the_object_file;
53 #endif
54
55 long string_byte_count;
56 char *next_object_file_charP;   /* Tracks object file bytes. */
57
58 #ifndef OBJ_VMS
59 int magic_number_for_object_file = DEFAULT_MAGIC_NUMBER_FOR_OBJECT_FILE;
60 #endif
61
62 #endif /* BFD_ASSEMBLER */
63
64 #ifdef BFD_ASSEMBLER
65 static fixS *fix_new_internal PARAMS ((fragS *, int where, int size,
66                                        symbolS *add, symbolS *sub,
67                                        offsetT offset, int pcrel,
68                                        bfd_reloc_code_real_type r_type));
69 #else
70 static fixS *fix_new_internal PARAMS ((fragS *, int where, int size,
71                                        symbolS *add, symbolS *sub,
72                                        offsetT offset, int pcrel,
73                                        int r_type));
74 #endif
75 #if defined (BFD_ASSEMBLER) || !defined (BFD)
76 static long fixup_segment PARAMS ((fixS * fixP, segT this_segment_type));
77 #endif
78 static relax_addressT relax_align PARAMS ((relax_addressT addr, int align));
79
80 /*
81  *                      fix_new()
82  *
83  * Create a fixS in obstack 'notes'.
84  */
85 static fixS *
86 fix_new_internal (frag, where, size, add_symbol, sub_symbol, offset, pcrel,
87                   r_type)
88      fragS *frag;               /* Which frag? */
89      int where;                 /* Where in that frag? */
90      int size;                  /* 1, 2, or 4 usually. */
91      symbolS *add_symbol;       /* X_add_symbol. */
92      symbolS *sub_symbol;       /* X_op_symbol. */
93      offsetT offset;            /* X_add_number. */
94      int pcrel;                 /* TRUE if PC-relative relocation. */
95 #ifdef BFD_ASSEMBLER
96      bfd_reloc_code_real_type r_type; /* Relocation type */
97 #else
98      int r_type;                /* Relocation type */
99 #endif
100 {
101   fixS *fixP;
102
103   fixP = (fixS *) obstack_alloc (&notes, sizeof (fixS));
104
105   fixP->fx_frag = frag;
106   fixP->fx_where = where;
107   fixP->fx_size = size;
108   fixP->fx_addsy = add_symbol;
109   fixP->fx_subsy = sub_symbol;
110   fixP->fx_offset = offset;
111   fixP->fx_pcrel = pcrel;
112 #if defined(NEED_FX_R_TYPE) || defined (BFD_ASSEMBLER)
113   fixP->fx_r_type = r_type;
114 #endif
115   fixP->fx_im_disp = 0;
116   fixP->fx_pcrel_adjust = 0;
117   fixP->fx_bit_fixP = 0;
118   fixP->fx_addnumber = 0;
119   fixP->tc_fix_data = NULL;
120
121 #ifdef TC_something
122   fixP->fx_bsr = 0;
123 #endif
124 #ifdef TC_I960
125   fixP->fx_callj = 0;
126 #endif
127
128   as_where (&fixP->fx_file, &fixP->fx_line);
129
130   /* Usually, we want relocs sorted numerically, but while
131      comparing to older versions of gas that have relocs
132      reverse sorted, it is convenient to have this compile
133      time option.  xoxorich. */
134
135   {
136
137 #ifdef BFD_ASSEMBLER
138     fixS **seg_fix_rootP = & (seg_info (now_seg)->fix_root);
139     fixS **seg_fix_tailP = & (seg_info (now_seg)->fix_tail);
140 #endif
141
142 #ifdef REVERSE_SORT_RELOCS
143
144     fixP->fx_next = *seg_fix_rootP;
145     *seg_fix_rootP = fixP;
146
147 #else /* REVERSE_SORT_RELOCS */
148
149     fixP->fx_next = NULL;
150
151     if (*seg_fix_tailP)
152       (*seg_fix_tailP)->fx_next = fixP;
153     else
154       *seg_fix_rootP = fixP;
155     *seg_fix_tailP = fixP;
156
157 #endif /* REVERSE_SORT_RELOCS */
158
159   }
160
161   return fixP;
162 }
163
164 /* Create a fixup relative to a symbol (plus a constant).  */
165
166 fixS *
167 fix_new (frag, where, size, add_symbol, offset, pcrel, r_type)
168      fragS *frag;               /* Which frag? */
169      int where;                 /* Where in that frag? */
170      short int size;            /* 1, 2, or 4 usually. */
171      symbolS *add_symbol;       /* X_add_symbol. */
172      offsetT offset;            /* X_add_number. */
173      int pcrel;                 /* TRUE if PC-relative relocation. */
174 #ifdef BFD_ASSEMBLER
175      bfd_reloc_code_real_type r_type; /* Relocation type */
176 #else
177      int r_type;                /* Relocation type */
178 #endif
179 {
180   return fix_new_internal (frag, where, size, add_symbol,
181                            (symbolS *) NULL, offset, pcrel, r_type);
182 }
183
184 /* Create a fixup for an expression.  Currently we only support fixups
185    for difference expressions.  That is itself more than most object
186    file formats support anyhow.  */
187
188 fixS *
189 fix_new_exp (frag, where, size, exp, pcrel, r_type)
190      fragS *frag;               /* Which frag? */
191      int where;                 /* Where in that frag? */
192      short int size;            /* 1, 2, or 4 usually. */
193      expressionS *exp;          /* Expression.  */
194      int pcrel;                 /* TRUE if PC-relative relocation. */
195 #ifdef BFD_ASSEMBLER
196      bfd_reloc_code_real_type r_type; /* Relocation type */
197 #else
198      int r_type;                /* Relocation type */
199 #endif
200 {
201   symbolS *add = NULL;
202   symbolS *sub = NULL;
203   offsetT off = 0;
204   
205   switch (exp->X_op)
206     {
207     case O_absent:
208       break;
209
210     case O_uminus:
211       sub = exp->X_add_symbol;
212       off = exp->X_add_number;
213       break;
214
215     case O_subtract:
216       sub = exp->X_op_symbol;
217       /* Fall through.  */
218     case O_symbol:
219       add = exp->X_add_symbol;
220       /* Fall through.   */
221     case O_constant:
222       off = exp->X_add_number;
223       break;
224       
225     default:
226       as_bad ("expression too complex for fixup");
227     }
228
229   return fix_new_internal (frag, where, size, add, sub, off,
230                            pcrel, r_type);
231 }
232
233 /* Append a string onto another string, bumping the pointer along.  */
234 void
235 append (charPP, fromP, length)
236      char **charPP;
237      char *fromP;
238      unsigned long length;
239 {
240   /* Don't trust memcpy() of 0 chars. */
241   if (length == 0)
242     return;
243
244   memcpy (*charPP, fromP, length);
245   *charPP += length;
246 }
247
248 #ifndef BFD_ASSEMBLER 
249 int section_alignment[SEG_MAXIMUM_ORDINAL];
250 #endif
251
252 /*
253  * This routine records the largest alignment seen for each segment.
254  * If the beginning of the segment is aligned on the worst-case
255  * boundary, all of the other alignments within it will work.  At
256  * least one object format really uses this info.
257  */
258 void 
259 record_alignment (seg, align)
260      /* Segment to which alignment pertains */
261      segT seg;
262      /* Alignment, as a power of 2 (e.g., 1 => 2-byte boundary, 2 => 4-byte
263         boundary, etc.)  */
264      int align;
265 {
266 #ifdef BFD_ASSEMBLER
267   if (align > bfd_get_section_alignment (stdoutput, seg))
268     bfd_set_section_alignment (stdoutput, seg, align);
269 #else
270   if (align > section_alignment[(int) seg])
271     section_alignment[(int) seg] = align;
272 #endif
273 }
274
275 #if defined (BFD_ASSEMBLER) || ! defined (BFD)
276
277 static fragS *
278 chain_frchains_together_1 (section, frchp)
279      segT section;
280      struct frchain *frchp;
281 {
282   fragS dummy, *prev_frag = &dummy;
283   for (; frchp && frchp->frch_seg == section; frchp = frchp->frch_next)
284     {
285       prev_frag->fr_next = frchp->frch_root;
286       prev_frag = frchp->frch_last;
287     }
288   prev_frag->fr_next = 0;
289   return prev_frag;
290 }
291
292 #endif
293
294 #ifdef BFD_ASSEMBLER
295
296 static void
297 chain_frchains_together (abfd, section, xxx)
298      bfd *abfd;                 /* unused */
299      segT section;
300      char *xxx;                 /* unused */
301 {
302   segment_info_type *info;
303
304   /* BFD may have introduced its own sections without using
305      subseg_new, so it is possible that seg_info is NULL.  */
306   info = seg_info (section);
307   if (info != (segment_info_type *) NULL)
308     chain_frchains_together_1 (section, info->frchainP);
309 }
310
311 #endif
312
313 #if !defined (BFD) && !defined (BFD_ASSEMBLER)
314
315 void 
316 remove_subsegs (head, seg, root, last)
317      frchainS *head;
318      int seg;
319      fragS **root;
320      fragS **last;
321 {
322   *root = head->frch_root;
323   *last = chain_frchains_together_1 (seg, head);
324 }
325
326 #endif /* BFD */
327
328 #if defined (BFD_ASSEMBLER) || !defined (BFD)
329
330 #ifdef BFD_ASSEMBLER
331 static void
332 cvt_frag_to_fill (sec, fragP)
333      segT sec;
334      fragS *fragP;
335 #else
336 static void
337 cvt_frag_to_fill (headers, fragP)
338      object_headers *headers;
339      fragS *fragP;
340 #endif
341 {
342   switch (fragP->fr_type)
343     {
344     case rs_align:
345     case rs_org:
346 #ifdef HANDLE_ALIGN
347       HANDLE_ALIGN (fragP);
348 #endif
349       fragP->fr_type = rs_fill;
350       know (fragP->fr_var == 1);
351       know (fragP->fr_next != NULL);
352
353       fragP->fr_offset = (fragP->fr_next->fr_address
354                           - fragP->fr_address
355                           - fragP->fr_fix);
356       break;
357
358     case rs_fill:
359       break;
360
361     case rs_machine_dependent:
362 #ifdef BFD_ASSEMBLER
363       md_convert_frag (stdoutput, sec, fragP);
364 #else
365       md_convert_frag (headers, fragP);
366 #endif
367
368       assert (fragP->fr_next == NULL || (fragP->fr_next->fr_address - fragP->fr_address == fragP->fr_fix));
369
370       /*
371        * After md_convert_frag, we make the frag into a ".space 0".
372        * Md_convert_frag() should set up any fixSs and constants
373        * required.
374        */
375       frag_wane (fragP);
376       break;
377
378 #ifndef WORKING_DOT_WORD
379     case rs_broken_word:
380       {
381         struct broken_word *lie;
382
383         if (fragP->fr_subtype)
384           {
385             fragP->fr_fix += md_short_jump_size;
386             for (lie = (struct broken_word *) (fragP->fr_symbol);
387                  lie && lie->dispfrag == fragP;
388                  lie = lie->next_broken_word)
389               if (lie->added == 1)
390                 fragP->fr_fix += md_long_jump_size;
391           }
392         frag_wane (fragP);
393       }
394       break;
395 #endif
396
397     default:
398       BAD_CASE (fragP->fr_type);
399       break;
400     }
401 }
402
403 #endif /* defined (BFD_ASSEMBLER) || !defined (BFD) */
404
405 #ifdef BFD_ASSEMBLER
406 static void
407 relax_and_size_seg (abfd, sec, xxx)
408      bfd *abfd;
409      asection *sec;
410      char *xxx;
411 {
412   flagword flags;
413   fragS *fragp;
414   segment_info_type *seginfo;
415   int x;
416   valueT size, newsize;
417
418   flags = bfd_get_section_flags (abfd, sec);
419
420   seginfo = (segment_info_type *) bfd_get_section_userdata (abfd, sec);
421   if (seginfo && seginfo->frchainP)
422     {
423       relax_segment (seginfo->frchainP->frch_root, sec);
424       for (fragp = seginfo->frchainP->frch_root; fragp; fragp = fragp->fr_next)
425         cvt_frag_to_fill (sec, fragp);
426       for (fragp = seginfo->frchainP->frch_root;
427            fragp->fr_next;
428            fragp = fragp->fr_next)
429         /* walk to last elt */;
430       size = fragp->fr_address + fragp->fr_fix;
431     }
432   else
433     size = 0;
434   if (size > 0)
435     {
436       flags |= SEC_HAS_CONTENTS;
437       /* @@ This is just an approximation.  */
438       if (seginfo->fix_root)
439         flags |= SEC_RELOC;
440       else
441         flags &= ~SEC_RELOC;
442       x = bfd_set_section_flags (abfd, sec, flags);
443       assert (x == true);
444     }
445   newsize = md_section_align (sec, size);
446   x = bfd_set_section_size (abfd, sec, newsize);
447   assert (x == true);
448
449   /* If the size had to be rounded up, add some padding in the last
450      non-empty frag.  */
451   assert (newsize >= size);
452   if (size != newsize)
453     {
454       fragS *last = seginfo->frchainP->frch_last;
455       fragp = seginfo->frchainP->frch_root;
456       while (fragp->fr_next != last)
457         fragp = fragp->fr_next;
458       last->fr_address = size;
459       fragp->fr_offset += newsize - size;
460     }
461
462 #ifdef tc_frob_section
463   tc_frob_section (sec);
464 #endif
465 #ifdef obj_frob_section
466   obj_frob_section (sec);
467 #endif
468 }
469
470 #ifdef DEBUG2
471 static void
472 dump_section_relocs (abfd, sec, stream_)
473      bfd *abfd;
474      asection *sec;
475      char *stream_;
476 {
477   FILE *stream = (FILE *) stream_;
478   segment_info_type *seginfo = seg_info (sec);
479   fixS *fixp = seginfo->fix_root;
480
481   if (!fixp)
482     return;
483
484   fprintf (stream, "sec %s relocs:\n", sec->name);
485   while (fixp)
486     {
487       symbolS *s = fixp->fx_addsy;
488       if (s)
489         fprintf (stream, "  %08x: %s(%s+%x)+%x\n", fixp,
490                  S_GET_NAME (s), s->bsym->section->name,
491                  S_GET_VALUE (s), fixp->fx_offset);
492       else
493         fprintf (stream, "  %08x: type %d no sym\n", fixp, fixp->fx_r_type);
494       fixp = fixp->fx_next;
495     }
496 }
497 #else
498 #define dump_section_relocs(ABFD,SEC,STREAM)    (void)(ABFD,SEC,STREAM)
499 #endif
500
501 static void
502 adjust_reloc_syms (abfd, sec, xxx)
503      bfd *abfd;
504      asection *sec;
505      char *xxx;
506 {
507   segment_info_type *seginfo = seg_info (sec);
508   fixS *fixp;
509
510   if (seginfo == NULL)
511     return;
512
513   dump_section_relocs (abfd, sec, stderr);
514
515   for (fixp = seginfo->fix_root; fixp; fixp = fixp->fx_next)
516     if (fixp->fx_addsy)
517       {
518         symbolS *sym = fixp->fx_addsy;
519         asection *symsec = sym->bsym->section;
520         segment_info_type *symseginfo = seg_info (symsec);
521
522         /* If it's one of these sections, assume the symbol is definitely
523            going to be output.  */
524         if (symsec == &bfd_und_section
525             || symsec == &bfd_abs_section
526             || bfd_is_com_section (symsec))
527           {
528             fixp->fx_addsy->sy_used_in_reloc = 1;
529             continue;
530           }
531
532         /* Since we're reducing to section symbols, don't attempt to reduce
533            anything that's already using one.  */
534         if (sym->bsym == symsec->symbol)
535           {
536             fixp->fx_addsy->sy_used_in_reloc = 1;
537             continue;
538           }
539
540         /* Is there some other reason we can't adjust this one?  (E.g.,
541            call/bal links in i960-bout symbols.)  */
542 #ifdef obj_fix_adjustable
543         if (! obj_fix_adjustable (fixp))
544           {
545             fixp->fx_addsy->sy_used_in_reloc = 1;
546             continue;
547           }
548 #endif
549
550         /* Is there some other (target cpu dependent) reason we can't adjust
551            this one?  (E.g. relocations involving function addresses on 
552            the PA.  */
553 #ifdef tc_fix_adjustable
554         if (! tc_fix_adjustable (fixp))
555           {
556             fixp->fx_addsy->sy_used_in_reloc = 1;
557             continue;
558           }
559 #endif
560
561         /* If the section symbol isn't going to be output, the relocs
562            at least should still work.  If not, figure out what to do
563            when we run into that case.  */
564         fixp->fx_offset += S_GET_VALUE (sym);
565         if (sym->sy_frag)
566           fixp->fx_offset += sym->sy_frag->fr_address;
567         if (symseginfo->sym)
568           fixp->fx_addsy = symseginfo->sym;
569         else
570           {
571             fixp->fx_addsy = symbol_find (symsec->name);
572             if (!fixp->fx_addsy)
573               {
574                 fixp->fx_addsy = symbol_make (symsec->name);
575                 fixp->fx_addsy->bsym = symsec->symbol;
576               }
577             symseginfo->sym = fixp->fx_addsy;
578           }
579         fixp->fx_addsy->sy_used_in_reloc = 1;
580       }
581
582   dump_section_relocs (abfd, sec, stderr);
583 }
584
585 static void
586 write_relocs (abfd, sec, xxx)
587      bfd *abfd;
588      asection *sec;
589      char *xxx;
590 {
591   segment_info_type *seginfo = seg_info (sec);
592   int i;
593   unsigned int n;
594   arelent **relocs;
595   fixS *fixp;
596
597   /* If seginfo is NULL, we did not create this section; don't do
598      anything with it.  */
599   if (seginfo == NULL)
600     return;
601
602   fixup_segment (seginfo->fix_root, sec);
603
604   n = 0;
605   for (fixp = seginfo->fix_root; fixp; fixp = fixp->fx_next)
606     n++;
607
608 #ifndef RELOC_EXPANSION_POSSIBLE
609   /* Set up reloc information as well.  */
610   relocs = (arelent **) bfd_alloc_by_size_t (stdoutput,
611                                              n * sizeof (arelent *));
612   memset ((char*)relocs, 0, n * sizeof (arelent*));
613
614   i = 0;
615   for (fixp = seginfo->fix_root; fixp != (fixS *) NULL; fixp = fixp->fx_next)
616     {
617       arelent *reloc;
618       char *data;
619       bfd_reloc_status_type s;
620
621       if (fixp->fx_addsy == 0)
622         {
623           /* @@ Need some other flag to indicate which have already
624              been performed...  */
625           n--;
626           continue;
627         }
628       reloc = tc_gen_reloc (sec, fixp);
629       if (!reloc)
630         {
631           n--;
632           continue;
633         }
634       data = fixp->fx_frag->fr_literal + fixp->fx_where;
635       if (fixp->fx_where + fixp->fx_size
636           > fixp->fx_frag->fr_fix + fixp->fx_frag->fr_offset)
637         abort ();
638       /* Pass bogus address so that when bfd_perform_relocation adds
639          `address' back in, it'll come up with `data', which is where
640          we want it to operate.  */
641       if (reloc->howto->partial_inplace == false
642           && reloc->howto->pcrel_offset == true
643           && reloc->howto->pc_relative == true)
644         {
645           /* bfd_perform_relocation screws this up */
646           reloc->addend += reloc->address;
647         }
648       s = bfd_perform_relocation (stdoutput, reloc, data - reloc->address,
649                                   sec, stdoutput);
650       switch (s)
651         {
652         case bfd_reloc_ok:
653           break;
654         default:
655           as_fatal ("bad return from bfd_perform_relocation");
656         }
657       relocs[i++] = reloc;
658     }
659 #else
660   n = n * MAX_RELOC_EXPANSION;
661   /* Set up reloc information as well.  */
662   relocs = (arelent **) bfd_alloc_by_size_t (stdoutput,
663                                              n * sizeof (arelent *));
664
665   i = 0;
666   for (fixp = seginfo->fix_root; fixp != (fixS *) NULL; fixp = fixp->fx_next)
667     {
668       arelent **reloc;
669       char *data;
670       bfd_reloc_status_type s;
671       int j;
672
673       if (fixp->fx_addsy == 0)
674         {
675           /* @@ Need some other flag to indicate which have already
676              been performed...  */
677           n--;
678           continue;
679         }
680       reloc = tc_gen_reloc (sec, fixp);
681
682       for (j = 0; reloc[j]; j++)
683         {
684           relocs[i++] = reloc[j];
685           assert(i <= n);
686         }
687       data = fixp->fx_frag->fr_literal + fixp->fx_where;
688       if (fixp->fx_where + fixp->fx_size
689           > fixp->fx_frag->fr_fix + fixp->fx_frag->fr_offset)
690         abort ();
691       for (j = 0; reloc[j]; j++)
692         {
693           s = bfd_perform_relocation (stdoutput, reloc[j], data - reloc[j]->address,
694                                       sec, stdoutput);
695           switch (s)
696             {
697               case bfd_reloc_ok:
698                 break;
699               default:
700                 as_fatal ("bad return from bfd_perform_relocation");
701             }
702         }
703     }
704   n = i;
705 #endif
706
707   if (n)
708     bfd_set_reloc (stdoutput, sec, relocs, n);
709   else
710     bfd_set_section_flags (abfd, sec,
711                            (bfd_get_section_flags (abfd, sec)
712                             & (flagword) ~SEC_RELOC));
713 #ifdef DEBUG2
714   {
715     int i;
716     arelent *r;
717     asymbol *s;
718     fprintf (stderr, "relocs for sec %s\n", sec->name);
719     for (i = 0; i < n; i++)
720       {
721         r = relocs[i];
722         s = *r->sym_ptr_ptr;
723         fprintf (stderr, "  reloc %2d @%08x off %4x : sym %-10s addend %x\n",
724                  i, r, r->address, s->name, r->addend);
725       }
726   }
727 #endif
728 }
729
730 static void
731 write_contents (abfd, sec, xxx)
732      bfd *abfd;
733      asection *sec;
734      char *xxx;
735 {
736   segment_info_type *seginfo = seg_info (sec);
737   unsigned long offset = 0;
738   fragS *f;
739
740   /* Write out the frags.  */
741   if (seginfo == NULL
742       || ! (bfd_get_section_flags (abfd, sec) & SEC_HAS_CONTENTS))
743     return;
744
745   for (f = seginfo->frchainP->frch_root;
746        f;
747        f = f->fr_next)
748     {
749       int x;
750       unsigned long fill_size;
751       char *fill_literal;
752       long count;
753
754       assert (f->fr_type == rs_fill);
755       if (f->fr_fix)
756         {
757           x = bfd_set_section_contents (stdoutput, sec,
758                                         f->fr_literal, (file_ptr) offset,
759                                         (bfd_size_type) f->fr_fix);
760           assert (x == true);
761           offset += f->fr_fix;
762         }
763       fill_literal = f->fr_literal + f->fr_fix;
764       fill_size = f->fr_var;
765       count = f->fr_offset;
766       assert (count >= 0);
767       if (fill_size && count)
768         while (count--)
769           {
770             x = bfd_set_section_contents (stdoutput, sec,
771                                           fill_literal, (file_ptr) offset,
772                                           (bfd_size_type) fill_size);
773             assert (x == true);
774             offset += fill_size;
775           }
776     }
777 }
778 #endif
779
780 #if defined(BFD_ASSEMBLER) || (!defined (BFD) && !defined(OBJ_AOUT))
781 static void
782 merge_data_into_text ()
783 {
784 #if defined(BFD_ASSEMBLER) || defined(MANY_SEGMENTS)
785   seg_info (text_section)->frchainP->frch_last->fr_next =
786     seg_info (data_section)->frchainP->frch_root;
787   seg_info (text_section)->frchainP->frch_last =
788     seg_info (data_section)->frchainP->frch_last;
789   seg_info (data_section)->frchainP = 0;
790 #else
791   fixS *tmp;
792
793   text_last_frag->fr_next = data_frag_root;
794   text_last_frag = data_last_frag;
795   data_last_frag = NULL;
796   data_frag_root = NULL;
797   if (text_fix_root)
798     {
799       for (tmp = text_fix_root; tmp->fx_next; tmp = tmp->fx_next);;
800       tmp->fx_next = data_fix_root;
801       text_fix_tail = data_fix_tail;
802     }
803   else
804     text_fix_root = data_fix_root;
805   data_fix_root = NULL;
806 #endif
807 }
808 #endif /* BFD_ASSEMBLER || (! BFD && ! OBJ_AOUT) */
809
810 #if !defined (BFD_ASSEMBLER) && !defined (BFD)
811 static void
812 relax_and_size_all_segments ()
813 {
814   fragS *fragP;
815
816   relax_segment (text_frag_root, SEG_TEXT);
817   relax_segment (data_frag_root, SEG_DATA);
818   relax_segment (bss_frag_root, SEG_BSS);
819   /*
820    * Now the addresses of frags are correct within the segment.
821    */
822
823   know (text_last_frag->fr_type == rs_fill && text_last_frag->fr_offset == 0);
824   H_SET_TEXT_SIZE (&headers, text_last_frag->fr_address);
825   text_last_frag->fr_address = H_GET_TEXT_SIZE (&headers);
826
827   /*
828    * Join the 2 segments into 1 huge segment.
829    * To do this, re-compute every rn_address in the SEG_DATA frags.
830    * Then join the data frags after the text frags.
831    *
832    * Determine a_data [length of data segment].
833    */
834   if (data_frag_root)
835     {
836       register relax_addressT slide;
837
838       know ((text_last_frag->fr_type == rs_fill) && (text_last_frag->fr_offset == 0));
839
840       H_SET_DATA_SIZE (&headers, data_last_frag->fr_address);
841       data_last_frag->fr_address = H_GET_DATA_SIZE (&headers);
842       slide = H_GET_TEXT_SIZE (&headers);       /* & in file of the data segment. */
843 #ifdef OBJ_BOUT
844 #define RoundUp(N,S) (((N)+(S)-1)&-(S))
845       /* For b.out: If the data section has a strict alignment
846          requirement, its load address in the .o file will be
847          rounded up from the size of the text section.  These
848          two values are *not* the same!  Similarly for the bss
849          section....  */
850       slide = RoundUp (slide, 1 << section_alignment[SEG_DATA]);
851 #endif
852
853       for (fragP = data_frag_root; fragP; fragP = fragP->fr_next)
854         {
855           fragP->fr_address += slide;
856         }                       /* for each data frag */
857
858       know (text_last_frag != 0);
859       text_last_frag->fr_next = data_frag_root;
860     }
861   else
862     {
863       H_SET_DATA_SIZE (&headers, 0);
864     }
865
866 #ifdef OBJ_BOUT
867   /* See above comments on b.out data section address.  */
868   {
869     long bss_vma;
870     if (data_last_frag == 0)
871       bss_vma = H_GET_TEXT_SIZE (&headers);
872     else
873       bss_vma = data_last_frag->fr_address;
874     bss_vma = RoundUp (bss_vma, 1 << section_alignment[SEG_BSS]);
875     bss_address_frag.fr_address = bss_vma;
876   }
877 #else /* ! OBJ_BOUT */
878   bss_address_frag.fr_address = (H_GET_TEXT_SIZE (&headers) +
879                                  H_GET_DATA_SIZE (&headers));
880
881 #endif /* ! OBJ_BOUT */
882
883   /* Slide all the frags */
884   if (bss_frag_root)
885     {
886       relax_addressT slide = bss_address_frag.fr_address;
887
888       for (fragP = bss_frag_root; fragP; fragP = fragP->fr_next)
889         {
890           fragP->fr_address += slide;
891         }                       /* for each bss frag */
892     }
893
894   if (bss_last_frag)
895     H_SET_BSS_SIZE (&headers,
896                     bss_last_frag->fr_address - bss_frag_root->fr_address);
897   else
898     H_SET_BSS_SIZE (&headers, 0);
899 }
900 #endif /* ! BFD_ASSEMBLER && ! BFD */
901
902 #if defined (BFD_ASSEMBLER) || !defined (BFD)
903
904 void 
905 write_object_file ()
906 {
907   register struct frchain *frchainP;    /* Track along all frchains. */
908 #if ! defined (BFD_ASSEMBLER) || ! defined (WORKING_DOT_WORD)
909   register fragS *fragP;        /* Track along all frags. */
910 #endif
911 #if !defined (BFD_ASSEMBLER) && !defined (OBJ_VMS)
912   long object_file_size;
913 #endif
914
915   /* Do we really want to write it?  */
916   {
917     int n_warns, n_errs;
918     n_warns = had_warnings ();
919     n_errs = had_errors ();
920     /* The -Z flag indicates that an object file should be generated,
921        regardless of warnings and errors.  */
922     if (flagseen['Z'])
923       {
924         if (n_warns || n_errs)
925           as_warn ("%d error%s, %d warning%s, generating bad object file.\n",
926                    n_errs, n_errs == 1 ? "" : "s",
927                    n_warns, n_warns == 1 ? "" : "s");
928       }
929     else
930       {
931         if (n_errs)
932           as_fatal ("%d error%s, %d warning%s, no object file generated.\n",
933                     n_errs, n_errs == 1 ? "" : "s",
934                     n_warns, n_warns == 1 ? "" : "s");
935       }
936   }
937
938 #ifdef  OBJ_VMS
939   /*
940    *    Under VMS we try to be compatible with VAX-11 "C".  Thus, we
941    *    call a routine to check for the definition of the procedure
942    *    "_main", and if so -- fix it up so that it can be program
943    *    entry point.
944    */
945   VMS_Check_For_Main ();
946 #endif /* VMS */
947
948   /* After every sub-segment, we fake an ".align ...". This conforms to
949      BSD4.2 brane-damage. We then fake ".fill 0" because that is the kind of
950      frag that requires least thought. ".align" frags like to have a
951      following frag since that makes calculating their intended length
952      trivial.
953
954      @@ Is this really necessary??  */
955 #ifndef SUB_SEGMENT_ALIGN
956 #ifdef BFD_ASSEMBLER
957 #define SUB_SEGMENT_ALIGN(SEG) (0)
958 #else
959 #define SUB_SEGMENT_ALIGN(SEG) (2)
960 #endif
961 #endif
962   for (frchainP = frchain_root; frchainP; frchainP = frchainP->frch_next)
963     {
964       subseg_set (frchainP->frch_seg, frchainP->frch_subseg);
965       frag_align (SUB_SEGMENT_ALIGN (now_seg), NOP_OPCODE);
966       /* frag_align will have left a new frag.
967          Use this last frag for an empty ".fill".
968
969          For this segment ...
970          Create a last frag. Do not leave a "being filled in frag".  */
971       frag_wane (frag_now);
972       frag_now->fr_fix = 0;
973       know (frag_now->fr_next == NULL);
974     }
975
976   /* From now on, we don't care about sub-segments.  Build one frag chain
977      for each segment. Linked thru fr_next.  */
978
979 #ifdef BFD_ASSEMBLER
980   /* Remove the sections created by gas for its own purposes.  */
981   {
982     asection **seclist, *sec;
983     seclist = &stdoutput->sections;
984     while (seclist && *seclist)
985       {
986         sec = *seclist;
987         while (sec == reg_section || sec == expr_section)
988           {
989             sec = sec->next;
990             *seclist = sec;
991             stdoutput->section_count--;
992             if (!sec)
993               break;
994           }
995         if (*seclist)
996           seclist = &(*seclist)->next;
997       }
998   }
999
1000   bfd_map_over_sections (stdoutput, chain_frchains_together, (char *) 0);
1001 #else
1002   remove_subsegs (frchain_root, SEG_TEXT, &text_frag_root, &text_last_frag);
1003   remove_subsegs (data0_frchainP, SEG_DATA, &data_frag_root, &data_last_frag);
1004   remove_subsegs (bss0_frchainP, SEG_BSS, &bss_frag_root, &bss_last_frag);
1005 #endif
1006
1007   /* We have two segments. If user gave -R flag, then we must put the
1008      data frags into the text segment. Do this before relaxing so
1009      we know to take advantage of -R and make shorter addresses.  */
1010 #if !defined (OBJ_AOUT) || defined (BFD_ASSEMBLER)
1011   if (flagseen['R'])
1012     {
1013       merge_data_into_text ();
1014     }
1015 #endif
1016
1017 #ifdef BFD_ASSEMBLER
1018   bfd_map_over_sections (stdoutput, relax_and_size_seg, (char *) 0);
1019 #else
1020   relax_and_size_all_segments ();
1021 #endif /* BFD_ASSEMBLER */
1022
1023 #ifndef BFD_ASSEMBLER
1024   /*
1025    *
1026    * Crawl the symbol chain.
1027    *
1028    * For each symbol whose value depends on a frag, take the address of
1029    * that frag and subsume it into the value of the symbol.
1030    * After this, there is just one way to lookup a symbol value.
1031    * Values are left in their final state for object file emission.
1032    * We adjust the values of 'L' local symbols, even if we do
1033    * not intend to emit them to the object file, because their values
1034    * are needed for fix-ups.
1035    *
1036    * Unless we saw a -L flag, remove all symbols that begin with 'L'
1037    * from the symbol chain.  (They are still pointed to by the fixes.)
1038    *
1039    * Count the remaining symbols.
1040    * Assign a symbol number to each symbol.
1041    * Count the number of string-table chars we will emit.
1042    * Put this info into the headers as appropriate.
1043    *
1044    */
1045   know (zero_address_frag.fr_address == 0);
1046   string_byte_count = sizeof (string_byte_count);
1047
1048   obj_crawl_symbol_chain (&headers);
1049
1050   if (string_byte_count == sizeof (string_byte_count))
1051     string_byte_count = 0;
1052
1053   H_SET_STRING_SIZE (&headers, string_byte_count);
1054
1055   /*
1056    * Addresses of frags now reflect addresses we use in the object file.
1057    * Symbol values are correct.
1058    * Scan the frags, converting any ".org"s and ".align"s to ".fill"s.
1059    * Also converting any machine-dependent frags using md_convert_frag();
1060    */
1061   subseg_change (SEG_TEXT, 0);
1062
1063   for (fragP = text_frag_root; fragP; fragP = fragP->fr_next)
1064     {
1065       cvt_frag_to_fill (&headers, fragP);
1066
1067       /* Some assert macros don't work with # directives mixed in.  */
1068 #ifndef NDEBUG
1069       if (!(fragP->fr_next == NULL
1070 #ifdef OBJ_BOUT
1071             || fragP->fr_next == data_frag_root
1072 #endif
1073             || ((fragP->fr_next->fr_address - fragP->fr_address)
1074                 == (fragP->fr_fix + fragP->fr_offset * fragP->fr_var))))
1075         abort ();
1076 #endif
1077     }
1078 #endif /* ! BFD_ASSEMBLER */
1079
1080 #ifndef WORKING_DOT_WORD
1081   {
1082     struct broken_word *lie;
1083     struct broken_word **prevP;
1084
1085     prevP = &broken_words;
1086     for (lie = broken_words; lie; lie = lie->next_broken_word)
1087       if (!lie->added)
1088         {
1089           expressionS exp;
1090
1091           exp.X_op = O_subtract;
1092           exp.X_add_symbol = lie->add;
1093           exp.X_op_symbol = lie->sub;
1094           exp.X_add_number = lie->addnum;
1095 #ifdef BFD_ASSEMBLER
1096           fix_new_exp (lie->frag,
1097                        lie->word_goes_here - lie->frag->fr_literal,
1098                        2, &exp, 0, BFD_RELOC_NONE);
1099 #else
1100 #if defined(TC_SPARC) || defined(TC_A29K) || defined(NEED_FX_R_TYPE)
1101           fix_new_exp (lie->frag,
1102                        lie->word_goes_here - lie->frag->fr_literal,
1103                        2, &exp, 0, NO_RELOC);
1104 #else
1105 #ifdef TC_NS32K
1106           fix_new_ns32k_exp (lie->frag,
1107                              lie->word_goes_here - lie->frag->fr_literal,
1108                              2, &exp, 0, 0, 2, 0, 0);
1109 #else
1110           fix_new_exp (lie->frag,
1111                        lie->word_goes_here - lie->frag->fr_literal,
1112                        2, &exp, 0, 0);
1113 #endif /* TC_NS32K */
1114 #endif /* TC_SPARC|TC_A29K|NEED_FX_R_TYPE */
1115 #endif /* BFD_ASSEMBLER */
1116           *prevP = lie->next_broken_word;
1117         }
1118       else
1119         prevP = &(lie->next_broken_word);
1120
1121     for (lie = broken_words; lie;)
1122       {
1123         struct broken_word *untruth;
1124         char *table_ptr;
1125         addressT table_addr;
1126         addressT from_addr, to_addr;
1127         int n, m;
1128
1129         fragP = lie->dispfrag;
1130
1131         /* Find out how many broken_words go here.  */
1132         n = 0;
1133         for (untruth = lie; untruth && untruth->dispfrag == fragP; untruth = untruth->next_broken_word)
1134           if (untruth->added == 1)
1135             n++;
1136
1137         table_ptr = lie->dispfrag->fr_opcode;
1138         table_addr = lie->dispfrag->fr_address + (table_ptr - lie->dispfrag->fr_literal);
1139         /* Create the jump around the long jumps.  This is a short
1140            jump from table_ptr+0 to table_ptr+n*long_jump_size.  */
1141         from_addr = table_addr;
1142         to_addr = table_addr + md_short_jump_size + n * md_long_jump_size;
1143         md_create_short_jump (table_ptr, from_addr, to_addr, lie->dispfrag, lie->add);
1144         table_ptr += md_short_jump_size;
1145         table_addr += md_short_jump_size;
1146
1147         for (m = 0; lie && lie->dispfrag == fragP; m++, lie = lie->next_broken_word)
1148           {
1149             if (lie->added == 2)
1150               continue;
1151             /* Patch the jump table */
1152             /* This is the offset from ??? to table_ptr+0 */
1153             to_addr = table_addr - S_GET_VALUE (lie->sub);
1154             md_number_to_chars (lie->word_goes_here, to_addr, 2);
1155             for (untruth = lie->next_broken_word; untruth && untruth->dispfrag == fragP; untruth = untruth->next_broken_word)
1156               {
1157                 if (untruth->use_jump == lie)
1158                   md_number_to_chars (untruth->word_goes_here, to_addr, 2);
1159               }
1160
1161             /* Install the long jump */
1162             /* this is a long jump from table_ptr+0 to the final target */
1163             from_addr = table_addr;
1164             to_addr = S_GET_VALUE (lie->add) + lie->addnum;
1165             md_create_long_jump (table_ptr, from_addr, to_addr, lie->dispfrag, lie->add);
1166             table_ptr += md_long_jump_size;
1167             table_addr += md_long_jump_size;
1168           }
1169       }
1170   }
1171 #endif /* not WORKING_DOT_WORD */
1172
1173 #ifndef BFD_ASSEMBLER
1174 #ifndef OBJ_VMS
1175   {                             /* not vms */
1176     /*
1177      * Scan every FixS performing fixups. We had to wait until now to do
1178      * this because md_convert_frag() may have made some fixSs.
1179      */
1180     int trsize, drsize;
1181
1182     subseg_change (SEG_TEXT, 0);
1183     trsize = md_reloc_size * fixup_segment (text_fix_root, SEG_TEXT);
1184     subseg_change (SEG_DATA, 0);
1185     drsize = md_reloc_size * fixup_segment (data_fix_root, SEG_DATA);
1186     H_SET_RELOCATION_SIZE (&headers, trsize, drsize);
1187
1188     /* FIXME move this stuff into the pre-write-hook */
1189     H_SET_MAGIC_NUMBER (&headers, magic_number_for_object_file);
1190     H_SET_ENTRY_POINT (&headers, 0);
1191
1192     obj_pre_write_hook (&headers);      /* extra coff stuff */
1193
1194     object_file_size = H_GET_FILE_SIZE (&headers);
1195     next_object_file_charP = the_object_file = xmalloc (object_file_size);
1196
1197     output_file_create (out_file_name);
1198
1199     obj_header_append (&next_object_file_charP, &headers);
1200
1201     know ((next_object_file_charP - the_object_file) == H_GET_HEADER_SIZE (&headers));
1202
1203     /*
1204      * Emit code.
1205      */
1206     for (fragP = text_frag_root; fragP; fragP = fragP->fr_next)
1207       {
1208         register long count;
1209         register char *fill_literal;
1210         register long fill_size;
1211
1212         know (fragP->fr_type == rs_fill);
1213         append (&next_object_file_charP, fragP->fr_literal, (unsigned long) fragP->fr_fix);
1214         fill_literal = fragP->fr_literal + fragP->fr_fix;
1215         fill_size = fragP->fr_var;
1216         know (fragP->fr_offset >= 0);
1217
1218         for (count = fragP->fr_offset; count; count--)
1219           {
1220             append (&next_object_file_charP, fill_literal, (unsigned long) fill_size);
1221           }                     /* for each  */
1222
1223       }                         /* for each code frag. */
1224
1225     know ((next_object_file_charP - the_object_file) == (H_GET_HEADER_SIZE (&headers) + H_GET_TEXT_SIZE (&headers) + H_GET_DATA_SIZE (&headers)));
1226
1227     /*
1228      * Emit relocations.
1229      */
1230     obj_emit_relocations (&next_object_file_charP, text_fix_root, (relax_addressT) 0);
1231     know ((next_object_file_charP - the_object_file) == (H_GET_HEADER_SIZE (&headers) + H_GET_TEXT_SIZE (&headers) + H_GET_DATA_SIZE (&headers) + H_GET_TEXT_RELOCATION_SIZE (&headers)));
1232 #ifdef TC_I960
1233     /* Make addresses in data relocation directives relative to beginning of
1234      * first data fragment, not end of last text fragment:  alignment of the
1235      * start of the data segment may place a gap between the segments.
1236      */
1237     obj_emit_relocations (&next_object_file_charP, data_fix_root, data0_frchainP->frch_root->fr_address);
1238 #else /* TC_I960 */
1239     obj_emit_relocations (&next_object_file_charP, data_fix_root, text_last_frag->fr_address);
1240 #endif /* TC_I960 */
1241
1242     know ((next_object_file_charP - the_object_file) == (H_GET_HEADER_SIZE (&headers) + H_GET_TEXT_SIZE (&headers) + H_GET_DATA_SIZE (&headers) + H_GET_TEXT_RELOCATION_SIZE (&headers) + H_GET_DATA_RELOCATION_SIZE (&headers)));
1243
1244     /*
1245      * Emit line number entries.
1246      */
1247     OBJ_EMIT_LINENO (&next_object_file_charP, lineno_rootP, the_object_file);
1248     know ((next_object_file_charP - the_object_file) == (H_GET_HEADER_SIZE (&headers) + H_GET_TEXT_SIZE (&headers) + H_GET_DATA_SIZE (&headers) + H_GET_TEXT_RELOCATION_SIZE (&headers) + H_GET_DATA_RELOCATION_SIZE (&headers) + H_GET_LINENO_SIZE (&headers)));
1249
1250     /*
1251      * Emit symbols.
1252      */
1253     obj_emit_symbols (&next_object_file_charP, symbol_rootP);
1254     know ((next_object_file_charP - the_object_file) == (H_GET_HEADER_SIZE (&headers) + H_GET_TEXT_SIZE (&headers) + H_GET_DATA_SIZE (&headers) + H_GET_TEXT_RELOCATION_SIZE (&headers) + H_GET_DATA_RELOCATION_SIZE (&headers) + H_GET_LINENO_SIZE (&headers) + H_GET_SYMBOL_TABLE_SIZE (&headers)));
1255
1256     /*
1257      * Emit strings.
1258      */
1259
1260     if (string_byte_count > 0)
1261       {
1262         obj_emit_strings (&next_object_file_charP);
1263       }                         /* only if we have a string table */
1264
1265 #ifdef BFD_HEADERS
1266     bfd_seek (stdoutput, 0, 0);
1267     bfd_write (the_object_file, 1, object_file_size, stdoutput);
1268 #else
1269
1270     /* Write the data to the file */
1271     output_file_append (the_object_file, object_file_size, out_file_name);
1272 #endif
1273
1274     output_file_close (out_file_name);
1275   }                             /* non vms output */
1276 #else /* VMS */
1277   /*
1278    *    Now do the VMS-dependent part of writing the object file
1279    */
1280   VMS_write_object_file (H_GET_TEXT_SIZE (&headers),
1281                          H_GET_DATA_SIZE (&headers),
1282                          H_GET_BSS_SIZE (&headers),
1283                          text_frag_root, data_frag_root);
1284 #endif /* VMS */
1285 #else /* BFD_ASSEMBLER */
1286
1287 #ifdef obj_check_file_symbols
1288   obj_check_file_symbols ();
1289 #endif
1290
1291   bfd_map_over_sections (stdoutput, adjust_reloc_syms, (char *)0);
1292
1293   /* Set up symbol table, and write it out.  */
1294   if (symbol_rootP)
1295     {
1296       unsigned int i = 0;
1297       unsigned int n;
1298       symbolS *symp;
1299
1300       for (symp = symbol_rootP; symp; symp = symbol_next (symp))
1301         {
1302           if (! symp->sy_resolved)
1303             {
1304               if (symp->sy_value.X_op == O_constant)
1305                 {
1306                   /* This is the normal case; skip the call.  */
1307                   S_SET_VALUE (symp,
1308                                (S_GET_VALUE (symp)
1309                                 + symp->sy_frag->fr_address));
1310                   symp->sy_resolved = 1;
1311                 }
1312               else
1313                 resolve_symbol_value (symp);
1314             }
1315
1316           /* So far, common symbols have been treated like undefined symbols.
1317              Put them in the common section now.  */
1318           if (S_IS_DEFINED (symp) == 0
1319               && S_GET_VALUE (symp) != 0)
1320             S_SET_SEGMENT (symp, &bfd_com_section);
1321 #if 0
1322           printf ("symbol `%s'\n\t@%x: value=%d flags=%x seg=%s\n",
1323                   S_GET_NAME (symp), symp,
1324                   S_GET_VALUE (symp),
1325                   symp->bsym->flags,
1326                   segment_name (symp->bsym->section));
1327 #endif
1328           if (! symp->sy_used_in_reloc)
1329             {
1330 #ifdef obj_frob_symbol
1331               {
1332                 int punt = 0;
1333                 obj_frob_symbol (symp, punt);
1334                 if (punt)
1335                   goto punt_it;
1336               }
1337 #endif
1338 #ifdef tc_frob_symbol
1339               {
1340                 int punt = 0;
1341                 tc_frob_symbol (symp, punt);
1342                 if (punt)
1343                   goto punt_it;
1344               }
1345 #endif
1346             }
1347
1348           /* If we don't want to keep this symbol, splice it out of the
1349              chain now.  */
1350           if (! symp->sy_used_in_reloc
1351               && S_IS_LOCAL (symp))
1352             {
1353               symbolS *prev, *next;
1354 #if defined (obj_frob_symbol) || defined (tc_frob_symbol)
1355             punt_it:
1356 #endif
1357               prev = symbol_previous (symp);
1358               next = symbol_next (symp);
1359 #ifdef DEBUG_SYMS
1360               verify_symbol_chain_2 (symp);
1361 #endif
1362               if (prev)
1363                 {
1364                   symbol_next (prev) = next;
1365                   symp = prev;
1366                 }
1367               else if (symp == symbol_rootP)
1368                 symbol_rootP = next;
1369               else
1370                 abort ();
1371               if (next)
1372                 symbol_previous (next) = prev;
1373               else
1374                 symbol_lastP = prev;
1375 #ifdef DEBUG_SYMS
1376               if (prev)
1377                 verify_symbol_chain_2 (prev);
1378               else if (next)
1379                 verify_symbol_chain_2 (next);
1380 #endif
1381               continue;
1382             }
1383
1384           /* Make sure we really got a value for the symbol.  */
1385           if (! symp->sy_resolved)
1386             {
1387               as_bad ("can't resolve value for symbol \"%s\"",
1388                       S_GET_NAME (symp));
1389               symp->sy_resolved = 1;
1390             }
1391
1392           /* Set the value into the BFD symbol.  Up til now the value
1393              has only been kept in the gas symbolS struct.  */
1394           symp->bsym->value = S_GET_VALUE (symp);
1395
1396           i++;
1397         }
1398       n = i;
1399       if (n)
1400         {
1401           asymbol **asympp;
1402           boolean result;
1403           extern PTR bfd_alloc PARAMS ((bfd *, size_t));
1404
1405           asympp = (asymbol **) bfd_alloc (stdoutput,
1406                                            n * sizeof (asymbol *));
1407           symp = symbol_rootP;
1408           for (i = 0; i < n; i++, symp = symbol_next (symp))
1409             {
1410               asympp[i] = symp->bsym;
1411               symp->written = 1;
1412             }
1413           result = bfd_set_symtab (stdoutput, asympp, n);
1414           assert (result == true);
1415         }
1416     }
1417
1418
1419 #ifdef obj_frob_file
1420   /* If obj_frob_file changes the symbol value at this point, it is
1421      responsible for moving the changed value into symp->bsym->value
1422      as well.  Hopefully all symbol value changing can be done in
1423      {obj,tc}_frob_symbol.  */
1424   obj_frob_file ();
1425 #endif
1426
1427   /* Now that all the sizes are known, and contents correct, we can
1428      start writing the file.  */
1429   bfd_map_over_sections (stdoutput, write_relocs, (char *) 0);
1430
1431   bfd_map_over_sections (stdoutput, write_contents, (char *) 0);
1432
1433   output_file_close (out_file_name);
1434 #endif /* BFD_ASSEMBLER */
1435 }
1436 #endif /* ! BFD */
1437
1438 /*
1439  *                      relax_segment()
1440  *
1441  * Now we have a segment, not a crowd of sub-segments, we can make fr_address
1442  * values.
1443  *
1444  * Relax the frags.
1445  *
1446  * After this, all frags in this segment have addresses that are correct
1447  * within the segment. Since segments live in different file addresses,
1448  * these frag addresses may not be the same as final object-file addresses.
1449  */
1450
1451 /* Subroutines of relax_segment.  */
1452 static int 
1453 is_dnrange (f1, f2)
1454      struct frag *f1;
1455      struct frag *f2;
1456 {
1457   for (; f1; f1 = f1->fr_next)
1458     if (f1->fr_next == f2)
1459       return 1;
1460   return 0;
1461 }
1462
1463 /* Relax_align. Advance location counter to next address that has 'alignment'
1464    lowest order bits all 0s, return size of adjustment made.  */
1465 static relax_addressT
1466 relax_align (address, alignment)
1467      register relax_addressT address;   /* Address now. */
1468      register int alignment;    /* Alignment (binary). */
1469 {
1470   relax_addressT mask;
1471   relax_addressT new_address;
1472
1473   mask = ~((~0) << alignment);
1474   new_address = (address + mask) & (~mask);
1475   if (linkrelax)
1476     /* We must provide lots of padding, so the linker can discard it
1477        when needed.  The linker will not add extra space, ever.  */
1478     new_address += (1 << alignment);
1479   return (new_address - address);
1480 }
1481
1482 void 
1483 relax_segment (segment_frag_root, segment)
1484      struct frag *segment_frag_root;
1485      segT segment;
1486 {
1487   register struct frag *fragP;
1488   register relax_addressT address;
1489 #if !defined (MANY_SEGMENTS) && !defined (BFD_ASSEMBLER)
1490   know (segment == SEG_DATA || segment == SEG_TEXT || segment == SEG_BSS);
1491 #endif
1492   /* In case md_estimate_size_before_relax() wants to make fixSs. */
1493   subseg_change (segment, 0);
1494
1495   /* For each frag in segment: count and store  (a 1st guess of)
1496      fr_address.  */
1497   address = 0;
1498   for (fragP = segment_frag_root; fragP; fragP = fragP->fr_next)
1499     {
1500       fragP->fr_address = address;
1501       address += fragP->fr_fix;
1502
1503       switch (fragP->fr_type)
1504         {
1505         case rs_fill:
1506           address += fragP->fr_offset * fragP->fr_var;
1507           break;
1508
1509         case rs_align:
1510           address += relax_align (address, (int) fragP->fr_offset);
1511           break;
1512
1513         case rs_org:
1514           /* Assume .org is nugatory. It will grow with 1st relax.  */
1515           break;
1516
1517         case rs_machine_dependent:
1518           address += md_estimate_size_before_relax (fragP, segment);
1519           break;
1520
1521 #ifndef WORKING_DOT_WORD
1522           /* Broken words don't concern us yet */
1523         case rs_broken_word:
1524           break;
1525 #endif
1526
1527         default:
1528           BAD_CASE (fragP->fr_type);
1529           break;
1530         }                       /* switch(fr_type) */
1531     }                           /* for each frag in the segment */
1532
1533   /* Do relax().  */
1534   {
1535     long stretch;       /* May be any size, 0 or negative. */
1536     /* Cumulative number of addresses we have */
1537     /* relaxed this pass. */
1538     /* We may have relaxed more than one address. */
1539     long stretched;     /* Have we stretched on this pass? */
1540     /* This is 'cuz stretch may be zero, when, in fact some piece of code
1541        grew, and another shrank.  If a branch instruction doesn't fit anymore,
1542        we could be scrod.  */
1543
1544     do
1545       {
1546         stretch = stretched = 0;
1547         for (fragP = segment_frag_root; fragP; fragP = fragP->fr_next)
1548           {
1549             long growth = 0;
1550             unsigned long was_address;
1551             long offset;
1552             symbolS *symbolP;
1553             long target;
1554             long after;
1555
1556             was_address = fragP->fr_address;
1557             address = fragP->fr_address += stretch;
1558             symbolP = fragP->fr_symbol;
1559             offset = fragP->fr_offset;
1560
1561             switch (fragP->fr_type)
1562               {
1563               case rs_fill:     /* .fill never relaxes. */
1564                 growth = 0;
1565                 break;
1566
1567 #ifndef WORKING_DOT_WORD
1568                 /* JF:  This is RMS's idea.  I do *NOT* want to be blamed
1569                    for it I do not want to write it.  I do not want to have
1570                    anything to do with it.  This is not the proper way to
1571                    implement this misfeature.  */
1572               case rs_broken_word:
1573                 {
1574                   struct broken_word *lie;
1575                   struct broken_word *untruth;
1576
1577                   /* Yes this is ugly (storing the broken_word pointer
1578                      in the symbol slot).  Still, this whole chunk of
1579                      code is ugly, and I don't feel like doing anything
1580                      about it.  Think of it as stubbornness in action.  */
1581                   growth = 0;
1582                   for (lie = (struct broken_word *) (fragP->fr_symbol);
1583                        lie && lie->dispfrag == fragP;
1584                        lie = lie->next_broken_word)
1585                     {
1586
1587                       if (lie->added)
1588                         continue;
1589
1590                       offset = (lie->add->sy_frag->fr_address
1591                                 + S_GET_VALUE (lie->add)
1592                                 + lie->addnum
1593                                 - (lie->sub->sy_frag->fr_address
1594                                    + S_GET_VALUE (lie->sub)));
1595                       if (offset <= -32768 || offset >= 32767)
1596                         {
1597                           if (flagseen['K'])
1598                             {
1599                               char buf[50];
1600                               sprint_value (buf, (addressT) lie->addnum);
1601                               as_warn (".word %s-%s+%s didn't fit",
1602                                        S_GET_NAME (lie->add),
1603                                        S_GET_NAME (lie->sub),
1604                                        buf);
1605                             }
1606                           lie->added = 1;
1607                           if (fragP->fr_subtype == 0)
1608                             {
1609                               fragP->fr_subtype++;
1610                               growth += md_short_jump_size;
1611                             }
1612                           for (untruth = lie->next_broken_word;
1613                                untruth && untruth->dispfrag == lie->dispfrag;
1614                                untruth = untruth->next_broken_word)
1615                             if ((untruth->add->sy_frag == lie->add->sy_frag)
1616                                 && S_GET_VALUE (untruth->add) == S_GET_VALUE (lie->add))
1617                               {
1618                                 untruth->added = 2;
1619                                 untruth->use_jump = lie;
1620                               }
1621                           growth += md_long_jump_size;
1622                         }
1623                     }
1624
1625                   break;
1626                 }               /* case rs_broken_word */
1627 #endif
1628               case rs_align:
1629                 growth = (relax_align ((relax_addressT) (address
1630                                                          + fragP->fr_fix),
1631                                        (int) offset)
1632                           - relax_align ((relax_addressT) (was_address
1633                                                            + fragP->fr_fix),
1634                                          (int) offset));
1635                 break;
1636
1637               case rs_org:
1638                 target = offset;
1639
1640                 if (symbolP)
1641                   {
1642 #if !defined (MANY_SEGMENTS) && !defined (BFD_ASSEMBLER)
1643                     know ((S_GET_SEGMENT (symbolP) == SEG_ABSOLUTE)
1644                           || (S_GET_SEGMENT (symbolP) == SEG_DATA)
1645                           || (S_GET_SEGMENT (symbolP) == SEG_TEXT)
1646                           || S_GET_SEGMENT (symbolP) == SEG_BSS);
1647                     know (symbolP->sy_frag);
1648                     know (!(S_GET_SEGMENT (symbolP) == SEG_ABSOLUTE)
1649                           || (symbolP->sy_frag == &zero_address_frag));
1650 #endif
1651                     target += S_GET_VALUE (symbolP)
1652                       + symbolP->sy_frag->fr_address;
1653                   }             /* if we have a symbol */
1654
1655                 know (fragP->fr_next);
1656                 after = fragP->fr_next->fr_address;
1657                 growth = ((target - after) > 0) ? (target - after) : 0;
1658                 /* Growth may be negative, but variable part of frag
1659                    cannot have fewer than 0 chars.  That is, we can't
1660                    .org backwards. */
1661
1662                 growth -= stretch;      /* This is an absolute growth factor */
1663                 break;
1664
1665               case rs_machine_dependent:
1666                 {
1667                   const relax_typeS *this_type;
1668                   const relax_typeS *start_type;
1669                   relax_substateT next_state;
1670                   relax_substateT this_state;
1671                   long aim;
1672
1673                   this_state = fragP->fr_subtype;
1674                   start_type = this_type = md_relax_table + this_state;
1675                   target = offset;
1676
1677                   if (symbolP)
1678                     {
1679 #ifndef DIFF_EXPR_OK
1680 #if !defined (MANY_SEGMENTS) && !defined (BFD_ASSEMBLER)
1681                       know ((S_GET_SEGMENT (symbolP) == SEG_ABSOLUTE)
1682                             || (S_GET_SEGMENT (symbolP) == SEG_DATA)
1683                             || (S_GET_SEGMENT (symbolP) == SEG_BSS)
1684                             || (S_GET_SEGMENT (symbolP) == SEG_TEXT));
1685 #endif
1686                       know (symbolP->sy_frag);
1687 #endif
1688                       know (!(S_GET_SEGMENT (symbolP) == absolute_section)
1689                             || symbolP->sy_frag == &zero_address_frag);
1690                       target +=
1691                         S_GET_VALUE (symbolP)
1692                         + symbolP->sy_frag->fr_address;
1693
1694                       /* If frag has yet to be reached on this pass,
1695                          assume it will move by STRETCH just as we did.
1696                          If this is not so, it will be because some frag
1697                          between grows, and that will force another pass.
1698
1699                          Beware zero-length frags.
1700
1701                          There should be a faster way to do this.  */
1702
1703                       if (symbolP->sy_frag->fr_address >= was_address
1704                           && is_dnrange (fragP, symbolP->sy_frag))
1705                         {
1706                           target += stretch;
1707                         }
1708                     }
1709
1710                   aim = target - address - fragP->fr_fix;
1711                   /* The displacement is affected by the instruction size
1712                      for the 32k architecture. I think we ought to be able
1713                      to add fragP->fr_pcrel_adjust in all cases (it should be
1714                      zero if not used), but just in case it breaks something
1715                      else we'll put this inside #ifdef NS32K ... #endif  */
1716 #ifndef TC_NS32K
1717                   if (fragP->fr_pcrel_adjust)
1718                     abort ();
1719 #endif
1720                   aim += fragP->fr_pcrel_adjust;
1721
1722                   if (aim < 0)
1723                     {
1724                       /* Look backwards. */
1725                       for (next_state = this_type->rlx_more; next_state;)
1726                         if (aim >= this_type->rlx_backward)
1727                           next_state = 0;
1728                         else
1729                           {
1730                             /* Grow to next state. */
1731                             this_state = next_state;
1732                             this_type = md_relax_table + this_state;
1733                             next_state = this_type->rlx_more;
1734                           }
1735                     }
1736                   else
1737                     {
1738 #ifdef M68K_AIM_KLUDGE
1739                       M68K_AIM_KLUDGE (aim, this_state, this_type);
1740 #endif
1741                       /* Look forwards. */
1742                       for (next_state = this_type->rlx_more; next_state;)
1743                         if (aim <= this_type->rlx_forward)
1744                           next_state = 0;
1745                         else
1746                           {
1747                             /* Grow to next state. */
1748                             this_state = next_state;
1749                             this_type = md_relax_table + this_state;
1750                             next_state = this_type->rlx_more;
1751                           }
1752                     }
1753
1754                   growth = this_type->rlx_length - start_type->rlx_length;
1755                   if (growth != 0)
1756                     fragP->fr_subtype = this_state;
1757                 }
1758                 break;
1759
1760               default:
1761                 BAD_CASE (fragP->fr_type);
1762                 break;
1763               }
1764             if (growth)
1765               {
1766                 stretch += growth;
1767                 stretched++;
1768               }
1769           }                     /* For each frag in the segment. */
1770       }
1771     while (stretched);          /* Until nothing further to relax. */
1772   }                             /* do_relax */
1773
1774   /*
1775    * We now have valid fr_address'es for each frag.
1776    */
1777
1778   /*
1779    * All fr_address's are correct, relative to their own segment.
1780    * We have made all the fixS we will ever make.
1781    */
1782 }                               /* relax_segment() */
1783
1784 #if defined (BFD_ASSEMBLER) || !defined (BFD)
1785
1786 /* fixup_segment()
1787
1788    Go through all the fixS's in a segment and see which ones can be
1789    handled now.  (These consist of fixS where we have since discovered
1790    the value of a symbol, or the address of the frag involved.)
1791    For each one, call md_apply_fix to put the fix into the frag data.
1792
1793    Result is a count of how many relocation structs will be needed to
1794    handle the remaining fixS's that we couldn't completely handle here.
1795    These will be output later by emit_relocations().  */
1796
1797 static long
1798 fixup_segment (fixP, this_segment_type)
1799      register fixS *fixP;
1800      segT this_segment_type;    /* N_TYPE bits for segment. */
1801 {
1802   register long seg_reloc_count;
1803   register symbolS *add_symbolP;
1804   register symbolS *sub_symbolP;
1805   valueT add_number;
1806   register int size;
1807   register char *place;
1808   register long where;
1809   register char pcrel;
1810   register fragS *fragP;
1811   register segT add_symbol_segment = absolute_section;
1812
1813   seg_reloc_count = 0;
1814   /* If the linker is doing the relaxing, we must not do any fixups.  */
1815   /* Well, strictly speaking that's not true -- we could do any that
1816      are PC-relative and don't cross regions that could change size.
1817      And for the i960 (the only machine for which we've got a relaxing
1818      linker right now), we might be able to turn callx/callj into bal
1819      in cases where we know the maximum displacement.  */
1820   if (linkrelax)
1821     for (; fixP; fixP = fixP->fx_next)
1822       seg_reloc_count++;
1823   else
1824     for (; fixP; fixP = fixP->fx_next)
1825       {
1826         fragP = fixP->fx_frag;
1827         know (fragP);
1828         where = fixP->fx_where;
1829         place = fragP->fr_literal + where;
1830         size = fixP->fx_size;
1831         add_symbolP = fixP->fx_addsy;
1832 #ifdef TC_I960
1833         if (fixP->fx_callj && TC_S_IS_CALLNAME (add_symbolP))
1834           {
1835             /* Relocation should be done via the associated 'bal'
1836                entry point symbol. */
1837
1838             if (!TC_S_IS_BALNAME (tc_get_bal_of_call (add_symbolP)))
1839               {
1840                 as_bad ("No 'bal' entry point for leafproc %s",
1841                         S_GET_NAME (add_symbolP));
1842                 continue;
1843               }
1844             fixP->fx_addsy = add_symbolP = tc_get_bal_of_call (add_symbolP);
1845           }
1846 #endif
1847         sub_symbolP = fixP->fx_subsy;
1848         add_number = fixP->fx_offset;
1849         pcrel = fixP->fx_pcrel;
1850
1851         if (add_symbolP)
1852           add_symbol_segment = S_GET_SEGMENT (add_symbolP);
1853
1854         if (sub_symbolP)
1855           {
1856             if (!add_symbolP)
1857               {
1858                 /* Its just -sym */
1859                 /* @@ Should try converting to pcrel ref to fixed addr.  */
1860                 if (S_GET_SEGMENT (sub_symbolP) != absolute_section)
1861                   as_bad ("Negative of non-absolute symbol %s",
1862                           S_GET_NAME (sub_symbolP));
1863
1864                 add_number -= S_GET_VALUE (sub_symbolP);
1865               }
1866             else if ((S_GET_SEGMENT (sub_symbolP) == add_symbol_segment)
1867                      && (SEG_NORMAL (add_symbol_segment)
1868                          || (add_symbol_segment == absolute_section)))
1869               {
1870                 /* Difference of 2 symbols from same segment.
1871                    Can't make difference of 2 undefineds: 'value' means
1872                    something different for N_UNDF. */
1873 #ifdef TC_I960
1874                 /* Makes no sense to use the difference of 2 arbitrary symbols
1875                    as the target of a call instruction.  */
1876                 if (fixP->fx_callj)
1877                   {
1878                     as_bad ("callj to difference of 2 symbols");
1879                   }
1880 #endif /* TC_I960 */
1881                 add_number += S_GET_VALUE (add_symbolP) -
1882                   S_GET_VALUE (sub_symbolP);
1883
1884                 add_symbolP = NULL;
1885                 fixP->fx_addsy = NULL;
1886               }
1887 #if !defined(SEG_DIFF_ALLOWED) && !defined (GLOBAL_DIFF_ALLOWED)
1888             else
1889               {
1890                 /* Different segments in subtraction. */
1891                 know (!(S_IS_EXTERNAL (sub_symbolP)
1892                         && (S_GET_SEGMENT (sub_symbolP) == absolute_section)));
1893
1894                 if ((S_GET_SEGMENT (sub_symbolP) == absolute_section))
1895                   {
1896                     add_number -= S_GET_VALUE (sub_symbolP);
1897                   }
1898 #ifdef DIFF_EXPR_OK
1899                 else if (!pcrel
1900                          && S_GET_SEGMENT (sub_symbolP) == this_segment_type)
1901                   {
1902                     /* Make it pc-relative.  */
1903                     add_number += (md_pcrel_from (fixP)
1904                                    - S_GET_VALUE (sub_symbolP));
1905                     pcrel = 1;
1906                     fixP->fx_pcrel = 1;
1907                     sub_symbolP = 0;
1908                     fixP->fx_subsy = 0;
1909                   }
1910 #endif
1911                 else
1912                   {
1913                     char buf[50];
1914                     sprint_value (buf, fragP->fr_address + where);
1915                     as_bad ("Can't emit reloc {- %s-seg symbol \"%s\"} @ file address %s.",
1916                             segment_name (S_GET_SEGMENT (sub_symbolP)),
1917                             S_GET_NAME (sub_symbolP), buf);
1918                   }
1919               }
1920 #else
1921               else
1922                 {
1923                   seg_reloc_count++;
1924                   fixP->fx_addnumber = add_number;      /* Remember value for emit_reloc */
1925                   continue;
1926                 }               /* if absolute */
1927 #endif
1928           }
1929
1930         if (add_symbolP)
1931           {
1932             if (add_symbol_segment == this_segment_type && pcrel)
1933               {
1934                 /*
1935                  * This fixup was made when the symbol's segment was
1936                  * SEG_UNKNOWN, but it is now in the local segment.
1937                  * So we know how to do the address without relocation.
1938                  */
1939 #ifdef TC_I960
1940                 /* reloc_callj() may replace a 'call' with a 'calls' or a
1941                    'bal', in which cases it modifies *fixP as appropriate.
1942                    In the case of a 'calls', no further work is required,
1943                    and *fixP has been set up to make the rest of the code
1944                    below a no-op. */
1945                 reloc_callj (fixP);
1946 #endif /* TC_I960 */
1947
1948                 add_number += S_GET_VALUE (add_symbolP);
1949                 add_number -= md_pcrel_from (fixP);
1950                 pcrel = 0;      /* Lie. Don't want further pcrel processing. */
1951 #ifndef TC_HPPA
1952                 fixP->fx_addsy = NULL;  /* No relocations please. */
1953 #endif
1954               }
1955             else
1956               {
1957                 if (add_symbol_segment == absolute_section)
1958                   {
1959 #ifdef TC_I960
1960                     /* See comment about reloc_callj() above.  */
1961                     reloc_callj (fixP);
1962 #endif /* TC_I960 */
1963                     add_number += S_GET_VALUE (add_symbolP);
1964                     fixP->fx_addsy = NULL;
1965                     add_symbolP = NULL;
1966                   }
1967                 else if (add_symbol_segment == undefined_section
1968 #ifdef BFD_ASSEMBLER
1969                          || bfd_is_com_section (add_symbol_segment)
1970 #endif
1971                          )
1972                   {
1973 #ifdef TC_I960
1974                     if ((int) fixP->fx_bit_fixP == 13)
1975                       {
1976                         /* This is a COBR instruction.  They have only a
1977                          * 13-bit displacement and are only to be used
1978                          * for local branches: flag as error, don't generate
1979                          * relocation.
1980                          */
1981                         as_bad ("can't use COBR format with external label");
1982                         fixP->fx_addsy = NULL;  /* No relocations please. */
1983                         continue;
1984                       }         /* COBR */
1985 #endif /* TC_I960 */
1986
1987 #ifdef OBJ_COFF
1988 #ifdef TE_I386AIX
1989                     if (S_IS_COMMON (add_symbolP))
1990                       add_number += S_GET_VALUE (add_symbolP);
1991 #endif /* TE_I386AIX */
1992 #endif /* OBJ_COFF */
1993                     ++seg_reloc_count;
1994                   }
1995                 else
1996                   {
1997                     seg_reloc_count++;
1998                     add_number += S_GET_VALUE (add_symbolP);
1999                   }
2000               }
2001           }
2002
2003         if (pcrel)
2004           {
2005             add_number -= md_pcrel_from (fixP);
2006             if (add_symbolP == 0)
2007               {
2008                 fixP->fx_addsy = &abs_symbol;
2009                 ++seg_reloc_count;
2010               }                 /* if there's an add_symbol */
2011           }                     /* if pcrel */
2012
2013         if (!fixP->fx_bit_fixP && size > 0)
2014           {
2015             valueT mask = 0;
2016             /* set all bits to one */
2017             mask--;
2018             /* Technically speaking, combining these produces an
2019                undefined result if size is sizeof (valueT), though I
2020                think these two half-way operations should both be
2021                defined.  */
2022             mask <<= size * 4;
2023             mask <<= size * 4;
2024             if ((add_number & mask) != 0
2025                 && (add_number & mask) != mask)
2026               {
2027                 char buf[50], buf2[50];
2028                 sprint_value (buf, fragP->fr_address + where);
2029                 if (add_number > 1000)
2030                   sprint_value (buf2, add_number);
2031                 else
2032                   sprintf (buf2, "%ld", (long) add_number);
2033                 as_bad_where (fixP->fx_file, fixP->fx_line,
2034                               "Value of %s too large for field of %d bytes at %s",
2035                               buf2, size, buf);
2036               }                 /* generic error checking */
2037 #ifdef WARN_SIGNED_OVERFLOW_WORD
2038             /* Warn if a .word value is too large when treated as a signed
2039                number.  We already know it is not too negative.  This is to
2040                catch over-large switches generated by gcc on the 68k.  */
2041             if (!flagseen['J']
2042                 && size == 2
2043                 && add_number > 0x7fff)
2044               as_bad_where (fixP->fx_file, fixP->fx_line,
2045                             "Signed .word overflow; switch may be too large; %ld at 0x%lx",
2046                             (long) add_number,
2047                             (unsigned long) (fragP->fr_address + where));
2048 #endif
2049           }                     /* not a bit fix */
2050
2051 #ifdef BFD_ASSEMBLER
2052         md_apply_fix (fixP, &add_number);
2053 #else
2054         md_apply_fix (fixP, add_number);
2055 #endif
2056       }                         /* For each fixS in this segment. */
2057
2058 #if defined (OBJ_COFF) && defined (TC_I960)
2059   {
2060     fixS *topP = fixP;
2061
2062     /* two relocs per callj under coff. */
2063     for (fixP = topP; fixP; fixP = fixP->fx_next)
2064       if (fixP->fx_callj && fixP->fx_addsy != 0)
2065         ++seg_reloc_count;
2066   }
2067 #endif /* OBJ_COFF && TC_I960 */
2068
2069   return (seg_reloc_count);
2070 }
2071
2072 #endif /* defined (BFD_ASSEMBLER) || !defined (BFD) */
2073
2074 /* end of write.c */