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