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