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