]> git.ipfire.org Git - thirdparty/binutils-gdb.git/blame - gas/write.c
Avoid crash when "compile" expression uses cooked register
[thirdparty/binutils-gdb.git] / gas / write.c
CommitLineData
252b5132 1/* write.c - emit .o file
250d07de 2 Copyright (C) 1986-2021 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))
d1bcae83
L
851 {
852 /* Mark the section symbol used in relocation so that it will
853 be included in the symbol table. */
854 symbol_mark_used_in_reloc (sym);
855 continue;
856 }
a161fe53 857
252b5132 858 symsec = S_GET_SEGMENT (sym);
252b5132
RH
859 if (symsec == NULL)
860 abort ();
efaf0ba4 861
a841bdf5
AM
862 if (bfd_is_abs_section (symsec)
863 || symsec == reg_section)
252b5132 864 {
a161fe53 865 /* The fixup_segment routine normally will not use this
b4b24b79 866 symbol in a relocation. */
df44284e 867 continue;
252b5132
RH
868 }
869
7565ed77 870 /* Don't try to reduce relocs which refer to non-local symbols
b4b24b79
AM
871 in .linkonce sections. It can lead to confusion when a
872 debugging section refers to a .linkonce section. I hope
873 this will always be correct. */
7565ed77 874 if (symsec != sec && ! S_IS_LOCAL (sym))
252b5132 875 {
a161fe53
AM
876 if ((symsec->flags & SEC_LINK_ONCE) != 0
877 || (IS_ELF
878 /* The GNU toolchain uses an extension for ELF: a
879 section beginning with the magic string
880 .gnu.linkonce is a linkonce section. */
881 && strncmp (segment_name (symsec), ".gnu.linkonce",
882 sizeof ".gnu.linkonce" - 1) == 0))
883 continue;
252b5132 884 }
f7460f5f
JJ
885
886 /* Never adjust a reloc against local symbol in a merge section
887 with non-zero addend. */
5045ec7a
AM
888 if ((symsec->flags & SEC_MERGE) != 0
889 && (fixp->fx_offset != 0 || fixp->fx_subsy != NULL))
a161fe53 890 continue;
13ae64f3
JJ
891
892 /* Never adjust a reloc against TLS local symbol. */
df44284e 893 if ((symsec->flags & SEC_THREAD_LOCAL) != 0)
a161fe53 894 continue;
252b5132 895
a161fe53 896 /* We refetch the segment when calling section_symbol, rather
252b5132 897 than using symsec, because S_GET_VALUE may wind up changing
efaf0ba4 898 the section when it calls resolve_symbol_value. */
252b5132
RH
899 fixp->fx_offset += S_GET_VALUE (sym);
900 fixp->fx_addsy = section_symbol (S_GET_SEGMENT (sym));
e723ef7c
ILT
901#ifdef DEBUG5
902 fprintf (stderr, "\nadjusted fixup:\n");
903 print_fixup (fixp);
904#endif
252b5132 905 }
252b5132
RH
906
907 dump_section_relocs (abfd, sec, stderr);
908}
909
e7ff5c73
AM
910/* fixup_segment()
911
912 Go through all the fixS's in a segment and see which ones can be
913 handled now. (These consist of fixS where we have since discovered
914 the value of a symbol, or the address of the frag involved.)
915 For each one, call md_apply_fix to put the fix into the frag data.
89d67ed9
AM
916 Ones that we couldn't completely handle here will be output later
917 by emit_relocations. */
e7ff5c73 918
89d67ed9 919static void
e7ff5c73
AM
920fixup_segment (fixS *fixP, segT this_segment)
921{
e7ff5c73
AM
922 valueT add_number;
923 fragS *fragP;
924 segT add_symbol_segment = absolute_section;
925
926 if (fixP != NULL && abs_section_sym == NULL)
927 abs_section_sym = section_symbol (absolute_section);
928
929 /* If the linker is doing the relaxing, we must not do any fixups.
930
931 Well, strictly speaking that's not true -- we could do any that
a8eb42a8 932 are PC-relative and don't cross regions that could change size. */
e7ff5c73
AM
933 if (linkrelax && TC_LINKRELAX_FIXUP (this_segment))
934 {
935 for (; fixP; fixP = fixP->fx_next)
936 if (!fixP->fx_done)
937 {
938 if (fixP->fx_addsy == NULL)
939 {
940 /* There was no symbol required by this relocation.
941 However, BFD doesn't really handle relocations
942 without symbols well. So fake up a local symbol in
943 the absolute section. */
944 fixP->fx_addsy = abs_section_sym;
945 }
946 symbol_mark_used_in_reloc (fixP->fx_addsy);
947 if (fixP->fx_subsy != NULL)
948 symbol_mark_used_in_reloc (fixP->fx_subsy);
e7ff5c73 949 }
89d67ed9 950 return;
e7ff5c73
AM
951 }
952
953 for (; fixP; fixP = fixP->fx_next)
954 {
955#ifdef DEBUG5
956 fprintf (stderr, "\nprocessing fixup:\n");
957 print_fixup (fixP);
958#endif
959
960 fragP = fixP->fx_frag;
961 know (fragP);
962#ifdef TC_VALIDATE_FIX
963 TC_VALIDATE_FIX (fixP, this_segment, skip);
964#endif
965 add_number = fixP->fx_offset;
966
e7ff5c73
AM
967 if (fixP->fx_addsy != NULL)
968 add_symbol_segment = S_GET_SEGMENT (fixP->fx_addsy);
969
970 if (fixP->fx_subsy != NULL)
971 {
972 segT sub_symbol_segment;
973 resolve_symbol_value (fixP->fx_subsy);
974 sub_symbol_segment = S_GET_SEGMENT (fixP->fx_subsy);
975 if (fixP->fx_addsy != NULL
976 && sub_symbol_segment == add_symbol_segment
c969da64
RS
977 && !S_FORCE_RELOC (fixP->fx_addsy, 0)
978 && !S_FORCE_RELOC (fixP->fx_subsy, 0)
e7ff5c73
AM
979 && !TC_FORCE_RELOCATION_SUB_SAME (fixP, add_symbol_segment))
980 {
981 add_number += S_GET_VALUE (fixP->fx_addsy);
982 add_number -= S_GET_VALUE (fixP->fx_subsy);
983 fixP->fx_offset = add_number;
984 fixP->fx_addsy = NULL;
985 fixP->fx_subsy = NULL;
986#ifdef TC_M68K
987 /* See the comment below about 68k weirdness. */
988 fixP->fx_pcrel = 0;
989#endif
990 }
991 else if (sub_symbol_segment == absolute_section
c969da64 992 && !S_FORCE_RELOC (fixP->fx_subsy, 0)
9a97a5d7 993 && !TC_FORCE_RELOCATION_SUB_ABS (fixP, add_symbol_segment))
e7ff5c73
AM
994 {
995 add_number -= S_GET_VALUE (fixP->fx_subsy);
996 fixP->fx_offset = add_number;
997 fixP->fx_subsy = NULL;
998 }
999 else if (sub_symbol_segment == this_segment
c969da64 1000 && !S_FORCE_RELOC (fixP->fx_subsy, 0)
5db484ff 1001 && !TC_FORCE_RELOCATION_SUB_LOCAL (fixP, add_symbol_segment))
e7ff5c73
AM
1002 {
1003 add_number -= S_GET_VALUE (fixP->fx_subsy);
1004 fixP->fx_offset = (add_number + fixP->fx_dot_value
8e723a10 1005 + fixP->fx_dot_frag->fr_address);
e7ff5c73
AM
1006
1007 /* Make it pc-relative. If the back-end code has not
1008 selected a pc-relative reloc, cancel the adjustment
1009 we do later on all pc-relative relocs. */
1010 if (0
1011#ifdef TC_M68K
1012 /* Do this for m68k even if it's already described
1013 as pc-relative. On the m68k, an operand of
1014 "pc@(foo-.-2)" should address "foo" in a
1015 pc-relative mode. */
1016 || 1
1017#endif
1018 || !fixP->fx_pcrel)
1019 add_number += MD_PCREL_FROM_SECTION (fixP, this_segment);
1020 fixP->fx_subsy = NULL;
1021 fixP->fx_pcrel = 1;
1022 }
586ec8c1 1023 else if (!TC_VALIDATE_FIX_SUB (fixP, add_symbol_segment))
e7ff5c73 1024 {
9a97a5d7
AM
1025 if (!md_register_arithmetic
1026 && (add_symbol_segment == reg_section
1027 || sub_symbol_segment == reg_section))
1028 as_bad_where (fixP->fx_file, fixP->fx_line,
1029 _("register value used as expression"));
1030 else
1031 as_bad_where (fixP->fx_file, fixP->fx_line,
1032 _("can't resolve `%s' {%s section} - `%s' {%s section}"),
1033 fixP->fx_addsy ? S_GET_NAME (fixP->fx_addsy) : "0",
1034 segment_name (add_symbol_segment),
1035 S_GET_NAME (fixP->fx_subsy),
1036 segment_name (sub_symbol_segment));
e7ff5c73 1037 }
586ec8c1
NC
1038 else if (sub_symbol_segment != undefined_section
1039 && ! bfd_is_com_section (sub_symbol_segment)
1040 && MD_APPLY_SYM_VALUE (fixP))
1041 add_number -= S_GET_VALUE (fixP->fx_subsy);
e7ff5c73
AM
1042 }
1043
1044 if (fixP->fx_addsy)
1045 {
1fc5d88e 1046 if (add_symbol_segment == this_segment
c969da64 1047 && !S_FORCE_RELOC (fixP->fx_addsy, 0)
e7ff5c73
AM
1048 && !TC_FORCE_RELOCATION_LOCAL (fixP))
1049 {
1050 /* This fixup was made when the symbol's segment was
1051 SEG_UNKNOWN, but it is now in the local segment.
1052 So we know how to do the address without relocation. */
1053 add_number += S_GET_VALUE (fixP->fx_addsy);
1054 fixP->fx_offset = add_number;
1055 if (fixP->fx_pcrel)
1056 add_number -= MD_PCREL_FROM_SECTION (fixP, this_segment);
1057 fixP->fx_addsy = NULL;
1058 fixP->fx_pcrel = 0;
1059 }
1060 else if (add_symbol_segment == absolute_section
c969da64 1061 && !S_FORCE_RELOC (fixP->fx_addsy, 0)
e7ff5c73
AM
1062 && !TC_FORCE_RELOCATION_ABS (fixP))
1063 {
1064 add_number += S_GET_VALUE (fixP->fx_addsy);
1065 fixP->fx_offset = add_number;
1066 fixP->fx_addsy = NULL;
1067 }
1068 else if (add_symbol_segment != undefined_section
1069 && ! bfd_is_com_section (add_symbol_segment)
1070 && MD_APPLY_SYM_VALUE (fixP))
1071 add_number += S_GET_VALUE (fixP->fx_addsy);
1072 }
1073
1074 if (fixP->fx_pcrel)
1075 {
1076 add_number -= MD_PCREL_FROM_SECTION (fixP, this_segment);
1077 if (!fixP->fx_done && fixP->fx_addsy == NULL)
1078 {
1079 /* There was no symbol required by this relocation.
1080 However, BFD doesn't really handle relocations
1081 without symbols well. So fake up a local symbol in
1082 the absolute section. */
1083 fixP->fx_addsy = abs_section_sym;
1084 }
1085 }
1086
1087 if (!fixP->fx_done)
1088 md_apply_fix (fixP, &add_number, this_segment);
1089
1090 if (!fixP->fx_done)
1091 {
e7ff5c73
AM
1092 if (fixP->fx_addsy == NULL)
1093 fixP->fx_addsy = abs_section_sym;
1094 symbol_mark_used_in_reloc (fixP->fx_addsy);
1095 if (fixP->fx_subsy != NULL)
1096 symbol_mark_used_in_reloc (fixP->fx_subsy);
1097 }
1098
5bc11336 1099 if (!fixP->fx_no_overflow && fixP->fx_size != 0)
e7ff5c73
AM
1100 {
1101 if (fixP->fx_size < sizeof (valueT))
1102 {
1103 valueT mask;
1104
1105 mask = 0;
1106 mask--; /* Set all bits to one. */
1107 mask <<= fixP->fx_size * 8 - (fixP->fx_signed ? 1 : 0);
1108 if ((add_number & mask) != 0 && (add_number & mask) != mask)
1109 {
1110 char buf[50], buf2[50];
1111 sprint_value (buf, fragP->fr_address + fixP->fx_where);
1112 if (add_number > 1000)
1113 sprint_value (buf2, add_number);
1114 else
1115 sprintf (buf2, "%ld", (long) add_number);
1116 as_bad_where (fixP->fx_file, fixP->fx_line,
992a06ee
AM
1117 ngettext ("value of %s too large for field "
1118 "of %d byte at %s",
1119 "value of %s too large for field "
1120 "of %d bytes at %s",
1121 fixP->fx_size),
e7ff5c73
AM
1122 buf2, fixP->fx_size, buf);
1123 } /* Generic error checking. */
1124 }
1125#ifdef WARN_SIGNED_OVERFLOW_WORD
1126 /* Warn if a .word value is too large when treated as a signed
1127 number. We already know it is not too negative. This is to
1128 catch over-large switches generated by gcc on the 68k. */
1129 if (!flag_signed_overflow_ok
1130 && fixP->fx_size == 2
1131 && add_number > 0x7fff)
1132 as_bad_where (fixP->fx_file, fixP->fx_line,
1133 _("signed .word overflow; switch may be too large; %ld at 0x%lx"),
1134 (long) add_number,
1135 (long) (fragP->fr_address + fixP->fx_where));
1136#endif
5bc11336 1137 }
e7ff5c73
AM
1138
1139#ifdef TC_VALIDATE_FIX
1140 skip: ATTRIBUTE_UNUSED_LABEL
1141 ;
1142#endif
1143#ifdef DEBUG5
1144 fprintf (stderr, "result:\n");
1145 print_fixup (fixP);
1146#endif
1147 } /* For each fixS in this segment. */
e7ff5c73
AM
1148}
1149
a161fe53 1150static void
d7342424
KH
1151fix_segment (bfd *abfd ATTRIBUTE_UNUSED,
1152 asection *sec,
e7ff5c73 1153 void *xxx ATTRIBUTE_UNUSED)
a161fe53
AM
1154{
1155 segment_info_type *seginfo = seg_info (sec);
1156
1157 fixup_segment (seginfo->fix_root, sec);
1158}
1159
e5435dec
AM
1160static void
1161install_reloc (asection *sec, arelent *reloc, fragS *fragp,
3b4dbbbf 1162 const char *file, unsigned int line)
e5435dec
AM
1163{
1164 char *err;
1165 bfd_reloc_status_type s;
76d12939
AM
1166 asymbol *sym;
1167
1168 if (reloc->sym_ptr_ptr != NULL
1169 && (sym = *reloc->sym_ptr_ptr) != NULL
1170 && (sym->flags & BSF_KEEP) == 0
1171 && ((sym->flags & BSF_SECTION_SYM) == 0
55f8b826
AM
1172 || (EMIT_SECTION_SYMBOLS
1173 && !bfd_is_abs_section (sym->section))))
76d12939 1174 as_bad_where (file, line, _("redefined symbol cannot be used on reloc"));
e5435dec
AM
1175
1176 s = bfd_install_relocation (stdoutput, reloc,
1177 fragp->fr_literal, fragp->fr_address,
1178 sec, &err);
1179 switch (s)
1180 {
1181 case bfd_reloc_ok:
1182 break;
1183 case bfd_reloc_overflow:
1184 as_bad_where (file, line, _("relocation overflow"));
1185 break;
1186 case bfd_reloc_outofrange:
1187 as_bad_where (file, line, _("relocation out of range"));
1188 break;
1189 default:
1190 as_fatal (_("%s:%u: bad return from bfd_install_relocation: %x"),
1191 file, line, s);
1192 }
1193}
1194
7230378d
AM
1195static fragS *
1196get_frag_for_reloc (fragS *last_frag,
1197 const segment_info_type *seginfo,
1198 const struct reloc_list *r)
1199{
1200 fragS *f;
34bca508 1201
7230378d
AM
1202 for (f = last_frag; f != NULL; f = f->fr_next)
1203 if (f->fr_address <= r->u.b.r.address
1204 && r->u.b.r.address < f->fr_address + f->fr_fix)
1205 return f;
1206
1207 for (f = seginfo->frchainP->frch_root; f != NULL; f = f->fr_next)
1208 if (f->fr_address <= r->u.b.r.address
1209 && r->u.b.r.address < f->fr_address + f->fr_fix)
1210 return f;
1211
740bdc67
AM
1212 for (f = seginfo->frchainP->frch_root; f != NULL; f = f->fr_next)
1213 if (f->fr_address <= r->u.b.r.address
1214 && r->u.b.r.address <= f->fr_address + f->fr_fix)
1215 return f;
1216
7230378d
AM
1217 as_bad_where (r->file, r->line,
1218 _("reloc not within (fixed part of) section"));
1219 return NULL;
1220}
1221
252b5132 1222static void
fd361982
AM
1223write_relocs (bfd *abfd ATTRIBUTE_UNUSED, asection *sec,
1224 void *xxx ATTRIBUTE_UNUSED)
252b5132
RH
1225{
1226 segment_info_type *seginfo = seg_info (sec);
252b5132 1227 unsigned int n;
05e9452c 1228 struct reloc_list *my_reloc_list, **rp, *r;
252b5132
RH
1229 arelent **relocs;
1230 fixS *fixp;
7230378d 1231 fragS *last_frag;
252b5132
RH
1232
1233 /* If seginfo is NULL, we did not create this section; don't do
1234 anything with it. */
1235 if (seginfo == NULL)
1236 return;
1237
252b5132
RH
1238 n = 0;
1239 for (fixp = seginfo->fix_root; fixp; fixp = fixp->fx_next)
e5435dec
AM
1240 if (!fixp->fx_done)
1241 n++;
1242
1243#ifdef RELOC_EXPANSION_POSSIBLE
1244 n *= MAX_RELOC_EXPANSION;
1245#endif
252b5132 1246
05e9452c
AM
1247 /* Extract relocs for this section from reloc_list. */
1248 rp = &reloc_list;
269b4ded 1249
05e9452c
AM
1250 my_reloc_list = NULL;
1251 while ((r = *rp) != NULL)
1252 {
1253 if (r->u.b.sec == sec)
1254 {
1255 *rp = r->next;
1256 r->next = my_reloc_list;
1257 my_reloc_list = r;
1258 n++;
1259 }
1260 else
1261 rp = &r->next;
1262 }
1263
add39d23 1264 relocs = XCNEWVEC (arelent *, n);
252b5132 1265
7230378d
AM
1266 n = 0;
1267 r = my_reloc_list;
1268 last_frag = NULL;
252b5132
RH
1269 for (fixp = seginfo->fix_root; fixp != (fixS *) NULL; fixp = fixp->fx_next)
1270 {
d31f0f6d 1271 int fx_size, slack;
871a6bd2 1272 valueT loc;
7230378d
AM
1273 arelent **reloc;
1274#ifndef RELOC_EXPANSION_POSSIBLE
1275 arelent *rel;
1276
1277 reloc = &rel;
1278#endif
252b5132
RH
1279
1280 if (fixp->fx_done)
e5435dec 1281 continue;
252b5132 1282
d31f0f6d
AM
1283 fx_size = fixp->fx_size;
1284 slack = TC_FX_SIZE_SLACK (fixp);
1285 if (slack > 0)
1286 fx_size = fx_size > slack ? fx_size - slack : 0;
1287 loc = fixp->fx_where + fx_size;
e5435dec 1288 if (slack >= 0 && loc > fixp->fx_frag->fr_fix)
d31f0f6d
AM
1289 as_bad_where (fixp->fx_file, fixp->fx_line,
1290 _("internal error: fixup not contained within frag"));
252b5132 1291
e5435dec 1292#ifndef RELOC_EXPANSION_POSSIBLE
7230378d 1293 *reloc = tc_gen_reloc (sec, fixp);
e5435dec 1294#else
7230378d
AM
1295 reloc = tc_gen_reloc (sec, fixp);
1296#endif
252b5132 1297
7230378d
AM
1298 while (*reloc)
1299 {
1300 while (r != NULL && r->u.b.r.address < (*reloc)->address)
1301 {
1302 fragS *f = get_frag_for_reloc (last_frag, seginfo, r);
1303 if (f != NULL)
1304 {
1305 last_frag = f;
1306 relocs[n++] = &r->u.b.r;
1307 install_reloc (sec, &r->u.b.r, f, r->file, r->line);
1308 }
1309 r = r->next;
1310 }
1311 relocs[n++] = *reloc;
1312 install_reloc (sec, *reloc, fixp->fx_frag,
1313 fixp->fx_file, fixp->fx_line);
1314#ifndef RELOC_EXPANSION_POSSIBLE
1315 break;
1316#else
1317 reloc++;
e5435dec 1318#endif
7230378d
AM
1319 }
1320 }
d31f0f6d 1321
7230378d
AM
1322 while (r != NULL)
1323 {
1324 fragS *f = get_frag_for_reloc (last_frag, seginfo, r);
1325 if (f != NULL)
1326 {
1327 last_frag = f;
1328 relocs[n++] = &r->u.b.r;
1329 install_reloc (sec, &r->u.b.r, f, r->file, r->line);
1330 }
1331 r = r->next;
252b5132 1332 }
252b5132
RH
1333
1334#ifdef DEBUG4
1335 {
1596988d 1336 unsigned int k, j, nsyms;
252b5132
RH
1337 asymbol **sympp;
1338 sympp = bfd_get_outsymbols (stdoutput);
1339 nsyms = bfd_get_symcount (stdoutput);
1596988d
TG
1340 for (k = 0; k < n; k++)
1341 if (((*relocs[k]->sym_ptr_ptr)->flags & BSF_SECTION_SYM) == 0)
252b5132
RH
1342 {
1343 for (j = 0; j < nsyms; j++)
1596988d 1344 if (sympp[j] == *relocs[k]->sym_ptr_ptr)
252b5132
RH
1345 break;
1346 if (j == nsyms)
1347 abort ();
1348 }
1349 }
1350#endif
1351
1352 if (n)
e5435dec 1353 {
fd361982 1354 flagword flags = bfd_section_flags (sec);
e5435dec 1355 flags |= SEC_RELOC;
fd361982 1356 bfd_set_section_flags (sec, flags);
e5435dec
AM
1357 bfd_set_reloc (stdoutput, sec, relocs, n);
1358 }
252b5132 1359
945a1a6b
ILT
1360#ifdef SET_SECTION_RELOCS
1361 SET_SECTION_RELOCS (sec, relocs, n);
1362#endif
1363
252b5132
RH
1364#ifdef DEBUG3
1365 {
1596988d
TG
1366 unsigned int k;
1367
252b5132 1368 fprintf (stderr, "relocs for sec %s\n", sec->name);
1596988d 1369 for (k = 0; k < n; k++)
252b5132 1370 {
1596988d
TG
1371 arelent *rel = relocs[k];
1372 asymbol *s = *rel->sym_ptr_ptr;
988392e2 1373 fprintf (stderr, " reloc %2d @%p off %4lx : sym %-10s addend %lx\n",
1596988d
TG
1374 k, rel, (unsigned long)rel->address, s->name,
1375 (unsigned long)rel->addend);
252b5132
RH
1376 }
1377 }
1378#endif
1379}
1380
0acf065b
CC
1381static int
1382compress_frag (struct z_stream_s *strm, const char *contents, int in_size,
1383 fragS **last_newf, struct obstack *ob)
1384{
1385 int out_size;
1386 int total_out_size = 0;
1387 fragS *f = *last_newf;
1388 char *next_out;
1389 int avail_out;
1390
1391 /* Call the compression routine repeatedly until it has finished
1392 processing the frag. */
1393 while (in_size > 0)
1394 {
1395 /* Reserve all the space available in the current chunk.
1396 If none is available, start a new frag. */
1397 avail_out = obstack_room (ob);
1398 if (avail_out <= 0)
1399 {
1400 obstack_finish (ob);
1401 f = frag_alloc (ob);
1402 f->fr_type = rs_fill;
1403 (*last_newf)->fr_next = f;
1404 *last_newf = f;
1405 avail_out = obstack_room (ob);
1406 }
1407 if (avail_out <= 0)
1408 as_fatal (_("can't extend frag"));
1409 next_out = obstack_next_free (ob);
1410 obstack_blank_fast (ob, avail_out);
1411 out_size = compress_data (strm, &contents, &in_size,
1412 &next_out, &avail_out);
1413 if (out_size < 0)
1414 return -1;
1415
1416 f->fr_fix += out_size;
1417 total_out_size += out_size;
1418
1419 /* Return unused space. */
1420 if (avail_out > 0)
1421 obstack_blank_fast (ob, -avail_out);
1422 }
1423
1424 return total_out_size;
1425}
1426
1427static void
1428compress_debug (bfd *abfd, asection *sec, void *xxx ATTRIBUTE_UNUSED)
1429{
1430 segment_info_type *seginfo = seg_info (sec);
1431 fragS *f;
1432 fragS *first_newf;
1433 fragS *last_newf;
1434 struct obstack *ob = &seginfo->frchainP->frch_obstack;
1435 bfd_size_type uncompressed_size = (bfd_size_type) sec->size;
1436 bfd_size_type compressed_size;
1437 const char *section_name;
1438 char *compressed_name;
1439 char *header;
1440 struct z_stream_s *strm;
1441 int x;
fd361982 1442 flagword flags = bfd_section_flags (sec);
151411f8 1443 unsigned int header_size, compression_header_size;
0acf065b
CC
1444
1445 if (seginfo == NULL
6ac88ef3 1446 || sec->size < 32
4a114e3e 1447 || (flags & (SEC_ALLOC | SEC_HAS_CONTENTS)) == SEC_ALLOC)
0acf065b
CC
1448 return;
1449
fd361982 1450 section_name = bfd_section_name (sec);
0acf065b
CC
1451 if (strncmp (section_name, ".debug_", 7) != 0)
1452 return;
1453
1454 strm = compress_init ();
1455 if (strm == NULL)
1456 return;
1457
151411f8 1458 if (flag_compress_debug == COMPRESS_DEBUG_GABI_ZLIB)
dab394de 1459 {
dab394de
L
1460 compression_header_size
1461 = bfd_get_compression_header_size (stdoutput, NULL);
1462 header_size = compression_header_size;
1463 }
151411f8 1464 else
dab394de 1465 {
dab394de
L
1466 compression_header_size = 0;
1467 header_size = 12;
1468 }
151411f8 1469
dab394de 1470 /* Create a new frag to contain the compression header. */
0acf065b 1471 first_newf = frag_alloc (ob);
151411f8 1472 if (obstack_room (ob) < header_size)
0acf065b 1473 first_newf = frag_alloc (ob);
151411f8 1474 if (obstack_room (ob) < header_size)
992a06ee
AM
1475 as_fatal (ngettext ("can't extend frag %lu char",
1476 "can't extend frag %lu chars",
1477 (unsigned long) header_size),
1478 (unsigned long) header_size);
0acf065b 1479 last_newf = first_newf;
151411f8 1480 obstack_blank_fast (ob, header_size);
0acf065b 1481 last_newf->fr_type = rs_fill;
151411f8 1482 last_newf->fr_fix = header_size;
0acf065b 1483 header = last_newf->fr_literal;
151411f8 1484 compressed_size = header_size;
0acf065b
CC
1485
1486 /* Stream the frags through the compression engine, adding new frags
2b0f3761 1487 as necessary to accommodate the compressed output. */
0acf065b
CC
1488 for (f = seginfo->frchainP->frch_root;
1489 f;
1490 f = f->fr_next)
1491 {
1492 offsetT fill_size;
1493 char *fill_literal;
1494 offsetT count;
1495 int out_size;
1496
1497 gas_assert (f->fr_type == rs_fill);
1498 if (f->fr_fix)
1499 {
1500 out_size = compress_frag (strm, f->fr_literal, f->fr_fix,
1501 &last_newf, ob);
1502 if (out_size < 0)
1503 return;
1504 compressed_size += out_size;
1505 }
1506 fill_literal = f->fr_literal + f->fr_fix;
1507 fill_size = f->fr_var;
1508 count = f->fr_offset;
1509 gas_assert (count >= 0);
1510 if (fill_size && count)
1511 {
1512 while (count--)
1513 {
1514 out_size = compress_frag (strm, fill_literal, (int) fill_size,
1515 &last_newf, ob);
1516 if (out_size < 0)
1517 return;
1518 compressed_size += out_size;
1519 }
1520 }
1521 }
1522
1523 /* Flush the compression state. */
1524 for (;;)
1525 {
1526 int avail_out;
1527 char *next_out;
1528 int out_size;
1529
1530 /* Reserve all the space available in the current chunk.
1531 If none is available, start a new frag. */
1532 avail_out = obstack_room (ob);
1533 if (avail_out <= 0)
1534 {
1535 fragS *newf;
1536
1537 obstack_finish (ob);
1538 newf = frag_alloc (ob);
1539 newf->fr_type = rs_fill;
1540 last_newf->fr_next = newf;
1541 last_newf = newf;
1542 avail_out = obstack_room (ob);
1543 }
1544 if (avail_out <= 0)
1545 as_fatal (_("can't extend frag"));
1546 next_out = obstack_next_free (ob);
1547 obstack_blank_fast (ob, avail_out);
1548 x = compress_finish (strm, &next_out, &avail_out, &out_size);
1549 if (x < 0)
1550 return;
1551
1552 last_newf->fr_fix += out_size;
1553 compressed_size += out_size;
1554
1555 /* Return unused space. */
1556 if (avail_out > 0)
1557 obstack_blank_fast (ob, -avail_out);
1558
1559 if (x == 0)
1560 break;
1561 }
1562
b422eb49
L
1563 /* PR binutils/18087: If compression didn't make the section smaller,
1564 just keep it uncompressed. */
317974f6 1565 if (compressed_size >= uncompressed_size)
273a4985 1566 return;
d94077e2 1567
0acf065b
CC
1568 /* Replace the uncompressed frag list with the compressed frag list. */
1569 seginfo->frchainP->frch_root = first_newf;
1570 seginfo->frchainP->frch_last = last_newf;
1571
1572 /* Update the section size and its name. */
151411f8 1573 bfd_update_compression_header (abfd, (bfd_byte *) header, sec);
fd361982 1574 x = bfd_set_section_size (sec, compressed_size);
0acf065b 1575 gas_assert (x);
151411f8
L
1576 if (!compression_header_size)
1577 {
29a2809e 1578 compressed_name = concat (".z", section_name + 1, (char *) NULL);
fd361982 1579 bfd_rename_section (sec, compressed_name);
151411f8 1580 }
0acf065b
CC
1581}
1582
62a02d25
L
1583#ifndef md_generate_nops
1584/* Genenerate COUNT bytes of no-op instructions to WHERE. A target
1585 backend must override this with proper no-op instructions. */
1586
1587static void
1588md_generate_nops (fragS *f ATTRIBUTE_UNUSED,
1589 char *where ATTRIBUTE_UNUSED,
1590 offsetT count ATTRIBUTE_UNUSED,
1591 int control ATTRIBUTE_UNUSED)
1592{
8f065d3b 1593 as_bad (_("unimplemented .nops directive"));
62a02d25
L
1594}
1595#endif
1596
252b5132 1597static void
d7342424
KH
1598write_contents (bfd *abfd ATTRIBUTE_UNUSED,
1599 asection *sec,
e7ff5c73 1600 void *xxx ATTRIBUTE_UNUSED)
252b5132
RH
1601{
1602 segment_info_type *seginfo = seg_info (sec);
685736be 1603 addressT offset = 0;
252b5132
RH
1604 fragS *f;
1605
1606 /* Write out the frags. */
1607 if (seginfo == NULL
fd361982 1608 || !(bfd_section_flags (sec) & SEC_HAS_CONTENTS))
252b5132
RH
1609 return;
1610
1611 for (f = seginfo->frchainP->frch_root;
1612 f;
1613 f = f->fr_next)
1614 {
1615 int x;
685736be 1616 addressT fill_size;
252b5132 1617 char *fill_literal;
685736be 1618 offsetT count;
252b5132 1619
62a02d25 1620 gas_assert (f->fr_type == rs_fill || f->fr_type == rs_fill_nop);
252b5132
RH
1621 if (f->fr_fix)
1622 {
1623 x = bfd_set_section_contents (stdoutput, sec,
1624 f->fr_literal, (file_ptr) offset,
1625 (bfd_size_type) f->fr_fix);
b34976b6 1626 if (!x)
992a06ee
AM
1627 as_fatal (ngettext ("can't write %ld byte "
1628 "to section %s of %s: '%s'",
1629 "can't write %ld bytes "
1630 "to section %s of %s: '%s'",
1631 (long) f->fr_fix),
1632 (long) f->fr_fix,
69f57659 1633 bfd_section_name (sec), bfd_get_filename (stdoutput),
885afe7b 1634 bfd_errmsg (bfd_get_error ()));
252b5132
RH
1635 offset += f->fr_fix;
1636 }
62a02d25 1637
252b5132
RH
1638 fill_size = f->fr_var;
1639 count = f->fr_offset;
62a02d25
L
1640 fill_literal = f->fr_literal + f->fr_fix;
1641
1642 if (f->fr_type == rs_fill_nop)
1643 {
1644 gas_assert (count >= 0 && fill_size == 1);
1645 if (count > 0)
1646 {
1647 char *buf = xmalloc (count);
1648 md_generate_nops (f, buf, count, *fill_literal);
1649 x = bfd_set_section_contents
1650 (stdoutput, sec, buf, (file_ptr) offset,
1651 (bfd_size_type) count);
1652 if (!x)
1653 as_fatal (ngettext ("can't fill %ld byte "
1654 "in section %s of %s: '%s'",
1655 "can't fill %ld bytes "
1656 "in section %s of %s: '%s'",
69f57659
AM
1657 (long) count),
1658 (long) count,
1659 bfd_section_name (sec),
1660 bfd_get_filename (stdoutput),
1661 bfd_errmsg (bfd_get_error ()));
62a02d25
L
1662 offset += count;
1663 free (buf);
1664 }
1665 continue;
1666 }
1667
9c2799c2 1668 gas_assert (count >= 0);
252b5132
RH
1669 if (fill_size && count)
1670 {
1671 char buf[256];
efaf0ba4 1672 if (fill_size > sizeof (buf))
252b5132 1673 {
efaf0ba4 1674 /* Do it the old way. Can this ever happen? */
252b5132
RH
1675 while (count--)
1676 {
1677 x = bfd_set_section_contents (stdoutput, sec,
1678 fill_literal,
1679 (file_ptr) offset,
1680 (bfd_size_type) fill_size);
b34976b6 1681 if (!x)
992a06ee
AM
1682 as_fatal (ngettext ("can't fill %ld byte "
1683 "in section %s of %s: '%s'",
1684 "can't fill %ld bytes "
1685 "in section %s of %s: '%s'",
1686 (long) fill_size),
1687 (long) fill_size,
69f57659
AM
1688 bfd_section_name (sec),
1689 bfd_get_filename (stdoutput),
885afe7b 1690 bfd_errmsg (bfd_get_error ()));
252b5132
RH
1691 offset += fill_size;
1692 }
1693 }
1694 else
1695 {
1696 /* Build a buffer full of fill objects and output it as
1697 often as necessary. This saves on the overhead of
1698 potentially lots of bfd_set_section_contents calls. */
1699 int n_per_buf, i;
1700 if (fill_size == 1)
1701 {
1702 n_per_buf = sizeof (buf);
1703 memset (buf, *fill_literal, n_per_buf);
1704 }
1705 else
1706 {
1707 char *bufp;
efaf0ba4 1708 n_per_buf = sizeof (buf) / fill_size;
252b5132 1709 for (i = n_per_buf, bufp = buf; i; i--, bufp += fill_size)
efaf0ba4 1710 memcpy (bufp, fill_literal, fill_size);
252b5132
RH
1711 }
1712 for (; count > 0; count -= n_per_buf)
1713 {
1714 n_per_buf = n_per_buf > count ? count : n_per_buf;
efaf0ba4
NC
1715 x = bfd_set_section_contents
1716 (stdoutput, sec, buf, (file_ptr) offset,
1717 (bfd_size_type) n_per_buf * fill_size);
b34976b6 1718 if (!x)
992a06ee
AM
1719 as_fatal (ngettext ("can't fill %ld byte "
1720 "in section %s of %s: '%s'",
1721 "can't fill %ld bytes "
1722 "in section %s of %s: '%s'",
1723 (long) (n_per_buf * fill_size)),
1724 (long) (n_per_buf * fill_size),
69f57659
AM
1725 bfd_section_name (sec),
1726 bfd_get_filename (stdoutput),
a22429b9 1727 bfd_errmsg (bfd_get_error ()));
252b5132
RH
1728 offset += n_per_buf * fill_size;
1729 }
1730 }
1731 }
1732 }
1733}
252b5132 1734
252b5132 1735static void
d7342424 1736merge_data_into_text (void)
252b5132 1737{
252b5132
RH
1738 seg_info (text_section)->frchainP->frch_last->fr_next =
1739 seg_info (data_section)->frchainP->frch_root;
1740 seg_info (text_section)->frchainP->frch_last =
1741 seg_info (data_section)->frchainP->frch_last;
1742 seg_info (data_section)->frchainP = 0;
252b5132 1743}
252b5132 1744
252b5132 1745static void
d7342424 1746set_symtab (void)
252b5132
RH
1747{
1748 int nsyms;
1749 asymbol **asympp;
1750 symbolS *symp;
b34976b6 1751 bfd_boolean result;
252b5132
RH
1752
1753 /* Count symbols. We can't rely on a count made by the loop in
1754 write_object_file, because *_frob_file may add a new symbol or
d1bcae83 1755 two. Generate unused section symbols only if needed. */
252b5132
RH
1756 nsyms = 0;
1757 for (symp = symbol_rootP; symp; symp = symbol_next (symp))
d1bcae83
L
1758 if (bfd_keep_unused_section_symbols (stdoutput)
1759 || !symbol_section_p (symp)
1760 || symbol_used_in_reloc_p (symp))
1761 nsyms++;
252b5132
RH
1762
1763 if (nsyms)
1764 {
1765 int i;
0e1a166b 1766 bfd_size_type amt = (bfd_size_type) nsyms * sizeof (asymbol *);
252b5132 1767
1e9cc1c2 1768 asympp = (asymbol **) bfd_alloc (stdoutput, amt);
252b5132 1769 symp = symbol_rootP;
d1bcae83
L
1770 for (i = 0; i < nsyms; symp = symbol_next (symp))
1771 if (bfd_keep_unused_section_symbols (stdoutput)
1772 || !symbol_section_p (symp)
1773 || symbol_used_in_reloc_p (symp))
1774 {
1775 asympp[i] = symbol_get_bfdsym (symp);
1776 if (asympp[i]->flags != BSF_SECTION_SYM
1777 || !(bfd_is_const_section (asympp[i]->section)
1778 && asympp[i]->section->symbol == asympp[i]))
1779 asympp[i]->flags |= BSF_KEEP;
1780 symbol_mark_written (symp);
1781 /* Include this section symbol in the symbol table. */
1782 if (symbol_section_p (symp))
1783 asympp[i]->flags |= BSF_SECTION_SYM_USED;
1784 i++;
1785 }
252b5132
RH
1786 }
1787 else
1788 asympp = 0;
1789 result = bfd_set_symtab (stdoutput, asympp, nsyms);
9c2799c2 1790 gas_assert (result);
252b5132
RH
1791 symbol_table_frozen = 1;
1792}
252b5132
RH
1793
1794/* Finish the subsegments. After every sub-segment, we fake an
2edb36e7 1795 ".align ...". This conforms to BSD4.2 brain-damage. We then fake
252b5132
RH
1796 ".fill 0" because that is the kind of frag that requires least
1797 thought. ".align" frags like to have a following frag since that
1798 makes calculating their intended length trivial. */
1799
1800#ifndef SUB_SEGMENT_ALIGN
18e1d487 1801#ifdef HANDLE_ALIGN
436d9e46 1802/* The last subsegment gets an alignment corresponding to the alignment
18e1d487
AM
1803 of the section. This allows proper nop-filling at the end of
1804 code-bearing sections. */
1805#define SUB_SEGMENT_ALIGN(SEG, FRCHAIN) \
9028d943 1806 (!(FRCHAIN)->frch_next && subseg_text_p (SEG) \
2edb36e7 1807 && !do_not_pad_sections_to_alignment \
9028d943
AM
1808 ? get_recorded_alignment (SEG) \
1809 : 0)
18e1d487 1810#else
18e1d487 1811#define SUB_SEGMENT_ALIGN(SEG, FRCHAIN) 0
252b5132
RH
1812#endif
1813#endif
1814
85024cd8 1815static void
d98b0e2b 1816subsegs_finish_section (asection *s)
252b5132
RH
1817{
1818 struct frchain *frchainP;
d98b0e2b
TG
1819 segment_info_type *seginfo = seg_info (s);
1820 if (!seginfo)
1821 return;
252b5132 1822
d98b0e2b
TG
1823 for (frchainP = seginfo->frchainP;
1824 frchainP != NULL;
1825 frchainP = frchainP->frch_next)
252b5132 1826 {
93a24ba7 1827 int alignment;
0a9ef439 1828
d98b0e2b 1829 subseg_set (s, frchainP->frch_subseg);
381a1ab3 1830
d98b0e2b
TG
1831 /* This now gets called even if we had errors. In that case,
1832 any alignment is meaningless, and, moreover, will look weird
1833 if we are generating a listing. */
93a24ba7
MR
1834 if (had_errors ())
1835 do_not_pad_sections_to_alignment = 1;
c9049d30 1836
93a24ba7 1837 alignment = SUB_SEGMENT_ALIGN (now_seg, frchainP);
fd361982 1838 if ((bfd_section_flags (now_seg) & SEC_MERGE)
93a24ba7
MR
1839 && now_seg->entsize)
1840 {
1841 unsigned int entsize = now_seg->entsize;
1842 int entalign = 0;
d98b0e2b 1843
93a24ba7
MR
1844 while ((entsize & 1) == 0)
1845 {
1846 ++entalign;
1847 entsize >>= 1;
381a1ab3 1848 }
93a24ba7
MR
1849
1850 if (entalign > alignment)
1851 alignment = entalign;
d98b0e2b 1852 }
0a9ef439 1853
d98b0e2b
TG
1854 if (subseg_text_p (now_seg))
1855 frag_align_code (alignment, 0);
1856 else
1857 frag_align (alignment, 0, 0);
252b5132 1858
d98b0e2b
TG
1859 /* frag_align will have left a new frag.
1860 Use this last frag for an empty ".fill".
252b5132 1861
d98b0e2b
TG
1862 For this segment ...
1863 Create a last frag. Do not leave a "being filled in frag". */
1864 frag_wane (frag_now);
1865 frag_now->fr_fix = 0;
1866 know (frag_now->fr_next == NULL);
252b5132
RH
1867 }
1868}
1869
d98b0e2b
TG
1870static void
1871subsegs_finish (void)
1872{
1873 asection *s;
1874
1875 for (s = stdoutput->sections; s; s = s->next)
1876 subsegs_finish_section (s);
1877}
1878
1879#ifdef OBJ_ELF
1880static void
1881create_obj_attrs_section (void)
1882{
1883 segT s;
1884 char *p;
1885 offsetT size;
1886 const char *name;
1887
1888 size = bfd_elf_obj_attr_size (stdoutput);
0df8ad28
NC
1889 if (size == 0)
1890 return;
1891
1892 name = get_elf_backend_data (stdoutput)->obj_attrs_section;
1893 if (!name)
1894 name = ".gnu.attributes";
1895 s = subseg_new (name, 0);
1896 elf_section_type (s)
1897 = get_elf_backend_data (stdoutput)->obj_attrs_section_type;
fd361982 1898 bfd_set_section_flags (s, SEC_READONLY | SEC_DATA);
0df8ad28
NC
1899 frag_now_fix ();
1900 p = frag_more (size);
1901 bfd_elf_set_obj_attr_contents (stdoutput, (bfd_byte *)p, size);
1902
1903 subsegs_finish_section (s);
1904 relax_segment (seg_info (s)->frchainP->frch_root, s, 0);
1905 size_seg (stdoutput, s, NULL);
1906}
1907
0df8ad28
NC
1908/* Create a relocation against an entry in a GNU Build attribute section. */
1909
1910static void
1911create_note_reloc (segT sec,
1912 symbolS * sym,
269b4ded
NC
1913 bfd_size_type note_offset,
1914 bfd_size_type desc2_offset,
56c1b507 1915 offsetT desc2_size,
0df8ad28
NC
1916 int reloc_type,
1917 bfd_vma addend,
1918 char * note)
1919{
1920 struct reloc_list * reloc;
1921
1922 reloc = XNEW (struct reloc_list);
1923
1924 /* We create a .b type reloc as resolve_reloc_expr_symbols() has already been called. */
269b4ded
NC
1925 reloc->u.b.sec = sec;
1926 reloc->u.b.s = symbol_get_bfdsym (sym);
0df8ad28 1927 reloc->u.b.r.sym_ptr_ptr = & reloc->u.b.s;
269b4ded 1928 reloc->u.b.r.address = note_offset + desc2_offset;
0df8ad28
NC
1929 reloc->u.b.r.addend = addend;
1930 reloc->u.b.r.howto = bfd_reloc_type_lookup (stdoutput, reloc_type);
1931
1932 if (reloc->u.b.r.howto == NULL)
d98b0e2b 1933 {
0df8ad28
NC
1934 as_bad (_("unable to create reloc for build note"));
1935 return;
1936 }
1937
1938 reloc->file = N_("<gnu build note>");
1939 reloc->line = 0;
1940
1941 reloc->next = reloc_list;
1942 reloc_list = reloc;
1943
1944 /* For REL relocs, store the addend in the section. */
1945 if (! sec->use_rela_p
1946 /* The SH target is a special case that uses RELA relocs
1947 but still stores the addend in the word being relocated. */
1948 || strstr (bfd_get_target (stdoutput), "-sh") != NULL)
1949 {
56c1b507
NC
1950 offsetT i;
1951
1952 /* Zero out the addend, since it is now stored in the note. */
1953 reloc->u.b.r.addend = 0;
1954
0df8ad28
NC
1955 if (target_big_endian)
1956 {
56c1b507
NC
1957 for (i = desc2_size; addend != 0 && i > 0; addend >>= 8, i--)
1958 note[desc2_offset + i - 1] = (addend & 0xff);
0df8ad28
NC
1959 }
1960 else
56c1b507
NC
1961 {
1962 for (i = 0; addend != 0 && i < desc2_size; addend >>= 8, i++)
1963 note[desc2_offset + i] = (addend & 0xff);
1964 }
d98b0e2b
TG
1965 }
1966}
0df8ad28
NC
1967
1968static void
1969maybe_generate_build_notes (void)
1970{
1971 segT sec;
1972 char * note;
1973 offsetT note_size;
864bb26c 1974 offsetT total_size;
0df8ad28
NC
1975 offsetT desc_size;
1976 offsetT desc2_offset;
1977 int desc_reloc;
1978 symbolS * sym;
8d1015a8 1979 asymbol * bsym;
0df8ad28
NC
1980
1981 if (! flag_generate_build_notes
1982 || bfd_get_section_by_name (stdoutput,
1983 GNU_BUILD_ATTRS_SECTION_NAME) != NULL)
1984 return;
1985
1986 /* Create a GNU Build Attribute section. */
1987 sec = subseg_new (GNU_BUILD_ATTRS_SECTION_NAME, FALSE);
1988 elf_section_type (sec) = SHT_NOTE;
61826503
CE
1989 bfd_set_section_flags (sec, (SEC_READONLY | SEC_HAS_CONTENTS | SEC_DATA
1990 | SEC_OCTETS));
fd361982 1991 bfd_set_section_alignment (sec, 2);
0df8ad28 1992
864bb26c
NC
1993 /* Work out the size of the notes that we will create,
1994 and the relocation we should use. */
0df8ad28
NC
1995 if (bfd_arch_bits_per_address (stdoutput) <= 32)
1996 {
1997 note_size = 28;
1998 desc_size = 8; /* Two 4-byte offsets. */
1999 desc2_offset = 24;
2000
2001 /* FIXME: The BFD backend for the CRX target does not support the
2002 BFD_RELOC_32, even though it really should. Likewise for the
2003 CR16 target. So we have special case code here... */
2004 if (strstr (bfd_get_target (stdoutput), "-crx") != NULL)
2005 desc_reloc = BFD_RELOC_CRX_NUM32;
2006 else if (strstr (bfd_get_target (stdoutput), "-cr16") != NULL)
2007 desc_reloc = BFD_RELOC_CR16_NUM32;
2008 else
2009 desc_reloc = BFD_RELOC_32;
2010 }
2011 else
2012 {
2013 note_size = 36;
2014 desc_size = 16; /* Two 8-byte offsets. */
2015 desc2_offset = 28;
2016 /* FIXME: The BFD backend for the IA64 target does not support the
2017 BFD_RELOC_64, even though it really should. The HPPA backend
2018 has a similar issue, although it does not support BFD_RELOCs at
2019 all! So we have special case code to handle these targets. */
2020 if (strstr (bfd_get_target (stdoutput), "-ia64") != NULL)
2021 desc_reloc = target_big_endian ? BFD_RELOC_IA64_DIR32MSB : BFD_RELOC_IA64_DIR32LSB;
2022 else if (strstr (bfd_get_target (stdoutput), "-hppa") != NULL)
2023 desc_reloc = 80; /* R_PARISC_DIR64. */
2024 else
2025 desc_reloc = BFD_RELOC_64;
2026 }
2027
864bb26c
NC
2028 /* We have to create a note for *each* code section.
2029 Linker garbage collection might discard some. */
2030 total_size = 0;
2031 note = NULL;
0df8ad28 2032
8d1015a8
AM
2033 for (sym = symbol_rootP; sym != NULL; sym = symbol_next (sym))
2034 if ((bsym = symbol_get_bfdsym (sym)) != NULL
2035 && bsym->flags & BSF_SECTION_SYM
2036 && bsym->section != NULL
2e48456f 2037 /* Skip linkonce sections - we cannot use these section symbols as they may disappear. */
8d1015a8 2038 && (bsym->section->flags & (SEC_CODE | SEC_LINK_ONCE)) == SEC_CODE
864bb26c
NC
2039 /* Not all linkonce sections are flagged... */
2040 && strncmp (S_GET_NAME (sym), ".gnu.linkonce", sizeof ".gnu.linkonce" - 1) != 0)
0df8ad28 2041 {
864bb26c
NC
2042 /* Create a version note. */
2043 frag_now_fix ();
2044 note = frag_more (note_size);
2045 memset (note, 0, note_size);
0df8ad28 2046
864bb26c 2047 if (target_big_endian)
0df8ad28 2048 {
864bb26c 2049 note[3] = 8; /* strlen (name) + 1. */
56c1b507 2050 note[7] = desc_size; /* Two N-byte offsets. */
864bb26c
NC
2051 note[10] = NT_GNU_BUILD_ATTRIBUTE_OPEN >> 8;
2052 note[11] = NT_GNU_BUILD_ATTRIBUTE_OPEN & 0xff;
2053 }
2054 else
2055 {
2056 note[0] = 8; /* strlen (name) + 1. */
56c1b507 2057 note[4] = desc_size; /* Two N-byte offsets. */
864bb26c
NC
2058 note[8] = NT_GNU_BUILD_ATTRIBUTE_OPEN & 0xff;
2059 note[9] = NT_GNU_BUILD_ATTRIBUTE_OPEN >> 8;
0df8ad28 2060 }
0df8ad28 2061
864bb26c
NC
2062 /* The a1 version number indicates that this note was
2063 generated by the assembler and not the gcc annobin plugin. */
2064 memcpy (note + 12, "GA$\ 13a1", 8);
2065
2066 /* Create a relocation to install the start address of the note... */
56c1b507 2067 create_note_reloc (sec, sym, total_size, 20, desc_size / 2, desc_reloc, 0, note);
864bb26c
NC
2068
2069 /* ...and another one to install the end address. */
56c1b507
NC
2070 create_note_reloc (sec, sym, total_size, desc2_offset,
2071 desc_size / 2,
2072 desc_reloc,
fd361982 2073 bfd_section_size (bsym->section),
864bb26c
NC
2074 note);
2075
d1bcae83
L
2076 /* Mark the section symbol used in relocation so that it will be
2077 included in the symbol table. */
2078 symbol_mark_used_in_reloc (sym);
2079
864bb26c
NC
2080 total_size += note_size;
2081 /* FIXME: Maybe add a note recording the assembler command line and version ? */
2082 }
0df8ad28
NC
2083
2084 /* Install the note(s) into the section. */
864bb26c
NC
2085 if (total_size)
2086 bfd_set_section_contents (stdoutput, sec, (bfd_byte *) note, 0, total_size);
0df8ad28
NC
2087 subsegs_finish_section (sec);
2088 relax_segment (seg_info (sec)->frchainP->frch_root, sec, 0);
2089 size_seg (stdoutput, sec, NULL);
2090}
2091#endif /* OBJ_ELF */
d98b0e2b 2092
252b5132
RH
2093/* Write the object file. */
2094
2095void
d7342424 2096write_object_file (void)
252b5132 2097{
32638454 2098 struct relax_seg_info rsi;
7be1c489 2099#ifndef WORKING_DOT_WORD
efaf0ba4 2100 fragS *fragP; /* Track along all frags. */
252b5132
RH
2101#endif
2102
85024cd8
AM
2103 subsegs_finish ();
2104
16a87420
IS
2105#ifdef md_pre_output_hook
2106 md_pre_output_hook;
2107#endif
2108
cdaa5616
IS
2109#ifdef md_pre_relax_hook
2110 md_pre_relax_hook;
2111#endif
2112
252b5132 2113 /* From now on, we don't care about sub-segments. Build one frag chain
2b0f3761 2114 for each segment. Linked through fr_next. */
252b5132 2115
252b5132
RH
2116 /* Remove the sections created by gas for its own purposes. */
2117 {
252b5132
RH
2118 int i;
2119
5daa8fe7
L
2120 bfd_section_list_remove (stdoutput, reg_section);
2121 bfd_section_list_remove (stdoutput, expr_section);
2122 stdoutput->section_count -= 2;
252b5132
RH
2123 i = 0;
2124 bfd_map_over_sections (stdoutput, renumber_sections, &i);
2125 }
2126
2127 bfd_map_over_sections (stdoutput, chain_frchains_together, (char *) 0);
252b5132
RH
2128
2129 /* We have two segments. If user gave -R flag, then we must put the
2130 data frags into the text segment. Do this before relaxing so
2131 we know to take advantage of -R and make shorter addresses. */
252b5132
RH
2132 if (flag_readonly_data_in_text)
2133 {
2134 merge_data_into_text ();
2135 }
252b5132 2136
32638454 2137 rsi.pass = 0;
e46d99eb
AM
2138 while (1)
2139 {
aacb5251
HPN
2140#ifndef WORKING_DOT_WORD
2141 /* We need to reset the markers in the broken word list and
2142 associated frags between calls to relax_segment (via
2143 relax_seg). Since the broken word list is global, we do it
2144 once per round, rather than locally in relax_segment for each
2145 segment. */
2146 struct broken_word *brokp;
2147
2148 for (brokp = broken_words;
2149 brokp != (struct broken_word *) NULL;
2150 brokp = brokp->next_broken_word)
2151 {
2152 brokp->added = 0;
2153
2154 if (brokp->dispfrag != (fragS *) NULL
2155 && brokp->dispfrag->fr_type == rs_broken_word)
2156 brokp->dispfrag->fr_subtype = 0;
2157 }
2158#endif
2159
32638454
AM
2160 rsi.changed = 0;
2161 bfd_map_over_sections (stdoutput, relax_seg, &rsi);
2162 rsi.pass++;
2163 if (!rsi.changed)
e46d99eb
AM
2164 break;
2165 }
e027f3e8 2166
87548816
NC
2167 /* Note - Most ports will use the default value of
2168 TC_FINALIZE_SYMS_BEFORE_SIZE_SEG, which 1. This will force
2169 local symbols to be resolved, removing their frag information.
2170 Some ports however, will not have finished relaxing all of
2171 their frags and will still need the local symbol frag
2172 information. These ports can set
2173 TC_FINALIZE_SYMS_BEFORE_SIZE_SEG to 0. */
2174 finalize_syms = TC_FINALIZE_SYMS_BEFORE_SIZE_SEG;
2175
e46d99eb 2176 bfd_map_over_sections (stdoutput, size_seg, (char *) 0);
e46d99eb 2177
38b87a1b
NC
2178 /* Relaxation has completed. Freeze all syms. */
2179 finalize_syms = 1;
2180
ba8826a8
AO
2181 dwarf2dbg_final_check ();
2182
e0001a05
NC
2183#ifdef md_post_relax_hook
2184 md_post_relax_hook;
2185#endif
2186
d98b0e2b
TG
2187#ifdef OBJ_ELF
2188 if (IS_ELF)
2189 create_obj_attrs_section ();
2190#endif
2191
252b5132
RH
2192#ifndef WORKING_DOT_WORD
2193 {
2194 struct broken_word *lie;
2195 struct broken_word **prevP;
2196
2197 prevP = &broken_words;
2198 for (lie = broken_words; lie; lie = lie->next_broken_word)
2199 if (!lie->added)
2200 {
2201 expressionS exp;
2202
2203 subseg_change (lie->seg, lie->subseg);
2204 exp.X_op = O_subtract;
2205 exp.X_add_symbol = lie->add;
2206 exp.X_op_symbol = lie->sub;
2207 exp.X_add_number = lie->addnum;
252b5132
RH
2208#ifdef TC_CONS_FIX_NEW
2209 TC_CONS_FIX_NEW (lie->frag,
efaf0ba4 2210 lie->word_goes_here - lie->frag->fr_literal,
62ebcb5c 2211 2, &exp, TC_PARSE_CONS_RETURN_NONE);
252b5132
RH
2212#else
2213 fix_new_exp (lie->frag,
2214 lie->word_goes_here - lie->frag->fr_literal,
2215 2, &exp, 0, BFD_RELOC_16);
2216#endif
252b5132
RH
2217 *prevP = lie->next_broken_word;
2218 }
2219 else
2220 prevP = &(lie->next_broken_word);
2221
2222 for (lie = broken_words; lie;)
2223 {
2224 struct broken_word *untruth;
2225 char *table_ptr;
2226 addressT table_addr;
2227 addressT from_addr, to_addr;
2228 int n, m;
2229
2230 subseg_change (lie->seg, lie->subseg);
2231 fragP = lie->dispfrag;
2232
2233 /* Find out how many broken_words go here. */
2234 n = 0;
efaf0ba4
NC
2235 for (untruth = lie;
2236 untruth && untruth->dispfrag == fragP;
2237 untruth = untruth->next_broken_word)
252b5132
RH
2238 if (untruth->added == 1)
2239 n++;
2240
2241 table_ptr = lie->dispfrag->fr_opcode;
efaf0ba4
NC
2242 table_addr = (lie->dispfrag->fr_address
2243 + (table_ptr - lie->dispfrag->fr_literal));
252b5132
RH
2244 /* Create the jump around the long jumps. This is a short
2245 jump from table_ptr+0 to table_ptr+n*long_jump_size. */
2246 from_addr = table_addr;
2247 to_addr = table_addr + md_short_jump_size + n * md_long_jump_size;
efaf0ba4
NC
2248 md_create_short_jump (table_ptr, from_addr, to_addr, lie->dispfrag,
2249 lie->add);
252b5132
RH
2250 table_ptr += md_short_jump_size;
2251 table_addr += md_short_jump_size;
2252
efaf0ba4
NC
2253 for (m = 0;
2254 lie && lie->dispfrag == fragP;
2255 m++, lie = lie->next_broken_word)
252b5132
RH
2256 {
2257 if (lie->added == 2)
2258 continue;
efaf0ba4 2259 /* Patch the jump table. */
187af7df 2260 for (untruth = (struct broken_word *) (fragP->fr_symbol);
efaf0ba4
NC
2261 untruth && untruth->dispfrag == fragP;
2262 untruth = untruth->next_broken_word)
252b5132
RH
2263 {
2264 if (untruth->use_jump == lie)
187af7df
HPN
2265 {
2266 /* This is the offset from ??? to table_ptr+0.
2267 The target is the same for all users of this
2268 md_long_jump, but the "sub" bases (and hence the
2269 offsets) may be different. */
2270 addressT to_word = table_addr - S_GET_VALUE (untruth->sub);
2271#ifdef TC_CHECK_ADJUSTED_BROKEN_DOT_WORD
2272 TC_CHECK_ADJUSTED_BROKEN_DOT_WORD (to_word, untruth);
2273#endif
2274 md_number_to_chars (untruth->word_goes_here, to_word, 2);
2275 }
252b5132
RH
2276 }
2277
efaf0ba4
NC
2278 /* Install the long jump. */
2279 /* This is a long jump from table_ptr+0 to the final target. */
252b5132
RH
2280 from_addr = table_addr;
2281 to_addr = S_GET_VALUE (lie->add) + lie->addnum;
efaf0ba4
NC
2282 md_create_long_jump (table_ptr, from_addr, to_addr, lie->dispfrag,
2283 lie->add);
252b5132
RH
2284 table_ptr += md_long_jump_size;
2285 table_addr += md_long_jump_size;
2286 }
2287 }
2288 }
efaf0ba4 2289#endif /* not WORKING_DOT_WORD */
252b5132 2290
252b5132
RH
2291 /* Resolve symbol values. This needs to be done before processing
2292 the relocations. */
2293 if (symbol_rootP)
2294 {
2295 symbolS *symp;
2296
2297 for (symp = symbol_rootP; symp; symp = symbol_next (symp))
6386f3a7 2298 resolve_symbol_value (symp);
252b5132 2299 }
49309057 2300 resolve_local_symbol_values ();
05e9452c 2301 resolve_reloc_expr_symbols ();
252b5132 2302
0df8ad28
NC
2303#ifdef OBJ_ELF
2304 if (IS_ELF)
2305 maybe_generate_build_notes ();
2306#endif
269b4ded 2307
252b5132
RH
2308 PROGRESS (1);
2309
2310#ifdef tc_frob_file_before_adjust
2311 tc_frob_file_before_adjust ();
2312#endif
2313#ifdef obj_frob_file_before_adjust
2314 obj_frob_file_before_adjust ();
2315#endif
2316
efaf0ba4 2317 bfd_map_over_sections (stdoutput, adjust_reloc_syms, (char *) 0);
252b5132 2318
a161fe53
AM
2319#ifdef tc_frob_file_before_fix
2320 tc_frob_file_before_fix ();
2321#endif
2322#ifdef obj_frob_file_before_fix
2323 obj_frob_file_before_fix ();
2324#endif
2325
2326 bfd_map_over_sections (stdoutput, fix_segment, (char *) 0);
2327
252b5132
RH
2328 /* Set up symbol table, and write it out. */
2329 if (symbol_rootP)
2330 {
2331 symbolS *symp;
aaac53f5 2332 bfd_boolean skip_next_symbol = FALSE;
252b5132
RH
2333
2334 for (symp = symbol_rootP; symp; symp = symbol_next (symp))
2335 {
2336 int punt = 0;
2337 const char *name;
2338
aaac53f5
HPN
2339 if (skip_next_symbol)
2340 {
2341 /* Don't do anything besides moving the value of the
2342 symbol from the GAS value-field to the BFD value-field. */
2343 symbol_get_bfdsym (symp)->value = S_GET_VALUE (symp);
2344 skip_next_symbol = FALSE;
2345 continue;
2346 }
2347
49309057 2348 if (symbol_mri_common_p (symp))
252b5132
RH
2349 {
2350 if (S_IS_EXTERNAL (symp))
2351 as_bad (_("%s: global symbols not supported in common sections"),
2352 S_GET_NAME (symp));
2353 symbol_remove (symp, &symbol_rootP, &symbol_lastP);
2354 continue;
2355 }
2356
2357 name = S_GET_NAME (symp);
2358 if (name)
2359 {
efaf0ba4
NC
2360 const char *name2 =
2361 decode_local_label_name ((char *) S_GET_NAME (symp));
252b5132
RH
2362 /* They only differ if `name' is a fb or dollar local
2363 label name. */
2364 if (name2 != name && ! S_IS_DEFINED (symp))
0e389e77 2365 as_bad (_("local label `%s' is not defined"), name2);
252b5132
RH
2366 }
2367
2368 /* Do it again, because adjust_reloc_syms might introduce
2369 more symbols. They'll probably only be section symbols,
2370 but they'll still need to have the values computed. */
6386f3a7 2371 resolve_symbol_value (symp);
252b5132
RH
2372
2373 /* Skip symbols which were equated to undefined or common
b4b24b79 2374 symbols. */
06e77878
AO
2375 if (symbol_equated_reloc_p (symp)
2376 || S_IS_WEAKREFR (symp))
252b5132 2377 {
91d6fa6a
NC
2378 const char *sname = S_GET_NAME (symp);
2379
60938e80 2380 if (S_IS_COMMON (symp)
91d6fa6a 2381 && !TC_FAKE_LABEL (sname)
76db0a2e 2382 && !S_IS_WEAKREFR (symp))
60938e80
L
2383 {
2384 expressionS *e = symbol_get_value_expression (symp);
91d6fa6a 2385
76db0a2e 2386 as_bad (_("`%s' can't be equated to common symbol `%s'"),
91d6fa6a 2387 sname, S_GET_NAME (e->X_add_symbol));
60938e80 2388 }
d0548f34
L
2389 if (S_GET_SEGMENT (symp) == reg_section)
2390 {
2391 /* Report error only if we know the symbol name. */
2392 if (S_GET_NAME (symp) != reg_section->name)
2393 as_bad (_("can't make global register symbol `%s'"),
91d6fa6a 2394 sname);
d0548f34 2395 }
252b5132
RH
2396 symbol_remove (symp, &symbol_rootP, &symbol_lastP);
2397 continue;
2398 }
2399
252b5132
RH
2400#ifdef obj_frob_symbol
2401 obj_frob_symbol (symp, punt);
2402#endif
2403#ifdef tc_frob_symbol
49309057 2404 if (! punt || symbol_used_in_reloc_p (symp))
252b5132
RH
2405 tc_frob_symbol (symp, punt);
2406#endif
2407
2408 /* If we don't want to keep this symbol, splice it out of
2409 the chain now. If EMIT_SECTION_SYMBOLS is 0, we never
2410 want section symbols. Otherwise, we skip local symbols
2411 and symbols that the frob_symbol macros told us to punt,
2412 but we keep such symbols if they are used in relocs. */
a161fe53
AM
2413 if (symp == abs_section_sym
2414 || (! EMIT_SECTION_SYMBOLS
2415 && symbol_section_p (symp))
e97b3f28 2416 /* Note that S_IS_EXTERNAL and S_IS_LOCAL are not always
252b5132
RH
2417 opposites. Sometimes the former checks flags and the
2418 latter examines the name... */
e97b3f28 2419 || (!S_IS_EXTERNAL (symp)
461b725f
AO
2420 && (punt || S_IS_LOCAL (symp) ||
2421 (S_IS_WEAKREFD (symp) && ! symbol_used_p (symp)))
49309057 2422 && ! symbol_used_in_reloc_p (symp)))
252b5132
RH
2423 {
2424 symbol_remove (symp, &symbol_rootP, &symbol_lastP);
efaf0ba4 2425
252b5132
RH
2426 /* After symbol_remove, symbol_next(symp) still returns
2427 the one that came after it in the chain. So we don't
2428 need to do any extra cleanup work here. */
252b5132
RH
2429 continue;
2430 }
2431
2432 /* Make sure we really got a value for the symbol. */
49309057 2433 if (! symbol_resolved_p (symp))
252b5132 2434 {
0e389e77 2435 as_bad (_("can't resolve value for symbol `%s'"),
252b5132 2436 S_GET_NAME (symp));
49309057 2437 symbol_mark_resolved (symp);
252b5132
RH
2438 }
2439
2440 /* Set the value into the BFD symbol. Up til now the value
2441 has only been kept in the gas symbolS struct. */
49309057 2442 symbol_get_bfdsym (symp)->value = S_GET_VALUE (symp);
aaac53f5
HPN
2443
2444 /* A warning construct is a warning symbol followed by the
2445 symbol warned about. Don't let anything object-format or
2446 target-specific muck with it; it's ready for output. */
2447 if (symbol_get_bfdsym (symp)->flags & BSF_WARNING)
2448 skip_next_symbol = TRUE;
252b5132
RH
2449 }
2450 }
2451
2452 PROGRESS (1);
2453
2454 /* Now do any format-specific adjustments to the symbol table, such
2455 as adding file symbols. */
2456#ifdef tc_adjust_symtab
2457 tc_adjust_symtab ();
2458#endif
2459#ifdef obj_adjust_symtab
2460 obj_adjust_symtab ();
2461#endif
2462
d0548f34 2463 /* Stop if there is an error. */
82194874 2464 if (!flag_always_generate_output && had_errors ())
d0548f34
L
2465 return;
2466
252b5132
RH
2467 /* Now that all the sizes are known, and contents correct, we can
2468 start writing to the file. */
2ae08483 2469 set_symtab ();
252b5132
RH
2470
2471 /* If *_frob_file changes the symbol value at this point, it is
2472 responsible for moving the changed value into symp->bsym->value
2473 as well. Hopefully all symbol value changing can be done in
2474 *_frob_symbol. */
2475#ifdef tc_frob_file
2476 tc_frob_file ();
2477#endif
2478#ifdef obj_frob_file
2479 obj_frob_file ();
2480#endif
f3d2b04b
KT
2481#ifdef obj_coff_generate_pdata
2482 obj_coff_generate_pdata ();
2483#endif
0df8ad28 2484
252b5132
RH
2485 bfd_map_over_sections (stdoutput, write_relocs, (char *) 0);
2486
f1c2d4af 2487#ifdef tc_frob_file_after_relocs
252b5132
RH
2488 tc_frob_file_after_relocs ();
2489#endif
2490#ifdef obj_frob_file_after_relocs
2491 obj_frob_file_after_relocs ();
2492#endif
f1c2d4af 2493
b8871f35
L
2494#if defined OBJ_ELF || defined OBJ_MAYBE_ELF
2495 if (IS_ELF && flag_use_elf_stt_common)
2496 stdoutput->flags |= BFD_CONVERT_ELF_COMMON | BFD_USE_ELF_STT_COMMON;
2497#endif
2498
0acf065b
CC
2499 /* Once all relocations have been written, we can compress the
2500 contents of the debug sections. This needs to be done before
2501 we start writing any sections, because it will affect the file
2502 layout, which is fixed once we start writing contents. */
2503 if (flag_compress_debug)
8ecb73dd
L
2504 {
2505 if (flag_compress_debug == COMPRESS_DEBUG_GABI_ZLIB)
2506 stdoutput->flags |= BFD_COMPRESS | BFD_COMPRESS_GABI;
2507 else
2508 stdoutput->flags |= BFD_COMPRESS;
2509 bfd_map_over_sections (stdoutput, compress_debug, (char *) 0);
2510 }
0acf065b 2511
252b5132 2512 bfd_map_over_sections (stdoutput, write_contents, (char *) 0);
252b5132 2513}
252b5132
RH
2514
2515#ifdef TC_GENERIC_RELAX_TABLE
b65d68b8
L
2516#ifndef md_generic_table_relax_frag
2517#define md_generic_table_relax_frag relax_frag
2518#endif
2519
252b5132
RH
2520/* Relax a fragment by scanning TC_GENERIC_RELAX_TABLE. */
2521
2522long
d7342424 2523relax_frag (segT segment, fragS *fragP, long stretch)
252b5132
RH
2524{
2525 const relax_typeS *this_type;
2526 const relax_typeS *start_type;
2527 relax_substateT next_state;
2528 relax_substateT this_state;
685736be 2529 offsetT growth;
38686296
AM
2530 offsetT aim;
2531 addressT target;
2532 addressT address;
2533 symbolS *symbolP;
2534 const relax_typeS *table;
2535
2536 target = fragP->fr_offset;
37a58883 2537 address = fragP->fr_address + fragP->fr_fix;
38686296 2538 table = TC_GENERIC_RELAX_TABLE;
252b5132
RH
2539 this_state = fragP->fr_subtype;
2540 start_type = this_type = table + this_state;
38686296 2541 symbolP = fragP->fr_symbol;
252b5132
RH
2542
2543 if (symbolP)
2544 {
c842b53a
ILT
2545 fragS *sym_frag;
2546
2547 sym_frag = symbol_get_frag (symbolP);
2548
252b5132 2549#ifndef DIFF_EXPR_OK
c842b53a 2550 know (sym_frag != NULL);
252b5132 2551#endif
a161fe53 2552 know (S_GET_SEGMENT (symbolP) != absolute_section
c842b53a 2553 || sym_frag == &zero_address_frag);
ac62c346 2554 target += S_GET_VALUE (symbolP);
252b5132 2555
e35a414d
AM
2556 /* If SYM_FRAG has yet to be reached on this pass, assume it
2557 will move by STRETCH just as we did, unless there is an
2558 alignment frag between here and SYM_FRAG. An alignment may
2559 well absorb any STRETCH, and we don't want to choose a larger
2560 branch insn by overestimating the needed reach of this
2561 branch. It isn't critical to calculate TARGET exactly; We
2562 know we'll be doing another pass if STRETCH is non-zero. */
252b5132 2563
c842b53a 2564 if (stretch != 0
38686296
AM
2565 && sym_frag->relax_marker != fragP->relax_marker
2566 && S_GET_SEGMENT (symbolP) == segment)
252b5132 2567 {
e35a414d
AM
2568 if (stretch < 0
2569 || sym_frag->region == fragP->region)
2570 target += stretch;
e5940dff
AM
2571 /* If we get here we know we have a forward branch. This
2572 relax pass may have stretched previous instructions so
2573 far that omitting STRETCH would make the branch
2574 negative. Don't allow this in case the negative reach is
2575 large enough to require a larger branch instruction. */
2576 else if (target < address)
37a58883 2577 return 0;
252b5132
RH
2578 }
2579 }
2580
37a58883 2581 aim = target - address;
252b5132 2582#ifdef TC_PCREL_ADJUST
37a58883 2583 /* Currently only the ns32k and arc needs this. */
efaf0ba4 2584 aim += TC_PCREL_ADJUST (fragP);
efaf0ba4 2585#endif
59c871b4
BE
2586
2587#ifdef md_prepare_relax_scan
2588 /* Formerly called M68K_AIM_KLUDGE. */
252b5132
RH
2589 md_prepare_relax_scan (fragP, address, aim, this_state, this_type);
2590#endif
2591
2592 if (aim < 0)
2593 {
efaf0ba4 2594 /* Look backwards. */
252b5132
RH
2595 for (next_state = this_type->rlx_more; next_state;)
2596 if (aim >= this_type->rlx_backward)
2597 next_state = 0;
2598 else
2599 {
efaf0ba4 2600 /* Grow to next state. */
252b5132
RH
2601 this_state = next_state;
2602 this_type = table + this_state;
2603 next_state = this_type->rlx_more;
2604 }
2605 }
2606 else
2607 {
efaf0ba4 2608 /* Look forwards. */
252b5132
RH
2609 for (next_state = this_type->rlx_more; next_state;)
2610 if (aim <= this_type->rlx_forward)
2611 next_state = 0;
2612 else
2613 {
efaf0ba4 2614 /* Grow to next state. */
252b5132
RH
2615 this_state = next_state;
2616 this_type = table + this_state;
2617 next_state = this_type->rlx_more;
2618 }
2619 }
2620
2621 growth = this_type->rlx_length - start_type->rlx_length;
2622 if (growth != 0)
2623 fragP->fr_subtype = this_state;
2624 return growth;
2625}
2626
efaf0ba4 2627#endif /* defined (TC_GENERIC_RELAX_TABLE) */
252b5132
RH
2628
2629/* Relax_align. Advance location counter to next address that has 'alignment'
2630 lowest order bits all 0s, return size of adjustment made. */
2631static relax_addressT
ed9e98c2
AM
2632relax_align (relax_addressT address, /* Address now. */
2633 int alignment /* Alignment (binary). */)
252b5132
RH
2634{
2635 relax_addressT mask;
2636 relax_addressT new_address;
2637
65879393 2638 mask = ~((relax_addressT) ~0 << alignment);
252b5132
RH
2639 new_address = (address + mask) & (~mask);
2640#ifdef LINKER_RELAXING_SHRINKS_ONLY
2641 if (linkrelax)
2642 /* We must provide lots of padding, so the linker can discard it
2643 when needed. The linker will not add extra space, ever. */
2644 new_address += (1 << alignment);
2645#endif
2646 return (new_address - address);
2647}
2648
efaf0ba4
NC
2649/* Now we have a segment, not a crowd of sub-segments, we can make
2650 fr_address values.
58a77e41 2651
efaf0ba4 2652 Relax the frags.
58a77e41 2653
efaf0ba4
NC
2654 After this, all frags in this segment have addresses that are correct
2655 within the segment. Since segments live in different file addresses,
2656 these frag addresses may not be the same as final object-file
2657 addresses. */
2658
e46d99eb 2659int
32638454 2660relax_segment (struct frag *segment_frag_root, segT segment, int pass)
252b5132 2661{
4111faa5
NC
2662 unsigned long frag_count;
2663 struct frag *fragP;
2664 relax_addressT address;
e35a414d 2665 int region;
e46d99eb
AM
2666 int ret;
2667
efaf0ba4 2668 /* In case md_estimate_size_before_relax() wants to make fixSs. */
252b5132
RH
2669 subseg_change (segment, 0);
2670
2671 /* For each frag in segment: count and store (a 1st guess of)
2672 fr_address. */
2673 address = 0;
e35a414d 2674 region = 0;
4111faa5
NC
2675 for (frag_count = 0, fragP = segment_frag_root;
2676 fragP;
2677 fragP = fragP->fr_next, frag_count ++)
252b5132 2678 {
e35a414d 2679 fragP->region = region;
38686296 2680 fragP->relax_marker = 0;
252b5132
RH
2681 fragP->fr_address = address;
2682 address += fragP->fr_fix;
2683
2684 switch (fragP->fr_type)
2685 {
2686 case rs_fill:
2687 address += fragP->fr_offset * fragP->fr_var;
2688 break;
2689
2690 case rs_align:
2691 case rs_align_code:
0a9ef439 2692 case rs_align_test:
252b5132
RH
2693 {
2694 addressT offset = relax_align (address, (int) fragP->fr_offset);
2695
2696 if (fragP->fr_subtype != 0 && offset > fragP->fr_subtype)
2697 offset = 0;
2698
2699 if (offset % fragP->fr_var != 0)
2700 {
54d3cad9 2701 as_bad_where (fragP->fr_file, fragP->fr_line,
992a06ee
AM
2702 ngettext ("alignment padding (%lu byte) "
2703 "not a multiple of %ld",
2704 "alignment padding (%lu bytes) "
2705 "not a multiple of %ld",
2706 (unsigned long) offset),
54d3cad9 2707 (unsigned long) offset, (long) fragP->fr_var);
252b5132
RH
2708 offset -= (offset % fragP->fr_var);
2709 }
2710
2711 address += offset;
e35a414d 2712 region += 1;
252b5132
RH
2713 }
2714 break;
2715
2716 case rs_org:
252b5132 2717 /* Assume .org is nugatory. It will grow with 1st relax. */
e35a414d
AM
2718 region += 1;
2719 break;
2720
2721 case rs_space:
62a02d25 2722 case rs_space_nop:
252b5132
RH
2723 break;
2724
2725 case rs_machine_dependent:
e0890092
AM
2726 /* If fr_symbol is an expression, this call to
2727 resolve_symbol_value sets up the correct segment, which will
2728 likely be needed in md_estimate_size_before_relax. */
2729 if (fragP->fr_symbol)
2730 resolve_symbol_value (fragP->fr_symbol);
2731
252b5132
RH
2732 address += md_estimate_size_before_relax (fragP, segment);
2733 break;
2734
2735#ifndef WORKING_DOT_WORD
efaf0ba4 2736 /* Broken words don't concern us yet. */
252b5132
RH
2737 case rs_broken_word:
2738 break;
2739#endif
2740
2741 case rs_leb128:
efaf0ba4 2742 /* Initial guess is always 1; doing otherwise can result in
252b5132
RH
2743 stable solutions that are larger than the minimum. */
2744 address += fragP->fr_offset = 1;
2745 break;
2746
2747 case rs_cfa:
2748 address += eh_frame_estimate_size_before_relax (fragP);
2749 break;
2750
220e750f
RH
2751 case rs_dwarf2dbg:
2752 address += dwarf2dbg_estimate_size_before_relax (fragP);
2753 break;
2754
252b5132
RH
2755 default:
2756 BAD_CASE (fragP->fr_type);
2757 break;
efaf0ba4
NC
2758 }
2759 }
252b5132
RH
2760
2761 /* Do relax(). */
2762 {
4111faa5 2763 unsigned long max_iterations;
d1c5f158
AM
2764
2765 /* Cumulative address adjustment. */
2766 offsetT stretch;
2767
2768 /* Have we made any adjustment this pass? We can't just test
2769 stretch because one piece of code may have grown and another
2770 shrank. */
2771 int stretched;
2772
2773 /* Most horrible, but gcc may give us some exception data that
2774 is impossible to assemble, of the form
2775
2776 .align 4
2777 .byte 0, 0
2778 .uleb128 end - start
2779 start:
2780 .space 128*128 - 1
2781 .align 4
2782 end:
2783
2784 If the leb128 is two bytes in size, then end-start is 128*128,
2785 which requires a three byte leb128. If the leb128 is three
2786 bytes in size, then end-start is 128*128-1, which requires a
2787 two byte leb128. We work around this dilemma by inserting
2788 an extra 4 bytes of alignment just after the .align. This
2789 works because the data after the align is accessed relative to
2790 the end label.
2791
2792 This counter is used in a tiny state machine to detect
2793 whether a leb128 followed by an align is impossible to
2794 relax. */
2795 int rs_leb128_fudge = 0;
252b5132 2796
4111faa5
NC
2797 /* We want to prevent going into an infinite loop where one frag grows
2798 depending upon the location of a symbol which is in turn moved by
2799 the growing frag. eg:
2800
b4b24b79
AM
2801 foo = .
2802 .org foo+16
2803 foo = .
4111faa5 2804
b4b24b79 2805 So we dictate that this algorithm can be at most O2. */
4111faa5
NC
2806 max_iterations = frag_count * frag_count;
2807 /* Check for overflow. */
2808 if (max_iterations < frag_count)
2809 max_iterations = frag_count;
2810
32638454 2811 ret = 0;
252b5132
RH
2812 do
2813 {
e46d99eb
AM
2814 stretch = 0;
2815 stretched = 0;
58a77e41 2816
252b5132
RH
2817 for (fragP = segment_frag_root; fragP; fragP = fragP->fr_next)
2818 {
685736be 2819 offsetT growth = 0;
252b5132
RH
2820 addressT was_address;
2821 offsetT offset;
2822 symbolS *symbolP;
2823
38686296 2824 fragP->relax_marker ^= 1;
252b5132
RH
2825 was_address = fragP->fr_address;
2826 address = fragP->fr_address += stretch;
2827 symbolP = fragP->fr_symbol;
2828 offset = fragP->fr_offset;
2829
2830 switch (fragP->fr_type)
2831 {
efaf0ba4 2832 case rs_fill: /* .fill never relaxes. */
252b5132
RH
2833 growth = 0;
2834 break;
2835
2836#ifndef WORKING_DOT_WORD
2837 /* JF: This is RMS's idea. I do *NOT* want to be blamed
2838 for it I do not want to write it. I do not want to have
2839 anything to do with it. This is not the proper way to
2840 implement this misfeature. */
2841 case rs_broken_word:
2842 {
2843 struct broken_word *lie;
2844 struct broken_word *untruth;
2845
2846 /* Yes this is ugly (storing the broken_word pointer
2847 in the symbol slot). Still, this whole chunk of
2848 code is ugly, and I don't feel like doing anything
2849 about it. Think of it as stubbornness in action. */
2850 growth = 0;
2851 for (lie = (struct broken_word *) (fragP->fr_symbol);
2852 lie && lie->dispfrag == fragP;
2853 lie = lie->next_broken_word)
2854 {
2855
2856 if (lie->added)
2857 continue;
2858
ac62c346 2859 offset = (S_GET_VALUE (lie->add)
252b5132 2860 + lie->addnum
ac62c346 2861 - S_GET_VALUE (lie->sub));
252b5132
RH
2862 if (offset <= -32768 || offset >= 32767)
2863 {
2864 if (flag_warn_displacement)
2865 {
2866 char buf[50];
2867 sprint_value (buf, (addressT) lie->addnum);
54d3cad9
AM
2868 as_warn_where (fragP->fr_file, fragP->fr_line,
2869 _(".word %s-%s+%s didn't fit"),
2870 S_GET_NAME (lie->add),
2871 S_GET_NAME (lie->sub),
2872 buf);
252b5132 2873 }
252b5132
RH
2874 if (fragP->fr_subtype == 0)
2875 {
2876 fragP->fr_subtype++;
2877 growth += md_short_jump_size;
2878 }
187af7df
HPN
2879
2880 /* Redirect *all* words of this table with the same
2881 target, lest we have to handle the case where the
2882 same target but with a offset that fits on this
2883 round overflows at the next relaxation round. */
2884 for (untruth = (struct broken_word *) (fragP->fr_symbol);
252b5132
RH
2885 untruth && untruth->dispfrag == lie->dispfrag;
2886 untruth = untruth->next_broken_word)
49309057
ILT
2887 if ((symbol_get_frag (untruth->add)
2888 == symbol_get_frag (lie->add))
2889 && (S_GET_VALUE (untruth->add)
2890 == S_GET_VALUE (lie->add)))
252b5132
RH
2891 {
2892 untruth->added = 2;
2893 untruth->use_jump = lie;
2894 }
187af7df
HPN
2895
2896 lie->added = 1;
252b5132
RH
2897 growth += md_long_jump_size;
2898 }
2899 }
2900
2901 break;
efaf0ba4 2902 } /* case rs_broken_word */
252b5132
RH
2903#endif
2904 case rs_align:
2905 case rs_align_code:
0a9ef439 2906 case rs_align_test:
252b5132
RH
2907 {
2908 addressT oldoff, newoff;
2909
2910 oldoff = relax_align (was_address + fragP->fr_fix,
2911 (int) offset);
2912 newoff = relax_align (address + fragP->fr_fix,
2913 (int) offset);
2914
2915 if (fragP->fr_subtype != 0)
2916 {
2917 if (oldoff > fragP->fr_subtype)
2918 oldoff = 0;
2919 if (newoff > fragP->fr_subtype)
2920 newoff = 0;
2921 }
2922
2923 growth = newoff - oldoff;
d1c5f158
AM
2924
2925 /* If this align happens to follow a leb128 and
2926 we have determined that the leb128 is bouncing
2927 in size, then break the cycle by inserting an
2928 extra alignment. */
2929 if (growth < 0
2930 && (rs_leb128_fudge & 16) != 0
2931 && (rs_leb128_fudge & 15) >= 2)
2932 {
2933 segment_info_type *seginfo = seg_info (segment);
2934 struct obstack *ob = &seginfo->frchainP->frch_obstack;
2935 struct frag *newf;
2936
2937 newf = frag_alloc (ob);
2938 obstack_blank_fast (ob, fragP->fr_var);
2939 obstack_finish (ob);
2940 memcpy (newf, fragP, SIZEOF_STRUCT_FRAG);
2941 memcpy (newf->fr_literal,
2942 fragP->fr_literal + fragP->fr_fix,
2943 fragP->fr_var);
2944 newf->fr_type = rs_fill;
20f5cfbd 2945 newf->fr_address = address + fragP->fr_fix + newoff;
d1c5f158
AM
2946 newf->fr_fix = 0;
2947 newf->fr_offset = (((offsetT) 1 << fragP->fr_offset)
2948 / fragP->fr_var);
2949 if (newf->fr_offset * newf->fr_var
2950 != (offsetT) 1 << fragP->fr_offset)
2951 {
2952 newf->fr_offset = (offsetT) 1 << fragP->fr_offset;
2953 newf->fr_var = 1;
2954 }
20f5cfbd 2955 /* Include size of new frag in GROWTH. */
d1c5f158 2956 growth += newf->fr_offset * newf->fr_var;
20f5cfbd
AM
2957 /* Adjust the new frag address for the amount
2958 we'll add when we process the new frag. */
2959 newf->fr_address -= stretch + growth;
d1c5f158
AM
2960 newf->relax_marker ^= 1;
2961 fragP->fr_next = newf;
2962#ifdef DEBUG
2963 as_warn (_("padding added"));
2964#endif
2965 }
252b5132
RH
2966 }
2967 break;
2968
2969 case rs_org:
2970 {
c39c821c 2971 offsetT target = offset;
e46d99eb 2972 addressT after;
252b5132
RH
2973
2974 if (symbolP)
2975 {
b4b24b79
AM
2976 /* Convert from an actual address to an octet offset
2977 into the section. Here it is assumed that the
2978 section's VMA is zero, and can omit subtracting it
2979 from the symbol's value to get the address offset. */
2980 know (S_GET_SEGMENT (symbolP)->vma == 0);
6e917903 2981 target += S_GET_VALUE (symbolP) * OCTETS_PER_BYTE;
ac62c346 2982 }
252b5132
RH
2983
2984 know (fragP->fr_next);
6afe8e98 2985 after = fragP->fr_next->fr_address + stretch;
252b5132 2986 growth = target - after;
9875b365
MR
2987
2988 /* Growth may be negative, but variable part of frag
2989 cannot have fewer than 0 chars. That is, we can't
2990 .org backwards. */
c39c821c 2991 if ((offsetT) (address + fragP->fr_fix) > target)
252b5132 2992 {
32638454
AM
2993 growth = 0;
2994
2995 /* Don't error on first few frag relax passes.
2996 The symbol might be an expression involving
2997 symbol values from other sections. If those
2998 sections have not yet been processed their
2999 frags will all have zero addresses, so we
3000 will calculate incorrect values for them. The
3001 number of passes we allow before giving an
3002 error is somewhat arbitrary. It should be at
3003 least one, with larger values requiring
3004 increasingly contrived dependencies between
3005 frags to trigger a false error. */
3006 if (pass < 2)
3007 {
3008 /* Force another pass. */
3009 ret = 1;
3010 break;
3011 }
3012
14ad458a 3013 as_bad_where (fragP->fr_file, fragP->fr_line,
685736be 3014 _("attempt to move .org backwards"));
14ad458a
ILT
3015
3016 /* We've issued an error message. Change the
b4b24b79 3017 frag to avoid cascading errors. */
14ad458a
ILT
3018 fragP->fr_type = rs_align;
3019 fragP->fr_subtype = 0;
3020 fragP->fr_offset = 0;
6afe8e98 3021 fragP->fr_fix = after - address;
252b5132 3022 }
252b5132 3023 }
6afe8e98 3024 break;
252b5132
RH
3025
3026 case rs_space:
62a02d25 3027 case rs_space_nop:
54d3cad9 3028 growth = 0;
252b5132
RH
3029 if (symbolP)
3030 {
766c03c9
AM
3031 offsetT amount;
3032
3033 amount = S_GET_VALUE (symbolP);
9e40345d 3034 if (S_GET_SEGMENT (symbolP) != absolute_section
252b5132
RH
3035 || S_IS_COMMON (symbolP)
3036 || ! S_IS_DEFINED (symbolP))
252b5132 3037 {
54d3cad9 3038 as_bad_where (fragP->fr_file, fragP->fr_line,
b1766e7c 3039 _(".space, .nops or .fill specifies non-absolute value"));
54d3cad9
AM
3040 /* Prevent repeat of this error message. */
3041 fragP->fr_symbol = 0;
3042 }
3043 else if (amount < 0)
3044 {
32638454
AM
3045 /* Don't error on first few frag relax passes.
3046 See rs_org comment for a longer explanation. */
3047 if (pass < 2)
3048 {
3049 ret = 1;
3050 break;
3051 }
3052
54d3cad9 3053 as_warn_where (fragP->fr_file, fragP->fr_line,
8f065d3b 3054 _(".space, .nops or .fill with negative value, ignored"));
766c03c9 3055 fragP->fr_symbol = 0;
252b5132 3056 }
54d3cad9 3057 else
050be34e 3058 growth = (was_address + fragP->fr_fix + amount
54d3cad9 3059 - fragP->fr_next->fr_address);
252b5132 3060 }
252b5132
RH
3061 break;
3062
3063 case rs_machine_dependent:
3064#ifdef md_relax_frag
c842b53a 3065 growth = md_relax_frag (segment, fragP, stretch);
252b5132
RH
3066#else
3067#ifdef TC_GENERIC_RELAX_TABLE
3068 /* The default way to relax a frag is to look through
3069 TC_GENERIC_RELAX_TABLE. */
b65d68b8
L
3070 growth = md_generic_table_relax_frag (segment, fragP,
3071 stretch);
efaf0ba4 3072#endif /* TC_GENERIC_RELAX_TABLE */
252b5132
RH
3073#endif
3074 break;
3075
3076 case rs_leb128:
3077 {
3078 valueT value;
685736be 3079 offsetT size;
252b5132 3080
6386f3a7 3081 value = resolve_symbol_value (fragP->fr_symbol);
252b5132
RH
3082 size = sizeof_leb128 (value, fragP->fr_subtype);
3083 growth = size - fragP->fr_offset;
3084 fragP->fr_offset = size;
3085 }
3086 break;
3087
3088 case rs_cfa:
3089 growth = eh_frame_relax_frag (fragP);
3090 break;
3091
220e750f
RH
3092 case rs_dwarf2dbg:
3093 growth = dwarf2dbg_relax_frag (fragP);
3094 break;
3095
252b5132
RH
3096 default:
3097 BAD_CASE (fragP->fr_type);
3098 break;
3099 }
3100 if (growth)
3101 {
3102 stretch += growth;
e46d99eb 3103 stretched = 1;
d1c5f158
AM
3104 if (fragP->fr_type == rs_leb128)
3105 rs_leb128_fudge += 16;
3106 else if (fragP->fr_type == rs_align
3107 && (rs_leb128_fudge & 16) != 0
3108 && stretch == 0)
3109 rs_leb128_fudge += 16;
3110 else
3111 rs_leb128_fudge = 0;
252b5132 3112 }
4111faa5 3113 }
d1c5f158
AM
3114
3115 if (stretch == 0
3116 && (rs_leb128_fudge & 16) == 0
3117 && (rs_leb128_fudge & -16) != 0)
3118 rs_leb128_fudge += 1;
3119 else
3120 rs_leb128_fudge = 0;
252b5132 3121 }
4111faa5
NC
3122 /* Until nothing further to relax. */
3123 while (stretched && -- max_iterations);
3124
3125 if (stretched)
3126 as_fatal (_("Infinite loop encountered whilst attempting to compute the addresses of symbols in section %s"),
3127 segment_name (segment));
3128 }
252b5132 3129
e46d99eb
AM
3130 for (fragP = segment_frag_root; fragP; fragP = fragP->fr_next)
3131 if (fragP->last_fr_address != fragP->fr_address)
3132 {
3133 fragP->last_fr_address = fragP->fr_address;
3134 ret = 1;
3135 }
3136 return ret;
efaf0ba4 3137}
252b5132 3138
252b5132 3139void
d7342424 3140number_to_chars_bigendian (char *buf, valueT val, int n)
252b5132 3141{
937149dd 3142 if (n <= 0)
252b5132
RH
3143 abort ();
3144 while (n--)
3145 {
3146 buf[n] = val & 0xff;
3147 val >>= 8;
3148 }
3149}
3150
3151void
d7342424 3152number_to_chars_littleendian (char *buf, valueT val, int n)
252b5132 3153{
937149dd 3154 if (n <= 0)
252b5132
RH
3155 abort ();
3156 while (n--)
3157 {
3158 *buf++ = val & 0xff;
3159 val >>= 8;
3160 }
3161}
3162
3163void
d7342424 3164write_print_statistics (FILE *file)
252b5132 3165{
6d4d30bb 3166 fprintf (file, "fixups: %d\n", n_fixups);
252b5132
RH
3167}
3168
efaf0ba4 3169/* For debugging. */
252b5132
RH
3170extern int indent_level;
3171
3172void
d7342424 3173print_fixup (fixS *fixp)
252b5132
RH
3174{
3175 indent_level = 1;
d2df793a
NC
3176 fprintf (stderr, "fix ");
3177 fprintf_vma (stderr, (bfd_vma)((bfd_hostptr_t) fixp));
3178 fprintf (stderr, " %s:%d",fixp->fx_file, fixp->fx_line);
252b5132
RH
3179 if (fixp->fx_pcrel)
3180 fprintf (stderr, " pcrel");
3181 if (fixp->fx_pcrel_adjust)
3182 fprintf (stderr, " pcrel_adjust=%d", fixp->fx_pcrel_adjust);
252b5132
RH
3183 if (fixp->fx_tcbit)
3184 fprintf (stderr, " tcbit");
3185 if (fixp->fx_done)
3186 fprintf (stderr, " done");
d2df793a
NC
3187 fprintf (stderr, "\n size=%d frag=", fixp->fx_size);
3188 fprintf_vma (stderr, (bfd_vma) ((bfd_hostptr_t) fixp->fx_frag));
3189 fprintf (stderr, " where=%ld offset=%lx addnumber=%lx",
3190 (long) fixp->fx_where,
0af1713e
AM
3191 (unsigned long) fixp->fx_offset,
3192 (unsigned long) fixp->fx_addnumber);
252b5132
RH
3193 fprintf (stderr, "\n %s (%d)", bfd_get_reloc_code_name (fixp->fx_r_type),
3194 fixp->fx_r_type);
252b5132
RH
3195 if (fixp->fx_addsy)
3196 {
3197 fprintf (stderr, "\n +<");
3198 print_symbol_value_1 (stderr, fixp->fx_addsy);
3199 fprintf (stderr, ">");
3200 }
3201 if (fixp->fx_subsy)
3202 {
3203 fprintf (stderr, "\n -<");
3204 print_symbol_value_1 (stderr, fixp->fx_subsy);
3205 fprintf (stderr, ">");
3206 }
3207 fprintf (stderr, "\n");
3208#ifdef TC_FIX_DATA_PRINT
3209 TC_FIX_DATA_PRINT (stderr, fixp);
3210#endif
3211}