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