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