gdb/
[deliverable/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,
2da5c037 3 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005
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
10 the Free Software Foundation; either version 2, or (at your option)
11 any later version.
12
13 GAS is distributed in the hope that it will be useful,
14 but WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 GNU General Public License for more details.
17
18 You should have received a copy of the GNU General Public License
19 along with GAS; see the file COPYING. If not, write to the Free
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"
252b5132 30
252b5132 31#ifndef TC_ADJUST_RELOC_COUNT
df44284e 32#define TC_ADJUST_RELOC_COUNT(FIX, COUNT)
252b5132
RH
33#endif
34
35#ifndef TC_FORCE_RELOCATION
a161fe53 36#define TC_FORCE_RELOCATION(FIX) \
ae6063d4 37 (generic_force_reloc (FIX))
252b5132
RH
38#endif
39
a161fe53
AM
40#ifndef TC_FORCE_RELOCATION_ABS
41#define TC_FORCE_RELOCATION_ABS(FIX) \
42 (TC_FORCE_RELOCATION (FIX))
43#endif
44
45#ifndef TC_FORCE_RELOCATION_LOCAL
46#define TC_FORCE_RELOCATION_LOCAL(FIX) \
47 (!(FIX)->fx_pcrel \
48 || (FIX)->fx_plt \
49 || TC_FORCE_RELOCATION (FIX))
50#endif
51
52#ifndef TC_FORCE_RELOCATION_SUB_SAME
53#define TC_FORCE_RELOCATION_SUB_SAME(FIX, SEG) \
426318c5 54 (! SEG_NORMAL (SEG))
a161fe53
AM
55#endif
56
57#ifndef TC_FORCE_RELOCATION_SUB_ABS
4f3cafa2 58#define TC_FORCE_RELOCATION_SUB_ABS(FIX) 0
a161fe53
AM
59#endif
60
61#ifndef TC_FORCE_RELOCATION_SUB_LOCAL
62#ifdef DIFF_EXPR_OK
4f3cafa2 63#define TC_FORCE_RELOCATION_SUB_LOCAL(FIX) 0
a161fe53 64#else
4f3cafa2 65#define TC_FORCE_RELOCATION_SUB_LOCAL(FIX) 1
a161fe53
AM
66#endif
67#endif
68
69#ifndef TC_VALIDATE_FIX_SUB
70#ifdef UNDEFINED_DIFFERENCE_OK
71/* The PA needs this for PIC code generation. */
72#define TC_VALIDATE_FIX_SUB(FIX) 1
73#else
a161fe53
AM
74#define TC_VALIDATE_FIX_SUB(FIX) \
75 ((FIX)->fx_r_type == BFD_RELOC_GPREL32 \
76 || (FIX)->fx_r_type == BFD_RELOC_GPREL16)
a161fe53 77#endif
252b5132
RH
78#endif
79
58a77e41
EC
80#ifndef TC_LINKRELAX_FIXUP
81#define TC_LINKRELAX_FIXUP(SEG) 1
82#endif
83
a161fe53
AM
84#ifndef MD_APPLY_SYM_VALUE
85#define MD_APPLY_SYM_VALUE(FIX) 1
8f36cd18 86#endif
ef99799a 87
87548816
NC
88#ifndef TC_FINALIZE_SYMS_BEFORE_SIZE_SEG
89#define TC_FINALIZE_SYMS_BEFORE_SIZE_SEG 1
90#endif
91
252b5132 92#ifndef MD_PCREL_FROM_SECTION
df44284e 93#define MD_PCREL_FROM_SECTION(FIX, SEC) md_pcrel_from (FIX)
252b5132
RH
94#endif
95
c9cd7160
L
96#ifndef TC_FAKE_LABEL
97#define TC_FAKE_LABEL(NAME) (strcmp ((NAME), FAKE_LABEL_NAME) == 0)
98#endif
99
6386f3a7
AM
100/* Used to control final evaluation of expressions. */
101int finalize_syms = 0;
e46d99eb 102
252b5132 103int symbol_table_frozen;
a161fe53
AM
104
105symbolS *abs_section_sym;
106
26346241
AM
107/* Remember the value of dot when parsing expressions. */
108addressT dot_value;
109
d7342424 110void print_fixup (fixS *);
252b5132 111
d7342424 112static void renumber_sections (bfd *, asection *, PTR);
252b5132
RH
113
114/* We generally attach relocs to frag chains. However, after we have
115 chained these all together into a segment, any relocs we add after
116 that must be attached to a segment. This will include relocs added
117 in md_estimate_size_for_relax, for example. */
118static int frags_chained = 0;
252b5132
RH
119
120static int n_fixups;
121
df44284e 122#define RELOC_ENUM enum bfd_reloc_code_real
df44284e 123
d7342424
KH
124static fixS *fix_new_internal (fragS *, int where, int size,
125 symbolS *add, symbolS *sub,
126 offsetT offset, int pcrel,
127 RELOC_ENUM r_type);
d7342424 128static long fixup_segment (fixS *, segT);
d7342424 129static relax_addressT relax_align (relax_addressT addr, int align);
d7342424 130static fragS *chain_frchains_together_1 (segT, struct frchain *);
d7342424
KH
131static void chain_frchains_together (bfd *, segT, PTR);
132static void cvt_frag_to_fill (segT, fragS *);
133static void adjust_reloc_syms (bfd *, asection *, PTR);
134static void fix_segment (bfd *, asection *, PTR);
135static void write_relocs (bfd *, asection *, PTR);
136static void write_contents (bfd *, asection *, PTR);
137static void set_symtab (void);
d7342424 138static void merge_data_into_text (void);
252b5132 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
156 fixP = (fixS *) obstack_alloc (&notes, sizeof (fixS));
157
158 fixP->fx_frag = frag;
159 fixP->fx_where = where;
160 fixP->fx_size = size;
161 /* We've made fx_size a narrow field; check that it's wide enough. */
162 if (fixP->fx_size != size)
163 {
164 as_bad (_("field fx_size too small to hold %d"), size);
165 abort ();
166 }
167 fixP->fx_addsy = add_symbol;
168 fixP->fx_subsy = sub_symbol;
169 fixP->fx_offset = offset;
26346241 170 fixP->fx_dot_value = dot_value;
252b5132
RH
171 fixP->fx_pcrel = pcrel;
172 fixP->fx_plt = 0;
252b5132 173 fixP->fx_r_type = r_type;
252b5132
RH
174 fixP->fx_im_disp = 0;
175 fixP->fx_pcrel_adjust = 0;
176 fixP->fx_bit_fixP = 0;
177 fixP->fx_addnumber = 0;
178 fixP->fx_tcbit = 0;
179 fixP->fx_done = 0;
180 fixP->fx_no_overflow = 0;
181 fixP->fx_signed = 0;
182
183#ifdef USING_CGEN
184 fixP->fx_cgen.insn = NULL;
185 fixP->fx_cgen.opinfo = 0;
186#endif
187
188#ifdef TC_FIX_TYPE
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
d7342424 368renumber_sections (bfd *abfd ATTRIBUTE_UNUSED, asection *sec, PTR 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
RH
381
382 for (; frchp && frchp->frch_seg == section; frchp = frchp->frch_next)
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);
397 prev_frag->fr_next = 0;
398 return prev_frag;
399}
400
252b5132 401static void
d7342424
KH
402chain_frchains_together (bfd *abfd ATTRIBUTE_UNUSED,
403 segT section,
404 PTR xxx ATTRIBUTE_UNUSED)
252b5132
RH
405{
406 segment_info_type *info;
407
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)
efaf0ba4
NC
412 info->frchainP->frch_last
413 = chain_frchains_together_1 (section, info->frchainP);
252b5132
RH
414
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;
418}
419
252b5132 420static void
d7342424 421cvt_frag_to_fill (segT sec ATTRIBUTE_UNUSED, fragS *fragP)
252b5132
RH
422{
423 switch (fragP->fr_type)
424 {
425 case rs_align:
426 case rs_align_code:
0a9ef439 427 case rs_align_test:
252b5132
RH
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)
438 {
14ad458a
ILT
439 as_bad_where (fragP->fr_file, fragP->fr_line,
440 _("attempt to .org/.space backwards? (%ld)"),
441 (long) fragP->fr_offset);
3f3cdb03 442 fragP->fr_offset = 0;
252b5132
RH
443 }
444 fragP->fr_type = rs_fill;
445 break;
446
447 case rs_fill:
448 break;
449
450 case rs_leb128:
451 {
452 valueT value = S_GET_VALUE (fragP->fr_symbol);
453 int size;
454
455 size = output_leb128 (fragP->fr_literal + fragP->fr_fix, value,
456 fragP->fr_subtype);
457
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;
463 }
464 break;
465
466 case rs_cfa:
467 eh_frame_convert_frag (fragP);
468 break;
469
220e750f
RH
470 case rs_dwarf2dbg:
471 dwarf2dbg_convert_frag (fragP);
472 break;
473
252b5132 474 case rs_machine_dependent:
252b5132 475 md_convert_frag (stdoutput, sec, fragP);
252b5132
RH
476
477 assert (fragP->fr_next == NULL
478 || ((offsetT) (fragP->fr_next->fr_address - fragP->fr_address)
479 == fragP->fr_fix));
480
efaf0ba4
NC
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. */
252b5132
RH
484 frag_wane (fragP);
485 break;
486
487#ifndef WORKING_DOT_WORD
488 case rs_broken_word:
489 {
490 struct broken_word *lie;
491
492 if (fragP->fr_subtype)
493 {
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;
500 }
501 frag_wane (fragP);
502 }
503 break;
504#endif
505
506 default:
507 BAD_CASE (fragP->fr_type);
508 break;
509 }
09b935ac
AM
510#ifdef md_frag_check
511 md_frag_check (fragP);
512#endif
252b5132
RH
513}
514
d7342424
KH
515static void relax_seg (bfd *, asection *, PTR);
516
252b5132 517static void
d7342424 518relax_seg (bfd *abfd ATTRIBUTE_UNUSED, asection *sec, PTR xxx)
e46d99eb
AM
519{
520 segment_info_type *seginfo = seg_info (sec);
521
522 if (seginfo && seginfo->frchainP
523 && relax_segment (seginfo->frchainP->frch_root, sec))
524 {
525 int *result = (int *) xxx;
526 *result = 1;
527 }
528}
529
d7342424
KH
530static void size_seg (bfd *, asection *, PTR);
531
e46d99eb 532static void
d7342424 533size_seg (bfd *abfd, asection *sec, PTR xxx ATTRIBUTE_UNUSED)
252b5132
RH
534{
535 flagword flags;
536 fragS *fragp;
537 segment_info_type *seginfo;
538 int x;
539 valueT size, newsize;
540
541 subseg_change (sec, 0);
542
252b5132
RH
543 seginfo = seg_info (sec);
544 if (seginfo && seginfo->frchainP)
545 {
252b5132
RH
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)
efaf0ba4
NC
551 /* Walk to last elt. */
552 ;
252b5132
RH
553 size = fragp->fr_address + fragp->fr_fix;
554 }
555 else
556 size = 0;
557
e46d99eb
AM
558 flags = bfd_get_section_flags (abfd, sec);
559
252b5132
RH
560 if (size > 0 && ! seginfo->bss)
561 flags |= SEC_HAS_CONTENTS;
562
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);
b34976b6 569 assert (x);
252b5132
RH
570
571 newsize = md_section_align (sec, size);
572 x = bfd_set_section_size (abfd, sec, newsize);
b34976b6 573 assert (x);
252b5132
RH
574
575 /* If the size had to be rounded up, add some padding in the last
576 non-empty frag. */
577 assert (newsize >= size);
578 if (size != newsize)
579 {
580 fragS *last = seginfo->frchainP->frch_last;
581 fragp = seginfo->frchainP->frch_root;
582 while (fragp->fr_next != last)
583 fragp = fragp->fr_next;
584 last->fr_address = size;
18e1d487
AM
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 ();
252b5132
RH
593 }
594
595#ifdef tc_frob_section
596 tc_frob_section (sec);
597#endif
598#ifdef obj_frob_section
599 obj_frob_section (sec);
600#endif
601}
602
603#ifdef DEBUG2
604static void
988392e2 605dump_section_relocs (bfd *abfd ATTRIBUTE_UNUSED, asection *sec, FILE *stream)
252b5132 606{
252b5132
RH
607 segment_info_type *seginfo = seg_info (sec);
608 fixS *fixp = seginfo->fix_root;
609
610 if (!fixp)
611 return;
612
613 fprintf (stream, "sec %s relocs:\n", sec->name);
614 while (fixp)
615 {
616 symbolS *s = fixp->fx_addsy;
e723ef7c
ILT
617
618 fprintf (stream, " %08lx: type %d ", (unsigned long) fixp,
619 (int) fixp->fx_r_type);
620 if (s == NULL)
621 fprintf (stream, "no sym\n");
622 else
252b5132 623 {
e723ef7c
ILT
624 print_symbol_value_1 (stream, s);
625 fprintf (stream, "\n");
252b5132 626 }
252b5132
RH
627 fixp = fixp->fx_next;
628 }
629}
630#else
631#define dump_section_relocs(ABFD,SEC,STREAM) ((void) 0)
632#endif
633
634#ifndef EMIT_SECTION_SYMBOLS
635#define EMIT_SECTION_SYMBOLS 1
636#endif
637
df44284e
AM
638/* This pass over fixups decides whether symbols can be replaced with
639 section symbols. */
640
252b5132 641static void
d7342424
KH
642adjust_reloc_syms (bfd *abfd ATTRIBUTE_UNUSED,
643 asection *sec,
644 PTR xxx ATTRIBUTE_UNUSED)
252b5132
RH
645{
646 segment_info_type *seginfo = seg_info (sec);
647 fixS *fixp;
648
649 if (seginfo == NULL)
650 return;
651
652 dump_section_relocs (abfd, sec, stderr);
653
654 for (fixp = seginfo->fix_root; fixp; fixp = fixp->fx_next)
655 if (fixp->fx_done)
efaf0ba4
NC
656 /* Ignore it. */
657 ;
252b5132
RH
658 else if (fixp->fx_addsy)
659 {
660 symbolS *sym;
661 asection *symsec;
662
663#ifdef DEBUG5
664 fprintf (stderr, "\n\nadjusting fixup:\n");
665 print_fixup (fixp);
666#endif
667
668 sym = fixp->fx_addsy;
669
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. */
df44284e 674 resolve_symbol_value (sym);
efaf0ba4 675
49309057 676 if (fixp->fx_subsy != NULL)
6386f3a7 677 resolve_symbol_value (fixp->fx_subsy);
252b5132 678
60938e80
L
679 /* If this symbol is equated to an undefined or common symbol,
680 convert the fixup to being against that symbol. */
06e77878
AO
681 if (symbol_equated_reloc_p (sym)
682 || S_IS_WEAKREFR (sym))
252b5132 683 {
49309057 684 fixp->fx_offset += symbol_get_value_expression (sym)->X_add_number;
50afb01e 685 sym = symbol_get_value_expression (sym)->X_add_symbol;
252b5132
RH
686 fixp->fx_addsy = sym;
687 }
688
df44284e 689 if (symbol_mri_common_p (sym))
252b5132
RH
690 {
691 /* These symbols are handled specially in fixup_segment. */
df44284e 692 continue;
252b5132
RH
693 }
694
a161fe53
AM
695 /* If the symbol is undefined, common, weak, or global (ELF
696 shared libs), we can't replace it with the section symbol. */
ae6063d4 697 if (S_FORCE_RELOC (fixp->fx_addsy, 1))
a161fe53
AM
698 continue;
699
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
707
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;
712
252b5132 713 symsec = S_GET_SEGMENT (sym);
252b5132
RH
714 if (symsec == NULL)
715 abort ();
efaf0ba4 716
252b5132
RH
717 if (bfd_is_abs_section (symsec))
718 {
a161fe53
AM
719 /* The fixup_segment routine normally will not use this
720 symbol in a relocation. */
df44284e 721 continue;
252b5132
RH
722 }
723
7565ed77
ILT
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))
252b5132 729 {
a161fe53
AM
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;
252b5132 738 }
f7460f5f
JJ
739
740 /* Never adjust a reloc against local symbol in a merge section
741 with non-zero addend. */
5045ec7a
AM
742 if ((symsec->flags & SEC_MERGE) != 0
743 && (fixp->fx_offset != 0 || fixp->fx_subsy != NULL))
a161fe53 744 continue;
13ae64f3
JJ
745
746 /* Never adjust a reloc against TLS local symbol. */
df44284e 747 if ((symsec->flags & SEC_THREAD_LOCAL) != 0)
a161fe53 748 continue;
252b5132 749
a161fe53 750 /* We refetch the segment when calling section_symbol, rather
252b5132 751 than using symsec, because S_GET_VALUE may wind up changing
efaf0ba4 752 the section when it calls resolve_symbol_value. */
252b5132
RH
753 fixp->fx_offset += S_GET_VALUE (sym);
754 fixp->fx_addsy = section_symbol (S_GET_SEGMENT (sym));
e723ef7c
ILT
755#ifdef DEBUG5
756 fprintf (stderr, "\nadjusted fixup:\n");
757 print_fixup (fixp);
758#endif
252b5132 759 }
252b5132
RH
760
761 dump_section_relocs (abfd, sec, stderr);
762}
763
a161fe53 764static void
d7342424
KH
765fix_segment (bfd *abfd ATTRIBUTE_UNUSED,
766 asection *sec,
767 PTR xxx ATTRIBUTE_UNUSED)
a161fe53
AM
768{
769 segment_info_type *seginfo = seg_info (sec);
770
771 fixup_segment (seginfo->fix_root, sec);
772}
773
252b5132 774static void
d7342424 775write_relocs (bfd *abfd, asection *sec, PTR xxx ATTRIBUTE_UNUSED)
252b5132
RH
776{
777 segment_info_type *seginfo = seg_info (sec);
927781e2 778 unsigned int i;
252b5132
RH
779 unsigned int n;
780 arelent **relocs;
781 fixS *fixp;
782 char *err;
783
784 /* If seginfo is NULL, we did not create this section; don't do
785 anything with it. */
786 if (seginfo == NULL)
787 return;
788
252b5132
RH
789 n = 0;
790 for (fixp = seginfo->fix_root; fixp; fixp = fixp->fx_next)
791 n++;
792
793#ifndef RELOC_EXPANSION_POSSIBLE
794 /* Set up reloc information as well. */
d25d759d 795 relocs = (arelent **) xcalloc (n, sizeof (arelent *));
252b5132
RH
796
797 i = 0;
798 for (fixp = seginfo->fix_root; fixp != (fixS *) NULL; fixp = fixp->fx_next)
799 {
800 arelent *reloc;
801 bfd_reloc_status_type s;
802 symbolS *sym;
803
804 if (fixp->fx_done)
805 {
806 n--;
807 continue;
808 }
809
810 /* If this is an undefined symbol which was equated to another
e0890092 811 symbol, then generate the reloc against the latter symbol
252b5132
RH
812 rather than the former. */
813 sym = fixp->fx_addsy;
e0890092 814 while (symbol_equated_reloc_p (sym))
252b5132
RH
815 {
816 symbolS *n;
817
818 /* We must avoid looping, as that can occur with a badly
819 written program. */
49309057 820 n = symbol_get_value_expression (sym)->X_add_symbol;
252b5132
RH
821 if (n == sym)
822 break;
49309057 823 fixp->fx_offset += symbol_get_value_expression (sym)->X_add_number;
252b5132
RH
824 sym = n;
825 }
826 fixp->fx_addsy = sym;
827
828 reloc = tc_gen_reloc (sec, fixp);
829 if (!reloc)
830 {
831 n--;
832 continue;
833 }
834
59c871b4
BE
835 /*
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 ();
840 */
252b5132
RH
841
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)
847 {
848 case bfd_reloc_ok:
849 break;
850 case bfd_reloc_overflow:
df44284e
AM
851 as_bad_where (fixp->fx_file, fixp->fx_line,
852 _("relocation overflow"));
252b5132
RH
853 break;
854 case bfd_reloc_outofrange:
df44284e
AM
855 as_bad_where (fixp->fx_file, fixp->fx_line,
856 _("relocation out of range"));
252b5132
RH
857 break;
858 default:
859 as_fatal (_("%s:%u: bad return from bfd_install_relocation: %x"),
860 fixp->fx_file, fixp->fx_line, s);
861 }
862 relocs[i++] = reloc;
863 }
864#else
865 n = n * MAX_RELOC_EXPANSION;
866 /* Set up reloc information as well. */
d25d759d 867 relocs = (arelent **) xcalloc (n, sizeof (arelent *));
252b5132
RH
868
869 i = 0;
870 for (fixp = seginfo->fix_root; fixp != (fixS *) NULL; fixp = fixp->fx_next)
871 {
872 arelent **reloc;
252b5132
RH
873 bfd_reloc_status_type s;
874 symbolS *sym;
875 int j;
876
877 if (fixp->fx_done)
878 {
879 n--;
880 continue;
881 }
882
883 /* If this is an undefined symbol which was equated to another
44852b19 884 symbol, then generate the reloc against the latter symbol
252b5132
RH
885 rather than the former. */
886 sym = fixp->fx_addsy;
e0890092 887 while (symbol_equated_reloc_p (sym))
df44284e
AM
888 {
889 symbolS *n;
890
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;
898 }
252b5132
RH
899 fixp->fx_addsy = sym;
900
901 reloc = tc_gen_reloc (sec, fixp);
902
903 for (j = 0; reloc[j]; j++)
904 {
efaf0ba4
NC
905 relocs[i++] = reloc[j];
906 assert (i <= n);
252b5132 907 }
252b5132
RH
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++)
efaf0ba4 913 {
252b5132
RH
914 s = bfd_install_relocation (stdoutput, reloc[j],
915 fixp->fx_frag->fr_literal,
916 fixp->fx_frag->fr_address,
917 sec, &err);
efaf0ba4 918 switch (s)
252b5132
RH
919 {
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;
df44284e
AM
926 case bfd_reloc_outofrange:
927 as_bad_where (fixp->fx_file, fixp->fx_line,
928 _("relocation out of range"));
929 break;
252b5132 930 default:
df44284e
AM
931 as_fatal (_("%s:%u: bad return from bfd_install_relocation: %x"),
932 fixp->fx_file, fixp->fx_line, s);
252b5132 933 }
efaf0ba4 934 }
252b5132
RH
935 }
936 n = i;
937#endif
938
939#ifdef DEBUG4
940 {
988392e2 941 unsigned int i, j, nsyms;
252b5132
RH
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)
947 {
948 for (j = 0; j < nsyms; j++)
949 if (sympp[j] == *relocs[i]->sym_ptr_ptr)
950 break;
951 if (j == nsyms)
952 abort ();
953 }
954 }
955#endif
956
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));
963
945a1a6b
ILT
964#ifdef SET_SECTION_RELOCS
965 SET_SECTION_RELOCS (sec, relocs, n);
966#endif
967
252b5132
RH
968#ifdef DEBUG3
969 {
988392e2 970 unsigned int i;
252b5132
RH
971 arelent *r;
972 asymbol *s;
973 fprintf (stderr, "relocs for sec %s\n", sec->name);
974 for (i = 0; i < n; i++)
975 {
976 r = relocs[i];
977 s = *r->sym_ptr_ptr;
988392e2
CG
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);
252b5132
RH
980 }
981 }
982#endif
983}
984
985static void
d7342424
KH
986write_contents (bfd *abfd ATTRIBUTE_UNUSED,
987 asection *sec,
988 PTR xxx ATTRIBUTE_UNUSED)
252b5132
RH
989{
990 segment_info_type *seginfo = seg_info (sec);
685736be 991 addressT offset = 0;
252b5132
RH
992 fragS *f;
993
994 /* Write out the frags. */
995 if (seginfo == NULL
efaf0ba4 996 || !(bfd_get_section_flags (abfd, sec) & SEC_HAS_CONTENTS))
252b5132
RH
997 return;
998
999 for (f = seginfo->frchainP->frch_root;
1000 f;
1001 f = f->fr_next)
1002 {
1003 int x;
685736be 1004 addressT fill_size;
252b5132 1005 char *fill_literal;
685736be 1006 offsetT count;
252b5132
RH
1007
1008 assert (f->fr_type == rs_fill);
1009 if (f->fr_fix)
1010 {
1011 x = bfd_set_section_contents (stdoutput, sec,
1012 f->fr_literal, (file_ptr) offset,
1013 (bfd_size_type) f->fr_fix);
b34976b6 1014 if (!x)
252b5132
RH
1015 {
1016 bfd_perror (stdoutput->filename);
1017 as_perror (_("FATAL: Can't write %s"), stdoutput->filename);
1018 exit (EXIT_FAILURE);
1019 }
1020 offset += f->fr_fix;
1021 }
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)
1027 {
1028 char buf[256];
efaf0ba4 1029 if (fill_size > sizeof (buf))
252b5132 1030 {
efaf0ba4 1031 /* Do it the old way. Can this ever happen? */
252b5132
RH
1032 while (count--)
1033 {
1034 x = bfd_set_section_contents (stdoutput, sec,
1035 fill_literal,
1036 (file_ptr) offset,
1037 (bfd_size_type) fill_size);
b34976b6 1038 if (!x)
252b5132
RH
1039 {
1040 bfd_perror (stdoutput->filename);
efaf0ba4
NC
1041 as_perror (_("FATAL: Can't write %s"),
1042 stdoutput->filename);
252b5132
RH
1043 exit (EXIT_FAILURE);
1044 }
1045 offset += fill_size;
1046 }
1047 }
1048 else
1049 {
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)
1055 {
1056 n_per_buf = sizeof (buf);
1057 memset (buf, *fill_literal, n_per_buf);
1058 }
1059 else
1060 {
1061 char *bufp;
efaf0ba4 1062 n_per_buf = sizeof (buf) / fill_size;
252b5132 1063 for (i = n_per_buf, bufp = buf; i; i--, bufp += fill_size)
efaf0ba4 1064 memcpy (bufp, fill_literal, fill_size);
252b5132
RH
1065 }
1066 for (; count > 0; count -= n_per_buf)
1067 {
1068 n_per_buf = n_per_buf > count ? count : n_per_buf;
efaf0ba4
NC
1069 x = bfd_set_section_contents
1070 (stdoutput, sec, buf, (file_ptr) offset,
1071 (bfd_size_type) n_per_buf * fill_size);
b34976b6 1072 if (!x)
0e389e77 1073 as_fatal (_("cannot write to output file"));
252b5132
RH
1074 offset += n_per_buf * fill_size;
1075 }
1076 }
1077 }
1078 }
1079}
252b5132 1080
252b5132 1081static void
d7342424 1082merge_data_into_text (void)
252b5132 1083{
252b5132
RH
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;
252b5132 1089}
252b5132 1090
252b5132 1091static void
d7342424 1092set_symtab (void)
252b5132
RH
1093{
1094 int nsyms;
1095 asymbol **asympp;
1096 symbolS *symp;
b34976b6 1097 bfd_boolean result;
d7342424 1098 extern PTR bfd_alloc (bfd *, bfd_size_type);
252b5132
RH
1099
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++;
1106
1107 if (nsyms)
1108 {
1109 int i;
0e1a166b 1110 bfd_size_type amt = (bfd_size_type) nsyms * sizeof (asymbol *);
252b5132 1111
0e1a166b 1112 asympp = (asymbol **) bfd_alloc (stdoutput, amt);
252b5132
RH
1113 symp = symbol_rootP;
1114 for (i = 0; i < nsyms; i++, symp = symbol_next (symp))
1115 {
49309057
ILT
1116 asympp[i] = symbol_get_bfdsym (symp);
1117 symbol_mark_written (symp);
252b5132
RH
1118 }
1119 }
1120 else
1121 asympp = 0;
1122 result = bfd_set_symtab (stdoutput, asympp, nsyms);
b34976b6 1123 assert (result);
252b5132
RH
1124 symbol_table_frozen = 1;
1125}
252b5132
RH
1126
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. */
1132
1133#ifndef SUB_SEGMENT_ALIGN
18e1d487 1134#ifdef HANDLE_ALIGN
436d9e46 1135/* The last subsegment gets an alignment corresponding to the alignment
18e1d487
AM
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
18e1d487 1142#define SUB_SEGMENT_ALIGN(SEG, FRCHAIN) 0
252b5132
RH
1143#endif
1144#endif
1145
1146void
d7342424 1147subsegs_finish (void)
252b5132
RH
1148{
1149 struct frchain *frchainP;
1150
1151 for (frchainP = frchain_root; frchainP; frchainP = frchainP->frch_next)
1152 {
18e1d487 1153 int alignment = 0;
0a9ef439 1154
252b5132
RH
1155 subseg_set (frchainP->frch_seg, frchainP->frch_subseg);
1156
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. */
18e1d487 1160 if (!had_errors ())
381a1ab3
JJ
1161 {
1162 alignment = SUB_SEGMENT_ALIGN (now_seg, frchainP);
381a1ab3
JJ
1163 if ((bfd_get_section_flags (now_seg->owner, now_seg) & SEC_MERGE)
1164 && now_seg->entsize)
1165 {
1166 unsigned int entsize = now_seg->entsize;
1167 int entalign = 0;
1168
1169 while ((entsize & 1) == 0)
1170 {
1171 ++entalign;
1172 entsize >>= 1;
1173 }
1174 if (entalign > alignment)
1175 alignment = entalign;
1176 }
381a1ab3 1177 }
0a9ef439 1178
799051fc
RH
1179 if (subseg_text_p (now_seg))
1180 frag_align_code (alignment, 0);
1181 else
1182 frag_align (alignment, 0, 0);
252b5132
RH
1183
1184 /* frag_align will have left a new frag.
1185 Use this last frag for an empty ".fill".
1186
1187 For this segment ...
1188 Create a last frag. Do not leave a "being filled in frag". */
252b5132
RH
1189 frag_wane (frag_now);
1190 frag_now->fr_fix = 0;
1191 know (frag_now->fr_next == NULL);
1192 }
1193}
1194
1195/* Write the object file. */
1196
1197void
d7342424 1198write_object_file (void)
252b5132 1199{
7be1c489 1200#ifndef WORKING_DOT_WORD
efaf0ba4 1201 fragS *fragP; /* Track along all frags. */
252b5132
RH
1202#endif
1203
1204 /* Do we really want to write it? */
1205 {
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)
1212 {
1213 if (n_warns || n_errs)
0e389e77 1214 as_warn (_("%d error%s, %d warning%s, generating bad object file"),
252b5132
RH
1215 n_errs, n_errs == 1 ? "" : "s",
1216 n_warns, n_warns == 1 ? "" : "s");
1217 }
1218 else
1219 {
1220 if (n_errs)
0e389e77 1221 as_fatal (_("%d error%s, %d warning%s, no object file generated"),
252b5132
RH
1222 n_errs, n_errs == 1 ? "" : "s",
1223 n_warns, n_warns == 1 ? "" : "s");
1224 }
1225 }
1226
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",
efaf0ba4 1230 and if so -- fix it up so that it can be program entry point. */
252b5132 1231 vms_check_for_main ();
efaf0ba4 1232#endif /* OBJ_VMS */
252b5132
RH
1233
1234 /* From now on, we don't care about sub-segments. Build one frag chain
1235 for each segment. Linked thru fr_next. */
1236
252b5132
RH
1237 /* Remove the sections created by gas for its own purposes. */
1238 {
252b5132
RH
1239 int i;
1240
5daa8fe7
L
1241 bfd_section_list_remove (stdoutput, reg_section);
1242 bfd_section_list_remove (stdoutput, expr_section);
1243 stdoutput->section_count -= 2;
252b5132
RH
1244 i = 0;
1245 bfd_map_over_sections (stdoutput, renumber_sections, &i);
1246 }
1247
1248 bfd_map_over_sections (stdoutput, chain_frchains_together, (char *) 0);
252b5132
RH
1249
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. */
252b5132
RH
1253 if (flag_readonly_data_in_text)
1254 {
1255 merge_data_into_text ();
1256 }
252b5132 1257
e46d99eb
AM
1258 while (1)
1259 {
1260 int changed;
1261
aacb5251
HPN
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;
1269
1270 for (brokp = broken_words;
1271 brokp != (struct broken_word *) NULL;
1272 brokp = brokp->next_broken_word)
1273 {
1274 brokp->added = 0;
1275
1276 if (brokp->dispfrag != (fragS *) NULL
1277 && brokp->dispfrag->fr_type == rs_broken_word)
1278 brokp->dispfrag->fr_subtype = 0;
1279 }
1280#endif
1281
e46d99eb
AM
1282 changed = 0;
1283 bfd_map_over_sections (stdoutput, relax_seg, &changed);
1284 if (!changed)
1285 break;
1286 }
e027f3e8 1287
87548816
NC
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;
1296
e46d99eb 1297 bfd_map_over_sections (stdoutput, size_seg, (char *) 0);
e46d99eb 1298
38b87a1b
NC
1299 /* Relaxation has completed. Freeze all syms. */
1300 finalize_syms = 1;
1301
e0001a05
NC
1302#ifdef md_post_relax_hook
1303 md_post_relax_hook;
1304#endif
1305
252b5132
RH
1306#ifndef WORKING_DOT_WORD
1307 {
1308 struct broken_word *lie;
1309 struct broken_word **prevP;
1310
1311 prevP = &broken_words;
1312 for (lie = broken_words; lie; lie = lie->next_broken_word)
1313 if (!lie->added)
1314 {
1315 expressionS exp;
1316
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;
252b5132
RH
1322#ifdef TC_CONS_FIX_NEW
1323 TC_CONS_FIX_NEW (lie->frag,
efaf0ba4
NC
1324 lie->word_goes_here - lie->frag->fr_literal,
1325 2, &exp);
252b5132
RH
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
252b5132
RH
1331 *prevP = lie->next_broken_word;
1332 }
1333 else
1334 prevP = &(lie->next_broken_word);
1335
1336 for (lie = broken_words; lie;)
1337 {
1338 struct broken_word *untruth;
1339 char *table_ptr;
1340 addressT table_addr;
1341 addressT from_addr, to_addr;
1342 int n, m;
1343
1344 subseg_change (lie->seg, lie->subseg);
1345 fragP = lie->dispfrag;
1346
1347 /* Find out how many broken_words go here. */
1348 n = 0;
efaf0ba4
NC
1349 for (untruth = lie;
1350 untruth && untruth->dispfrag == fragP;
1351 untruth = untruth->next_broken_word)
252b5132
RH
1352 if (untruth->added == 1)
1353 n++;
1354
1355 table_ptr = lie->dispfrag->fr_opcode;
efaf0ba4
NC
1356 table_addr = (lie->dispfrag->fr_address
1357 + (table_ptr - lie->dispfrag->fr_literal));
252b5132
RH
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;
efaf0ba4
NC
1362 md_create_short_jump (table_ptr, from_addr, to_addr, lie->dispfrag,
1363 lie->add);
252b5132
RH
1364 table_ptr += md_short_jump_size;
1365 table_addr += md_short_jump_size;
1366
efaf0ba4
NC
1367 for (m = 0;
1368 lie && lie->dispfrag == fragP;
1369 m++, lie = lie->next_broken_word)
252b5132
RH
1370 {
1371 if (lie->added == 2)
1372 continue;
efaf0ba4
NC
1373 /* Patch the jump table. */
1374 /* This is the offset from ??? to table_ptr+0. */
252b5132 1375 to_addr = table_addr - S_GET_VALUE (lie->sub);
753f6b12
HPN
1376#ifdef TC_CHECK_ADJUSTED_BROKEN_DOT_WORD
1377 TC_CHECK_ADJUSTED_BROKEN_DOT_WORD (to_addr, lie);
252b5132
RH
1378#endif
1379 md_number_to_chars (lie->word_goes_here, to_addr, 2);
efaf0ba4
NC
1380 for (untruth = lie->next_broken_word;
1381 untruth && untruth->dispfrag == fragP;
1382 untruth = untruth->next_broken_word)
252b5132
RH
1383 {
1384 if (untruth->use_jump == lie)
1385 md_number_to_chars (untruth->word_goes_here, to_addr, 2);
1386 }
1387
efaf0ba4
NC
1388 /* Install the long jump. */
1389 /* This is a long jump from table_ptr+0 to the final target. */
252b5132
RH
1390 from_addr = table_addr;
1391 to_addr = S_GET_VALUE (lie->add) + lie->addnum;
efaf0ba4
NC
1392 md_create_long_jump (table_ptr, from_addr, to_addr, lie->dispfrag,
1393 lie->add);
252b5132
RH
1394 table_ptr += md_long_jump_size;
1395 table_addr += md_long_jump_size;
1396 }
1397 }
1398 }
efaf0ba4 1399#endif /* not WORKING_DOT_WORD */
252b5132 1400
252b5132
RH
1401 /* Resolve symbol values. This needs to be done before processing
1402 the relocations. */
1403 if (symbol_rootP)
1404 {
1405 symbolS *symp;
1406
1407 for (symp = symbol_rootP; symp; symp = symbol_next (symp))
6386f3a7 1408 resolve_symbol_value (symp);
252b5132 1409 }
49309057 1410 resolve_local_symbol_values ();
252b5132
RH
1411
1412 PROGRESS (1);
1413
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
1420
efaf0ba4 1421 bfd_map_over_sections (stdoutput, adjust_reloc_syms, (char *) 0);
252b5132 1422
a161fe53
AM
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
1429
1430 bfd_map_over_sections (stdoutput, fix_segment, (char *) 0);
1431
252b5132
RH
1432 /* Set up symbol table, and write it out. */
1433 if (symbol_rootP)
1434 {
1435 symbolS *symp;
aaac53f5 1436 bfd_boolean skip_next_symbol = FALSE;
252b5132
RH
1437
1438 for (symp = symbol_rootP; symp; symp = symbol_next (symp))
1439 {
1440 int punt = 0;
1441 const char *name;
1442
aaac53f5
HPN
1443 if (skip_next_symbol)
1444 {
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;
1450 }
1451
49309057 1452 if (symbol_mri_common_p (symp))
252b5132
RH
1453 {
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;
1459 }
1460
1461 name = S_GET_NAME (symp);
1462 if (name)
1463 {
efaf0ba4
NC
1464 const char *name2 =
1465 decode_local_label_name ((char *) S_GET_NAME (symp));
252b5132
RH
1466 /* They only differ if `name' is a fb or dollar local
1467 label name. */
1468 if (name2 != name && ! S_IS_DEFINED (symp))
0e389e77 1469 as_bad (_("local label `%s' is not defined"), name2);
252b5132
RH
1470 }
1471
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. */
6386f3a7 1475 resolve_symbol_value (symp);
252b5132
RH
1476
1477 /* Skip symbols which were equated to undefined or common
1478 symbols. */
06e77878
AO
1479 if (symbol_equated_reloc_p (symp)
1480 || S_IS_WEAKREFR (symp))
252b5132 1481 {
60938e80
L
1482 const char *name = S_GET_NAME (symp);
1483 if (S_IS_COMMON (symp)
c9cd7160 1484 && !TC_FAKE_LABEL (name)
06e77878 1485 && !S_IS_WEAKREFR (symp)
60938e80
L
1486 && (!S_IS_EXTERNAL (symp) || S_IS_LOCAL (symp)))
1487 {
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));
1491 }
252b5132
RH
1492 symbol_remove (symp, &symbol_rootP, &symbol_lastP);
1493 continue;
1494 }
1495
252b5132
RH
1496#ifdef obj_frob_symbol
1497 obj_frob_symbol (symp, punt);
1498#endif
1499#ifdef tc_frob_symbol
49309057 1500 if (! punt || symbol_used_in_reloc_p (symp))
252b5132
RH
1501 tc_frob_symbol (symp, punt);
1502#endif
1503
1504 /* If we don't want to keep this symbol, splice it out of
1505 the chain now. If EMIT_SECTION_SYMBOLS is 0, we never
1506 want section symbols. Otherwise, we skip local symbols
1507 and symbols that the frob_symbol macros told us to punt,
1508 but we keep such symbols if they are used in relocs. */
a161fe53
AM
1509 if (symp == abs_section_sym
1510 || (! EMIT_SECTION_SYMBOLS
1511 && symbol_section_p (symp))
e97b3f28 1512 /* Note that S_IS_EXTERNAL and S_IS_LOCAL are not always
252b5132
RH
1513 opposites. Sometimes the former checks flags and the
1514 latter examines the name... */
e97b3f28 1515 || (!S_IS_EXTERNAL (symp)
461b725f
AO
1516 && (punt || S_IS_LOCAL (symp) ||
1517 (S_IS_WEAKREFD (symp) && ! symbol_used_p (symp)))
49309057 1518 && ! symbol_used_in_reloc_p (symp)))
252b5132
RH
1519 {
1520 symbol_remove (symp, &symbol_rootP, &symbol_lastP);
efaf0ba4 1521
252b5132
RH
1522 /* After symbol_remove, symbol_next(symp) still returns
1523 the one that came after it in the chain. So we don't
1524 need to do any extra cleanup work here. */
252b5132
RH
1525 continue;
1526 }
1527
1528 /* Make sure we really got a value for the symbol. */
49309057 1529 if (! symbol_resolved_p (symp))
252b5132 1530 {
0e389e77 1531 as_bad (_("can't resolve value for symbol `%s'"),
252b5132 1532 S_GET_NAME (symp));
49309057 1533 symbol_mark_resolved (symp);
252b5132
RH
1534 }
1535
1536 /* Set the value into the BFD symbol. Up til now the value
1537 has only been kept in the gas symbolS struct. */
49309057 1538 symbol_get_bfdsym (symp)->value = S_GET_VALUE (symp);
aaac53f5
HPN
1539
1540 /* A warning construct is a warning symbol followed by the
1541 symbol warned about. Don't let anything object-format or
1542 target-specific muck with it; it's ready for output. */
1543 if (symbol_get_bfdsym (symp)->flags & BSF_WARNING)
1544 skip_next_symbol = TRUE;
252b5132
RH
1545 }
1546 }
1547
1548 PROGRESS (1);
1549
1550 /* Now do any format-specific adjustments to the symbol table, such
1551 as adding file symbols. */
1552#ifdef tc_adjust_symtab
1553 tc_adjust_symtab ();
1554#endif
1555#ifdef obj_adjust_symtab
1556 obj_adjust_symtab ();
1557#endif
1558
1559 /* Now that all the sizes are known, and contents correct, we can
1560 start writing to the file. */
1561 set_symtab ();
1562
1563 /* If *_frob_file changes the symbol value at this point, it is
1564 responsible for moving the changed value into symp->bsym->value
1565 as well. Hopefully all symbol value changing can be done in
1566 *_frob_symbol. */
1567#ifdef tc_frob_file
1568 tc_frob_file ();
1569#endif
1570#ifdef obj_frob_file
1571 obj_frob_file ();
1572#endif
1573
1574 bfd_map_over_sections (stdoutput, write_relocs, (char *) 0);
1575
1576#ifdef tc_frob_file_after_relocs
1577 tc_frob_file_after_relocs ();
1578#endif
1579#ifdef obj_frob_file_after_relocs
1580 obj_frob_file_after_relocs ();
1581#endif
1582
1583 bfd_map_over_sections (stdoutput, write_contents, (char *) 0);
252b5132 1584}
252b5132
RH
1585
1586#ifdef TC_GENERIC_RELAX_TABLE
252b5132
RH
1587/* Relax a fragment by scanning TC_GENERIC_RELAX_TABLE. */
1588
1589long
d7342424 1590relax_frag (segT segment, fragS *fragP, long stretch)
252b5132
RH
1591{
1592 const relax_typeS *this_type;
1593 const relax_typeS *start_type;
1594 relax_substateT next_state;
1595 relax_substateT this_state;
685736be 1596 offsetT growth;
38686296
AM
1597 offsetT aim;
1598 addressT target;
1599 addressT address;
1600 symbolS *symbolP;
1601 const relax_typeS *table;
1602
1603 target = fragP->fr_offset;
1604 address = fragP->fr_address;
1605 table = TC_GENERIC_RELAX_TABLE;
252b5132
RH
1606 this_state = fragP->fr_subtype;
1607 start_type = this_type = table + this_state;
38686296 1608 symbolP = fragP->fr_symbol;
252b5132
RH
1609
1610 if (symbolP)
1611 {
c842b53a
ILT
1612 fragS *sym_frag;
1613
1614 sym_frag = symbol_get_frag (symbolP);
1615
252b5132 1616#ifndef DIFF_EXPR_OK
c842b53a 1617 know (sym_frag != NULL);
252b5132 1618#endif
a161fe53 1619 know (S_GET_SEGMENT (symbolP) != absolute_section
c842b53a 1620 || sym_frag == &zero_address_frag);
ac62c346 1621 target += S_GET_VALUE (symbolP);
252b5132
RH
1622
1623 /* If frag has yet to be reached on this pass,
1624 assume it will move by STRETCH just as we did.
1625 If this is not so, it will be because some frag
38686296 1626 between grows, and that will force another pass. */
252b5132 1627
c842b53a 1628 if (stretch != 0
38686296
AM
1629 && sym_frag->relax_marker != fragP->relax_marker
1630 && S_GET_SEGMENT (symbolP) == segment)
252b5132
RH
1631 {
1632 target += stretch;
1633 }
1634 }
1635
1636 aim = target - address - fragP->fr_fix;
1637#ifdef TC_PCREL_ADJUST
efaf0ba4
NC
1638 /* Currently only the ns32k family needs this. */
1639 aim += TC_PCREL_ADJUST (fragP);
efaf0ba4 1640#endif
59c871b4
BE
1641
1642#ifdef md_prepare_relax_scan
1643 /* Formerly called M68K_AIM_KLUDGE. */
252b5132
RH
1644 md_prepare_relax_scan (fragP, address, aim, this_state, this_type);
1645#endif
1646
1647 if (aim < 0)
1648 {
efaf0ba4 1649 /* Look backwards. */
252b5132
RH
1650 for (next_state = this_type->rlx_more; next_state;)
1651 if (aim >= this_type->rlx_backward)
1652 next_state = 0;
1653 else
1654 {
efaf0ba4 1655 /* Grow to next state. */
252b5132
RH
1656 this_state = next_state;
1657 this_type = table + this_state;
1658 next_state = this_type->rlx_more;
1659 }
1660 }
1661 else
1662 {
efaf0ba4 1663 /* Look forwards. */
252b5132
RH
1664 for (next_state = this_type->rlx_more; next_state;)
1665 if (aim <= this_type->rlx_forward)
1666 next_state = 0;
1667 else
1668 {
efaf0ba4 1669 /* Grow to next state. */
252b5132
RH
1670 this_state = next_state;
1671 this_type = table + this_state;
1672 next_state = this_type->rlx_more;
1673 }
1674 }
1675
1676 growth = this_type->rlx_length - start_type->rlx_length;
1677 if (growth != 0)
1678 fragP->fr_subtype = this_state;
1679 return growth;
1680}
1681
efaf0ba4 1682#endif /* defined (TC_GENERIC_RELAX_TABLE) */
252b5132
RH
1683
1684/* Relax_align. Advance location counter to next address that has 'alignment'
1685 lowest order bits all 0s, return size of adjustment made. */
1686static relax_addressT
d7342424
KH
1687relax_align (register relax_addressT address, /* Address now. */
1688 register int alignment /* Alignment (binary). */)
252b5132
RH
1689{
1690 relax_addressT mask;
1691 relax_addressT new_address;
1692
1693 mask = ~((~0) << alignment);
1694 new_address = (address + mask) & (~mask);
1695#ifdef LINKER_RELAXING_SHRINKS_ONLY
1696 if (linkrelax)
1697 /* We must provide lots of padding, so the linker can discard it
1698 when needed. The linker will not add extra space, ever. */
1699 new_address += (1 << alignment);
1700#endif
1701 return (new_address - address);
1702}
1703
efaf0ba4
NC
1704/* Now we have a segment, not a crowd of sub-segments, we can make
1705 fr_address values.
58a77e41 1706
efaf0ba4 1707 Relax the frags.
58a77e41 1708
efaf0ba4
NC
1709 After this, all frags in this segment have addresses that are correct
1710 within the segment. Since segments live in different file addresses,
1711 these frag addresses may not be the same as final object-file
1712 addresses. */
1713
e46d99eb 1714int
d7342424 1715relax_segment (struct frag *segment_frag_root, segT segment)
252b5132 1716{
4111faa5
NC
1717 unsigned long frag_count;
1718 struct frag *fragP;
1719 relax_addressT address;
e46d99eb
AM
1720 int ret;
1721
efaf0ba4 1722 /* In case md_estimate_size_before_relax() wants to make fixSs. */
252b5132
RH
1723 subseg_change (segment, 0);
1724
1725 /* For each frag in segment: count and store (a 1st guess of)
1726 fr_address. */
1727 address = 0;
4111faa5
NC
1728 for (frag_count = 0, fragP = segment_frag_root;
1729 fragP;
1730 fragP = fragP->fr_next, frag_count ++)
252b5132 1731 {
38686296 1732 fragP->relax_marker = 0;
252b5132
RH
1733 fragP->fr_address = address;
1734 address += fragP->fr_fix;
1735
1736 switch (fragP->fr_type)
1737 {
1738 case rs_fill:
1739 address += fragP->fr_offset * fragP->fr_var;
1740 break;
1741
1742 case rs_align:
1743 case rs_align_code:
0a9ef439 1744 case rs_align_test:
252b5132
RH
1745 {
1746 addressT offset = relax_align (address, (int) fragP->fr_offset);
1747
1748 if (fragP->fr_subtype != 0 && offset > fragP->fr_subtype)
1749 offset = 0;
1750
1751 if (offset % fragP->fr_var != 0)
1752 {
54d3cad9
AM
1753 as_bad_where (fragP->fr_file, fragP->fr_line,
1754 _("alignment padding (%lu bytes) not a multiple of %ld"),
1755 (unsigned long) offset, (long) fragP->fr_var);
252b5132
RH
1756 offset -= (offset % fragP->fr_var);
1757 }
1758
1759 address += offset;
1760 }
1761 break;
1762
1763 case rs_org:
1764 case rs_space:
1765 /* Assume .org is nugatory. It will grow with 1st relax. */
1766 break;
1767
1768 case rs_machine_dependent:
e0890092
AM
1769 /* If fr_symbol is an expression, this call to
1770 resolve_symbol_value sets up the correct segment, which will
1771 likely be needed in md_estimate_size_before_relax. */
1772 if (fragP->fr_symbol)
1773 resolve_symbol_value (fragP->fr_symbol);
1774
252b5132
RH
1775 address += md_estimate_size_before_relax (fragP, segment);
1776 break;
1777
1778#ifndef WORKING_DOT_WORD
efaf0ba4 1779 /* Broken words don't concern us yet. */
252b5132
RH
1780 case rs_broken_word:
1781 break;
1782#endif
1783
1784 case rs_leb128:
efaf0ba4 1785 /* Initial guess is always 1; doing otherwise can result in
252b5132
RH
1786 stable solutions that are larger than the minimum. */
1787 address += fragP->fr_offset = 1;
1788 break;
1789
1790 case rs_cfa:
1791 address += eh_frame_estimate_size_before_relax (fragP);
1792 break;
1793
220e750f
RH
1794 case rs_dwarf2dbg:
1795 address += dwarf2dbg_estimate_size_before_relax (fragP);
1796 break;
1797
252b5132
RH
1798 default:
1799 BAD_CASE (fragP->fr_type);
1800 break;
efaf0ba4
NC
1801 }
1802 }
252b5132
RH
1803
1804 /* Do relax(). */
1805 {
4111faa5 1806 unsigned long max_iterations;
685736be 1807 offsetT stretch; /* May be any size, 0 or negative. */
efaf0ba4
NC
1808 /* Cumulative number of addresses we have relaxed this pass.
1809 We may have relaxed more than one address. */
e46d99eb 1810 int stretched; /* Have we stretched on this pass? */
252b5132
RH
1811 /* This is 'cuz stretch may be zero, when, in fact some piece of code
1812 grew, and another shrank. If a branch instruction doesn't fit anymore,
1813 we could be scrod. */
1814
4111faa5
NC
1815 /* We want to prevent going into an infinite loop where one frag grows
1816 depending upon the location of a symbol which is in turn moved by
1817 the growing frag. eg:
1818
1819 foo = .
1820 .org foo+16
1821 foo = .
1822
1823 So we dictate that this algorithm can be at most O2. */
1824 max_iterations = frag_count * frag_count;
1825 /* Check for overflow. */
1826 if (max_iterations < frag_count)
1827 max_iterations = frag_count;
1828
252b5132
RH
1829 do
1830 {
e46d99eb
AM
1831 stretch = 0;
1832 stretched = 0;
58a77e41 1833
252b5132
RH
1834 for (fragP = segment_frag_root; fragP; fragP = fragP->fr_next)
1835 {
685736be 1836 offsetT growth = 0;
252b5132
RH
1837 addressT was_address;
1838 offsetT offset;
1839 symbolS *symbolP;
1840
38686296 1841 fragP->relax_marker ^= 1;
252b5132
RH
1842 was_address = fragP->fr_address;
1843 address = fragP->fr_address += stretch;
1844 symbolP = fragP->fr_symbol;
1845 offset = fragP->fr_offset;
1846
1847 switch (fragP->fr_type)
1848 {
efaf0ba4 1849 case rs_fill: /* .fill never relaxes. */
252b5132
RH
1850 growth = 0;
1851 break;
1852
1853#ifndef WORKING_DOT_WORD
1854 /* JF: This is RMS's idea. I do *NOT* want to be blamed
1855 for it I do not want to write it. I do not want to have
1856 anything to do with it. This is not the proper way to
1857 implement this misfeature. */
1858 case rs_broken_word:
1859 {
1860 struct broken_word *lie;
1861 struct broken_word *untruth;
1862
1863 /* Yes this is ugly (storing the broken_word pointer
1864 in the symbol slot). Still, this whole chunk of
1865 code is ugly, and I don't feel like doing anything
1866 about it. Think of it as stubbornness in action. */
1867 growth = 0;
1868 for (lie = (struct broken_word *) (fragP->fr_symbol);
1869 lie && lie->dispfrag == fragP;
1870 lie = lie->next_broken_word)
1871 {
1872
1873 if (lie->added)
1874 continue;
1875
ac62c346 1876 offset = (S_GET_VALUE (lie->add)
252b5132 1877 + lie->addnum
ac62c346 1878 - S_GET_VALUE (lie->sub));
252b5132
RH
1879 if (offset <= -32768 || offset >= 32767)
1880 {
1881 if (flag_warn_displacement)
1882 {
1883 char buf[50];
1884 sprint_value (buf, (addressT) lie->addnum);
54d3cad9
AM
1885 as_warn_where (fragP->fr_file, fragP->fr_line,
1886 _(".word %s-%s+%s didn't fit"),
1887 S_GET_NAME (lie->add),
1888 S_GET_NAME (lie->sub),
1889 buf);
252b5132
RH
1890 }
1891 lie->added = 1;
1892 if (fragP->fr_subtype == 0)
1893 {
1894 fragP->fr_subtype++;
1895 growth += md_short_jump_size;
1896 }
1897 for (untruth = lie->next_broken_word;
1898 untruth && untruth->dispfrag == lie->dispfrag;
1899 untruth = untruth->next_broken_word)
49309057
ILT
1900 if ((symbol_get_frag (untruth->add)
1901 == symbol_get_frag (lie->add))
1902 && (S_GET_VALUE (untruth->add)
1903 == S_GET_VALUE (lie->add)))
252b5132
RH
1904 {
1905 untruth->added = 2;
1906 untruth->use_jump = lie;
1907 }
1908 growth += md_long_jump_size;
1909 }
1910 }
1911
1912 break;
efaf0ba4 1913 } /* case rs_broken_word */
252b5132
RH
1914#endif
1915 case rs_align:
1916 case rs_align_code:
0a9ef439 1917 case rs_align_test:
252b5132
RH
1918 {
1919 addressT oldoff, newoff;
1920
1921 oldoff = relax_align (was_address + fragP->fr_fix,
1922 (int) offset);
1923 newoff = relax_align (address + fragP->fr_fix,
1924 (int) offset);
1925
1926 if (fragP->fr_subtype != 0)
1927 {
1928 if (oldoff > fragP->fr_subtype)
1929 oldoff = 0;
1930 if (newoff > fragP->fr_subtype)
1931 newoff = 0;
1932 }
1933
1934 growth = newoff - oldoff;
1935 }
1936 break;
1937
1938 case rs_org:
1939 {
e46d99eb
AM
1940 addressT target = offset;
1941 addressT after;
252b5132
RH
1942
1943 if (symbolP)
1944 {
6e917903
TW
1945 /* Convert from an actual address to an octet offset
1946 into the section. Here it is assumed that the
1947 section's VMA is zero, and can omit subtracting it
1948 from the symbol's value to get the address offset. */
c9dea48b 1949 know (S_GET_SEGMENT (symbolP)->vma == 0);
6e917903 1950 target += S_GET_VALUE (symbolP) * OCTETS_PER_BYTE;
ac62c346 1951 }
252b5132
RH
1952
1953 know (fragP->fr_next);
1954 after = fragP->fr_next->fr_address;
1955 growth = target - after;
1956 if (growth < 0)
1957 {
1958 /* Growth may be negative, but variable part of frag
1959 cannot have fewer than 0 chars. That is, we can't
efaf0ba4 1960 .org backwards. */
14ad458a 1961 as_bad_where (fragP->fr_file, fragP->fr_line,
685736be 1962 _("attempt to move .org backwards"));
14ad458a
ILT
1963
1964 /* We've issued an error message. Change the
1965 frag to avoid cascading errors. */
1966 fragP->fr_type = rs_align;
1967 fragP->fr_subtype = 0;
1968 fragP->fr_offset = 0;
e750405d 1969 fragP->fr_fix = after - was_address;
14ad458a 1970 growth = stretch;
252b5132
RH
1971 }
1972
efaf0ba4
NC
1973 /* This is an absolute growth factor */
1974 growth -= stretch;
252b5132
RH
1975 break;
1976 }
1977
1978 case rs_space:
54d3cad9 1979 growth = 0;
252b5132
RH
1980 if (symbolP)
1981 {
766c03c9
AM
1982 offsetT amount;
1983
1984 amount = S_GET_VALUE (symbolP);
9e40345d 1985 if (S_GET_SEGMENT (symbolP) != absolute_section
252b5132
RH
1986 || S_IS_COMMON (symbolP)
1987 || ! S_IS_DEFINED (symbolP))
252b5132 1988 {
54d3cad9
AM
1989 as_bad_where (fragP->fr_file, fragP->fr_line,
1990 _(".space specifies non-absolute value"));
1991 /* Prevent repeat of this error message. */
1992 fragP->fr_symbol = 0;
1993 }
1994 else if (amount < 0)
1995 {
1996 as_warn_where (fragP->fr_file, fragP->fr_line,
1997 _(".space or .fill with negative value, ignored"));
766c03c9 1998 fragP->fr_symbol = 0;
252b5132 1999 }
54d3cad9 2000 else
050be34e 2001 growth = (was_address + fragP->fr_fix + amount
54d3cad9 2002 - fragP->fr_next->fr_address);
252b5132 2003 }
252b5132
RH
2004 break;
2005
2006 case rs_machine_dependent:
2007#ifdef md_relax_frag
c842b53a 2008 growth = md_relax_frag (segment, fragP, stretch);
252b5132
RH
2009#else
2010#ifdef TC_GENERIC_RELAX_TABLE
2011 /* The default way to relax a frag is to look through
2012 TC_GENERIC_RELAX_TABLE. */
c842b53a 2013 growth = relax_frag (segment, fragP, stretch);
efaf0ba4 2014#endif /* TC_GENERIC_RELAX_TABLE */
252b5132
RH
2015#endif
2016 break;
2017
2018 case rs_leb128:
2019 {
2020 valueT value;
685736be 2021 offsetT size;
252b5132 2022
6386f3a7 2023 value = resolve_symbol_value (fragP->fr_symbol);
252b5132
RH
2024 size = sizeof_leb128 (value, fragP->fr_subtype);
2025 growth = size - fragP->fr_offset;
2026 fragP->fr_offset = size;
2027 }
2028 break;
2029
2030 case rs_cfa:
2031 growth = eh_frame_relax_frag (fragP);
2032 break;
2033
220e750f
RH
2034 case rs_dwarf2dbg:
2035 growth = dwarf2dbg_relax_frag (fragP);
2036 break;
2037
252b5132
RH
2038 default:
2039 BAD_CASE (fragP->fr_type);
2040 break;
2041 }
2042 if (growth)
2043 {
2044 stretch += growth;
e46d99eb 2045 stretched = 1;
252b5132 2046 }
4111faa5 2047 }
252b5132 2048 }
4111faa5
NC
2049 /* Until nothing further to relax. */
2050 while (stretched && -- max_iterations);
2051
2052 if (stretched)
2053 as_fatal (_("Infinite loop encountered whilst attempting to compute the addresses of symbols in section %s"),
2054 segment_name (segment));
2055 }
252b5132 2056
e46d99eb
AM
2057 ret = 0;
2058 for (fragP = segment_frag_root; fragP; fragP = fragP->fr_next)
2059 if (fragP->last_fr_address != fragP->fr_address)
2060 {
2061 fragP->last_fr_address = fragP->fr_address;
2062 ret = 1;
2063 }
2064 return ret;
efaf0ba4 2065}
252b5132 2066
252b5132
RH
2067/* fixup_segment()
2068
2069 Go through all the fixS's in a segment and see which ones can be
2070 handled now. (These consist of fixS where we have since discovered
2071 the value of a symbol, or the address of the frag involved.)
55cf6793 2072 For each one, call md_apply_fix to put the fix into the frag data.
252b5132
RH
2073
2074 Result is a count of how many relocation structs will be needed to
2075 handle the remaining fixS's that we couldn't completely handle here.
2076 These will be output later by emit_relocations(). */
2077
2078static long
d7342424 2079fixup_segment (fixS *fixP, segT this_segment)
252b5132
RH
2080{
2081 long seg_reloc_count = 0;
252b5132 2082 valueT add_number;
252b5132
RH
2083 fragS *fragP;
2084 segT add_symbol_segment = absolute_section;
2085
a161fe53 2086 if (fixP != NULL && abs_section_sym == NULL)
7be1c489 2087 abs_section_sym = section_symbol (absolute_section);
a161fe53 2088
252b5132
RH
2089 /* If the linker is doing the relaxing, we must not do any fixups.
2090
df44284e
AM
2091 Well, strictly speaking that's not true -- we could do any that
2092 are PC-relative and don't cross regions that could change size.
2093 And for the i960 we might be able to turn callx/callj into bal
2094 anyways in cases where we know the maximum displacement. */
2095 if (linkrelax && TC_LINKRELAX_FIXUP (this_segment))
252b5132
RH
2096 {
2097 for (; fixP; fixP = fixP->fx_next)
a161fe53
AM
2098 if (!fixP->fx_done)
2099 {
2100 if (fixP->fx_addsy == NULL)
2101 {
2102 /* There was no symbol required by this relocation.
2103 However, BFD doesn't really handle relocations
2104 without symbols well. So fake up a local symbol in
2105 the absolute section. */
2106 fixP->fx_addsy = abs_section_sym;
2107 }
2108 symbol_mark_used_in_reloc (fixP->fx_addsy);
2109 if (fixP->fx_subsy != NULL)
2110 symbol_mark_used_in_reloc (fixP->fx_subsy);
2111 seg_reloc_count++;
2112 }
252b5132
RH
2113 TC_ADJUST_RELOC_COUNT (fixP, seg_reloc_count);
2114 return seg_reloc_count;
2115 }
2116
2117 for (; fixP; fixP = fixP->fx_next)
2118 {
252b5132
RH
2119#ifdef DEBUG5
2120 fprintf (stderr, "\nprocessing fixup:\n");
2121 print_fixup (fixP);
2122#endif
2123
252b5132
RH
2124 fragP = fixP->fx_frag;
2125 know (fragP);
252b5132 2126#ifdef TC_VALIDATE_FIX
df44284e 2127 TC_VALIDATE_FIX (fixP, this_segment, skip);
252b5132 2128#endif
252b5132 2129 add_number = fixP->fx_offset;
252b5132 2130
a161fe53
AM
2131 if (fixP->fx_addsy != NULL
2132 && symbol_mri_common_p (fixP->fx_addsy))
252b5132 2133 {
a161fe53 2134 add_number += S_GET_VALUE (fixP->fx_addsy);
252b5132 2135 fixP->fx_offset = add_number;
a161fe53
AM
2136 fixP->fx_addsy
2137 = symbol_get_value_expression (fixP->fx_addsy)->X_add_symbol;
252b5132
RH
2138 }
2139
a161fe53
AM
2140 if (fixP->fx_addsy != NULL)
2141 add_symbol_segment = S_GET_SEGMENT (fixP->fx_addsy);
252b5132 2142
a161fe53 2143 if (fixP->fx_subsy != NULL)
252b5132 2144 {
a161fe53
AM
2145 segT sub_symbol_segment;
2146 resolve_symbol_value (fixP->fx_subsy);
2147 sub_symbol_segment = S_GET_SEGMENT (fixP->fx_subsy);
2148 if (fixP->fx_addsy != NULL
2149 && sub_symbol_segment == add_symbol_segment
2150 && !TC_FORCE_RELOCATION_SUB_SAME (fixP, add_symbol_segment))
252b5132 2151 {
a161fe53
AM
2152 add_number += S_GET_VALUE (fixP->fx_addsy);
2153 add_number -= S_GET_VALUE (fixP->fx_subsy);
2154 fixP->fx_offset = add_number;
a161fe53
AM
2155 fixP->fx_addsy = NULL;
2156 fixP->fx_subsy = NULL;
1a317472
AM
2157#ifdef TC_M68K
2158 /* See the comment below about 68k weirdness. */
a161fe53 2159 fixP->fx_pcrel = 0;
1a317472 2160#endif
252b5132 2161 }
a161fe53
AM
2162 else if (sub_symbol_segment == absolute_section
2163 && !TC_FORCE_RELOCATION_SUB_ABS (fixP))
252b5132 2164 {
a161fe53
AM
2165 add_number -= S_GET_VALUE (fixP->fx_subsy);
2166 fixP->fx_offset = add_number;
2167 fixP->fx_subsy = NULL;
2168 }
2169 else if (sub_symbol_segment == this_segment
2170 && !TC_FORCE_RELOCATION_SUB_LOCAL (fixP))
2171 {
2172 add_number -= S_GET_VALUE (fixP->fx_subsy);
26346241
AM
2173 fixP->fx_offset = (add_number + fixP->fx_dot_value
2174 + fixP->fx_frag->fr_address);
252b5132 2175
a161fe53
AM
2176 /* Make it pc-relative. If the back-end code has not
2177 selected a pc-relative reloc, cancel the adjustment
2178 we do later on all pc-relative relocs. */
2179 if (0
1a16aca4 2180#ifdef TC_M68K
a161fe53
AM
2181 /* Do this for m68k even if it's already described
2182 as pc-relative. On the m68k, an operand of
2183 "pc@(foo-.-2)" should address "foo" in a
2184 pc-relative mode. */
2185 || 1
2186#endif
2187 || !fixP->fx_pcrel)
2188 add_number += MD_PCREL_FROM_SECTION (fixP, this_segment);
2189 fixP->fx_subsy = NULL;
2190 fixP->fx_pcrel = 1;
2191 }
2192 else if (!TC_VALIDATE_FIX_SUB (fixP))
2193 {
2194 as_bad_where (fixP->fx_file, fixP->fx_line,
2195 _("can't resolve `%s' {%s section} - `%s' {%s section}"),
2196 fixP->fx_addsy ? S_GET_NAME (fixP->fx_addsy) : "0",
2197 segment_name (add_symbol_segment),
2198 S_GET_NAME (fixP->fx_subsy),
2199 segment_name (sub_symbol_segment));
252b5132
RH
2200 }
2201 }
2202
a161fe53 2203 if (fixP->fx_addsy)
252b5132 2204 {
a161fe53
AM
2205 if (add_symbol_segment == this_segment
2206 && !TC_FORCE_RELOCATION_LOCAL (fixP))
252b5132 2207 {
efaf0ba4
NC
2208 /* This fixup was made when the symbol's segment was
2209 SEG_UNKNOWN, but it is now in the local segment.
2210 So we know how to do the address without relocation. */
a161fe53
AM
2211 add_number += S_GET_VALUE (fixP->fx_addsy);
2212 fixP->fx_offset = add_number;
2213 if (fixP->fx_pcrel)
2214 add_number -= MD_PCREL_FROM_SECTION (fixP, this_segment);
2215 fixP->fx_addsy = NULL;
2216 fixP->fx_pcrel = 0;
252b5132 2217 }
a161fe53
AM
2218 else if (add_symbol_segment == absolute_section
2219 && !TC_FORCE_RELOCATION_ABS (fixP))
252b5132 2220 {
a161fe53
AM
2221 add_number += S_GET_VALUE (fixP->fx_addsy);
2222 fixP->fx_offset = add_number;
2223 fixP->fx_addsy = NULL;
2224 }
2225 else if (add_symbol_segment != undefined_section
a161fe53 2226 && ! bfd_is_com_section (add_symbol_segment)
a161fe53
AM
2227 && MD_APPLY_SYM_VALUE (fixP))
2228 add_number += S_GET_VALUE (fixP->fx_addsy);
252b5132
RH
2229 }
2230
a161fe53 2231 if (fixP->fx_pcrel)
252b5132 2232 {
df44284e 2233 add_number -= MD_PCREL_FROM_SECTION (fixP, this_segment);
a161fe53 2234 if (!fixP->fx_done && fixP->fx_addsy == NULL)
252b5132 2235 {
a161fe53
AM
2236 /* There was no symbol required by this relocation.
2237 However, BFD doesn't really handle relocations
2238 without symbols well. So fake up a local symbol in
2239 the absolute section. */
2240 fixP->fx_addsy = abs_section_sym;
252b5132
RH
2241 }
2242 }
2243
6d4d30bb 2244 if (!fixP->fx_done)
55cf6793 2245 md_apply_fix (fixP, &add_number, this_segment);
6d4d30bb 2246
a161fe53
AM
2247 if (!fixP->fx_done)
2248 {
2249 ++seg_reloc_count;
2250 if (fixP->fx_addsy == NULL)
2251 fixP->fx_addsy = abs_section_sym;
2252 symbol_mark_used_in_reloc (fixP->fx_addsy);
2253 if (fixP->fx_subsy != NULL)
2254 symbol_mark_used_in_reloc (fixP->fx_subsy);
2255 }
2256
df44284e 2257 if (!fixP->fx_bit_fixP && !fixP->fx_no_overflow && fixP->fx_size != 0)
252b5132 2258 {
df44284e 2259 if (fixP->fx_size < sizeof (valueT))
252b5132 2260 {
b77ad1d4 2261 valueT mask;
252b5132 2262
252b5132 2263 mask = 0;
efaf0ba4 2264 mask--; /* Set all bits to one. */
df44284e 2265 mask <<= fixP->fx_size * 8 - (fixP->fx_signed ? 1 : 0);
b77ad1d4 2266 if ((add_number & mask) != 0 && (add_number & mask) != mask)
252b5132
RH
2267 {
2268 char buf[50], buf2[50];
df44284e 2269 sprint_value (buf, fragP->fr_address + fixP->fx_where);
252b5132
RH
2270 if (add_number > 1000)
2271 sprint_value (buf2, add_number);
2272 else
2273 sprintf (buf2, "%ld", (long) add_number);
2274 as_bad_where (fixP->fx_file, fixP->fx_line,
0e389e77 2275 _("value of %s too large for field of %d bytes at %s"),
df44284e 2276 buf2, fixP->fx_size, buf);
efaf0ba4 2277 } /* Generic error checking. */
252b5132
RH
2278 }
2279#ifdef WARN_SIGNED_OVERFLOW_WORD
2280 /* Warn if a .word value is too large when treated as a signed
2281 number. We already know it is not too negative. This is to
2282 catch over-large switches generated by gcc on the 68k. */
2283 if (!flag_signed_overflow_ok
df44284e 2284 && fixP->fx_size == 2
252b5132
RH
2285 && add_number > 0x7fff)
2286 as_bad_where (fixP->fx_file, fixP->fx_line,
0e389e77 2287 _("signed .word overflow; switch may be too large; %ld at 0x%lx"),
252b5132 2288 (long) add_number,
df44284e 2289 (long) (fragP->fr_address + fixP->fx_where));
252b5132 2290#endif
efaf0ba4 2291 } /* Not a bit fix. */
252b5132 2292
252b5132 2293#ifdef TC_VALIDATE_FIX
ab9da554
ILT
2294 skip: ATTRIBUTE_UNUSED_LABEL
2295 ;
252b5132
RH
2296#endif
2297#ifdef DEBUG5
2298 fprintf (stderr, "result:\n");
2299 print_fixup (fixP);
2300#endif
efaf0ba4 2301 } /* For each fixS in this segment. */
252b5132
RH
2302
2303 TC_ADJUST_RELOC_COUNT (fixP, seg_reloc_count);
2304 return seg_reloc_count;
2305}
2306
252b5132 2307void
d7342424 2308number_to_chars_bigendian (char *buf, valueT val, int n)
252b5132 2309{
937149dd 2310 if (n <= 0)
252b5132
RH
2311 abort ();
2312 while (n--)
2313 {
2314 buf[n] = val & 0xff;
2315 val >>= 8;
2316 }
2317}
2318
2319void
d7342424 2320number_to_chars_littleendian (char *buf, valueT val, int n)
252b5132 2321{
937149dd 2322 if (n <= 0)
252b5132
RH
2323 abort ();
2324 while (n--)
2325 {
2326 *buf++ = val & 0xff;
2327 val >>= 8;
2328 }
2329}
2330
2331void
d7342424 2332write_print_statistics (FILE *file)
252b5132 2333{
6d4d30bb 2334 fprintf (file, "fixups: %d\n", n_fixups);
252b5132
RH
2335}
2336
efaf0ba4 2337/* For debugging. */
252b5132
RH
2338extern int indent_level;
2339
2340void
d7342424 2341print_fixup (fixS *fixp)
252b5132
RH
2342{
2343 indent_level = 1;
2344 fprintf (stderr, "fix %lx %s:%d", (long) fixp, fixp->fx_file, fixp->fx_line);
2345 if (fixp->fx_pcrel)
2346 fprintf (stderr, " pcrel");
2347 if (fixp->fx_pcrel_adjust)
2348 fprintf (stderr, " pcrel_adjust=%d", fixp->fx_pcrel_adjust);
2349 if (fixp->fx_im_disp)
2350 {
2351#ifdef TC_NS32K
2352 fprintf (stderr, " im_disp=%d", fixp->fx_im_disp);
2353#else
2354 fprintf (stderr, " im_disp");
2355#endif
2356 }
2357 if (fixp->fx_tcbit)
2358 fprintf (stderr, " tcbit");
2359 if (fixp->fx_done)
2360 fprintf (stderr, " done");
2361 fprintf (stderr, "\n size=%d frag=%lx where=%ld offset=%lx addnumber=%lx",
2362 fixp->fx_size, (long) fixp->fx_frag, (long) fixp->fx_where,
2363 (long) fixp->fx_offset, (long) fixp->fx_addnumber);
252b5132
RH
2364 fprintf (stderr, "\n %s (%d)", bfd_get_reloc_code_name (fixp->fx_r_type),
2365 fixp->fx_r_type);
252b5132
RH
2366 if (fixp->fx_addsy)
2367 {
2368 fprintf (stderr, "\n +<");
2369 print_symbol_value_1 (stderr, fixp->fx_addsy);
2370 fprintf (stderr, ">");
2371 }
2372 if (fixp->fx_subsy)
2373 {
2374 fprintf (stderr, "\n -<");
2375 print_symbol_value_1 (stderr, fixp->fx_subsy);
2376 fprintf (stderr, ">");
2377 }
2378 fprintf (stderr, "\n");
2379#ifdef TC_FIX_DATA_PRINT
2380 TC_FIX_DATA_PRINT (stderr, fixp);
2381#endif
2382}
This page took 0.709309 seconds and 4 git commands to generate.