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