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