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