xref: /netbsd/external/gpl3/binutils/dist/gas/write.c (revision e072ec67)
1 /* write.c - emit .o file
2    Copyright (C) 1986-2022 Free Software Foundation, Inc.
3 
4    This file is part of GAS, the GNU Assembler.
5 
6    GAS is free software; you can redistribute it and/or modify
7    it under the terms of the GNU General Public License as published by
8    the Free Software Foundation; either version 3, or (at your option)
9    any later version.
10 
11    GAS is distributed in the hope that it will be useful,
12    but WITHOUT ANY WARRANTY; without even the implied warranty of
13    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14    GNU General Public License for more details.
15 
16    You should have received a copy of the GNU General Public License
17    along with GAS; see the file COPYING.  If not, write to the Free
18    Software Foundation, 51 Franklin Street - Fifth Floor, Boston, MA
19    02110-1301, USA.  */
20 
21 /* This thing should be set up to do byte ordering correctly.  But...  */
22 
23 #include "as.h"
24 #include "subsegs.h"
25 #include "obstack.h"
26 #include "output-file.h"
27 #include "dwarf2dbg.h"
28 #include "compress-debug.h"
29 
30 #ifndef TC_FORCE_RELOCATION
31 #define TC_FORCE_RELOCATION(FIX)		\
32   (generic_force_reloc (FIX))
33 #endif
34 
35 #ifndef TC_FORCE_RELOCATION_ABS
36 #define TC_FORCE_RELOCATION_ABS(FIX)		\
37   (TC_FORCE_RELOCATION (FIX))
38 #endif
39 
40 #define GENERIC_FORCE_RELOCATION_LOCAL(FIX)	\
41   (!(FIX)->fx_pcrel				\
42    || TC_FORCE_RELOCATION (FIX))
43 #ifndef TC_FORCE_RELOCATION_LOCAL
44 #define TC_FORCE_RELOCATION_LOCAL GENERIC_FORCE_RELOCATION_LOCAL
45 #endif
46 
47 #define GENERIC_FORCE_RELOCATION_SUB_SAME(FIX, SEG)	\
48   (!SEG_NORMAL (SEG))
49 #ifndef TC_FORCE_RELOCATION_SUB_SAME
50 #define TC_FORCE_RELOCATION_SUB_SAME GENERIC_FORCE_RELOCATION_SUB_SAME
51 #endif
52 
53 #ifndef md_register_arithmetic
54 # define md_register_arithmetic 1
55 #endif
56 
57 #ifndef TC_FORCE_RELOCATION_SUB_ABS
58 #define TC_FORCE_RELOCATION_SUB_ABS(FIX, SEG)	\
59   (!md_register_arithmetic && (SEG) == reg_section)
60 #endif
61 
62 #ifndef TC_FORCE_RELOCATION_SUB_LOCAL
63 #ifdef DIFF_EXPR_OK
64 #define TC_FORCE_RELOCATION_SUB_LOCAL(FIX, SEG)	\
65   (!md_register_arithmetic && (SEG) == reg_section)
66 #else
67 #define TC_FORCE_RELOCATION_SUB_LOCAL(FIX, SEG)	1
68 #endif
69 #endif
70 
71 #ifndef TC_VALIDATE_FIX_SUB
72 #define TC_VALIDATE_FIX_SUB(FIX, SEG) 0
73 #endif
74 
75 #ifndef TC_LINKRELAX_FIXUP
76 #define TC_LINKRELAX_FIXUP(SEG) 1
77 #endif
78 
79 #ifndef MD_APPLY_SYM_VALUE
80 #define MD_APPLY_SYM_VALUE(FIX) 1
81 #endif
82 
83 #ifndef TC_FINALIZE_SYMS_BEFORE_SIZE_SEG
84 #define TC_FINALIZE_SYMS_BEFORE_SIZE_SEG 1
85 #endif
86 
87 #ifndef	MD_PCREL_FROM_SECTION
88 #define MD_PCREL_FROM_SECTION(FIX, SEC) md_pcrel_from (FIX)
89 #endif
90 
91 #ifndef TC_FAKE_LABEL
92 #define TC_FAKE_LABEL(NAME) (strcmp ((NAME), FAKE_LABEL_NAME) == 0)
93 #endif
94 
95 /* Positive values of TC_FX_SIZE_SLACK allow a target to define
96    fixups that far past the end of a frag.  Having such fixups
97    is of course most most likely a bug in setting fx_size correctly.
98    A negative value disables the fixup check entirely, which is
99    appropriate for something like the Renesas / SuperH SH_COUNT
100    reloc.  */
101 #ifndef TC_FX_SIZE_SLACK
102 #define TC_FX_SIZE_SLACK(FIX) 0
103 #endif
104 
105 /* Used to control final evaluation of expressions.  */
106 int finalize_syms = 0;
107 
108 int symbol_table_frozen;
109 
110 symbolS *abs_section_sym;
111 
112 /* Remember the value of dot when parsing expressions.  */
113 addressT dot_value;
114 
115 /* The frag that dot_value is based from.  */
116 fragS *dot_frag;
117 
118 /* Relocs generated by ".reloc" pseudo.  */
119 struct reloc_list* reloc_list;
120 
121 void print_fixup (fixS *);
122 
123 /* We generally attach relocs to frag chains.  However, after we have
124    chained these all together into a segment, any relocs we add after
125    that must be attached to a segment.  This will include relocs added
126    in md_estimate_size_for_relax, for example.  */
127 static int frags_chained = 0;
128 
129 static int n_fixups;
130 
131 #define RELOC_ENUM enum bfd_reloc_code_real
132 
133 /* Create a fixS in obstack 'notes'.  */
134 
135 static fixS *
fix_new_internal(fragS * frag,unsigned long where,unsigned long size,symbolS * add_symbol,symbolS * sub_symbol,offsetT offset,int pcrel,RELOC_ENUM r_type,int at_beginning)136 fix_new_internal (fragS *frag,		/* Which frag?  */
137 		  unsigned long where,	/* Where in that frag?  */
138 		  unsigned long size,	/* 1, 2, or 4 usually.  */
139 		  symbolS *add_symbol,	/* X_add_symbol.  */
140 		  symbolS *sub_symbol,	/* X_op_symbol.  */
141 		  offsetT offset,	/* X_add_number.  */
142 		  int pcrel,		/* TRUE if PC-relative relocation.  */
143 		  RELOC_ENUM r_type	/* Relocation type.  */,
144 		  int at_beginning)	/* Add to the start of the list?  */
145 {
146   fixS *fixP;
147 
148   n_fixups++;
149 
150   fixP = (fixS *) obstack_alloc (&notes, sizeof (fixS));
151 
152   fixP->fx_frag = frag;
153   fixP->fx_where = where;
154   fixP->fx_size = size;
155   /* We've made fx_size a narrow field; check that it's wide enough.  */
156   if (fixP->fx_size != size)
157     {
158       as_bad (_("field fx_size too small to hold %lu"), size);
159       abort ();
160     }
161   fixP->fx_addsy = add_symbol;
162   fixP->fx_subsy = sub_symbol;
163   fixP->fx_offset = offset;
164   fixP->fx_dot_value = dot_value;
165   fixP->fx_dot_frag = dot_frag;
166   fixP->fx_pcrel = pcrel;
167   fixP->fx_r_type = r_type;
168   fixP->fx_pcrel_adjust = 0;
169   fixP->fx_addnumber = 0;
170   fixP->fx_tcbit = 0;
171   fixP->fx_tcbit2 = 0;
172   fixP->fx_done = 0;
173   fixP->fx_no_overflow = 0;
174   fixP->fx_signed = 0;
175 
176 #ifdef USING_CGEN
177   fixP->fx_cgen.insn = NULL;
178   fixP->fx_cgen.opinfo = 0;
179 #endif
180 
181 #ifdef TC_FIX_TYPE
182   TC_INIT_FIX_DATA (fixP);
183 #endif
184 
185   fixP->fx_file = as_where (&fixP->fx_line);
186 
187   {
188 
189     fixS **seg_fix_rootP = (frags_chained
190 			    ? &seg_info (now_seg)->fix_root
191 			    : &frchain_now->fix_root);
192     fixS **seg_fix_tailP = (frags_chained
193 			    ? &seg_info (now_seg)->fix_tail
194 			    : &frchain_now->fix_tail);
195 
196     if (at_beginning)
197       {
198 	fixP->fx_next = *seg_fix_rootP;
199 	*seg_fix_rootP = fixP;
200 	if (fixP->fx_next == NULL)
201 	  *seg_fix_tailP = fixP;
202       }
203     else
204       {
205 	fixP->fx_next = NULL;
206 	if (*seg_fix_tailP)
207 	  (*seg_fix_tailP)->fx_next = fixP;
208 	else
209 	  *seg_fix_rootP = fixP;
210 	*seg_fix_tailP = fixP;
211       }
212   }
213 
214   return fixP;
215 }
216 
217 /* Create a fixup relative to a symbol (plus a constant).  */
218 
219 fixS *
fix_new(fragS * frag,unsigned long where,unsigned long size,symbolS * add_symbol,offsetT offset,int pcrel,RELOC_ENUM r_type)220 fix_new (fragS *frag,			/* Which frag?  */
221 	 unsigned long where,		/* Where in that frag?  */
222 	 unsigned long size,		/* 1, 2, or 4 usually.  */
223 	 symbolS *add_symbol,		/* X_add_symbol.  */
224 	 offsetT offset,		/* X_add_number.  */
225 	 int pcrel,			/* TRUE if PC-relative relocation.  */
226 	 RELOC_ENUM r_type		/* Relocation type.  */)
227 {
228   return fix_new_internal (frag, where, size, add_symbol,
229 			   (symbolS *) NULL, offset, pcrel, r_type, false);
230 }
231 
232 /* Create a fixup for an expression.  Currently we only support fixups
233    for difference expressions.  That is itself more than most object
234    file formats support anyhow.  */
235 
236 fixS *
fix_new_exp(fragS * frag,unsigned long where,unsigned long size,expressionS * exp,int pcrel,RELOC_ENUM r_type)237 fix_new_exp (fragS *frag,		/* Which frag?  */
238 	     unsigned long where,	/* Where in that frag?  */
239 	     unsigned long size,	/* 1, 2, or 4 usually.  */
240 	     expressionS *exp,		/* Expression.  */
241 	     int pcrel,			/* TRUE if PC-relative relocation.  */
242 	     RELOC_ENUM r_type		/* Relocation type.  */)
243 {
244   symbolS *add = NULL;
245   symbolS *sub = NULL;
246   offsetT off = 0;
247 
248   switch (exp->X_op)
249     {
250     case O_absent:
251       break;
252 
253     case O_register:
254       as_bad (_("register value used as expression"));
255       break;
256 
257     case O_add:
258       /* This comes up when _GLOBAL_OFFSET_TABLE_+(.-L0) is read, if
259 	 the difference expression cannot immediately be reduced.  */
260       {
261 	symbolS *stmp = make_expr_symbol (exp);
262 
263 	exp->X_op = O_symbol;
264 	exp->X_op_symbol = 0;
265 	exp->X_add_symbol = stmp;
266 	exp->X_add_number = 0;
267 
268 	return fix_new_exp (frag, where, size, exp, pcrel, r_type);
269       }
270 
271     case O_symbol_rva:
272       add = exp->X_add_symbol;
273       off = exp->X_add_number;
274       r_type = BFD_RELOC_RVA;
275       break;
276 
277     case O_uminus:
278       sub = exp->X_add_symbol;
279       off = exp->X_add_number;
280       break;
281 
282     case O_subtract:
283       sub = exp->X_op_symbol;
284       /* Fall through.  */
285     case O_symbol:
286       add = exp->X_add_symbol;
287       /* Fall through.  */
288     case O_constant:
289       off = exp->X_add_number;
290       break;
291 
292     default:
293       add = make_expr_symbol (exp);
294       break;
295     }
296 
297   return fix_new_internal (frag, where, size, add, sub, off, pcrel,
298 			   r_type, false);
299 }
300 
301 /* Create a fixup at the beginning of FRAG.  The arguments are the same
302    as for fix_new, except that WHERE is implicitly 0.  */
303 
304 fixS *
fix_at_start(fragS * frag,unsigned long size,symbolS * add_symbol,offsetT offset,int pcrel,RELOC_ENUM r_type)305 fix_at_start (fragS *frag, unsigned long size, symbolS *add_symbol,
306 	      offsetT offset, int pcrel, RELOC_ENUM r_type)
307 {
308   return fix_new_internal (frag, 0, size, add_symbol,
309 			   (symbolS *) NULL, offset, pcrel, r_type, true);
310 }
311 
312 /* Generic function to determine whether a fixup requires a relocation.  */
313 int
generic_force_reloc(fixS * fix)314 generic_force_reloc (fixS *fix)
315 {
316   if (fix->fx_r_type == BFD_RELOC_VTABLE_INHERIT
317       || fix->fx_r_type == BFD_RELOC_VTABLE_ENTRY)
318     return 1;
319 
320   if (fix->fx_addsy == NULL)
321     return 0;
322 
323   return S_FORCE_RELOC (fix->fx_addsy, fix->fx_subsy == NULL);
324 }
325 
326 /* Append a string onto another string, bumping the pointer along.  */
327 void
append(char ** charPP,char * fromP,unsigned long length)328 append (char **charPP, char *fromP, unsigned long length)
329 {
330   /* Don't trust memcpy() of 0 chars.  */
331   if (length == 0)
332     return;
333 
334   memcpy (*charPP, fromP, length);
335   *charPP += length;
336 }
337 
338 /* This routine records the largest alignment seen for each segment.
339    If the beginning of the segment is aligned on the worst-case
340    boundary, all of the other alignments within it will work.  At
341    least one object format really uses this info.  */
342 
343 void
record_alignment(segT seg,unsigned int align)344 record_alignment (/* Segment to which alignment pertains.  */
345 		  segT seg,
346 		  /* Alignment, as a power of 2 (e.g., 1 => 2-byte
347 		     boundary, 2 => 4-byte boundary, etc.)  */
348 		  unsigned int align)
349 {
350   if (seg == absolute_section)
351     return;
352 
353   if (align > bfd_section_alignment (seg))
354     bfd_set_section_alignment (seg, align);
355 }
356 
357 int
get_recorded_alignment(segT seg)358 get_recorded_alignment (segT seg)
359 {
360   if (seg == absolute_section)
361     return 0;
362 
363   return bfd_section_alignment (seg);
364 }
365 
366 /* Reset the section indices after removing the gas created sections.  */
367 
368 static void
renumber_sections(bfd * abfd ATTRIBUTE_UNUSED,asection * sec,void * countparg)369 renumber_sections (bfd *abfd ATTRIBUTE_UNUSED, asection *sec, void *countparg)
370 {
371   int *countp = (int *) countparg;
372 
373   sec->index = *countp;
374   ++*countp;
375 }
376 
377 static fragS *
chain_frchains_together_1(segT section,struct frchain * frchp)378 chain_frchains_together_1 (segT section, struct frchain *frchp)
379 {
380   fragS dummy, *prev_frag = &dummy;
381   fixS fix_dummy, *prev_fix = &fix_dummy;
382 
383   for (; frchp; frchp = frchp->frch_next)
384     {
385       prev_frag->fr_next = frchp->frch_root;
386       prev_frag = frchp->frch_last;
387       gas_assert (prev_frag->fr_type != 0);
388       if (frchp->fix_root != (fixS *) NULL)
389 	{
390 	  if (seg_info (section)->fix_root == (fixS *) NULL)
391 	    seg_info (section)->fix_root = frchp->fix_root;
392 	  prev_fix->fx_next = frchp->fix_root;
393 	  seg_info (section)->fix_tail = frchp->fix_tail;
394 	  prev_fix = frchp->fix_tail;
395 	}
396     }
397   gas_assert (prev_frag != &dummy
398 	      && prev_frag->fr_type != 0);
399   prev_frag->fr_next = 0;
400   return prev_frag;
401 }
402 
403 static void
chain_frchains_together(bfd * abfd ATTRIBUTE_UNUSED,segT section,void * xxx ATTRIBUTE_UNUSED)404 chain_frchains_together (bfd *abfd ATTRIBUTE_UNUSED,
405 			 segT section,
406 			 void *xxx ATTRIBUTE_UNUSED)
407 {
408   segment_info_type *info;
409 
410   /* BFD may have introduced its own sections without using
411      subseg_new, so it is possible that seg_info is NULL.  */
412   info = seg_info (section);
413   if (info != (segment_info_type *) NULL)
414     info->frchainP->frch_last
415       = chain_frchains_together_1 (section, info->frchainP);
416 
417   /* Now that we've chained the frags together, we must add new fixups
418      to the segment, not to the frag chain.  */
419   frags_chained = 1;
420 }
421 
422 static void
cvt_frag_to_fill(segT sec ATTRIBUTE_UNUSED,fragS * fragP)423 cvt_frag_to_fill (segT sec ATTRIBUTE_UNUSED, fragS *fragP)
424 {
425   switch (fragP->fr_type)
426     {
427     case rs_space_nop:
428       goto skip_align;
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     skip_align:
438       know (fragP->fr_next != NULL);
439       fragP->fr_offset = (fragP->fr_next->fr_address
440 			  - fragP->fr_address
441 			  - fragP->fr_fix) / fragP->fr_var;
442       if (fragP->fr_offset < 0)
443 	{
444 	  as_bad_where (fragP->fr_file, fragP->fr_line,
445 			_("attempt to .org/.space/.nops backwards? (%ld)"),
446 			(long) fragP->fr_offset);
447 	  fragP->fr_offset = 0;
448 	}
449       if (fragP->fr_type == rs_space_nop)
450 	fragP->fr_type = rs_fill_nop;
451       else
452 	fragP->fr_type = rs_fill;
453       break;
454 
455     case rs_fill:
456     case rs_fill_nop:
457       break;
458 
459     case rs_leb128:
460       {
461 	valueT value = S_GET_VALUE (fragP->fr_symbol);
462 	int size;
463 
464 	if (!S_IS_DEFINED (fragP->fr_symbol))
465 	  {
466 	    as_bad_where (fragP->fr_file, fragP->fr_line,
467 			  _("leb128 operand is an undefined symbol: %s"),
468 			  S_GET_NAME (fragP->fr_symbol));
469 	  }
470 
471 	size = output_leb128 (fragP->fr_literal + fragP->fr_fix, value,
472 			      fragP->fr_subtype);
473 
474 	fragP->fr_fix += size;
475 	fragP->fr_type = rs_fill;
476 	fragP->fr_var = 0;
477 	fragP->fr_offset = 0;
478 	fragP->fr_symbol = NULL;
479       }
480       break;
481 
482     case rs_cfa:
483       eh_frame_convert_frag (fragP);
484       break;
485 
486     case rs_dwarf2dbg:
487       dwarf2dbg_convert_frag (fragP);
488       break;
489 
490     case rs_machine_dependent:
491       md_convert_frag (stdoutput, sec, fragP);
492 
493       gas_assert (fragP->fr_next == NULL
494 		  || (fragP->fr_next->fr_address - fragP->fr_address
495 		      == fragP->fr_fix));
496 
497       /* After md_convert_frag, we make the frag into a ".space 0".
498 	 md_convert_frag() should set up any fixSs and constants
499 	 required.  */
500       frag_wane (fragP);
501       break;
502 
503 #ifndef WORKING_DOT_WORD
504     case rs_broken_word:
505       {
506 	struct broken_word *lie;
507 
508 	if (fragP->fr_subtype)
509 	  {
510 	    fragP->fr_fix += md_short_jump_size;
511 	    for (lie = (struct broken_word *) (fragP->fr_symbol);
512 		 lie && lie->dispfrag == fragP;
513 		 lie = lie->next_broken_word)
514 	      if (lie->added == 1)
515 		fragP->fr_fix += md_long_jump_size;
516 	  }
517 	frag_wane (fragP);
518       }
519       break;
520 #endif
521 
522     default:
523       BAD_CASE (fragP->fr_type);
524       break;
525     }
526 #ifdef md_frag_check
527   md_frag_check (fragP);
528 #endif
529 }
530 
531 struct relax_seg_info
532 {
533   int pass;
534   int changed;
535 };
536 
537 static void
relax_seg(bfd * abfd ATTRIBUTE_UNUSED,asection * sec,void * xxx)538 relax_seg (bfd *abfd ATTRIBUTE_UNUSED, asection *sec, void *xxx)
539 {
540   segment_info_type *seginfo = seg_info (sec);
541   struct relax_seg_info *info = (struct relax_seg_info *) xxx;
542 
543   if (seginfo && seginfo->frchainP
544       && relax_segment (seginfo->frchainP->frch_root, sec, info->pass))
545     info->changed = 1;
546 }
547 
548 static void
size_seg(bfd * abfd ATTRIBUTE_UNUSED,asection * sec,void * xxx ATTRIBUTE_UNUSED)549 size_seg (bfd *abfd ATTRIBUTE_UNUSED, asection *sec, void *xxx ATTRIBUTE_UNUSED)
550 {
551   flagword flags;
552   fragS *fragp;
553   segment_info_type *seginfo;
554   int x;
555   valueT size, newsize;
556 
557   subseg_change (sec, 0);
558 
559   seginfo = seg_info (sec);
560   if (seginfo && seginfo->frchainP)
561     {
562       for (fragp = seginfo->frchainP->frch_root; fragp; fragp = fragp->fr_next)
563 	cvt_frag_to_fill (sec, fragp);
564       for (fragp = seginfo->frchainP->frch_root;
565 	   fragp->fr_next;
566 	   fragp = fragp->fr_next)
567 	/* Walk to last elt.  */
568 	;
569       size = fragp->fr_address + fragp->fr_fix;
570     }
571   else
572     size = 0;
573 
574   flags = bfd_section_flags (sec);
575   if (size == 0 && bfd_section_size (sec) != 0 &&
576     (flags & SEC_HAS_CONTENTS) != 0)
577     return;
578 
579   if (size > 0 && ! seginfo->bss)
580     flags |= SEC_HAS_CONTENTS;
581 
582   flags &= ~SEC_RELOC;
583   x = bfd_set_section_flags (sec, flags);
584   gas_assert (x);
585 
586   /* If permitted, allow the backend to pad out the section
587      to some alignment boundary.  */
588   if (do_not_pad_sections_to_alignment)
589     newsize = size;
590   else
591     newsize = md_section_align (sec, size);
592   x = bfd_set_section_size (sec, newsize);
593   gas_assert (x);
594 
595   /* If the size had to be rounded up, add some padding in the last
596      non-empty frag.  */
597   gas_assert (newsize >= size);
598   if (size != newsize)
599     {
600       fragS *last = seginfo->frchainP->frch_last;
601       fragp = seginfo->frchainP->frch_root;
602       while (fragp->fr_next != last)
603 	fragp = fragp->fr_next;
604       last->fr_address = size;
605       if ((newsize - size) % fragp->fr_var == 0)
606 	fragp->fr_offset += (newsize - size) / fragp->fr_var;
607       else
608 	/* If we hit this abort, it's likely due to subsegs_finish not
609 	   providing sufficient alignment on the last frag, and the
610 	   machine dependent code using alignment frags with fr_var
611 	   greater than 1.  */
612 	abort ();
613     }
614 
615 #ifdef tc_frob_section
616   tc_frob_section (sec);
617 #endif
618 #ifdef obj_frob_section
619   obj_frob_section (sec);
620 #endif
621 }
622 
623 #ifdef DEBUG2
624 static void
dump_section_relocs(bfd * abfd ATTRIBUTE_UNUSED,asection * sec,FILE * stream)625 dump_section_relocs (bfd *abfd ATTRIBUTE_UNUSED, asection *sec, FILE *stream)
626 {
627   segment_info_type *seginfo = seg_info (sec);
628   fixS *fixp = seginfo->fix_root;
629 
630   if (!fixp)
631     return;
632 
633   fprintf (stream, "sec %s relocs:\n", sec->name);
634   while (fixp)
635     {
636       symbolS *s = fixp->fx_addsy;
637 
638       fprintf (stream, "  %08lx: type %d ", (unsigned long) fixp,
639 	       (int) fixp->fx_r_type);
640       if (s == NULL)
641 	fprintf (stream, "no sym\n");
642       else
643 	{
644 	  print_symbol_value_1 (stream, s);
645 	  fprintf (stream, "\n");
646 	}
647       fixp = fixp->fx_next;
648     }
649 }
650 #else
651 #define dump_section_relocs(ABFD,SEC,STREAM)	((void) 0)
652 #endif
653 
654 #ifndef EMIT_SECTION_SYMBOLS
655 #define EMIT_SECTION_SYMBOLS 1
656 #endif
657 
658 /* Resolve U.A.OFFSET_SYM and U.A.SYM fields of RELOC_LIST entries,
659    and check for validity.  Convert RELOC_LIST from using U.A fields
660    to U.B fields.  */
661 static void
resolve_reloc_expr_symbols(void)662 resolve_reloc_expr_symbols (void)
663 {
664   bfd_vma addr_mask = 1;
665   struct reloc_list *r;
666 
667   /* Avoid a shift by the width of type.  */
668   addr_mask <<= bfd_arch_bits_per_address (stdoutput) - 1;
669   addr_mask <<= 1;
670   addr_mask -= 1;
671 
672   for (r = reloc_list; r; r = r->next)
673     {
674       reloc_howto_type *howto = r->u.a.howto;
675       expressionS *symval;
676       symbolS *sym;
677       bfd_vma offset, addend;
678       asection *sec;
679 
680       resolve_symbol_value (r->u.a.offset_sym);
681       symval = symbol_get_value_expression (r->u.a.offset_sym);
682 
683       offset = 0;
684       sym = NULL;
685       if (symval->X_op == O_constant)
686 	sym = r->u.a.offset_sym;
687       else if (symval->X_op == O_symbol)
688 	{
689 	  sym = symval->X_add_symbol;
690 	  offset = symval->X_add_number;
691 	  symval = symbol_get_value_expression (symval->X_add_symbol);
692 	}
693       if (sym == NULL
694 	  || symval->X_op != O_constant
695 	  || (sec = S_GET_SEGMENT (sym)) == NULL
696 	  || !SEG_NORMAL (sec))
697 	{
698 	  as_bad_where (r->file, r->line, _("invalid offset expression"));
699 	  sec = NULL;
700 	}
701       else
702 	offset += S_GET_VALUE (sym);
703 
704       sym = NULL;
705       addend = r->u.a.addend;
706       if (r->u.a.sym != NULL)
707 	{
708 	  resolve_symbol_value (r->u.a.sym);
709 	  symval = symbol_get_value_expression (r->u.a.sym);
710 	  if (symval->X_op == O_constant)
711 	    sym = r->u.a.sym;
712 	  else if (symval->X_op == O_symbol)
713 	    {
714 	      sym = symval->X_add_symbol;
715 	      addend += symval->X_add_number;
716 	      symval = symbol_get_value_expression (symval->X_add_symbol);
717 	    }
718 	  if (symval->X_op != O_constant)
719 	    {
720 	      as_bad_where (r->file, r->line, _("invalid reloc expression"));
721 	      sec = NULL;
722 	    }
723 	  else if (sym != NULL && sec != NULL)
724 	    {
725 	      /* Convert relocs against local symbols to refer to the
726 	         corresponding section symbol plus offset instead.  Keep
727 	         PC-relative relocs of the REL variety intact though to
728 		 prevent the offset from overflowing the relocated field,
729 	         unless it has enough bits to cover the whole address
730 	         space.  */
731 	      if (S_IS_LOCAL (sym)
732 		  && S_IS_DEFINED (sym)
733 		  && !symbol_section_p (sym)
734 		  && (sec->use_rela_p
735 		      || (howto->partial_inplace
736 			  && (!howto->pc_relative
737 			      || howto->src_mask == addr_mask))))
738 		{
739 		  asection *symsec = S_GET_SEGMENT (sym);
740 		  if (!(((symsec->flags & SEC_MERGE) != 0
741 			 && addend != 0)
742 			|| (symsec->flags & SEC_THREAD_LOCAL) != 0))
743 		    {
744 		      addend += S_GET_VALUE (sym);
745 		      sym = section_symbol (symsec);
746 		    }
747 		}
748 	      symbol_mark_used_in_reloc (sym);
749 	    }
750 	}
751       if (sym == NULL)
752 	{
753 	  if (abs_section_sym == NULL)
754 	    abs_section_sym = section_symbol (absolute_section);
755 	  sym = abs_section_sym;
756 	}
757 
758       r->u.b.sec = sec;
759       r->u.b.s = symbol_get_bfdsym (sym);
760       r->u.b.r.sym_ptr_ptr = &r->u.b.s;
761       r->u.b.r.address = offset;
762       r->u.b.r.addend = addend;
763       r->u.b.r.howto = howto;
764     }
765 }
766 
767 /* This pass over fixups decides whether symbols can be replaced with
768    section symbols.  */
769 
770 static void
adjust_reloc_syms(bfd * abfd ATTRIBUTE_UNUSED,asection * sec,void * xxx ATTRIBUTE_UNUSED)771 adjust_reloc_syms (bfd *abfd ATTRIBUTE_UNUSED,
772 		   asection *sec,
773 		   void *xxx ATTRIBUTE_UNUSED)
774 {
775   segment_info_type *seginfo = seg_info (sec);
776   fixS *fixp;
777 
778   if (seginfo == NULL)
779     return;
780 
781   dump_section_relocs (abfd, sec, stderr);
782 
783   for (fixp = seginfo->fix_root; fixp; fixp = fixp->fx_next)
784     if (fixp->fx_done)
785       /* Ignore it.  */
786       ;
787     else if (fixp->fx_addsy)
788       {
789 	symbolS *sym;
790 	asection *symsec;
791 
792 #ifdef DEBUG5
793 	fprintf (stderr, "\n\nadjusting fixup:\n");
794 	print_fixup (fixp);
795 #endif
796 
797 	sym = fixp->fx_addsy;
798 
799 	/* All symbols should have already been resolved at this
800 	   point.  It is possible to see unresolved expression
801 	   symbols, though, since they are not in the regular symbol
802 	   table.  */
803 	resolve_symbol_value (sym);
804 
805 	if (fixp->fx_subsy != NULL)
806 	  resolve_symbol_value (fixp->fx_subsy);
807 
808 	/* If this symbol is equated to an undefined or common symbol,
809 	   convert the fixup to being against that symbol.  */
810 	while (symbol_equated_reloc_p (sym)
811 	       || S_IS_WEAKREFR (sym))
812 	  {
813 	    symbolS *newsym = symbol_get_value_expression (sym)->X_add_symbol;
814 	    if (sym == newsym)
815 	      break;
816 	    fixp->fx_offset += symbol_get_value_expression (sym)->X_add_number;
817 	    fixp->fx_addsy = newsym;
818 	    sym = newsym;
819 	  }
820 
821 	if (symbol_mri_common_p (sym))
822 	  {
823 	    fixp->fx_offset += S_GET_VALUE (sym);
824 	    fixp->fx_addsy = symbol_get_value_expression (sym)->X_add_symbol;
825 	    continue;
826 	  }
827 
828 	/* If the symbol is undefined, common, weak, or global (ELF
829 	   shared libs), we can't replace it with the section symbol.  */
830 	if (S_FORCE_RELOC (fixp->fx_addsy, 1))
831 	  continue;
832 
833 	/* Is there some other (target cpu dependent) reason we can't adjust
834 	   this one?  (E.g. relocations involving function addresses on
835 	   the PA.  */
836 #ifdef tc_fix_adjustable
837 	if (! tc_fix_adjustable (fixp))
838 	  continue;
839 #endif
840 
841 	/* Since we're reducing to section symbols, don't attempt to reduce
842 	   anything that's already using one.  */
843 	if (symbol_section_p (sym))
844 	  {
845 	    /* Mark the section symbol used in relocation so that it will
846 	       be included in the symbol table.  */
847 	    symbol_mark_used_in_reloc (sym);
848 	    continue;
849 	  }
850 
851 	symsec = S_GET_SEGMENT (sym);
852 	if (symsec == NULL)
853 	  abort ();
854 
855 	if (bfd_is_abs_section (symsec)
856 	    || symsec == reg_section)
857 	  {
858 	    /* The fixup_segment routine normally will not use this
859 	       symbol in a relocation.  */
860 	    continue;
861 	  }
862 
863 	/* Don't try to reduce relocs which refer to non-local symbols
864 	   in .linkonce sections.  It can lead to confusion when a
865 	   debugging section refers to a .linkonce section.  I hope
866 	   this will always be correct.  */
867 	if (symsec != sec && ! S_IS_LOCAL (sym))
868 	  {
869 	    if ((symsec->flags & SEC_LINK_ONCE) != 0
870 		|| (IS_ELF
871 		    /* The GNU toolchain uses an extension for ELF: a
872 		       section beginning with the magic string
873 		       .gnu.linkonce is a linkonce section.  */
874 		    && startswith (segment_name (symsec), ".gnu.linkonce")))
875 	      continue;
876 	  }
877 
878 	/* Never adjust a reloc against local symbol in a merge section
879 	   with non-zero addend.  */
880 	if ((symsec->flags & SEC_MERGE) != 0
881 	    && (fixp->fx_offset != 0 || fixp->fx_subsy != NULL))
882 	  continue;
883 
884 	/* Never adjust a reloc against TLS local symbol.  */
885 	if ((symsec->flags & SEC_THREAD_LOCAL) != 0)
886 	  continue;
887 
888 	/* We refetch the segment when calling section_symbol, rather
889 	   than using symsec, because S_GET_VALUE may wind up changing
890 	   the section when it calls resolve_symbol_value.  */
891 	fixp->fx_offset += S_GET_VALUE (sym);
892 	fixp->fx_addsy = section_symbol (S_GET_SEGMENT (sym));
893 #ifdef DEBUG5
894 	fprintf (stderr, "\nadjusted fixup:\n");
895 	print_fixup (fixp);
896 #endif
897       }
898 
899   dump_section_relocs (abfd, sec, stderr);
900 }
901 
902 void
as_bad_subtract(fixS * fixp)903 as_bad_subtract (fixS *fixp)
904 {
905   as_bad_where (fixp->fx_file, fixp->fx_line,
906 		_("can't resolve %s - %s"),
907 		fixp->fx_addsy ? S_GET_NAME (fixp->fx_addsy) : "0",
908 		S_GET_NAME (fixp->fx_subsy));
909 }
910 
911 /* fixup_segment()
912 
913    Go through all the fixS's in a segment and see which ones can be
914    handled now.  (These consist of fixS where we have since discovered
915    the value of a symbol, or the address of the frag involved.)
916    For each one, call md_apply_fix to put the fix into the frag data.
917    Ones that we couldn't completely handle here will be output later
918    by emit_relocations.  */
919 
920 static void
fixup_segment(fixS * fixP,segT this_segment)921 fixup_segment (fixS *fixP, segT this_segment)
922 {
923   valueT add_number;
924   fragS *fragP;
925 
926   if (fixP != NULL && abs_section_sym == NULL)
927     abs_section_sym = section_symbol (absolute_section);
928 
929   /* If the linker is doing the relaxing, we must not do any fixups.
930 
931      Well, strictly speaking that's not true -- we could do any that
932      are PC-relative and don't cross regions that could change size.  */
933   if (linkrelax && TC_LINKRELAX_FIXUP (this_segment))
934     {
935       for (; fixP; fixP = fixP->fx_next)
936 	if (!fixP->fx_done)
937 	  {
938 	    if (fixP->fx_addsy == NULL)
939 	      {
940 		/* There was no symbol required by this relocation.
941 		   However, BFD doesn't really handle relocations
942 		   without symbols well. So fake up a local symbol in
943 		   the absolute section.  */
944 		fixP->fx_addsy = abs_section_sym;
945 	      }
946 	    symbol_mark_used_in_reloc (fixP->fx_addsy);
947 	    if (fixP->fx_subsy != NULL)
948 	      symbol_mark_used_in_reloc (fixP->fx_subsy);
949 	  }
950       return;
951     }
952 
953   for (; fixP; fixP = fixP->fx_next)
954     {
955       segT add_symbol_segment = absolute_section;
956 
957 #ifdef DEBUG5
958       fprintf (stderr, "\nprocessing fixup:\n");
959       print_fixup (fixP);
960 #endif
961 
962       fragP = fixP->fx_frag;
963       know (fragP);
964 #ifdef TC_VALIDATE_FIX
965       TC_VALIDATE_FIX (fixP, this_segment, skip);
966 #endif
967       add_number = fixP->fx_offset;
968 
969       if (fixP->fx_addsy != NULL)
970 	add_symbol_segment = S_GET_SEGMENT (fixP->fx_addsy);
971 
972       if (fixP->fx_subsy != NULL)
973 	{
974 	  segT sub_symbol_segment;
975 	  resolve_symbol_value (fixP->fx_subsy);
976 	  sub_symbol_segment = S_GET_SEGMENT (fixP->fx_subsy);
977 	  if (fixP->fx_addsy != NULL
978 	      && sub_symbol_segment == add_symbol_segment
979 	      && !S_FORCE_RELOC (fixP->fx_addsy, 0)
980 	      && !S_FORCE_RELOC (fixP->fx_subsy, 0)
981 	      && !TC_FORCE_RELOCATION_SUB_SAME (fixP, add_symbol_segment))
982 	    {
983 	      add_number += S_GET_VALUE (fixP->fx_addsy);
984 	      add_number -= S_GET_VALUE (fixP->fx_subsy);
985 	      fixP->fx_offset = add_number;
986 	      fixP->fx_addsy = NULL;
987 	      fixP->fx_subsy = NULL;
988 #ifdef TC_M68K
989 	      /* See the comment below about 68k weirdness.  */
990 	      fixP->fx_pcrel = 0;
991 #endif
992 	    }
993 	  else if (sub_symbol_segment == absolute_section
994 		   && !S_FORCE_RELOC (fixP->fx_subsy, 0)
995 		   && !TC_FORCE_RELOCATION_SUB_ABS (fixP, add_symbol_segment))
996 	    {
997 	      add_number -= S_GET_VALUE (fixP->fx_subsy);
998 	      fixP->fx_offset = add_number;
999 	      fixP->fx_subsy = NULL;
1000 	    }
1001 	  else if (sub_symbol_segment == this_segment
1002 		   && !S_FORCE_RELOC (fixP->fx_subsy, 0)
1003 		   && !TC_FORCE_RELOCATION_SUB_LOCAL (fixP, add_symbol_segment))
1004 	    {
1005 	      add_number -= S_GET_VALUE (fixP->fx_subsy);
1006 	      fixP->fx_offset = (add_number + fixP->fx_dot_value
1007 				 + fixP->fx_dot_frag->fr_address);
1008 
1009 	      /* Make it pc-relative.  If the back-end code has not
1010 		 selected a pc-relative reloc, cancel the adjustment
1011 		 we do later on all pc-relative relocs.  */
1012 	      if (0
1013 #ifdef TC_M68K
1014 		  /* Do this for m68k even if it's already described
1015 		     as pc-relative.  On the m68k, an operand of
1016 		     "pc@(foo-.-2)" should address "foo" in a
1017 		     pc-relative mode.  */
1018 		  || 1
1019 #endif
1020 		  || !fixP->fx_pcrel)
1021 		add_number += MD_PCREL_FROM_SECTION (fixP, this_segment);
1022 	      fixP->fx_subsy = NULL;
1023 	      fixP->fx_pcrel = 1;
1024 	    }
1025 	  else if (!TC_VALIDATE_FIX_SUB (fixP, add_symbol_segment))
1026 	    {
1027 	      if (!md_register_arithmetic
1028 		  && (add_symbol_segment == reg_section
1029 		      || sub_symbol_segment == reg_section))
1030 		as_bad_where (fixP->fx_file, fixP->fx_line,
1031 			      _("register value used as expression"));
1032 	      else
1033 		as_bad_subtract (fixP);
1034 	    }
1035 	  else if (sub_symbol_segment != undefined_section
1036 		   && ! bfd_is_com_section (sub_symbol_segment)
1037 		   && MD_APPLY_SYM_VALUE (fixP))
1038 	    add_number -= S_GET_VALUE (fixP->fx_subsy);
1039 	}
1040 
1041       if (fixP->fx_addsy)
1042 	{
1043 	  if (add_symbol_segment == this_segment
1044 	      && !S_FORCE_RELOC (fixP->fx_addsy, 0)
1045 	      && !TC_FORCE_RELOCATION_LOCAL (fixP))
1046 	    {
1047 	      /* This fixup was made when the symbol's segment was
1048 		 SEG_UNKNOWN, but it is now in the local segment.
1049 		 So we know how to do the address without relocation.  */
1050 	      add_number += S_GET_VALUE (fixP->fx_addsy);
1051 	      fixP->fx_offset = add_number;
1052 	      if (fixP->fx_pcrel)
1053 		add_number -= MD_PCREL_FROM_SECTION (fixP, this_segment);
1054 	      fixP->fx_addsy = NULL;
1055 	      fixP->fx_pcrel = 0;
1056 	    }
1057 	  else if (add_symbol_segment == absolute_section
1058 		   && !S_FORCE_RELOC (fixP->fx_addsy, 0)
1059 		   && !TC_FORCE_RELOCATION_ABS (fixP))
1060 	    {
1061 	      add_number += S_GET_VALUE (fixP->fx_addsy);
1062 	      fixP->fx_offset = add_number;
1063 	      fixP->fx_addsy = NULL;
1064 	    }
1065 	  else if (add_symbol_segment != undefined_section
1066 		   && ! bfd_is_com_section (add_symbol_segment)
1067 		   && MD_APPLY_SYM_VALUE (fixP))
1068 	    add_number += S_GET_VALUE (fixP->fx_addsy);
1069 	}
1070 
1071       if (fixP->fx_pcrel)
1072 	{
1073 	  add_number -= MD_PCREL_FROM_SECTION (fixP, this_segment);
1074 	  if (!fixP->fx_done && fixP->fx_addsy == NULL)
1075 	    {
1076 	      /* There was no symbol required by this relocation.
1077 		 However, BFD doesn't really handle relocations
1078 		 without symbols well. So fake up a local symbol in
1079 		 the absolute section.  */
1080 	      fixP->fx_addsy = abs_section_sym;
1081 	    }
1082 	}
1083 
1084       if (!fixP->fx_done)
1085 	md_apply_fix (fixP, &add_number, this_segment);
1086 
1087       if (!fixP->fx_done)
1088 	{
1089 	  if (fixP->fx_addsy == NULL)
1090 	    fixP->fx_addsy = abs_section_sym;
1091 	  symbol_mark_used_in_reloc (fixP->fx_addsy);
1092 	  if (fixP->fx_subsy != NULL)
1093 	    symbol_mark_used_in_reloc (fixP->fx_subsy);
1094 	}
1095 
1096       if (!fixP->fx_no_overflow && fixP->fx_size != 0)
1097 	{
1098 	  if (fixP->fx_size < sizeof (valueT))
1099 	    {
1100 	      valueT mask;
1101 
1102 	      mask = 0;
1103 	      mask--;		/* Set all bits to one.  */
1104 	      mask <<= fixP->fx_size * 8 - (fixP->fx_signed ? 1 : 0);
1105 	      if ((add_number & mask) != 0
1106 		  && (fixP->fx_signed
1107 		      ? (add_number & mask) != mask
1108 		      : (-add_number & mask) != 0))
1109 		{
1110 		  char buf[50], buf2[50];
1111 		  bfd_sprintf_vma (stdoutput, buf, fragP->fr_address + fixP->fx_where);
1112 		  if (add_number > 1000)
1113 		    bfd_sprintf_vma (stdoutput, buf2, add_number);
1114 		  else
1115 		    sprintf (buf2, "%ld", (long) add_number);
1116 		  as_bad_where (fixP->fx_file, fixP->fx_line,
1117 				ngettext ("value of %s too large for field "
1118 					  "of %d byte at %s",
1119 					  "value of %s too large for field "
1120 					  "of %d bytes at %s",
1121 					  fixP->fx_size),
1122 				buf2, fixP->fx_size, buf);
1123 		} /* Generic error checking.  */
1124 	    }
1125 #ifdef WARN_SIGNED_OVERFLOW_WORD
1126 	  /* Warn if a .word value is too large when treated as a signed
1127 	     number.  We already know it is not too negative.  This is to
1128 	     catch over-large switches generated by gcc on the 68k.  */
1129 	  if (!flag_signed_overflow_ok
1130 	      && fixP->fx_size == 2
1131 	      && add_number > 0x7fff)
1132 	    as_bad_where (fixP->fx_file, fixP->fx_line,
1133 			  _("signed .word overflow; switch may be too large; %ld at 0x%lx"),
1134 			  (long) add_number,
1135 			  (long) (fragP->fr_address + fixP->fx_where));
1136 #endif
1137 	}
1138 
1139 #ifdef TC_VALIDATE_FIX
1140     skip:  ATTRIBUTE_UNUSED_LABEL
1141       ;
1142 #endif
1143 #ifdef DEBUG5
1144       fprintf (stderr, "result:\n");
1145       print_fixup (fixP);
1146 #endif
1147     }				/* For each fixS in this segment.  */
1148 }
1149 
1150 static void
fix_segment(bfd * abfd ATTRIBUTE_UNUSED,asection * sec,void * xxx ATTRIBUTE_UNUSED)1151 fix_segment (bfd *abfd ATTRIBUTE_UNUSED,
1152 	     asection *sec,
1153 	     void *xxx ATTRIBUTE_UNUSED)
1154 {
1155   segment_info_type *seginfo = seg_info (sec);
1156 
1157   fixup_segment (seginfo->fix_root, sec);
1158 }
1159 
1160 static void
install_reloc(asection * sec,arelent * reloc,fragS * fragp,const char * file,unsigned int line)1161 install_reloc (asection *sec, arelent *reloc, fragS *fragp,
1162 	       const char *file, unsigned int line)
1163 {
1164   char *err;
1165   bfd_reloc_status_type s;
1166   asymbol *sym;
1167 
1168   if (reloc->sym_ptr_ptr != NULL
1169       && (sym = *reloc->sym_ptr_ptr) != NULL
1170       && (sym->flags & BSF_KEEP) == 0
1171       && ((sym->flags & BSF_SECTION_SYM) == 0
1172 	  || (EMIT_SECTION_SYMBOLS
1173 	      && !bfd_is_abs_section (sym->section))))
1174     as_bad_where (file, line, _("redefined symbol cannot be used on reloc"));
1175 
1176   s = bfd_install_relocation (stdoutput, reloc,
1177 			      fragp->fr_literal, fragp->fr_address,
1178 			      sec, &err);
1179   switch (s)
1180     {
1181     case bfd_reloc_ok:
1182       break;
1183     case bfd_reloc_overflow:
1184       as_bad_where (file, line, _("relocation overflow"));
1185       break;
1186     case bfd_reloc_outofrange:
1187       as_bad_where (file, line, _("relocation out of range"));
1188       break;
1189     default:
1190       as_fatal (_("%s:%u: bad return from bfd_install_relocation: %x"),
1191 		file, line, s);
1192     }
1193 }
1194 
1195 static fragS *
get_frag_for_reloc(fragS * last_frag,const segment_info_type * seginfo,const struct reloc_list * r)1196 get_frag_for_reloc (fragS *last_frag,
1197 		    const segment_info_type *seginfo,
1198 		    const struct reloc_list *r)
1199 {
1200   fragS *f;
1201 
1202   for (f = last_frag; f != NULL; f = f->fr_next)
1203     if (f->fr_address <= r->u.b.r.address
1204 	&& r->u.b.r.address < f->fr_address + f->fr_fix)
1205       return f;
1206 
1207   for (f = seginfo->frchainP->frch_root; f != NULL; f = f->fr_next)
1208     if (f->fr_address <= r->u.b.r.address
1209 	&& r->u.b.r.address < f->fr_address + f->fr_fix)
1210       return f;
1211 
1212   for (f = seginfo->frchainP->frch_root; f != NULL; f = f->fr_next)
1213     if (f->fr_address <= r->u.b.r.address
1214 	&& r->u.b.r.address <= f->fr_address + f->fr_fix)
1215       return f;
1216 
1217   as_bad_where (r->file, r->line,
1218 		_("reloc not within (fixed part of) section"));
1219   return NULL;
1220 }
1221 
1222 static void
write_relocs(bfd * abfd ATTRIBUTE_UNUSED,asection * sec,void * xxx ATTRIBUTE_UNUSED)1223 write_relocs (bfd *abfd ATTRIBUTE_UNUSED, asection *sec,
1224 	      void *xxx ATTRIBUTE_UNUSED)
1225 {
1226   segment_info_type *seginfo = seg_info (sec);
1227   unsigned int n;
1228   struct reloc_list *my_reloc_list, **rp, *r;
1229   arelent **relocs;
1230   fixS *fixp;
1231   fragS *last_frag;
1232 
1233   /* If seginfo is NULL, we did not create this section; don't do
1234      anything with it.  */
1235   if (seginfo == NULL)
1236     return;
1237 
1238   n = 0;
1239   for (fixp = seginfo->fix_root; fixp; fixp = fixp->fx_next)
1240     if (!fixp->fx_done)
1241       n++;
1242 
1243 #ifdef RELOC_EXPANSION_POSSIBLE
1244   n *= MAX_RELOC_EXPANSION;
1245 #endif
1246 
1247   /* Extract relocs for this section from reloc_list.  */
1248   rp = &reloc_list;
1249 
1250   my_reloc_list = NULL;
1251   while ((r = *rp) != NULL)
1252     {
1253       if (r->u.b.sec == sec)
1254 	{
1255 	  *rp = r->next;
1256 	  r->next = my_reloc_list;
1257 	  my_reloc_list = r;
1258 	  n++;
1259 	}
1260       else
1261 	rp = &r->next;
1262     }
1263 
1264   relocs = XCNEWVEC (arelent *, n);
1265 
1266   n = 0;
1267   r = my_reloc_list;
1268   last_frag = NULL;
1269   for (fixp = seginfo->fix_root; fixp != (fixS *) NULL; fixp = fixp->fx_next)
1270     {
1271       int fx_size, slack;
1272       valueT loc;
1273       arelent **reloc;
1274 #ifndef RELOC_EXPANSION_POSSIBLE
1275       arelent *rel;
1276 
1277       reloc = &rel;
1278 #endif
1279 
1280       if (fixp->fx_done)
1281 	continue;
1282 
1283       fx_size = fixp->fx_size;
1284       slack = TC_FX_SIZE_SLACK (fixp);
1285       if (slack > 0)
1286 	fx_size = fx_size > slack ? fx_size - slack : 0;
1287       loc = fixp->fx_where + fx_size;
1288       if (slack >= 0 && loc > fixp->fx_frag->fr_fix)
1289 	as_bad_where (fixp->fx_file, fixp->fx_line,
1290 		      _("internal error: fixup not contained within frag"));
1291 
1292 #ifdef obj_fixup_removed_symbol
1293       if (fixp->fx_addsy && symbol_removed_p (fixp->fx_addsy))
1294 	obj_fixup_removed_symbol (&fixp->fx_addsy);
1295       if (fixp->fx_subsy && symbol_removed_p (fixp->fx_subsy))
1296 	obj_fixup_removed_symbol (&fixp->fx_subsy);
1297 #endif
1298 
1299 #ifndef RELOC_EXPANSION_POSSIBLE
1300       *reloc = tc_gen_reloc (sec, fixp);
1301 #else
1302       reloc = tc_gen_reloc (sec, fixp);
1303 #endif
1304 
1305       while (*reloc)
1306 	{
1307 	  while (r != NULL && r->u.b.r.address < (*reloc)->address)
1308 	    {
1309 	      fragS *f = get_frag_for_reloc (last_frag, seginfo, r);
1310 	      if (f != NULL)
1311 		{
1312 		  last_frag = f;
1313 		  relocs[n++] = &r->u.b.r;
1314 		  install_reloc (sec, &r->u.b.r, f, r->file, r->line);
1315 		}
1316 	      r = r->next;
1317 	    }
1318 #ifdef GAS_SORT_RELOCS
1319 	  if (n != 0 && (*reloc)->address < relocs[n - 1]->address)
1320 	    {
1321 	      size_t lo = 0;
1322 	      size_t hi = n - 1;
1323 	      bfd_vma look = (*reloc)->address;
1324 	      while (lo < hi)
1325 		{
1326 		  size_t mid = (lo + hi) / 2;
1327 		  if (relocs[mid]->address > look)
1328 		    hi = mid;
1329 		  else
1330 		    {
1331 		      lo = mid + 1;
1332 		      if (relocs[mid]->address == look)
1333 			break;
1334 		    }
1335 		}
1336 	      while (lo < hi && relocs[lo]->address == look)
1337 		lo++;
1338 	      memmove (relocs + lo + 1, relocs + lo,
1339 		       (n - lo) * sizeof (*relocs));
1340 	      n++;
1341 	      relocs[lo] = *reloc;
1342 	    }
1343 	  else
1344 #endif
1345 	    relocs[n++] = *reloc;
1346 	  install_reloc (sec, *reloc, fixp->fx_frag,
1347 			 fixp->fx_file, fixp->fx_line);
1348 #ifndef RELOC_EXPANSION_POSSIBLE
1349 	  break;
1350 #else
1351 	  reloc++;
1352 #endif
1353 	}
1354     }
1355 
1356   while (r != NULL)
1357     {
1358       fragS *f = get_frag_for_reloc (last_frag, seginfo, r);
1359       if (f != NULL)
1360 	{
1361 	  last_frag = f;
1362 	  relocs[n++] = &r->u.b.r;
1363 	  install_reloc (sec, &r->u.b.r, f, r->file, r->line);
1364 	}
1365       r = r->next;
1366     }
1367 
1368 #ifdef DEBUG4
1369   {
1370     unsigned int k, j, nsyms;
1371     asymbol **sympp;
1372     sympp = bfd_get_outsymbols (stdoutput);
1373     nsyms = bfd_get_symcount (stdoutput);
1374     for (k = 0; k < n; k++)
1375       if (((*relocs[k]->sym_ptr_ptr)->flags & BSF_SECTION_SYM) == 0)
1376 	{
1377 	  for (j = 0; j < nsyms; j++)
1378 	    if (sympp[j] == *relocs[k]->sym_ptr_ptr)
1379 	      break;
1380 	  if (j == nsyms)
1381 	    abort ();
1382 	}
1383   }
1384 #endif
1385 
1386   if (n)
1387     {
1388       flagword flags = bfd_section_flags (sec);
1389       flags |= SEC_RELOC;
1390       bfd_set_section_flags (sec, flags);
1391       bfd_set_reloc (stdoutput, sec, relocs, n);
1392     }
1393 
1394 #ifdef SET_SECTION_RELOCS
1395   SET_SECTION_RELOCS (sec, relocs, n);
1396 #endif
1397 
1398 #ifdef DEBUG3
1399   {
1400     unsigned int k;
1401 
1402     fprintf (stderr, "relocs for sec %s\n", sec->name);
1403     for (k = 0; k < n; k++)
1404       {
1405 	arelent *rel = relocs[k];
1406 	asymbol *s = *rel->sym_ptr_ptr;
1407 	fprintf (stderr, "  reloc %2d @%p off %4lx : sym %-10s addend %lx\n",
1408 		 k, rel, (unsigned long)rel->address, s->name,
1409 		 (unsigned long)rel->addend);
1410       }
1411   }
1412 #endif
1413 }
1414 
1415 static int
compress_frag(struct z_stream_s * strm,const char * contents,int in_size,fragS ** last_newf,struct obstack * ob)1416 compress_frag (struct z_stream_s *strm, const char *contents, int in_size,
1417 	       fragS **last_newf, struct obstack *ob)
1418 {
1419   int out_size;
1420   int total_out_size = 0;
1421   fragS *f = *last_newf;
1422   char *next_out;
1423   int avail_out;
1424 
1425   /* Call the compression routine repeatedly until it has finished
1426      processing the frag.  */
1427   while (in_size > 0)
1428     {
1429       /* Reserve all the space available in the current chunk.
1430          If none is available, start a new frag.  */
1431       avail_out = obstack_room (ob);
1432       if (avail_out <= 0)
1433         {
1434           obstack_finish (ob);
1435           f = frag_alloc (ob);
1436 	  f->fr_type = rs_fill;
1437           (*last_newf)->fr_next = f;
1438           *last_newf = f;
1439           avail_out = obstack_room (ob);
1440         }
1441       if (avail_out <= 0)
1442 	as_fatal (_("can't extend frag"));
1443       next_out = obstack_next_free (ob);
1444       obstack_blank_fast (ob, avail_out);
1445       out_size = compress_data (strm, &contents, &in_size,
1446 				&next_out, &avail_out);
1447       if (out_size < 0)
1448         return -1;
1449 
1450       f->fr_fix += out_size;
1451       total_out_size += out_size;
1452 
1453       /* Return unused space.  */
1454       if (avail_out > 0)
1455 	obstack_blank_fast (ob, -avail_out);
1456     }
1457 
1458   return total_out_size;
1459 }
1460 
1461 static void
compress_debug(bfd * abfd,asection * sec,void * xxx ATTRIBUTE_UNUSED)1462 compress_debug (bfd *abfd, asection *sec, void *xxx ATTRIBUTE_UNUSED)
1463 {
1464   segment_info_type *seginfo = seg_info (sec);
1465   fragS *f;
1466   fragS *first_newf;
1467   fragS *last_newf;
1468   struct obstack *ob = &seginfo->frchainP->frch_obstack;
1469   bfd_size_type uncompressed_size = (bfd_size_type) sec->size;
1470   bfd_size_type compressed_size;
1471   const char *section_name;
1472   char *compressed_name;
1473   char *header;
1474   struct z_stream_s *strm;
1475   int x;
1476   flagword flags = bfd_section_flags (sec);
1477   unsigned int header_size, compression_header_size;
1478 
1479   if (seginfo == NULL
1480       || sec->size < 32
1481       || (flags & (SEC_ALLOC | SEC_HAS_CONTENTS)) == SEC_ALLOC)
1482     return;
1483 
1484   section_name = bfd_section_name (sec);
1485   if (!startswith (section_name, ".debug_"))
1486     return;
1487 
1488   strm = compress_init ();
1489   if (strm == NULL)
1490     return;
1491 
1492   if (flag_compress_debug == COMPRESS_DEBUG_GABI_ZLIB)
1493     {
1494       compression_header_size
1495 	= bfd_get_compression_header_size (stdoutput, NULL);
1496       header_size = compression_header_size;
1497     }
1498   else
1499     {
1500       compression_header_size = 0;
1501       header_size = 12;
1502     }
1503 
1504   /* Create a new frag to contain the compression header.  */
1505   first_newf = frag_alloc (ob);
1506   if (obstack_room (ob) < header_size)
1507     first_newf = frag_alloc (ob);
1508   if (obstack_room (ob) < header_size)
1509     as_fatal (ngettext ("can't extend frag %lu char",
1510 			"can't extend frag %lu chars",
1511 			(unsigned long) header_size),
1512 	      (unsigned long) header_size);
1513   last_newf = first_newf;
1514   obstack_blank_fast (ob, header_size);
1515   last_newf->fr_type = rs_fill;
1516   last_newf->fr_fix = header_size;
1517   header = last_newf->fr_literal;
1518   compressed_size = header_size;
1519 
1520   /* Stream the frags through the compression engine, adding new frags
1521      as necessary to accommodate the compressed output.  */
1522   for (f = seginfo->frchainP->frch_root;
1523        f;
1524        f = f->fr_next)
1525     {
1526       offsetT fill_size;
1527       char *fill_literal;
1528       offsetT count;
1529       int out_size;
1530 
1531       gas_assert (f->fr_type == rs_fill);
1532       if (f->fr_fix)
1533 	{
1534 	  out_size = compress_frag (strm, f->fr_literal, f->fr_fix,
1535 				    &last_newf, ob);
1536 	  if (out_size < 0)
1537 	    return;
1538 	  compressed_size += out_size;
1539 	}
1540       fill_literal = f->fr_literal + f->fr_fix;
1541       fill_size = f->fr_var;
1542       count = f->fr_offset;
1543       gas_assert (count >= 0);
1544       if (fill_size && count)
1545 	{
1546 	  while (count--)
1547 	    {
1548 	      out_size = compress_frag (strm, fill_literal, (int) fill_size,
1549 				        &last_newf, ob);
1550 	      if (out_size < 0)
1551 		return;
1552 	      compressed_size += out_size;
1553 	    }
1554 	}
1555     }
1556 
1557   /* Flush the compression state.  */
1558   for (;;)
1559     {
1560       int avail_out;
1561       char *next_out;
1562       int out_size;
1563 
1564       /* Reserve all the space available in the current chunk.
1565 	 If none is available, start a new frag.  */
1566       avail_out = obstack_room (ob);
1567       if (avail_out <= 0)
1568 	{
1569 	  fragS *newf;
1570 
1571 	  obstack_finish (ob);
1572 	  newf = frag_alloc (ob);
1573 	  newf->fr_type = rs_fill;
1574 	  last_newf->fr_next = newf;
1575 	  last_newf = newf;
1576 	  avail_out = obstack_room (ob);
1577 	}
1578       if (avail_out <= 0)
1579 	as_fatal (_("can't extend frag"));
1580       next_out = obstack_next_free (ob);
1581       obstack_blank_fast (ob, avail_out);
1582       x = compress_finish (strm, &next_out, &avail_out, &out_size);
1583       if (x < 0)
1584 	return;
1585 
1586       last_newf->fr_fix += out_size;
1587       compressed_size += out_size;
1588 
1589       /* Return unused space.  */
1590       if (avail_out > 0)
1591 	obstack_blank_fast (ob, -avail_out);
1592 
1593       if (x == 0)
1594 	break;
1595     }
1596 
1597   /* PR binutils/18087: If compression didn't make the section smaller,
1598      just keep it uncompressed.  */
1599   if (compressed_size >= uncompressed_size)
1600     return;
1601 
1602   /* Replace the uncompressed frag list with the compressed frag list.  */
1603   seginfo->frchainP->frch_root = first_newf;
1604   seginfo->frchainP->frch_last = last_newf;
1605 
1606   /* Update the section size and its name.  */
1607   bfd_update_compression_header (abfd, (bfd_byte *) header, sec);
1608   x = bfd_set_section_size (sec, compressed_size);
1609   gas_assert (x);
1610   if (!compression_header_size)
1611     {
1612       compressed_name = concat (".z", section_name + 1, (char *) NULL);
1613       bfd_rename_section (sec, compressed_name);
1614     }
1615 }
1616 
1617 #ifndef md_generate_nops
1618 /* Genenerate COUNT bytes of no-op instructions to WHERE.  A target
1619    backend must override this with proper no-op instructions.   */
1620 
1621 static void
md_generate_nops(fragS * f ATTRIBUTE_UNUSED,char * where ATTRIBUTE_UNUSED,offsetT count ATTRIBUTE_UNUSED,int control ATTRIBUTE_UNUSED)1622 md_generate_nops (fragS *f ATTRIBUTE_UNUSED,
1623 		  char *where ATTRIBUTE_UNUSED,
1624 		  offsetT count ATTRIBUTE_UNUSED,
1625 		  int control ATTRIBUTE_UNUSED)
1626 {
1627   as_bad (_("unimplemented .nops directive"));
1628 }
1629 #endif
1630 
1631 static void
write_contents(bfd * abfd ATTRIBUTE_UNUSED,asection * sec,void * xxx ATTRIBUTE_UNUSED)1632 write_contents (bfd *abfd ATTRIBUTE_UNUSED,
1633 		asection *sec,
1634 		void *xxx ATTRIBUTE_UNUSED)
1635 {
1636   segment_info_type *seginfo = seg_info (sec);
1637   addressT offset = 0;
1638   fragS *f;
1639 
1640   /* Write out the frags.  */
1641   if (seginfo == NULL
1642       || !(bfd_section_flags (sec) & SEC_HAS_CONTENTS))
1643     return;
1644 
1645   for (f = seginfo->frchainP->frch_root;
1646        f;
1647        f = f->fr_next)
1648     {
1649       int x;
1650       addressT fill_size;
1651       char *fill_literal;
1652       offsetT count;
1653 
1654       gas_assert (f->fr_type == rs_fill || f->fr_type == rs_fill_nop);
1655       if (f->fr_fix)
1656 	{
1657 	  x = bfd_set_section_contents (stdoutput, sec,
1658 					f->fr_literal, (file_ptr) offset,
1659 					(bfd_size_type) f->fr_fix);
1660 	  if (!x)
1661 	    as_fatal (ngettext ("can't write %ld byte "
1662 				"to section %s of %s: '%s'",
1663 				"can't write %ld bytes "
1664 				"to section %s of %s: '%s'",
1665 				(long) f->fr_fix),
1666 		      (long) f->fr_fix,
1667 		      bfd_section_name (sec), bfd_get_filename (stdoutput),
1668 		      bfd_errmsg (bfd_get_error ()));
1669 	  offset += f->fr_fix;
1670 	}
1671 
1672       fill_size = f->fr_var;
1673       count = f->fr_offset;
1674       fill_literal = f->fr_literal + f->fr_fix;
1675 
1676       if (f->fr_type == rs_fill_nop)
1677 	{
1678 	  gas_assert (count >= 0 && fill_size == 1);
1679 	  if (count > 0)
1680 	    {
1681 	      char *buf = xmalloc (count);
1682 	      md_generate_nops (f, buf, count, *fill_literal);
1683 	      x = bfd_set_section_contents
1684 		(stdoutput, sec, buf, (file_ptr) offset,
1685 		 (bfd_size_type) count);
1686 	      if (!x)
1687 		as_fatal (ngettext ("can't fill %ld byte "
1688 				    "in section %s of %s: '%s'",
1689 				    "can't fill %ld bytes "
1690 				    "in section %s of %s: '%s'",
1691 				    (long) count),
1692 			  (long) count,
1693 			  bfd_section_name (sec),
1694 			  bfd_get_filename (stdoutput),
1695 			  bfd_errmsg (bfd_get_error ()));
1696 	      offset += count;
1697 	      free (buf);
1698 	    }
1699 	  continue;
1700 	}
1701 
1702       gas_assert (count >= 0);
1703       if (fill_size && count)
1704 	{
1705 	  char buf[256];
1706 	  if (fill_size > sizeof (buf))
1707 	    {
1708 	      /* Do it the old way. Can this ever happen?  */
1709 	      while (count--)
1710 		{
1711 		  x = bfd_set_section_contents (stdoutput, sec,
1712 						fill_literal,
1713 						(file_ptr) offset,
1714 						(bfd_size_type) fill_size);
1715 		  if (!x)
1716 		    as_fatal (ngettext ("can't fill %ld byte "
1717 					"in section %s of %s: '%s'",
1718 					"can't fill %ld bytes "
1719 					"in section %s of %s: '%s'",
1720 					(long) fill_size),
1721 			      (long) fill_size,
1722 			      bfd_section_name (sec),
1723 			      bfd_get_filename (stdoutput),
1724 			      bfd_errmsg (bfd_get_error ()));
1725 		  offset += fill_size;
1726 		}
1727 	    }
1728 	  else
1729 	    {
1730 	      /* Build a buffer full of fill objects and output it as
1731 		 often as necessary. This saves on the overhead of
1732 		 potentially lots of bfd_set_section_contents calls.  */
1733 	      int n_per_buf, i;
1734 	      if (fill_size == 1)
1735 		{
1736 		  n_per_buf = sizeof (buf);
1737 		  memset (buf, *fill_literal, n_per_buf);
1738 		}
1739 	      else
1740 		{
1741 		  char *bufp;
1742 		  n_per_buf = sizeof (buf) / fill_size;
1743 		  for (i = n_per_buf, bufp = buf; i; i--, bufp += fill_size)
1744 		    memcpy (bufp, fill_literal, fill_size);
1745 		}
1746 	      for (; count > 0; count -= n_per_buf)
1747 		{
1748 		  n_per_buf = n_per_buf > count ? count : n_per_buf;
1749 		  x = bfd_set_section_contents
1750 		    (stdoutput, sec, buf, (file_ptr) offset,
1751 		     (bfd_size_type) n_per_buf * fill_size);
1752 		  if (!x)
1753 		    as_fatal (ngettext ("can't fill %ld byte "
1754 					"in section %s of %s: '%s'",
1755 					"can't fill %ld bytes "
1756 					"in section %s of %s: '%s'",
1757 					(long) (n_per_buf * fill_size)),
1758 			      (long) (n_per_buf * fill_size),
1759 			      bfd_section_name (sec),
1760 			      bfd_get_filename (stdoutput),
1761 			      bfd_errmsg (bfd_get_error ()));
1762 		  offset += n_per_buf * fill_size;
1763 		}
1764 	    }
1765 	}
1766     }
1767 }
1768 
1769 static void
merge_data_into_text(void)1770 merge_data_into_text (void)
1771 {
1772   seg_info (text_section)->frchainP->frch_last->fr_next =
1773     seg_info (data_section)->frchainP->frch_root;
1774   seg_info (text_section)->frchainP->frch_last =
1775     seg_info (data_section)->frchainP->frch_last;
1776   seg_info (data_section)->frchainP = 0;
1777 }
1778 
1779 static void
set_symtab(void)1780 set_symtab (void)
1781 {
1782   int nsyms;
1783   asymbol **asympp;
1784   symbolS *symp;
1785   bool result;
1786 
1787   /* Count symbols.  We can't rely on a count made by the loop in
1788      write_object_file, because *_frob_file may add a new symbol or
1789      two.  Generate unused section symbols only if needed.  */
1790   nsyms = 0;
1791   for (symp = symbol_rootP; symp; symp = symbol_next (symp))
1792     if (!symbol_removed_p (symp)
1793 	&& (bfd_keep_unused_section_symbols (stdoutput)
1794 	    || !symbol_section_p (symp)
1795 	    || symbol_used_in_reloc_p (symp)))
1796       nsyms++;
1797 
1798   if (nsyms)
1799     {
1800       int i;
1801       bfd_size_type amt = (bfd_size_type) nsyms * sizeof (asymbol *);
1802 
1803       asympp = (asymbol **) bfd_alloc (stdoutput, amt);
1804       symp = symbol_rootP;
1805       for (i = 0; i < nsyms; symp = symbol_next (symp))
1806 	if (!symbol_removed_p (symp)
1807 	    && (bfd_keep_unused_section_symbols (stdoutput)
1808 		|| !symbol_section_p (symp)
1809 		|| symbol_used_in_reloc_p (symp)))
1810 	  {
1811 	    asympp[i] = symbol_get_bfdsym (symp);
1812 	    if (asympp[i]->flags != BSF_SECTION_SYM
1813 		|| !(bfd_is_const_section (asympp[i]->section)
1814 		     && asympp[i]->section->symbol == asympp[i]))
1815 	      asympp[i]->flags |= BSF_KEEP;
1816 	    symbol_mark_written (symp);
1817 	    /* Include this section symbol in the symbol table.  */
1818 	    if (symbol_section_p (symp))
1819 	      asympp[i]->flags |= BSF_SECTION_SYM_USED;
1820 	    i++;
1821 	  }
1822     }
1823   else
1824     asympp = 0;
1825   result = bfd_set_symtab (stdoutput, asympp, nsyms);
1826   gas_assert (result);
1827   symbol_table_frozen = 1;
1828 }
1829 
1830 /* Finish the subsegments.  After every sub-segment, we fake an
1831    ".align ...".  This conforms to BSD4.2 brain-damage.  We then fake
1832    ".fill 0" because that is the kind of frag that requires least
1833    thought.  ".align" frags like to have a following frag since that
1834    makes calculating their intended length trivial.  */
1835 
1836 #ifndef SUB_SEGMENT_ALIGN
1837 #ifdef HANDLE_ALIGN
1838 /* The last subsegment gets an alignment corresponding to the alignment
1839    of the section.  This allows proper nop-filling at the end of
1840    code-bearing sections.  */
1841 #define SUB_SEGMENT_ALIGN(SEG, FRCHAIN)					\
1842   (!(FRCHAIN)->frch_next && subseg_text_p (SEG)				\
1843    && !do_not_pad_sections_to_alignment					\
1844    ? get_recorded_alignment (SEG)					\
1845    : 0)
1846 #else
1847 #define SUB_SEGMENT_ALIGN(SEG, FRCHAIN) 0
1848 #endif
1849 #endif
1850 
1851 static void
subsegs_finish_section(asection * s)1852 subsegs_finish_section (asection *s)
1853 {
1854   struct frchain *frchainP;
1855   segment_info_type *seginfo = seg_info (s);
1856   if (!seginfo)
1857     return;
1858 
1859   for (frchainP = seginfo->frchainP;
1860        frchainP != NULL;
1861        frchainP = frchainP->frch_next)
1862     {
1863       int alignment;
1864 
1865       subseg_set (s, frchainP->frch_subseg);
1866 
1867       /* This now gets called even if we had errors.  In that case,
1868 	 any alignment is meaningless, and, moreover, will look weird
1869 	 if we are generating a listing.  */
1870       if (had_errors ())
1871 	do_not_pad_sections_to_alignment = 1;
1872 
1873       alignment = SUB_SEGMENT_ALIGN (now_seg, frchainP);
1874       if ((bfd_section_flags (now_seg) & SEC_MERGE)
1875 	  && now_seg->entsize)
1876 	{
1877 	  unsigned int entsize = now_seg->entsize;
1878 	  int entalign = 0;
1879 
1880 	  while ((entsize & 1) == 0)
1881 	    {
1882 	      ++entalign;
1883 	      entsize >>= 1;
1884 	    }
1885 
1886 	  if (entalign > alignment)
1887 	    alignment = entalign;
1888 	}
1889 
1890       if (subseg_text_p (now_seg))
1891 	frag_align_code (alignment, 0);
1892       else
1893 	frag_align (alignment, 0, 0);
1894 
1895       /* frag_align will have left a new frag.
1896 	 Use this last frag for an empty ".fill".
1897 
1898 	 For this segment ...
1899 	 Create a last frag. Do not leave a "being filled in frag".  */
1900       frag_wane (frag_now);
1901       frag_now->fr_fix = 0;
1902       know (frag_now->fr_next == NULL);
1903     }
1904 }
1905 
1906 static void
subsegs_finish(void)1907 subsegs_finish (void)
1908 {
1909   asection *s;
1910 
1911   for (s = stdoutput->sections; s; s = s->next)
1912     subsegs_finish_section (s);
1913 }
1914 
1915 #ifdef OBJ_ELF
1916 static void
create_obj_attrs_section(void)1917 create_obj_attrs_section (void)
1918 {
1919   segT s;
1920   char *p;
1921   offsetT size;
1922   const char *name;
1923 
1924   size = bfd_elf_obj_attr_size (stdoutput);
1925   if (size == 0)
1926     return;
1927 
1928   name = get_elf_backend_data (stdoutput)->obj_attrs_section;
1929   if (!name)
1930     name = ".gnu.attributes";
1931   s = subseg_new (name, 0);
1932   elf_section_type (s)
1933     = get_elf_backend_data (stdoutput)->obj_attrs_section_type;
1934   bfd_set_section_flags (s, SEC_READONLY | SEC_DATA);
1935   frag_now_fix ();
1936   p = frag_more (size);
1937   bfd_elf_set_obj_attr_contents (stdoutput, (bfd_byte *)p, size);
1938 
1939   subsegs_finish_section (s);
1940   relax_segment (seg_info (s)->frchainP->frch_root, s, 0);
1941   size_seg (stdoutput, s, NULL);
1942 }
1943 
1944 /* Create a relocation against an entry in a GNU Build attribute section.  */
1945 
1946 static void
create_note_reloc(segT sec,symbolS * sym,bfd_size_type note_offset,bfd_size_type desc2_offset,offsetT desc2_size,int reloc_type,bfd_vma addend,char * note)1947 create_note_reloc (segT           sec,
1948 		   symbolS *      sym,
1949 		   bfd_size_type  note_offset,
1950 		   bfd_size_type  desc2_offset,
1951 		   offsetT        desc2_size,
1952 		   int            reloc_type,
1953 		   bfd_vma        addend,
1954 		   char *         note)
1955 {
1956   struct reloc_list * reloc;
1957 
1958   reloc = XNEW (struct reloc_list);
1959 
1960   /* We create a .b type reloc as resolve_reloc_expr_symbols() has already been called.  */
1961   reloc->u.b.sec           = sec;
1962   reloc->u.b.s             = symbol_get_bfdsym (sym);
1963   reloc->u.b.r.sym_ptr_ptr = & reloc->u.b.s;
1964   reloc->u.b.r.address     = note_offset + desc2_offset;
1965   reloc->u.b.r.addend      = addend;
1966   reloc->u.b.r.howto       = bfd_reloc_type_lookup (stdoutput, reloc_type);
1967 
1968   if (reloc->u.b.r.howto == NULL)
1969     {
1970       as_bad (_("unable to create reloc for build note"));
1971       return;
1972     }
1973 
1974   reloc->file = N_("<gnu build note>");
1975   reloc->line = 0;
1976 
1977   reloc->next = reloc_list;
1978   reloc_list = reloc;
1979 
1980   /* For REL relocs, store the addend in the section.  */
1981   if (! sec->use_rela_p
1982       /* The SH target is a special case that uses RELA relocs
1983 	 but still stores the addend in the word being relocated.  */
1984       || strstr (bfd_get_target (stdoutput), "-sh") != NULL)
1985     {
1986       offsetT i;
1987 
1988       /* Zero out the addend, since it is now stored in the note.  */
1989       reloc->u.b.r.addend = 0;
1990 
1991       if (target_big_endian)
1992 	{
1993 	  for (i = desc2_size; addend != 0 && i > 0; addend >>= 8, i--)
1994 	    note[desc2_offset + i - 1] = (addend & 0xff);
1995 	}
1996       else
1997 	{
1998 	  for (i = 0; addend != 0 && i < desc2_size; addend >>= 8, i++)
1999 	    note[desc2_offset + i] = (addend & 0xff);
2000 	}
2001     }
2002 }
2003 
2004 static void
maybe_generate_build_notes(void)2005 maybe_generate_build_notes (void)
2006 {
2007   segT      sec;
2008   char *    note;
2009   offsetT   note_size;
2010   offsetT   total_size;
2011   offsetT   desc_size;
2012   offsetT   desc2_offset;
2013   int       desc_reloc;
2014   symbolS * sym;
2015   asymbol * bsym;
2016 
2017   if (! flag_generate_build_notes
2018       || bfd_get_section_by_name (stdoutput,
2019 				  GNU_BUILD_ATTRS_SECTION_NAME) != NULL)
2020     return;
2021 
2022   /* Create a GNU Build Attribute section.  */
2023   sec = subseg_new (GNU_BUILD_ATTRS_SECTION_NAME, false);
2024   elf_section_type (sec) = SHT_NOTE;
2025   bfd_set_section_flags (sec, (SEC_READONLY | SEC_HAS_CONTENTS | SEC_DATA
2026 			       | SEC_OCTETS));
2027   bfd_set_section_alignment (sec, 2);
2028 
2029   /* Work out the size of the notes that we will create,
2030      and the relocation we should use.  */
2031   if (bfd_arch_bits_per_address (stdoutput) <= 32)
2032     {
2033       note_size = 28;
2034       desc_size = 8; /* Two 4-byte offsets.  */
2035       desc2_offset = 24;
2036 
2037       /* FIXME: The BFD backend for the CRX target does not support the
2038 	 BFD_RELOC_32, even though it really should.  Likewise for the
2039 	 CR16 target.  So we have special case code here...  */
2040       if (strstr (bfd_get_target (stdoutput), "-crx") != NULL)
2041 	desc_reloc = BFD_RELOC_CRX_NUM32;
2042       else if (strstr (bfd_get_target (stdoutput), "-cr16") != NULL)
2043 	desc_reloc = BFD_RELOC_CR16_NUM32;
2044       else
2045 	desc_reloc = BFD_RELOC_32;
2046     }
2047   else
2048     {
2049       note_size = 36;
2050       desc_size = 16; /* Two  8-byte offsets.  */
2051       desc2_offset = 28;
2052       /* FIXME: The BFD backend for the IA64 target does not support the
2053 	 BFD_RELOC_64, even though it really should.  The HPPA backend
2054 	 has a similar issue, although it does not support BFD_RELOCs at
2055 	 all!  So we have special case code to handle these targets.  */
2056       if (strstr (bfd_get_target (stdoutput), "-ia64") != NULL)
2057 	desc_reloc = target_big_endian ? BFD_RELOC_IA64_DIR32MSB : BFD_RELOC_IA64_DIR32LSB;
2058       else if (strstr (bfd_get_target (stdoutput), "-hppa") != NULL)
2059 	desc_reloc = 80; /* R_PARISC_DIR64.  */
2060       else
2061 	desc_reloc = BFD_RELOC_64;
2062     }
2063 
2064   /* We have to create a note for *each* code section.
2065      Linker garbage collection might discard some.  */
2066   total_size = 0;
2067   note = NULL;
2068 
2069   for (sym = symbol_rootP; sym != NULL; sym = symbol_next (sym))
2070     if ((bsym = symbol_get_bfdsym (sym)) != NULL
2071 	&& bsym->flags & BSF_SECTION_SYM
2072 	&& bsym->section != NULL
2073 	/* Skip linkonce sections - we cannot use these section symbols as they may disappear.  */
2074 	&& (bsym->section->flags & (SEC_CODE | SEC_LINK_ONCE)) == SEC_CODE
2075 	/* Not all linkonce sections are flagged...  */
2076 	&& !startswith (S_GET_NAME (sym), ".gnu.linkonce"))
2077       {
2078 	/* Create a version note.  */
2079 	frag_now_fix ();
2080 	note = frag_more (note_size);
2081 	memset (note, 0, note_size);
2082 
2083 	if (target_big_endian)
2084 	  {
2085 	    note[3] = 8; /* strlen (name) + 1.  */
2086 	    note[7] = desc_size; /* Two N-byte offsets.  */
2087 	    note[10] = NT_GNU_BUILD_ATTRIBUTE_OPEN >> 8;
2088 	    note[11] = NT_GNU_BUILD_ATTRIBUTE_OPEN & 0xff;
2089 	  }
2090 	else
2091 	  {
2092 	    note[0] = 8; /* strlen (name) + 1.  */
2093 	    note[4] = desc_size; /* Two N-byte offsets.  */
2094 	    note[8] = NT_GNU_BUILD_ATTRIBUTE_OPEN & 0xff;
2095 	    note[9] = NT_GNU_BUILD_ATTRIBUTE_OPEN >> 8;
2096 	  }
2097 
2098 	/* The a1 version number indicates that this note was
2099 	   generated by the assembler and not the gcc annobin plugin.  */
2100 	memcpy (note + 12, "GA$3a1", 8);
2101 
2102 	/* Create a relocation to install the start address of the note...  */
2103 	create_note_reloc (sec, sym, total_size, 20, desc_size / 2, desc_reloc, 0, note);
2104 
2105 	/* ...and another one to install the end address.  */
2106 	create_note_reloc (sec, sym, total_size, desc2_offset,
2107 			   desc_size / 2,
2108 			   desc_reloc,
2109 			   bfd_section_size (bsym->section),
2110 			   note);
2111 
2112 	/* Mark the section symbol used in relocation so that it will be
2113 	   included in the symbol table.  */
2114 	symbol_mark_used_in_reloc (sym);
2115 
2116 	total_size += note_size;
2117 	/* FIXME: Maybe add a note recording the assembler command line and version ?  */
2118       }
2119 
2120   /* Install the note(s) into the section.  */
2121   if (total_size)
2122     bfd_set_section_contents (stdoutput, sec, (bfd_byte *) note, 0, total_size);
2123   subsegs_finish_section (sec);
2124   relax_segment (seg_info (sec)->frchainP->frch_root, sec, 0);
2125   size_seg (stdoutput, sec, NULL);
2126 }
2127 #endif /* OBJ_ELF */
2128 
2129 /* Write the object file.  */
2130 
2131 void
write_object_file(void)2132 write_object_file (void)
2133 {
2134   struct relax_seg_info rsi;
2135 #ifndef WORKING_DOT_WORD
2136   fragS *fragP;			/* Track along all frags.  */
2137 #endif
2138 
2139   subsegs_finish ();
2140 
2141 #ifdef md_pre_output_hook
2142   md_pre_output_hook;
2143 #endif
2144 
2145 #ifdef md_pre_relax_hook
2146   md_pre_relax_hook;
2147 #endif
2148 
2149   /* From now on, we don't care about sub-segments.  Build one frag chain
2150      for each segment. Linked through fr_next.  */
2151 
2152   /* Remove the sections created by gas for its own purposes.  */
2153   {
2154     int i;
2155 
2156     bfd_section_list_remove (stdoutput, reg_section);
2157     bfd_section_list_remove (stdoutput, expr_section);
2158     stdoutput->section_count -= 2;
2159     i = 0;
2160     bfd_map_over_sections (stdoutput, renumber_sections, &i);
2161   }
2162 
2163   bfd_map_over_sections (stdoutput, chain_frchains_together, (char *) 0);
2164 
2165   /* We have two segments. If user gave -R flag, then we must put the
2166      data frags into the text segment. Do this before relaxing so
2167      we know to take advantage of -R and make shorter addresses.  */
2168   if (flag_readonly_data_in_text)
2169     {
2170       merge_data_into_text ();
2171     }
2172 
2173   rsi.pass = 0;
2174   while (1)
2175     {
2176 #ifndef WORKING_DOT_WORD
2177       /* We need to reset the markers in the broken word list and
2178 	 associated frags between calls to relax_segment (via
2179 	 relax_seg).  Since the broken word list is global, we do it
2180 	 once per round, rather than locally in relax_segment for each
2181 	 segment.  */
2182       struct broken_word *brokp;
2183 
2184       for (brokp = broken_words;
2185 	   brokp != (struct broken_word *) NULL;
2186 	   brokp = brokp->next_broken_word)
2187 	{
2188 	  brokp->added = 0;
2189 
2190 	  if (brokp->dispfrag != (fragS *) NULL
2191 	      && brokp->dispfrag->fr_type == rs_broken_word)
2192 	    brokp->dispfrag->fr_subtype = 0;
2193 	}
2194 #endif
2195 
2196       rsi.changed = 0;
2197       bfd_map_over_sections (stdoutput, relax_seg, &rsi);
2198       rsi.pass++;
2199       if (!rsi.changed)
2200 	break;
2201     }
2202 
2203   /* Note - Most ports will use the default value of
2204      TC_FINALIZE_SYMS_BEFORE_SIZE_SEG, which 1.  This will force
2205      local symbols to be resolved, removing their frag information.
2206      Some ports however, will not have finished relaxing all of
2207      their frags and will still need the local symbol frag
2208      information.  These ports can set
2209      TC_FINALIZE_SYMS_BEFORE_SIZE_SEG to 0.  */
2210   finalize_syms = TC_FINALIZE_SYMS_BEFORE_SIZE_SEG;
2211 
2212   bfd_map_over_sections (stdoutput, size_seg, (char *) 0);
2213 
2214   /* Relaxation has completed.  Freeze all syms.  */
2215   finalize_syms = 1;
2216 
2217   dwarf2dbg_final_check ();
2218 
2219 #ifdef md_post_relax_hook
2220   md_post_relax_hook;
2221 #endif
2222 
2223 #ifdef OBJ_ELF
2224   if (IS_ELF)
2225     create_obj_attrs_section ();
2226 #endif
2227 
2228 #ifndef WORKING_DOT_WORD
2229   {
2230     struct broken_word *lie;
2231     struct broken_word **prevP;
2232 
2233     prevP = &broken_words;
2234     for (lie = broken_words; lie; lie = lie->next_broken_word)
2235       if (!lie->added)
2236 	{
2237 	  expressionS exp;
2238 
2239 	  subseg_change (lie->seg, lie->subseg);
2240 	  exp.X_op = O_subtract;
2241 	  exp.X_add_symbol = lie->add;
2242 	  exp.X_op_symbol = lie->sub;
2243 	  exp.X_add_number = lie->addnum;
2244 #ifdef TC_CONS_FIX_NEW
2245 	  TC_CONS_FIX_NEW (lie->frag,
2246 			   lie->word_goes_here - lie->frag->fr_literal,
2247 			   2, &exp, TC_PARSE_CONS_RETURN_NONE);
2248 #else
2249 	  fix_new_exp (lie->frag,
2250 		       lie->word_goes_here - lie->frag->fr_literal,
2251 		       2, &exp, 0, BFD_RELOC_16);
2252 #endif
2253 	  *prevP = lie->next_broken_word;
2254 	}
2255       else
2256 	prevP = &(lie->next_broken_word);
2257 
2258     for (lie = broken_words; lie;)
2259       {
2260 	struct broken_word *untruth;
2261 	char *table_ptr;
2262 	addressT table_addr;
2263 	addressT from_addr, to_addr;
2264 	int n, m;
2265 
2266 	subseg_change (lie->seg, lie->subseg);
2267 	fragP = lie->dispfrag;
2268 
2269 	/* Find out how many broken_words go here.  */
2270 	n = 0;
2271 	for (untruth = lie;
2272 	     untruth && untruth->dispfrag == fragP;
2273 	     untruth = untruth->next_broken_word)
2274 	  if (untruth->added == 1)
2275 	    n++;
2276 
2277 	table_ptr = lie->dispfrag->fr_opcode;
2278 	table_addr = (lie->dispfrag->fr_address
2279 		      + (table_ptr - lie->dispfrag->fr_literal));
2280 	/* Create the jump around the long jumps.  This is a short
2281 	   jump from table_ptr+0 to table_ptr+n*long_jump_size.  */
2282 	from_addr = table_addr;
2283 	to_addr = table_addr + md_short_jump_size + n * md_long_jump_size;
2284 	md_create_short_jump (table_ptr, from_addr, to_addr, lie->dispfrag,
2285 			      lie->add);
2286 	table_ptr += md_short_jump_size;
2287 	table_addr += md_short_jump_size;
2288 
2289 	for (m = 0;
2290 	     lie && lie->dispfrag == fragP;
2291 	     m++, lie = lie->next_broken_word)
2292 	  {
2293 	    if (lie->added == 2)
2294 	      continue;
2295 	    /* Patch the jump table.  */
2296 	    for (untruth = (struct broken_word *) (fragP->fr_symbol);
2297 		 untruth && untruth->dispfrag == fragP;
2298 		 untruth = untruth->next_broken_word)
2299 	      {
2300 		if (untruth->use_jump == lie)
2301 		  {
2302 		    /* This is the offset from ??? to table_ptr+0.
2303 		       The target is the same for all users of this
2304 		       md_long_jump, but the "sub" bases (and hence the
2305 		       offsets) may be different.  */
2306 		    addressT to_word = table_addr - S_GET_VALUE (untruth->sub);
2307 #ifdef TC_CHECK_ADJUSTED_BROKEN_DOT_WORD
2308 		    TC_CHECK_ADJUSTED_BROKEN_DOT_WORD (to_word, untruth);
2309 #endif
2310 		    md_number_to_chars (untruth->word_goes_here, to_word, 2);
2311 		  }
2312 	      }
2313 
2314 	    /* Install the long jump.  */
2315 	    /* This is a long jump from table_ptr+0 to the final target.  */
2316 	    from_addr = table_addr;
2317 	    to_addr = S_GET_VALUE (lie->add) + lie->addnum;
2318 	    md_create_long_jump (table_ptr, from_addr, to_addr, lie->dispfrag,
2319 				 lie->add);
2320 	    table_ptr += md_long_jump_size;
2321 	    table_addr += md_long_jump_size;
2322 	  }
2323       }
2324   }
2325 #endif /* not WORKING_DOT_WORD  */
2326 
2327   /* Resolve symbol values.  This needs to be done before processing
2328      the relocations.  */
2329   if (symbol_rootP)
2330     {
2331       symbolS *symp;
2332 
2333       for (symp = symbol_rootP; symp; symp = symbol_next (symp))
2334 	resolve_symbol_value (symp);
2335     }
2336   resolve_local_symbol_values ();
2337   resolve_reloc_expr_symbols ();
2338 
2339 #ifdef OBJ_ELF
2340   if (IS_ELF)
2341     maybe_generate_build_notes ();
2342 #endif
2343 
2344   PROGRESS (1);
2345 
2346 #ifdef tc_frob_file_before_adjust
2347   tc_frob_file_before_adjust ();
2348 #endif
2349 #ifdef obj_frob_file_before_adjust
2350   obj_frob_file_before_adjust ();
2351 #endif
2352 
2353   bfd_map_over_sections (stdoutput, adjust_reloc_syms, (char *) 0);
2354 
2355 #ifdef tc_frob_file_before_fix
2356   tc_frob_file_before_fix ();
2357 #endif
2358 #ifdef obj_frob_file_before_fix
2359   obj_frob_file_before_fix ();
2360 #endif
2361 
2362   bfd_map_over_sections (stdoutput, fix_segment, (char *) 0);
2363 
2364   /* Set up symbol table, and write it out.  */
2365   if (symbol_rootP)
2366     {
2367       symbolS *symp;
2368       bool skip_next_symbol = false;
2369 
2370       for (symp = symbol_rootP; symp; symp = symbol_next (symp))
2371 	{
2372 	  int punt = 0;
2373 	  const char *name;
2374 
2375 	  if (skip_next_symbol)
2376 	    {
2377 	      /* Don't do anything besides moving the value of the
2378 		 symbol from the GAS value-field to the BFD value-field.  */
2379 	      symbol_get_bfdsym (symp)->value = S_GET_VALUE (symp);
2380 	      skip_next_symbol = false;
2381 	      continue;
2382 	    }
2383 
2384 	  if (symbol_mri_common_p (symp))
2385 	    {
2386 	      if (S_IS_EXTERNAL (symp))
2387 		as_bad (_("%s: global symbols not supported in common sections"),
2388 			S_GET_NAME (symp));
2389 	      symbol_remove (symp, &symbol_rootP, &symbol_lastP);
2390 	      continue;
2391 	    }
2392 
2393 	  name = S_GET_NAME (symp);
2394 	  if (name)
2395 	    {
2396 	      const char *name2 =
2397 		decode_local_label_name ((char *) S_GET_NAME (symp));
2398 	      /* They only differ if `name' is a fb or dollar local
2399 		 label name.  */
2400 	      if (name2 != name && ! S_IS_DEFINED (symp))
2401 		as_bad (_("local label `%s' is not defined"), name2);
2402 	    }
2403 
2404 	  /* Do it again, because adjust_reloc_syms might introduce
2405 	     more symbols.  They'll probably only be section symbols,
2406 	     but they'll still need to have the values computed.  */
2407 	  resolve_symbol_value (symp);
2408 
2409 	  /* Skip symbols which were equated to undefined or common
2410 	     symbols.  */
2411 	  if (symbol_equated_reloc_p (symp)
2412 	      || S_IS_WEAKREFR (symp))
2413 	    {
2414 	      const char *sname = S_GET_NAME (symp);
2415 
2416 	      if (S_IS_COMMON (symp)
2417 		  && !TC_FAKE_LABEL (sname)
2418 		  && !S_IS_WEAKREFR (symp))
2419 		{
2420 		  expressionS *e = symbol_get_value_expression (symp);
2421 
2422 		  as_bad (_("`%s' can't be equated to common symbol `%s'"),
2423 			  sname, S_GET_NAME (e->X_add_symbol));
2424 		}
2425 	      if (S_GET_SEGMENT (symp) == reg_section)
2426 		{
2427 		  /* Report error only if we know the symbol name.  */
2428 		  if (S_GET_NAME (symp) != reg_section->name)
2429 		    as_bad (_("can't make global register symbol `%s'"),
2430 			    sname);
2431 		}
2432 	      symbol_remove (symp, &symbol_rootP, &symbol_lastP);
2433 	      continue;
2434 	    }
2435 
2436 #ifdef obj_frob_symbol
2437 	  obj_frob_symbol (symp, punt);
2438 #endif
2439 #ifdef tc_frob_symbol
2440 	  if (! punt || symbol_used_in_reloc_p (symp))
2441 	    tc_frob_symbol (symp, punt);
2442 #endif
2443 
2444 	  /* If we don't want to keep this symbol, splice it out of
2445 	     the chain now.  If EMIT_SECTION_SYMBOLS is 0, we never
2446 	     want section symbols.  Otherwise, we skip local symbols
2447 	     and symbols that the frob_symbol macros told us to punt,
2448 	     but we keep such symbols if they are used in relocs.  */
2449 	  if (symp == abs_section_sym
2450 	      || (! EMIT_SECTION_SYMBOLS
2451 		  && symbol_section_p (symp))
2452 	      /* Note that S_IS_EXTERNAL and S_IS_LOCAL are not always
2453 		 opposites.  Sometimes the former checks flags and the
2454 		 latter examines the name...  */
2455 	      || (!S_IS_EXTERNAL (symp)
2456 		  && (punt || S_IS_LOCAL (symp) ||
2457 		      (S_IS_WEAKREFD (symp) && ! symbol_used_p (symp)))
2458 		  && ! symbol_used_in_reloc_p (symp)))
2459 	    {
2460 	      symbol_remove (symp, &symbol_rootP, &symbol_lastP);
2461 
2462 	      /* After symbol_remove, symbol_next(symp) still returns
2463 		 the one that came after it in the chain.  So we don't
2464 		 need to do any extra cleanup work here.  */
2465 	      continue;
2466 	    }
2467 
2468 	  /* Make sure we really got a value for the symbol.  */
2469 	  if (! symbol_resolved_p (symp))
2470 	    {
2471 	      as_bad (_("can't resolve value for symbol `%s'"),
2472 		      S_GET_NAME (symp));
2473 	      symbol_mark_resolved (symp);
2474 	    }
2475 
2476 	  /* Set the value into the BFD symbol.  Up til now the value
2477 	     has only been kept in the gas symbolS struct.  */
2478 	  symbol_get_bfdsym (symp)->value = S_GET_VALUE (symp);
2479 
2480 	  /* A warning construct is a warning symbol followed by the
2481 	     symbol warned about.  Don't let anything object-format or
2482 	     target-specific muck with it; it's ready for output.  */
2483 	  if (symbol_get_bfdsym (symp)->flags & BSF_WARNING)
2484 	    skip_next_symbol = true;
2485 	}
2486     }
2487 
2488   PROGRESS (1);
2489 
2490   /* Now do any format-specific adjustments to the symbol table, such
2491      as adding file symbols.  */
2492 #ifdef tc_adjust_symtab
2493   tc_adjust_symtab ();
2494 #endif
2495 #ifdef obj_adjust_symtab
2496   obj_adjust_symtab ();
2497 #endif
2498 
2499   /* Stop if there is an error.  */
2500   if (!flag_always_generate_output && had_errors ())
2501     return;
2502 
2503   /* Now that all the sizes are known, and contents correct, we can
2504      start writing to the file.  */
2505   set_symtab ();
2506 
2507   /* If *_frob_file changes the symbol value at this point, it is
2508      responsible for moving the changed value into symp->bsym->value
2509      as well.  Hopefully all symbol value changing can be done in
2510      *_frob_symbol.  */
2511 #ifdef tc_frob_file
2512   tc_frob_file ();
2513 #endif
2514 #ifdef obj_frob_file
2515   obj_frob_file ();
2516 #endif
2517 #ifdef obj_coff_generate_pdata
2518   obj_coff_generate_pdata ();
2519 #endif
2520 
2521   bfd_map_over_sections (stdoutput, write_relocs, (char *) 0);
2522 
2523 #ifdef tc_frob_file_after_relocs
2524   tc_frob_file_after_relocs ();
2525 #endif
2526 #ifdef obj_frob_file_after_relocs
2527   obj_frob_file_after_relocs ();
2528 #endif
2529 
2530 #if defined OBJ_ELF || defined OBJ_MAYBE_ELF
2531   if (IS_ELF && flag_use_elf_stt_common)
2532     stdoutput->flags |= BFD_CONVERT_ELF_COMMON | BFD_USE_ELF_STT_COMMON;
2533 #endif
2534 
2535   /* Once all relocations have been written, we can compress the
2536      contents of the debug sections.  This needs to be done before
2537      we start writing any sections, because it will affect the file
2538      layout, which is fixed once we start writing contents.  */
2539   if (flag_compress_debug)
2540     {
2541       if (flag_compress_debug == COMPRESS_DEBUG_GABI_ZLIB)
2542 	stdoutput->flags |= BFD_COMPRESS | BFD_COMPRESS_GABI;
2543       else
2544 	stdoutput->flags |= BFD_COMPRESS;
2545       bfd_map_over_sections (stdoutput, compress_debug, (char *) 0);
2546     }
2547 
2548   bfd_map_over_sections (stdoutput, write_contents, (char *) 0);
2549 }
2550 
2551 #ifdef TC_GENERIC_RELAX_TABLE
2552 #ifndef md_generic_table_relax_frag
2553 #define md_generic_table_relax_frag relax_frag
2554 #endif
2555 
2556 /* Relax a fragment by scanning TC_GENERIC_RELAX_TABLE.  */
2557 
2558 long
relax_frag(segT segment,fragS * fragP,long stretch)2559 relax_frag (segT segment, fragS *fragP, long stretch)
2560 {
2561   const relax_typeS *this_type;
2562   const relax_typeS *start_type;
2563   relax_substateT next_state;
2564   relax_substateT this_state;
2565   offsetT growth;
2566   offsetT aim;
2567   addressT target;
2568   addressT address;
2569   symbolS *symbolP;
2570   const relax_typeS *table;
2571 
2572   target = fragP->fr_offset;
2573   address = fragP->fr_address + fragP->fr_fix;
2574   table = TC_GENERIC_RELAX_TABLE;
2575   this_state = fragP->fr_subtype;
2576   start_type = this_type = table + this_state;
2577   symbolP = fragP->fr_symbol;
2578 
2579   if (symbolP)
2580     {
2581       fragS *sym_frag;
2582 
2583       sym_frag = symbol_get_frag (symbolP);
2584 
2585 #ifndef DIFF_EXPR_OK
2586       know (sym_frag != NULL);
2587 #endif
2588       know (S_GET_SEGMENT (symbolP) != absolute_section
2589 	    || sym_frag == &zero_address_frag);
2590       target += S_GET_VALUE (symbolP);
2591 
2592       /* If SYM_FRAG has yet to be reached on this pass, assume it
2593 	 will move by STRETCH just as we did, unless there is an
2594 	 alignment frag between here and SYM_FRAG.  An alignment may
2595 	 well absorb any STRETCH, and we don't want to choose a larger
2596 	 branch insn by overestimating the needed reach of this
2597 	 branch.  It isn't critical to calculate TARGET exactly;  We
2598 	 know we'll be doing another pass if STRETCH is non-zero.  */
2599 
2600       if (stretch != 0
2601 	  && sym_frag->relax_marker != fragP->relax_marker
2602 	  && S_GET_SEGMENT (symbolP) == segment)
2603 	{
2604 	  if (stretch < 0
2605 	      || sym_frag->region == fragP->region)
2606 	    target += stretch;
2607 	  /* If we get here we know we have a forward branch.  This
2608 	     relax pass may have stretched previous instructions so
2609 	     far that omitting STRETCH would make the branch
2610 	     negative.  Don't allow this in case the negative reach is
2611 	     large enough to require a larger branch instruction.  */
2612 	  else if (target < address)
2613 	    return 0;
2614 	}
2615     }
2616 
2617   aim = target - address;
2618 #ifdef TC_PCREL_ADJUST
2619   /* Currently only the ns32k and arc needs this.  */
2620   aim += TC_PCREL_ADJUST (fragP);
2621 #endif
2622 
2623 #ifdef md_prepare_relax_scan
2624   /* Formerly called M68K_AIM_KLUDGE.  */
2625   md_prepare_relax_scan (fragP, address, aim, this_state, this_type);
2626 #endif
2627 
2628   if (aim < 0)
2629     {
2630       /* Look backwards.  */
2631       for (next_state = this_type->rlx_more; next_state;)
2632 	if (aim >= this_type->rlx_backward)
2633 	  next_state = 0;
2634 	else
2635 	  {
2636 	    /* Grow to next state.  */
2637 	    this_state = next_state;
2638 	    this_type = table + this_state;
2639 	    next_state = this_type->rlx_more;
2640 	  }
2641     }
2642   else
2643     {
2644       /* Look forwards.  */
2645       for (next_state = this_type->rlx_more; next_state;)
2646 	if (aim <= this_type->rlx_forward)
2647 	  next_state = 0;
2648 	else
2649 	  {
2650 	    /* Grow to next state.  */
2651 	    this_state = next_state;
2652 	    this_type = table + this_state;
2653 	    next_state = this_type->rlx_more;
2654 	  }
2655     }
2656 
2657   growth = this_type->rlx_length - start_type->rlx_length;
2658   if (growth != 0)
2659     fragP->fr_subtype = this_state;
2660   return growth;
2661 }
2662 
2663 #endif /* defined (TC_GENERIC_RELAX_TABLE)  */
2664 
2665 /* Relax_align. Advance location counter to next address that has 'alignment'
2666    lowest order bits all 0s, return size of adjustment made.  */
2667 static relax_addressT
relax_align(relax_addressT address,int alignment)2668 relax_align (relax_addressT address,	/* Address now.  */
2669 	     int alignment	/* Alignment (binary).  */)
2670 {
2671   relax_addressT mask;
2672   relax_addressT new_address;
2673 
2674   mask = ~((relax_addressT) ~0 << alignment);
2675   new_address = (address + mask) & (~mask);
2676 #ifdef LINKER_RELAXING_SHRINKS_ONLY
2677   if (linkrelax)
2678     /* We must provide lots of padding, so the linker can discard it
2679        when needed.  The linker will not add extra space, ever.  */
2680     new_address += (1 << alignment);
2681 #endif
2682   return (new_address - address);
2683 }
2684 
2685 /* Now we have a segment, not a crowd of sub-segments, we can make
2686    fr_address values.
2687 
2688    Relax the frags.
2689 
2690    After this, all frags in this segment have addresses that are correct
2691    within the segment. Since segments live in different file addresses,
2692    these frag addresses may not be the same as final object-file
2693    addresses.  */
2694 
2695 int
relax_segment(struct frag * segment_frag_root,segT segment,int pass)2696 relax_segment (struct frag *segment_frag_root, segT segment, int pass)
2697 {
2698   unsigned long frag_count;
2699   struct frag *fragP;
2700   relax_addressT address;
2701   int region;
2702   int ret;
2703 
2704   /* In case md_estimate_size_before_relax() wants to make fixSs.  */
2705   subseg_change (segment, 0);
2706 
2707   /* For each frag in segment: count and store  (a 1st guess of)
2708      fr_address.  */
2709   address = 0;
2710   region = 0;
2711   for (frag_count = 0, fragP = segment_frag_root;
2712        fragP;
2713        fragP = fragP->fr_next, frag_count ++)
2714     {
2715       fragP->region = region;
2716       fragP->relax_marker = 0;
2717       fragP->fr_address = address;
2718       address += fragP->fr_fix;
2719 
2720       switch (fragP->fr_type)
2721 	{
2722 	case rs_fill:
2723 	  address += fragP->fr_offset * fragP->fr_var;
2724 	  break;
2725 
2726 	case rs_align:
2727 	case rs_align_code:
2728 	case rs_align_test:
2729 	  {
2730 	    addressT offset = relax_align (address, (int) fragP->fr_offset);
2731 
2732 	    if (fragP->fr_subtype != 0 && offset > fragP->fr_subtype)
2733 	      offset = 0;
2734 
2735 	    if (offset % fragP->fr_var != 0)
2736 	      {
2737 		as_bad_where (fragP->fr_file, fragP->fr_line,
2738 			      ngettext ("alignment padding (%lu byte) "
2739 					"not a multiple of %ld",
2740 					"alignment padding (%lu bytes) "
2741 					"not a multiple of %ld",
2742 					(unsigned long) offset),
2743 			      (unsigned long) offset, (long) fragP->fr_var);
2744 		offset -= (offset % fragP->fr_var);
2745 	      }
2746 
2747 	    address += offset;
2748 	    region += 1;
2749 	  }
2750 	  break;
2751 
2752 	case rs_org:
2753 	  /* Assume .org is nugatory. It will grow with 1st relax.  */
2754 	  region += 1;
2755 	  break;
2756 
2757 	case rs_space:
2758 	case rs_space_nop:
2759 	  break;
2760 
2761 	case rs_machine_dependent:
2762 	  /* If fr_symbol is an expression, this call to
2763 	     resolve_symbol_value sets up the correct segment, which will
2764 	     likely be needed in md_estimate_size_before_relax.  */
2765 	  if (fragP->fr_symbol)
2766 	    resolve_symbol_value (fragP->fr_symbol);
2767 
2768 	  address += md_estimate_size_before_relax (fragP, segment);
2769 	  break;
2770 
2771 #ifndef WORKING_DOT_WORD
2772 	  /* Broken words don't concern us yet.  */
2773 	case rs_broken_word:
2774 	  break;
2775 #endif
2776 
2777 	case rs_leb128:
2778 	  /* Initial guess is always 1; doing otherwise can result in
2779 	     stable solutions that are larger than the minimum.  */
2780 	  address += fragP->fr_offset = 1;
2781 	  break;
2782 
2783 	case rs_cfa:
2784 	  address += eh_frame_estimate_size_before_relax (fragP);
2785 	  break;
2786 
2787 	case rs_dwarf2dbg:
2788 	  address += dwarf2dbg_estimate_size_before_relax (fragP);
2789 	  break;
2790 
2791 	default:
2792 	  BAD_CASE (fragP->fr_type);
2793 	  break;
2794 	}
2795     }
2796 
2797   /* Do relax().  */
2798   {
2799     unsigned long max_iterations;
2800 
2801     /* Cumulative address adjustment.  */
2802     offsetT stretch;
2803 
2804     /* Have we made any adjustment this pass?  We can't just test
2805        stretch because one piece of code may have grown and another
2806        shrank.  */
2807     int stretched;
2808 
2809     /* Most horrible, but gcc may give us some exception data that
2810        is impossible to assemble, of the form
2811 
2812        .align 4
2813        .byte 0, 0
2814        .uleb128 end - start
2815        start:
2816        .space 128*128 - 1
2817        .align 4
2818        end:
2819 
2820        If the leb128 is two bytes in size, then end-start is 128*128,
2821        which requires a three byte leb128.  If the leb128 is three
2822        bytes in size, then end-start is 128*128-1, which requires a
2823        two byte leb128.  We work around this dilemma by inserting
2824        an extra 4 bytes of alignment just after the .align.  This
2825        works because the data after the align is accessed relative to
2826        the end label.
2827 
2828        This counter is used in a tiny state machine to detect
2829        whether a leb128 followed by an align is impossible to
2830        relax.  */
2831     int rs_leb128_fudge = 0;
2832 
2833     /* We want to prevent going into an infinite loop where one frag grows
2834        depending upon the location of a symbol which is in turn moved by
2835        the growing frag.  eg:
2836 
2837 	 foo = .
2838 	 .org foo+16
2839 	 foo = .
2840 
2841        So we dictate that this algorithm can be at most O2.  */
2842     max_iterations = frag_count * frag_count;
2843     /* Check for overflow.  */
2844     if (max_iterations < frag_count)
2845       max_iterations = frag_count;
2846 
2847     ret = 0;
2848     do
2849       {
2850 	stretch = 0;
2851 	stretched = 0;
2852 
2853 	for (fragP = segment_frag_root; fragP; fragP = fragP->fr_next)
2854 	  {
2855 	    offsetT growth = 0;
2856 	    addressT was_address;
2857 	    offsetT offset;
2858 	    symbolS *symbolP;
2859 
2860 	    fragP->relax_marker ^= 1;
2861 	    was_address = fragP->fr_address;
2862 	    address = fragP->fr_address += stretch;
2863 	    symbolP = fragP->fr_symbol;
2864 	    offset = fragP->fr_offset;
2865 
2866 	    switch (fragP->fr_type)
2867 	      {
2868 	      case rs_fill:	/* .fill never relaxes.  */
2869 		growth = 0;
2870 		break;
2871 
2872 #ifndef WORKING_DOT_WORD
2873 		/* JF:  This is RMS's idea.  I do *NOT* want to be blamed
2874 		   for it I do not want to write it.  I do not want to have
2875 		   anything to do with it.  This is not the proper way to
2876 		   implement this misfeature.  */
2877 	      case rs_broken_word:
2878 		{
2879 		  struct broken_word *lie;
2880 		  struct broken_word *untruth;
2881 
2882 		  /* Yes this is ugly (storing the broken_word pointer
2883 		     in the symbol slot).  Still, this whole chunk of
2884 		     code is ugly, and I don't feel like doing anything
2885 		     about it.  Think of it as stubbornness in action.  */
2886 		  growth = 0;
2887 		  for (lie = (struct broken_word *) (fragP->fr_symbol);
2888 		       lie && lie->dispfrag == fragP;
2889 		       lie = lie->next_broken_word)
2890 		    {
2891 
2892 		      if (lie->added)
2893 			continue;
2894 
2895 		      offset = (S_GET_VALUE (lie->add)
2896 				+ lie->addnum
2897 				- S_GET_VALUE (lie->sub));
2898 		      if (offset <= -32768 || offset >= 32767)
2899 			{
2900 			  if (flag_warn_displacement)
2901 			    {
2902 			      char buf[50];
2903 
2904 			      bfd_sprintf_vma (stdoutput, buf,
2905 					       (addressT) lie->addnum);
2906 			      as_warn_where (fragP->fr_file, fragP->fr_line,
2907 					     _(".word %s-%s+%s didn't fit"),
2908 					     S_GET_NAME (lie->add),
2909 					     S_GET_NAME (lie->sub),
2910 					     buf);
2911 			    }
2912 			  if (fragP->fr_subtype == 0)
2913 			    {
2914 			      fragP->fr_subtype++;
2915 			      growth += md_short_jump_size;
2916 			    }
2917 
2918 			  /* Redirect *all* words of this table with the same
2919 			     target, lest we have to handle the case where the
2920 			     same target but with a offset that fits on this
2921 			     round overflows at the next relaxation round.  */
2922 			  for (untruth = (struct broken_word *) (fragP->fr_symbol);
2923 			       untruth && untruth->dispfrag == lie->dispfrag;
2924 			       untruth = untruth->next_broken_word)
2925 			    if ((symbol_get_frag (untruth->add)
2926 				 == symbol_get_frag (lie->add))
2927 				&& (S_GET_VALUE (untruth->add)
2928 				    == S_GET_VALUE (lie->add)))
2929 			      {
2930 				untruth->added = 2;
2931 				untruth->use_jump = lie;
2932 			      }
2933 
2934 			  lie->added = 1;
2935 			  growth += md_long_jump_size;
2936 			}
2937 		    }
2938 
2939 		  break;
2940 		}		/* case rs_broken_word  */
2941 #endif
2942 	      case rs_align:
2943 	      case rs_align_code:
2944 	      case rs_align_test:
2945 		{
2946 		  addressT oldoff, newoff;
2947 
2948 		  oldoff = relax_align (was_address + fragP->fr_fix,
2949 					(int) offset);
2950 		  newoff = relax_align (address + fragP->fr_fix,
2951 					(int) offset);
2952 
2953 		  if (fragP->fr_subtype != 0)
2954 		    {
2955 		      if (oldoff > fragP->fr_subtype)
2956 			oldoff = 0;
2957 		      if (newoff > fragP->fr_subtype)
2958 			newoff = 0;
2959 		    }
2960 
2961 		  growth = newoff - oldoff;
2962 
2963 		  /* If this align happens to follow a leb128 and
2964 		     we have determined that the leb128 is bouncing
2965 		     in size, then break the cycle by inserting an
2966 		     extra alignment.  */
2967 		  if (growth < 0
2968 		      && (rs_leb128_fudge & 16) != 0
2969 		      && (rs_leb128_fudge & 15) >= 2)
2970 		    {
2971 		      segment_info_type *seginfo = seg_info (segment);
2972 		      struct obstack *ob = &seginfo->frchainP->frch_obstack;
2973 		      struct frag *newf;
2974 
2975 		      newf = frag_alloc (ob);
2976 		      obstack_blank_fast (ob, fragP->fr_var);
2977 		      obstack_finish (ob);
2978 		      memcpy (newf, fragP, SIZEOF_STRUCT_FRAG);
2979 		      memcpy (newf->fr_literal,
2980 			      fragP->fr_literal + fragP->fr_fix,
2981 			      fragP->fr_var);
2982 		      newf->fr_type = rs_fill;
2983 		      newf->fr_address = address + fragP->fr_fix + newoff;
2984 		      newf->fr_fix = 0;
2985 		      newf->fr_offset = (((offsetT) 1 << fragP->fr_offset)
2986 					 / fragP->fr_var);
2987 		      if (newf->fr_offset * newf->fr_var
2988 			  != (offsetT) 1 << fragP->fr_offset)
2989 			{
2990 			  newf->fr_offset = (offsetT) 1 << fragP->fr_offset;
2991 			  newf->fr_var = 1;
2992 			}
2993 		      /* Include size of new frag in GROWTH.  */
2994 		      growth += newf->fr_offset * newf->fr_var;
2995 		      /* Adjust the new frag address for the amount
2996 			 we'll add when we process the new frag.  */
2997 		      newf->fr_address -= stretch + growth;
2998 		      newf->relax_marker ^= 1;
2999 		      fragP->fr_next = newf;
3000 #ifdef DEBUG
3001 		      as_warn (_("padding added"));
3002 #endif
3003 		    }
3004 		}
3005 		break;
3006 
3007 	      case rs_org:
3008 		{
3009 		  offsetT target = offset;
3010 		  addressT after;
3011 
3012 		  if (symbolP)
3013 		    {
3014 		      /* Convert from an actual address to an octet offset
3015 			 into the section.  Here it is assumed that the
3016 			 section's VMA is zero, and can omit subtracting it
3017 			 from the symbol's value to get the address offset.  */
3018 		      know (S_GET_SEGMENT (symbolP)->vma == 0);
3019 		      target += S_GET_VALUE (symbolP) * OCTETS_PER_BYTE;
3020 		    }
3021 
3022 		  know (fragP->fr_next);
3023 		  after = fragP->fr_next->fr_address + stretch;
3024 		  growth = target - after;
3025 
3026 		  /* Growth may be negative, but variable part of frag
3027 		     cannot have fewer than 0 chars.  That is, we can't
3028 		     .org backwards.  */
3029 		  if ((offsetT) (address + fragP->fr_fix) > target)
3030 		    {
3031 		      growth = 0;
3032 
3033 		      /* Don't error on first few frag relax passes.
3034 			 The symbol might be an expression involving
3035 			 symbol values from other sections.  If those
3036 			 sections have not yet been processed their
3037 			 frags will all have zero addresses, so we
3038 			 will calculate incorrect values for them.  The
3039 			 number of passes we allow before giving an
3040 			 error is somewhat arbitrary.  It should be at
3041 			 least one, with larger values requiring
3042 			 increasingly contrived dependencies between
3043 			 frags to trigger a false error.  */
3044 		      if (pass < 2)
3045 			{
3046 			  /* Force another pass.  */
3047 			  ret = 1;
3048 			  break;
3049 			}
3050 
3051 		      as_bad_where (fragP->fr_file, fragP->fr_line,
3052 				    _("attempt to move .org backwards"));
3053 
3054 		      /* We've issued an error message.  Change the
3055 			 frag to avoid cascading errors.  */
3056 		      fragP->fr_type = rs_align;
3057 		      fragP->fr_subtype = 0;
3058 		      fragP->fr_offset = 0;
3059 		      fragP->fr_fix = after - address;
3060 		    }
3061 		}
3062 		break;
3063 
3064 	      case rs_space:
3065 	      case rs_space_nop:
3066 		growth = 0;
3067 		if (symbolP)
3068 		  {
3069 		    offsetT amount;
3070 
3071 		    amount = S_GET_VALUE (symbolP);
3072 		    if (S_GET_SEGMENT (symbolP) != absolute_section
3073 			|| S_IS_COMMON (symbolP)
3074 			|| ! S_IS_DEFINED (symbolP))
3075 		      {
3076 			as_bad_where (fragP->fr_file, fragP->fr_line,
3077 				      _(".space, .nops or .fill specifies non-absolute value"));
3078 			/* Prevent repeat of this error message.  */
3079 			fragP->fr_symbol = 0;
3080 		      }
3081 		    else if (amount < 0)
3082 		      {
3083 			/* Don't error on first few frag relax passes.
3084 			   See rs_org comment for a longer explanation.  */
3085 			if (pass < 2)
3086 			  {
3087 			    ret = 1;
3088 			    break;
3089 			  }
3090 
3091 			as_warn_where (fragP->fr_file, fragP->fr_line,
3092 				       _(".space, .nops or .fill with negative value, ignored"));
3093 			fragP->fr_symbol = 0;
3094 		      }
3095 		    else
3096 		      growth = (was_address + fragP->fr_fix + amount
3097 				- fragP->fr_next->fr_address);
3098 		  }
3099 		break;
3100 
3101 	      case rs_machine_dependent:
3102 #ifdef md_relax_frag
3103 		growth = md_relax_frag (segment, fragP, stretch);
3104 #else
3105 #ifdef TC_GENERIC_RELAX_TABLE
3106 		/* The default way to relax a frag is to look through
3107 		   TC_GENERIC_RELAX_TABLE.  */
3108 		growth = md_generic_table_relax_frag (segment, fragP,
3109 						      stretch);
3110 #endif /* TC_GENERIC_RELAX_TABLE  */
3111 #endif
3112 		break;
3113 
3114 	      case rs_leb128:
3115 		{
3116 		  valueT value;
3117 		  offsetT size;
3118 
3119 		  value = resolve_symbol_value (fragP->fr_symbol);
3120 		  size = sizeof_leb128 (value, fragP->fr_subtype);
3121 		  growth = size - fragP->fr_offset;
3122 		  fragP->fr_offset = size;
3123 		}
3124 		break;
3125 
3126 	      case rs_cfa:
3127 		growth = eh_frame_relax_frag (fragP);
3128 		break;
3129 
3130 	      case rs_dwarf2dbg:
3131 		growth = dwarf2dbg_relax_frag (fragP);
3132 		break;
3133 
3134 	      default:
3135 		BAD_CASE (fragP->fr_type);
3136 		break;
3137 	      }
3138 	    if (growth)
3139 	      {
3140 		stretch += growth;
3141 		stretched = 1;
3142 		if (fragP->fr_type == rs_leb128)
3143 		  rs_leb128_fudge += 16;
3144 		else if (fragP->fr_type == rs_align
3145 			 && (rs_leb128_fudge & 16) != 0
3146 			 && stretch == 0)
3147 		  rs_leb128_fudge += 16;
3148 		else
3149 		  rs_leb128_fudge = 0;
3150 	      }
3151 	  }
3152 
3153 	if (stretch == 0
3154 	    && (rs_leb128_fudge & 16) == 0
3155 	    && (rs_leb128_fudge & -16) != 0)
3156 	  rs_leb128_fudge += 1;
3157 	else
3158 	  rs_leb128_fudge = 0;
3159       }
3160     /* Until nothing further to relax.  */
3161     while (stretched && -- max_iterations);
3162 
3163     if (stretched)
3164       as_fatal (_("Infinite loop encountered whilst attempting to compute the addresses of symbols in section %s"),
3165 		segment_name (segment));
3166   }
3167 
3168   for (fragP = segment_frag_root; fragP; fragP = fragP->fr_next)
3169     if (fragP->last_fr_address != fragP->fr_address)
3170       {
3171 	fragP->last_fr_address = fragP->fr_address;
3172 	ret = 1;
3173       }
3174   return ret;
3175 }
3176 
3177 void
number_to_chars_bigendian(char * buf,valueT val,int n)3178 number_to_chars_bigendian (char *buf, valueT val, int n)
3179 {
3180   if (n <= 0)
3181     abort ();
3182   while (n--)
3183     {
3184       buf[n] = val & 0xff;
3185       val >>= 8;
3186     }
3187 }
3188 
3189 void
number_to_chars_littleendian(char * buf,valueT val,int n)3190 number_to_chars_littleendian (char *buf, valueT val, int n)
3191 {
3192   if (n <= 0)
3193     abort ();
3194   while (n--)
3195     {
3196       *buf++ = val & 0xff;
3197       val >>= 8;
3198     }
3199 }
3200 
3201 void
write_print_statistics(FILE * file)3202 write_print_statistics (FILE *file)
3203 {
3204   fprintf (file, "fixups: %d\n", n_fixups);
3205 }
3206 
3207 /* For debugging.  */
3208 extern int indent_level;
3209 
3210 void
print_fixup(fixS * fixp)3211 print_fixup (fixS *fixp)
3212 {
3213   indent_level = 1;
3214   fprintf (stderr, "fix ");
3215   fprintf_vma (stderr, (bfd_vma) (uintptr_t) fixp);
3216   fprintf (stderr, " %s:%d",fixp->fx_file, fixp->fx_line);
3217   if (fixp->fx_pcrel)
3218     fprintf (stderr, " pcrel");
3219   if (fixp->fx_pcrel_adjust)
3220     fprintf (stderr, " pcrel_adjust=%d", fixp->fx_pcrel_adjust);
3221   if (fixp->fx_tcbit)
3222     fprintf (stderr, " tcbit");
3223   if (fixp->fx_done)
3224     fprintf (stderr, " done");
3225   fprintf (stderr, "\n    size=%d frag=", fixp->fx_size);
3226   fprintf_vma (stderr, (bfd_vma) (uintptr_t) fixp->fx_frag);
3227   fprintf (stderr, " where=%ld offset=%lx addnumber=%lx",
3228 	   (long) fixp->fx_where,
3229 	   (unsigned long) fixp->fx_offset,
3230 	   (unsigned long) fixp->fx_addnumber);
3231   fprintf (stderr, "\n    %s (%d)", bfd_get_reloc_code_name (fixp->fx_r_type),
3232 	   fixp->fx_r_type);
3233   if (fixp->fx_addsy)
3234     {
3235       fprintf (stderr, "\n   +<");
3236       print_symbol_value_1 (stderr, fixp->fx_addsy);
3237       fprintf (stderr, ">");
3238     }
3239   if (fixp->fx_subsy)
3240     {
3241       fprintf (stderr, "\n   -<");
3242       print_symbol_value_1 (stderr, fixp->fx_subsy);
3243       fprintf (stderr, ">");
3244     }
3245   fprintf (stderr, "\n");
3246 #ifdef TC_FIX_DATA_PRINT
3247   TC_FIX_DATA_PRINT (stderr, fixp);
3248 #endif
3249 }
3250