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