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