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