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