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