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