need GM ChangeLog
[deliverable/binutils-gdb.git] / gas / write.c
1 /* write.c - emit .o file
2 Copyright (C) 1986, 1987, 1990, 1991, 1992, 1993 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 2, 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
18 the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */
19
20 /* This thing should be set up to do byteordering correctly. But... */
21
22 #include "as.h"
23 #include "subsegs.h"
24 #include "obstack.h"
25 #include "output-file.h"
26
27 /* The NOP_OPCODE is for the alignment fill value. Fill it with a nop
28 instruction so that the disassembler does not choke on it. */
29 #ifndef NOP_OPCODE
30 #define NOP_OPCODE 0x00
31 #endif
32
33 #ifndef TC_ADJUST_RELOC_COUNT
34 #define TC_ADJUST_RELOC_COUNT(FIXP,COUNT)
35 #endif
36
37 #ifndef TC_FORCE_RELOCATION
38 #define TC_FORCE_RELOCATION(FIXP) 0
39 #endif
40
41 #ifndef WORKING_DOT_WORD
42 extern CONST int md_short_jump_size;
43 extern CONST int md_long_jump_size;
44 #endif
45
46 #ifndef BFD_ASSEMBLER
47
48 #ifndef MANY_SEGMENTS
49 struct frag *text_frag_root;
50 struct frag *data_frag_root;
51 struct frag *bss_frag_root;
52
53 struct frag *text_last_frag; /* Last frag in segment. */
54 struct frag *data_last_frag; /* Last frag in segment. */
55 static struct frag *bss_last_frag; /* Last frag in segment. */
56 #endif
57
58 #if ! defined (BFD_ASSEMBLER) && ! defined (BFD)
59 static object_headers headers;
60 static char *the_object_file;
61 #endif
62
63 long string_byte_count;
64 char *next_object_file_charP; /* Tracks object file bytes. */
65
66 #ifndef OBJ_VMS
67 int magic_number_for_object_file = DEFAULT_MAGIC_NUMBER_FOR_OBJECT_FILE;
68 #endif
69
70 #endif /* BFD_ASSEMBLER */
71
72 #ifdef BFD_ASSEMBLER
73 static fixS *fix_new_internal PARAMS ((fragS *, int where, int size,
74 symbolS *add, symbolS *sub,
75 offsetT offset, int pcrel,
76 bfd_reloc_code_real_type r_type));
77 #else
78 static fixS *fix_new_internal PARAMS ((fragS *, int where, int size,
79 symbolS *add, symbolS *sub,
80 offsetT offset, int pcrel,
81 int r_type));
82 #endif
83 #if defined (BFD_ASSEMBLER) || !defined (BFD)
84 static long fixup_segment PARAMS ((fixS * fixP, segT this_segment_type));
85 #endif
86 static relax_addressT relax_align PARAMS ((relax_addressT addr, int align));
87
88 /*
89 * fix_new()
90 *
91 * Create a fixS in obstack 'notes'.
92 */
93 static fixS *
94 fix_new_internal (frag, where, size, add_symbol, sub_symbol, offset, pcrel,
95 r_type)
96 fragS *frag; /* Which frag? */
97 int where; /* Where in that frag? */
98 int size; /* 1, 2, or 4 usually. */
99 symbolS *add_symbol; /* X_add_symbol. */
100 symbolS *sub_symbol; /* X_op_symbol. */
101 offsetT offset; /* X_add_number. */
102 int pcrel; /* TRUE if PC-relative relocation. */
103 #ifdef BFD_ASSEMBLER
104 bfd_reloc_code_real_type r_type; /* Relocation type */
105 #else
106 int r_type; /* Relocation type */
107 #endif
108 {
109 fixS *fixP;
110
111 fixP = (fixS *) obstack_alloc (&notes, sizeof (fixS));
112
113 fixP->fx_frag = frag;
114 fixP->fx_where = where;
115 fixP->fx_size = size;
116 fixP->fx_addsy = add_symbol;
117 fixP->fx_subsy = sub_symbol;
118 fixP->fx_offset = offset;
119 fixP->fx_pcrel = pcrel;
120 #if defined(NEED_FX_R_TYPE) || defined (BFD_ASSEMBLER)
121 fixP->fx_r_type = r_type;
122 #endif
123 fixP->fx_im_disp = 0;
124 fixP->fx_pcrel_adjust = 0;
125 fixP->fx_bit_fixP = 0;
126 fixP->fx_addnumber = 0;
127 fixP->tc_fix_data = NULL;
128 fixP->fx_tcbit = 0;
129
130 #ifdef TC_something
131 fixP->fx_bsr = 0;
132 #endif
133
134 as_where (&fixP->fx_file, &fixP->fx_line);
135
136 /* Usually, we want relocs sorted numerically, but while
137 comparing to older versions of gas that have relocs
138 reverse sorted, it is convenient to have this compile
139 time option. xoxorich. */
140
141 {
142
143 #ifdef BFD_ASSEMBLER
144 fixS **seg_fix_rootP = & (seg_info (now_seg)->fix_root);
145 fixS **seg_fix_tailP = & (seg_info (now_seg)->fix_tail);
146 #endif
147
148 #ifdef REVERSE_SORT_RELOCS
149
150 fixP->fx_next = *seg_fix_rootP;
151 *seg_fix_rootP = fixP;
152
153 #else /* REVERSE_SORT_RELOCS */
154
155 fixP->fx_next = NULL;
156
157 if (*seg_fix_tailP)
158 (*seg_fix_tailP)->fx_next = fixP;
159 else
160 *seg_fix_rootP = fixP;
161 *seg_fix_tailP = fixP;
162
163 #endif /* REVERSE_SORT_RELOCS */
164
165 }
166
167 return fixP;
168 }
169
170 /* Create a fixup relative to a symbol (plus a constant). */
171
172 fixS *
173 fix_new (frag, where, size, add_symbol, offset, pcrel, r_type)
174 fragS *frag; /* Which frag? */
175 int where; /* Where in that frag? */
176 short int size; /* 1, 2, or 4 usually. */
177 symbolS *add_symbol; /* X_add_symbol. */
178 offsetT offset; /* X_add_number. */
179 int pcrel; /* TRUE if PC-relative relocation. */
180 #ifdef BFD_ASSEMBLER
181 bfd_reloc_code_real_type r_type; /* Relocation type */
182 #else
183 int r_type; /* Relocation type */
184 #endif
185 {
186 return fix_new_internal (frag, where, size, add_symbol,
187 (symbolS *) NULL, offset, pcrel, r_type);
188 }
189
190 /* Create a fixup for an expression. Currently we only support fixups
191 for difference expressions. That is itself more than most object
192 file formats support anyhow. */
193
194 fixS *
195 fix_new_exp (frag, where, size, exp, pcrel, r_type)
196 fragS *frag; /* Which frag? */
197 int where; /* Where in that frag? */
198 short int size; /* 1, 2, or 4 usually. */
199 expressionS *exp; /* Expression. */
200 int pcrel; /* TRUE if PC-relative relocation. */
201 #ifdef BFD_ASSEMBLER
202 bfd_reloc_code_real_type r_type; /* Relocation type */
203 #else
204 int r_type; /* Relocation type */
205 #endif
206 {
207 symbolS *add = NULL;
208 symbolS *sub = NULL;
209 offsetT off = 0;
210
211 switch (exp->X_op)
212 {
213 case O_absent:
214 break;
215
216 case O_uminus:
217 sub = exp->X_add_symbol;
218 off = exp->X_add_number;
219 break;
220
221 case O_subtract:
222 sub = exp->X_op_symbol;
223 /* Fall through. */
224 case O_symbol:
225 add = exp->X_add_symbol;
226 /* Fall through. */
227 case O_constant:
228 off = exp->X_add_number;
229 break;
230
231 default:
232 as_bad ("expression too complex for fixup");
233 }
234
235 return fix_new_internal (frag, where, size, add, sub, off,
236 pcrel, r_type);
237 }
238
239 /* Append a string onto another string, bumping the pointer along. */
240 void
241 append (charPP, fromP, length)
242 char **charPP;
243 char *fromP;
244 unsigned long length;
245 {
246 /* Don't trust memcpy() of 0 chars. */
247 if (length == 0)
248 return;
249
250 memcpy (*charPP, fromP, length);
251 *charPP += length;
252 }
253
254 #ifndef BFD_ASSEMBLER
255 int section_alignment[SEG_MAXIMUM_ORDINAL];
256 #endif
257
258 /*
259 * This routine records the largest alignment seen for each segment.
260 * If the beginning of the segment is aligned on the worst-case
261 * boundary, all of the other alignments within it will work. At
262 * least one object format really uses this info.
263 */
264 void
265 record_alignment (seg, align)
266 /* Segment to which alignment pertains */
267 segT seg;
268 /* Alignment, as a power of 2 (e.g., 1 => 2-byte boundary, 2 => 4-byte
269 boundary, etc.) */
270 int align;
271 {
272 #ifdef BFD_ASSEMBLER
273 if (align > bfd_get_section_alignment (stdoutput, seg))
274 bfd_set_section_alignment (stdoutput, seg, align);
275 #else
276 if (align > section_alignment[(int) seg])
277 section_alignment[(int) seg] = align;
278 #endif
279 }
280
281 #if defined (BFD_ASSEMBLER) || ! defined (BFD)
282
283 static fragS *
284 chain_frchains_together_1 (section, frchp)
285 segT section;
286 struct frchain *frchp;
287 {
288 fragS dummy, *prev_frag = &dummy;
289 for (; frchp && frchp->frch_seg == section; frchp = frchp->frch_next)
290 {
291 prev_frag->fr_next = frchp->frch_root;
292 prev_frag = frchp->frch_last;
293 }
294 prev_frag->fr_next = 0;
295 return prev_frag;
296 }
297
298 #endif
299
300 #ifdef BFD_ASSEMBLER
301
302 static void
303 chain_frchains_together (abfd, section, xxx)
304 bfd *abfd; /* unused */
305 segT section;
306 PTR xxx; /* unused */
307 {
308 segment_info_type *info;
309
310 /* BFD may have introduced its own sections without using
311 subseg_new, so it is possible that seg_info is NULL. */
312 info = seg_info (section);
313 if (info != (segment_info_type *) NULL)
314 info->frchainP->frch_last
315 = chain_frchains_together_1 (section, info->frchainP);
316 }
317
318 #endif
319
320 #if !defined (BFD) && !defined (BFD_ASSEMBLER)
321
322 void
323 remove_subsegs (head, seg, root, last)
324 frchainS *head;
325 int seg;
326 fragS **root;
327 fragS **last;
328 {
329 *root = head->frch_root;
330 *last = chain_frchains_together_1 (seg, head);
331 }
332
333 #endif /* BFD */
334
335 #if defined (BFD_ASSEMBLER) || !defined (BFD)
336
337 #ifdef BFD_ASSEMBLER
338 static void
339 cvt_frag_to_fill (sec, fragP)
340 segT sec;
341 fragS *fragP;
342 #else
343 static void
344 cvt_frag_to_fill (headers, fragP)
345 object_headers *headers;
346 fragS *fragP;
347 #endif
348 {
349 switch (fragP->fr_type)
350 {
351 case rs_align:
352 case rs_org:
353 #ifdef HANDLE_ALIGN
354 HANDLE_ALIGN (fragP);
355 #endif
356 fragP->fr_type = rs_fill;
357 know (fragP->fr_var == 1);
358 know (fragP->fr_next != NULL);
359
360 fragP->fr_offset = (fragP->fr_next->fr_address
361 - fragP->fr_address
362 - fragP->fr_fix);
363 break;
364
365 case rs_fill:
366 break;
367
368 case rs_machine_dependent:
369 #ifdef BFD_ASSEMBLER
370 md_convert_frag (stdoutput, sec, fragP);
371 #else
372 md_convert_frag (headers, fragP);
373 #endif
374
375 assert (fragP->fr_next == NULL || (fragP->fr_next->fr_address - fragP->fr_address == fragP->fr_fix));
376
377 /*
378 * After md_convert_frag, we make the frag into a ".space 0".
379 * Md_convert_frag() should set up any fixSs and constants
380 * required.
381 */
382 frag_wane (fragP);
383 break;
384
385 #ifndef WORKING_DOT_WORD
386 case rs_broken_word:
387 {
388 struct broken_word *lie;
389
390 if (fragP->fr_subtype)
391 {
392 fragP->fr_fix += md_short_jump_size;
393 for (lie = (struct broken_word *) (fragP->fr_symbol);
394 lie && lie->dispfrag == fragP;
395 lie = lie->next_broken_word)
396 if (lie->added == 1)
397 fragP->fr_fix += md_long_jump_size;
398 }
399 frag_wane (fragP);
400 }
401 break;
402 #endif
403
404 default:
405 BAD_CASE (fragP->fr_type);
406 break;
407 }
408 }
409
410 #endif /* defined (BFD_ASSEMBLER) || !defined (BFD) */
411
412 #ifdef BFD_ASSEMBLER
413 static void
414 relax_and_size_seg (abfd, sec, xxx)
415 bfd *abfd;
416 asection *sec;
417 PTR xxx;
418 {
419 flagword flags;
420 fragS *fragp;
421 segment_info_type *seginfo;
422 int x;
423 valueT size, newsize;
424
425 flags = bfd_get_section_flags (abfd, sec);
426
427 seginfo = (segment_info_type *) bfd_get_section_userdata (abfd, sec);
428 if (seginfo && seginfo->frchainP)
429 {
430 relax_segment (seginfo->frchainP->frch_root, sec);
431 for (fragp = seginfo->frchainP->frch_root; fragp; fragp = fragp->fr_next)
432 cvt_frag_to_fill (sec, fragp);
433 for (fragp = seginfo->frchainP->frch_root;
434 fragp->fr_next;
435 fragp = fragp->fr_next)
436 /* walk to last elt */;
437 size = fragp->fr_address + fragp->fr_fix;
438 }
439 else
440 size = 0;
441
442 if (size > 0 && ! seginfo->bss)
443 flags |= SEC_HAS_CONTENTS;
444
445 /* @@ This is just an approximation. */
446 if (seginfo && seginfo->fix_root)
447 flags |= SEC_RELOC;
448 else
449 flags &= ~SEC_RELOC;
450 x = bfd_set_section_flags (abfd, sec, flags);
451 assert (x == true);
452
453 newsize = md_section_align (sec, size);
454 x = bfd_set_section_size (abfd, sec, newsize);
455 assert (x == true);
456
457 /* If the size had to be rounded up, add some padding in the last
458 non-empty frag. */
459 assert (newsize >= size);
460 if (size != newsize)
461 {
462 fragS *last = seginfo->frchainP->frch_last;
463 fragp = seginfo->frchainP->frch_root;
464 while (fragp->fr_next != last)
465 fragp = fragp->fr_next;
466 last->fr_address = size;
467 fragp->fr_offset += newsize - size;
468 }
469
470 #ifdef tc_frob_section
471 tc_frob_section (sec);
472 #endif
473 #ifdef obj_frob_section
474 obj_frob_section (sec);
475 #endif
476 }
477
478 #ifdef DEBUG2
479 static void
480 dump_section_relocs (abfd, sec, stream_)
481 bfd *abfd;
482 asection *sec;
483 char *stream_;
484 {
485 FILE *stream = (FILE *) stream_;
486 segment_info_type *seginfo = seg_info (sec);
487 fixS *fixp = seginfo->fix_root;
488
489 if (!fixp)
490 return;
491
492 fprintf (stream, "sec %s relocs:\n", sec->name);
493 while (fixp)
494 {
495 symbolS *s = fixp->fx_addsy;
496 if (s)
497 fprintf (stream, " %08x: %s(%s+%x)+%x\n", fixp,
498 S_GET_NAME (s), s->bsym->section->name,
499 S_GET_VALUE (s), fixp->fx_offset);
500 else
501 fprintf (stream, " %08x: type %d no sym\n", fixp, fixp->fx_r_type);
502 fixp = fixp->fx_next;
503 }
504 }
505 #else
506 #define dump_section_relocs(ABFD,SEC,STREAM) (void)(ABFD,SEC,STREAM)
507 #endif
508
509 static void
510 adjust_reloc_syms (abfd, sec, xxx)
511 bfd *abfd;
512 asection *sec;
513 PTR xxx;
514 {
515 segment_info_type *seginfo = seg_info (sec);
516 fixS *fixp;
517
518 if (seginfo == NULL)
519 return;
520
521 dump_section_relocs (abfd, sec, stderr);
522
523 for (fixp = seginfo->fix_root; fixp; fixp = fixp->fx_next)
524 if (fixp->fx_addsy)
525 {
526 symbolS *sym = fixp->fx_addsy;
527 asection *symsec = sym->bsym->section;
528 segment_info_type *symseginfo = seg_info (symsec);
529
530 /* If it's one of these sections, assume the symbol is
531 definitely going to be output. The code in
532 md_estimate_size_before_relax in tc-mips.c uses this test
533 as well, so if you change this code you should look at that
534 code. */
535 if (symsec == &bfd_und_section
536 || symsec == &bfd_abs_section
537 || bfd_is_com_section (symsec))
538 {
539 fixp->fx_addsy->sy_used_in_reloc = 1;
540 continue;
541 }
542
543 /* Since we're reducing to section symbols, don't attempt to reduce
544 anything that's already using one. */
545 if (sym->bsym == symsec->symbol)
546 {
547 fixp->fx_addsy->sy_used_in_reloc = 1;
548 continue;
549 }
550
551 /* Is there some other reason we can't adjust this one? (E.g.,
552 call/bal links in i960-bout symbols.) */
553 #ifdef obj_fix_adjustable
554 if (! obj_fix_adjustable (fixp))
555 {
556 fixp->fx_addsy->sy_used_in_reloc = 1;
557 continue;
558 }
559 #endif
560
561 /* Is there some other (target cpu dependent) reason we can't adjust
562 this one? (E.g. relocations involving function addresses on
563 the PA. */
564 #ifdef tc_fix_adjustable
565 if (! tc_fix_adjustable (fixp))
566 {
567 fixp->fx_addsy->sy_used_in_reloc = 1;
568 continue;
569 }
570 #endif
571
572 /* If the section symbol isn't going to be output, the relocs
573 at least should still work. If not, figure out what to do
574 when we run into that case. */
575 fixp->fx_offset += S_GET_VALUE (sym);
576 if (sym->sy_frag)
577 fixp->fx_offset += sym->sy_frag->fr_address;
578 fixp->fx_addsy = section_symbol (symsec);
579 fixp->fx_addsy->sy_used_in_reloc = 1;
580 }
581 #ifdef RELOC_REQUIRES_SYMBOL
582 else
583 {
584 /* There was no symbol required by this relocation. However,
585 BFD doesn't really handle relocations without symbols well.
586 (At least, the COFF support doesn't.) So for now we fake up
587 a local symbol in the absolute section. */
588 static symbolS *abs_sym;
589 if (!abs_sym)
590 {
591 abs_sym = symbol_new ("*absolute0zero*", &bfd_abs_section, 0,
592 &zero_address_frag);
593 abs_sym->sy_used_in_reloc = 1;
594 }
595 fixp->fx_addsy = abs_sym;
596 }
597 #endif
598
599 dump_section_relocs (abfd, sec, stderr);
600 }
601
602 static void
603 write_relocs (abfd, sec, xxx)
604 bfd *abfd;
605 asection *sec;
606 PTR xxx;
607 {
608 segment_info_type *seginfo = seg_info (sec);
609 int i;
610 unsigned int n;
611 arelent **relocs;
612 fixS *fixp;
613
614 /* If seginfo is NULL, we did not create this section; don't do
615 anything with it. */
616 if (seginfo == NULL)
617 return;
618
619 fixup_segment (seginfo->fix_root, sec);
620
621 n = 0;
622 for (fixp = seginfo->fix_root; fixp; fixp = fixp->fx_next)
623 n++;
624
625 #ifndef RELOC_EXPANSION_POSSIBLE
626 /* Set up reloc information as well. */
627 relocs = (arelent **) bfd_alloc_by_size_t (stdoutput,
628 n * sizeof (arelent *));
629 memset ((char*)relocs, 0, n * sizeof (arelent*));
630
631 i = 0;
632 for (fixp = seginfo->fix_root; fixp != (fixS *) NULL; fixp = fixp->fx_next)
633 {
634 arelent *reloc;
635 char *data;
636 bfd_reloc_status_type s;
637
638 if (fixp->fx_addsy == 0)
639 {
640 /* @@ Need some other flag to indicate which have already
641 been performed... */
642 n--;
643 continue;
644 }
645 reloc = tc_gen_reloc (sec, fixp);
646 if (!reloc)
647 {
648 n--;
649 continue;
650 }
651 data = fixp->fx_frag->fr_literal + fixp->fx_where;
652 if (fixp->fx_where + fixp->fx_size
653 > fixp->fx_frag->fr_fix + fixp->fx_frag->fr_offset)
654 abort ();
655
656 if (reloc->howto->partial_inplace == false
657 && reloc->howto->pcrel_offset == true
658 && reloc->howto->pc_relative == true)
659 {
660 /* bfd_perform_relocation screws this up */
661 reloc->addend += reloc->address;
662 }
663 /* Pass bogus address so that when bfd_perform_relocation adds
664 `reloc->address' back in, it'll come up with `data', which is where
665 we want it to operate. We can't just do it by fudging reloc->address,
666 since that might be used in the calculations(?). */
667 s = bfd_perform_relocation (stdoutput, reloc, data - reloc->address,
668 sec, stdoutput);
669 switch (s)
670 {
671 case bfd_reloc_ok:
672 break;
673 default:
674 as_fatal ("bad return from bfd_perform_relocation");
675 }
676 relocs[i++] = reloc;
677 }
678 #else
679 n = n * MAX_RELOC_EXPANSION;
680 /* Set up reloc information as well. */
681 relocs = (arelent **) bfd_alloc_by_size_t (stdoutput,
682 n * sizeof (arelent *));
683
684 i = 0;
685 for (fixp = seginfo->fix_root; fixp != (fixS *) NULL; fixp = fixp->fx_next)
686 {
687 arelent **reloc;
688 char *data;
689 bfd_reloc_status_type s;
690 int j;
691
692 if (fixp->fx_addsy == 0)
693 {
694 /* @@ Need some other flag to indicate which have already
695 been performed... */
696 n--;
697 continue;
698 }
699 reloc = tc_gen_reloc (sec, fixp);
700
701 for (j = 0; reloc[j]; j++)
702 {
703 relocs[i++] = reloc[j];
704 assert(i <= n);
705 }
706 data = fixp->fx_frag->fr_literal + fixp->fx_where;
707 if (fixp->fx_where + fixp->fx_size
708 > fixp->fx_frag->fr_fix + fixp->fx_frag->fr_offset)
709 abort ();
710 for (j = 0; reloc[j]; j++)
711 {
712 s = bfd_perform_relocation (stdoutput, reloc[j],
713 data - reloc[0]->address,
714 sec, stdoutput);
715 switch (s)
716 {
717 case bfd_reloc_ok:
718 break;
719 default:
720 as_fatal ("bad return from bfd_perform_relocation");
721 }
722 }
723 }
724 n = i;
725 #endif
726
727 if (n)
728 bfd_set_reloc (stdoutput, sec, relocs, n);
729 else
730 bfd_set_section_flags (abfd, sec,
731 (bfd_get_section_flags (abfd, sec)
732 & (flagword) ~SEC_RELOC));
733 #ifdef DEBUG2
734 {
735 int i;
736 arelent *r;
737 asymbol *s;
738 fprintf (stderr, "relocs for sec %s\n", sec->name);
739 for (i = 0; i < n; i++)
740 {
741 r = relocs[i];
742 s = *r->sym_ptr_ptr;
743 fprintf (stderr, " reloc %2d @%08x off %4x : sym %-10s addend %x\n",
744 i, r, r->address, s->name, r->addend);
745 }
746 }
747 #endif
748 }
749
750 static void
751 write_contents (abfd, sec, xxx)
752 bfd *abfd;
753 asection *sec;
754 PTR xxx;
755 {
756 segment_info_type *seginfo = seg_info (sec);
757 unsigned long offset = 0;
758 fragS *f;
759
760 /* Write out the frags. */
761 if (seginfo == NULL
762 || ! (bfd_get_section_flags (abfd, sec) & SEC_HAS_CONTENTS))
763 return;
764
765 for (f = seginfo->frchainP->frch_root;
766 f;
767 f = f->fr_next)
768 {
769 int x;
770 unsigned long fill_size;
771 char *fill_literal;
772 long count;
773
774 assert (f->fr_type == rs_fill);
775 if (f->fr_fix)
776 {
777 x = bfd_set_section_contents (stdoutput, sec,
778 f->fr_literal, (file_ptr) offset,
779 (bfd_size_type) f->fr_fix);
780 assert (x == true);
781 offset += f->fr_fix;
782 }
783 fill_literal = f->fr_literal + f->fr_fix;
784 fill_size = f->fr_var;
785 count = f->fr_offset;
786 assert (count >= 0);
787 if (fill_size && count)
788 while (count--)
789 {
790 x = bfd_set_section_contents (stdoutput, sec,
791 fill_literal, (file_ptr) offset,
792 (bfd_size_type) fill_size);
793 assert (x == true);
794 offset += fill_size;
795 }
796 }
797 }
798 #endif
799
800 #if defined(BFD_ASSEMBLER) || (!defined (BFD) && !defined(OBJ_AOUT))
801 static void
802 merge_data_into_text ()
803 {
804 #if defined(BFD_ASSEMBLER) || defined(MANY_SEGMENTS)
805 seg_info (text_section)->frchainP->frch_last->fr_next =
806 seg_info (data_section)->frchainP->frch_root;
807 seg_info (text_section)->frchainP->frch_last =
808 seg_info (data_section)->frchainP->frch_last;
809 seg_info (data_section)->frchainP = 0;
810 #else
811 fixS *tmp;
812
813 text_last_frag->fr_next = data_frag_root;
814 text_last_frag = data_last_frag;
815 data_last_frag = NULL;
816 data_frag_root = NULL;
817 if (text_fix_root)
818 {
819 for (tmp = text_fix_root; tmp->fx_next; tmp = tmp->fx_next);;
820 tmp->fx_next = data_fix_root;
821 text_fix_tail = data_fix_tail;
822 }
823 else
824 text_fix_root = data_fix_root;
825 data_fix_root = NULL;
826 #endif
827 }
828 #endif /* BFD_ASSEMBLER || (! BFD && ! OBJ_AOUT) */
829
830 #if !defined (BFD_ASSEMBLER) && !defined (BFD)
831 static void
832 relax_and_size_all_segments ()
833 {
834 fragS *fragP;
835
836 relax_segment (text_frag_root, SEG_TEXT);
837 relax_segment (data_frag_root, SEG_DATA);
838 relax_segment (bss_frag_root, SEG_BSS);
839 /*
840 * Now the addresses of frags are correct within the segment.
841 */
842
843 know (text_last_frag->fr_type == rs_fill && text_last_frag->fr_offset == 0);
844 H_SET_TEXT_SIZE (&headers, text_last_frag->fr_address);
845 text_last_frag->fr_address = H_GET_TEXT_SIZE (&headers);
846
847 /*
848 * Join the 2 segments into 1 huge segment.
849 * To do this, re-compute every rn_address in the SEG_DATA frags.
850 * Then join the data frags after the text frags.
851 *
852 * Determine a_data [length of data segment].
853 */
854 if (data_frag_root)
855 {
856 register relax_addressT slide;
857
858 know ((text_last_frag->fr_type == rs_fill) && (text_last_frag->fr_offset == 0));
859
860 H_SET_DATA_SIZE (&headers, data_last_frag->fr_address);
861 data_last_frag->fr_address = H_GET_DATA_SIZE (&headers);
862 slide = H_GET_TEXT_SIZE (&headers); /* & in file of the data segment. */
863 #ifdef OBJ_BOUT
864 #define RoundUp(N,S) (((N)+(S)-1)&-(S))
865 /* For b.out: If the data section has a strict alignment
866 requirement, its load address in the .o file will be
867 rounded up from the size of the text section. These
868 two values are *not* the same! Similarly for the bss
869 section.... */
870 slide = RoundUp (slide, 1 << section_alignment[SEG_DATA]);
871 #endif
872
873 for (fragP = data_frag_root; fragP; fragP = fragP->fr_next)
874 {
875 fragP->fr_address += slide;
876 } /* for each data frag */
877
878 know (text_last_frag != 0);
879 text_last_frag->fr_next = data_frag_root;
880 }
881 else
882 {
883 H_SET_DATA_SIZE (&headers, 0);
884 }
885
886 #ifdef OBJ_BOUT
887 /* See above comments on b.out data section address. */
888 {
889 long bss_vma;
890 if (data_last_frag == 0)
891 bss_vma = H_GET_TEXT_SIZE (&headers);
892 else
893 bss_vma = data_last_frag->fr_address;
894 bss_vma = RoundUp (bss_vma, 1 << section_alignment[SEG_BSS]);
895 bss_address_frag.fr_address = bss_vma;
896 }
897 #else /* ! OBJ_BOUT */
898 bss_address_frag.fr_address = (H_GET_TEXT_SIZE (&headers) +
899 H_GET_DATA_SIZE (&headers));
900
901 #endif /* ! OBJ_BOUT */
902
903 /* Slide all the frags */
904 if (bss_frag_root)
905 {
906 relax_addressT slide = bss_address_frag.fr_address;
907
908 for (fragP = bss_frag_root; fragP; fragP = fragP->fr_next)
909 {
910 fragP->fr_address += slide;
911 } /* for each bss frag */
912 }
913
914 if (bss_last_frag)
915 H_SET_BSS_SIZE (&headers,
916 bss_last_frag->fr_address - bss_frag_root->fr_address);
917 else
918 H_SET_BSS_SIZE (&headers, 0);
919 }
920 #endif /* ! BFD_ASSEMBLER && ! BFD */
921
922 #if defined (BFD_ASSEMBLER) || !defined (BFD)
923
924 void
925 write_object_file ()
926 {
927 register struct frchain *frchainP; /* Track along all frchains. */
928 #if ! defined (BFD_ASSEMBLER) || ! defined (WORKING_DOT_WORD)
929 register fragS *fragP; /* Track along all frags. */
930 #endif
931 #if !defined (BFD_ASSEMBLER) && !defined (OBJ_VMS)
932 long object_file_size;
933 #endif
934
935 /* Do we really want to write it? */
936 {
937 int n_warns, n_errs;
938 n_warns = had_warnings ();
939 n_errs = had_errors ();
940 /* The -Z flag indicates that an object file should be generated,
941 regardless of warnings and errors. */
942 if (flagseen['Z'])
943 {
944 if (n_warns || n_errs)
945 as_warn ("%d error%s, %d warning%s, generating bad object file.\n",
946 n_errs, n_errs == 1 ? "" : "s",
947 n_warns, n_warns == 1 ? "" : "s");
948 }
949 else
950 {
951 if (n_errs)
952 as_fatal ("%d error%s, %d warning%s, no object file generated.\n",
953 n_errs, n_errs == 1 ? "" : "s",
954 n_warns, n_warns == 1 ? "" : "s");
955 }
956 }
957
958 #ifdef OBJ_VMS
959 /*
960 * Under VMS we try to be compatible with VAX-11 "C". Thus, we
961 * call a routine to check for the definition of the procedure
962 * "_main", and if so -- fix it up so that it can be program
963 * entry point.
964 */
965 VMS_Check_For_Main ();
966 #endif /* VMS */
967
968 /* After every sub-segment, we fake an ".align ...". This conforms to
969 BSD4.2 brane-damage. We then fake ".fill 0" because that is the kind of
970 frag that requires least thought. ".align" frags like to have a
971 following frag since that makes calculating their intended length
972 trivial.
973
974 @@ Is this really necessary?? */
975 #ifndef SUB_SEGMENT_ALIGN
976 #ifdef BFD_ASSEMBLER
977 #define SUB_SEGMENT_ALIGN(SEG) (0)
978 #else
979 #define SUB_SEGMENT_ALIGN(SEG) (2)
980 #endif
981 #endif
982 for (frchainP = frchain_root; frchainP; frchainP = frchainP->frch_next)
983 {
984 subseg_set (frchainP->frch_seg, frchainP->frch_subseg);
985 frag_align (SUB_SEGMENT_ALIGN (now_seg), NOP_OPCODE);
986 /* frag_align will have left a new frag.
987 Use this last frag for an empty ".fill".
988
989 For this segment ...
990 Create a last frag. Do not leave a "being filled in frag". */
991 frag_wane (frag_now);
992 frag_now->fr_fix = 0;
993 know (frag_now->fr_next == NULL);
994 }
995
996 /* From now on, we don't care about sub-segments. Build one frag chain
997 for each segment. Linked thru fr_next. */
998
999 #ifdef BFD_ASSEMBLER
1000 /* Remove the sections created by gas for its own purposes. */
1001 {
1002 asection **seclist, *sec;
1003 seclist = &stdoutput->sections;
1004 while (seclist && *seclist)
1005 {
1006 sec = *seclist;
1007 while (sec == reg_section || sec == expr_section)
1008 {
1009 sec = sec->next;
1010 *seclist = sec;
1011 stdoutput->section_count--;
1012 if (!sec)
1013 break;
1014 }
1015 if (*seclist)
1016 seclist = &(*seclist)->next;
1017 }
1018 }
1019
1020 bfd_map_over_sections (stdoutput, chain_frchains_together, (char *) 0);
1021 #else
1022 remove_subsegs (frchain_root, SEG_TEXT, &text_frag_root, &text_last_frag);
1023 remove_subsegs (data0_frchainP, SEG_DATA, &data_frag_root, &data_last_frag);
1024 remove_subsegs (bss0_frchainP, SEG_BSS, &bss_frag_root, &bss_last_frag);
1025 #endif
1026
1027 /* We have two segments. If user gave -R flag, then we must put the
1028 data frags into the text segment. Do this before relaxing so
1029 we know to take advantage of -R and make shorter addresses. */
1030 #if !defined (OBJ_AOUT) || defined (BFD_ASSEMBLER)
1031 if (flagseen['R'])
1032 {
1033 merge_data_into_text ();
1034 }
1035 #endif
1036
1037 #ifdef BFD_ASSEMBLER
1038 bfd_map_over_sections (stdoutput, relax_and_size_seg, (char *) 0);
1039 #else
1040 relax_and_size_all_segments ();
1041 #endif /* BFD_ASSEMBLER */
1042
1043 #ifndef BFD_ASSEMBLER
1044 /*
1045 *
1046 * Crawl the symbol chain.
1047 *
1048 * For each symbol whose value depends on a frag, take the address of
1049 * that frag and subsume it into the value of the symbol.
1050 * After this, there is just one way to lookup a symbol value.
1051 * Values are left in their final state for object file emission.
1052 * We adjust the values of 'L' local symbols, even if we do
1053 * not intend to emit them to the object file, because their values
1054 * are needed for fix-ups.
1055 *
1056 * Unless we saw a -L flag, remove all symbols that begin with 'L'
1057 * from the symbol chain. (They are still pointed to by the fixes.)
1058 *
1059 * Count the remaining symbols.
1060 * Assign a symbol number to each symbol.
1061 * Count the number of string-table chars we will emit.
1062 * Put this info into the headers as appropriate.
1063 *
1064 */
1065 know (zero_address_frag.fr_address == 0);
1066 string_byte_count = sizeof (string_byte_count);
1067
1068 obj_crawl_symbol_chain (&headers);
1069
1070 if (string_byte_count == sizeof (string_byte_count))
1071 string_byte_count = 0;
1072
1073 H_SET_STRING_SIZE (&headers, string_byte_count);
1074
1075 /*
1076 * Addresses of frags now reflect addresses we use in the object file.
1077 * Symbol values are correct.
1078 * Scan the frags, converting any ".org"s and ".align"s to ".fill"s.
1079 * Also converting any machine-dependent frags using md_convert_frag();
1080 */
1081 subseg_change (SEG_TEXT, 0);
1082
1083 for (fragP = text_frag_root; fragP; fragP = fragP->fr_next)
1084 {
1085 cvt_frag_to_fill (&headers, fragP);
1086
1087 /* Some assert macros don't work with # directives mixed in. */
1088 #ifndef NDEBUG
1089 if (!(fragP->fr_next == NULL
1090 #ifdef OBJ_BOUT
1091 || fragP->fr_next == data_frag_root
1092 #endif
1093 || ((fragP->fr_next->fr_address - fragP->fr_address)
1094 == (fragP->fr_fix + fragP->fr_offset * fragP->fr_var))))
1095 abort ();
1096 #endif
1097 }
1098 #endif /* ! BFD_ASSEMBLER */
1099
1100 #ifndef WORKING_DOT_WORD
1101 {
1102 struct broken_word *lie;
1103 struct broken_word **prevP;
1104
1105 prevP = &broken_words;
1106 for (lie = broken_words; lie; lie = lie->next_broken_word)
1107 if (!lie->added)
1108 {
1109 expressionS exp;
1110
1111 exp.X_op = O_subtract;
1112 exp.X_add_symbol = lie->add;
1113 exp.X_op_symbol = lie->sub;
1114 exp.X_add_number = lie->addnum;
1115 #ifdef BFD_ASSEMBLER
1116 fix_new_exp (lie->frag,
1117 lie->word_goes_here - lie->frag->fr_literal,
1118 2, &exp, 0, BFD_RELOC_NONE);
1119 #else
1120 #if defined(TC_SPARC) || defined(TC_A29K) || defined(NEED_FX_R_TYPE)
1121 fix_new_exp (lie->frag,
1122 lie->word_goes_here - lie->frag->fr_literal,
1123 2, &exp, 0, NO_RELOC);
1124 #else
1125 #ifdef TC_NS32K
1126 fix_new_ns32k_exp (lie->frag,
1127 lie->word_goes_here - lie->frag->fr_literal,
1128 2, &exp, 0, 0, 2, 0, 0);
1129 #else
1130 fix_new_exp (lie->frag,
1131 lie->word_goes_here - lie->frag->fr_literal,
1132 2, &exp, 0, 0);
1133 #endif /* TC_NS32K */
1134 #endif /* TC_SPARC|TC_A29K|NEED_FX_R_TYPE */
1135 #endif /* BFD_ASSEMBLER */
1136 *prevP = lie->next_broken_word;
1137 }
1138 else
1139 prevP = &(lie->next_broken_word);
1140
1141 for (lie = broken_words; lie;)
1142 {
1143 struct broken_word *untruth;
1144 char *table_ptr;
1145 addressT table_addr;
1146 addressT from_addr, to_addr;
1147 int n, m;
1148
1149 fragP = lie->dispfrag;
1150
1151 /* Find out how many broken_words go here. */
1152 n = 0;
1153 for (untruth = lie; untruth && untruth->dispfrag == fragP; untruth = untruth->next_broken_word)
1154 if (untruth->added == 1)
1155 n++;
1156
1157 table_ptr = lie->dispfrag->fr_opcode;
1158 table_addr = lie->dispfrag->fr_address + (table_ptr - lie->dispfrag->fr_literal);
1159 /* Create the jump around the long jumps. This is a short
1160 jump from table_ptr+0 to table_ptr+n*long_jump_size. */
1161 from_addr = table_addr;
1162 to_addr = table_addr + md_short_jump_size + n * md_long_jump_size;
1163 md_create_short_jump (table_ptr, from_addr, to_addr, lie->dispfrag, lie->add);
1164 table_ptr += md_short_jump_size;
1165 table_addr += md_short_jump_size;
1166
1167 for (m = 0; lie && lie->dispfrag == fragP; m++, lie = lie->next_broken_word)
1168 {
1169 if (lie->added == 2)
1170 continue;
1171 /* Patch the jump table */
1172 /* This is the offset from ??? to table_ptr+0 */
1173 to_addr = table_addr - S_GET_VALUE (lie->sub);
1174 md_number_to_chars (lie->word_goes_here, to_addr, 2);
1175 for (untruth = lie->next_broken_word; untruth && untruth->dispfrag == fragP; untruth = untruth->next_broken_word)
1176 {
1177 if (untruth->use_jump == lie)
1178 md_number_to_chars (untruth->word_goes_here, to_addr, 2);
1179 }
1180
1181 /* Install the long jump */
1182 /* this is a long jump from table_ptr+0 to the final target */
1183 from_addr = table_addr;
1184 to_addr = S_GET_VALUE (lie->add) + lie->addnum;
1185 md_create_long_jump (table_ptr, from_addr, to_addr, lie->dispfrag, lie->add);
1186 table_ptr += md_long_jump_size;
1187 table_addr += md_long_jump_size;
1188 }
1189 }
1190 }
1191 #endif /* not WORKING_DOT_WORD */
1192
1193 #ifndef BFD_ASSEMBLER
1194 #ifndef OBJ_VMS
1195 { /* not vms */
1196 /*
1197 * Scan every FixS performing fixups. We had to wait until now to do
1198 * this because md_convert_frag() may have made some fixSs.
1199 */
1200 int trsize, drsize;
1201
1202 subseg_change (SEG_TEXT, 0);
1203 trsize = md_reloc_size * fixup_segment (text_fix_root, SEG_TEXT);
1204 subseg_change (SEG_DATA, 0);
1205 drsize = md_reloc_size * fixup_segment (data_fix_root, SEG_DATA);
1206 H_SET_RELOCATION_SIZE (&headers, trsize, drsize);
1207
1208 /* FIXME move this stuff into the pre-write-hook */
1209 H_SET_MAGIC_NUMBER (&headers, magic_number_for_object_file);
1210 H_SET_ENTRY_POINT (&headers, 0);
1211
1212 obj_pre_write_hook (&headers); /* extra coff stuff */
1213
1214 object_file_size = H_GET_FILE_SIZE (&headers);
1215 next_object_file_charP = the_object_file = xmalloc (object_file_size);
1216
1217 output_file_create (out_file_name);
1218
1219 obj_header_append (&next_object_file_charP, &headers);
1220
1221 know ((next_object_file_charP - the_object_file) == H_GET_HEADER_SIZE (&headers));
1222
1223 /*
1224 * Emit code.
1225 */
1226 for (fragP = text_frag_root; fragP; fragP = fragP->fr_next)
1227 {
1228 register long count;
1229 register char *fill_literal;
1230 register long fill_size;
1231
1232 know (fragP->fr_type == rs_fill);
1233 append (&next_object_file_charP, fragP->fr_literal, (unsigned long) fragP->fr_fix);
1234 fill_literal = fragP->fr_literal + fragP->fr_fix;
1235 fill_size = fragP->fr_var;
1236 know (fragP->fr_offset >= 0);
1237
1238 for (count = fragP->fr_offset; count; count--)
1239 {
1240 append (&next_object_file_charP, fill_literal, (unsigned long) fill_size);
1241 } /* for each */
1242
1243 } /* for each code frag. */
1244
1245 know ((next_object_file_charP - the_object_file) == (H_GET_HEADER_SIZE (&headers) + H_GET_TEXT_SIZE (&headers) + H_GET_DATA_SIZE (&headers)));
1246
1247 /*
1248 * Emit relocations.
1249 */
1250 obj_emit_relocations (&next_object_file_charP, text_fix_root, (relax_addressT) 0);
1251 know ((next_object_file_charP - the_object_file) == (H_GET_HEADER_SIZE (&headers) + H_GET_TEXT_SIZE (&headers) + H_GET_DATA_SIZE (&headers) + H_GET_TEXT_RELOCATION_SIZE (&headers)));
1252 #ifdef TC_I960
1253 /* Make addresses in data relocation directives relative to beginning of
1254 * first data fragment, not end of last text fragment: alignment of the
1255 * start of the data segment may place a gap between the segments.
1256 */
1257 obj_emit_relocations (&next_object_file_charP, data_fix_root, data0_frchainP->frch_root->fr_address);
1258 #else /* TC_I960 */
1259 obj_emit_relocations (&next_object_file_charP, data_fix_root, text_last_frag->fr_address);
1260 #endif /* TC_I960 */
1261
1262 know ((next_object_file_charP - the_object_file) == (H_GET_HEADER_SIZE (&headers) + H_GET_TEXT_SIZE (&headers) + H_GET_DATA_SIZE (&headers) + H_GET_TEXT_RELOCATION_SIZE (&headers) + H_GET_DATA_RELOCATION_SIZE (&headers)));
1263
1264 /*
1265 * Emit line number entries.
1266 */
1267 OBJ_EMIT_LINENO (&next_object_file_charP, lineno_rootP, the_object_file);
1268 know ((next_object_file_charP - the_object_file) == (H_GET_HEADER_SIZE (&headers) + H_GET_TEXT_SIZE (&headers) + H_GET_DATA_SIZE (&headers) + H_GET_TEXT_RELOCATION_SIZE (&headers) + H_GET_DATA_RELOCATION_SIZE (&headers) + H_GET_LINENO_SIZE (&headers)));
1269
1270 /*
1271 * Emit symbols.
1272 */
1273 obj_emit_symbols (&next_object_file_charP, symbol_rootP);
1274 know ((next_object_file_charP - the_object_file) == (H_GET_HEADER_SIZE (&headers) + H_GET_TEXT_SIZE (&headers) + H_GET_DATA_SIZE (&headers) + H_GET_TEXT_RELOCATION_SIZE (&headers) + H_GET_DATA_RELOCATION_SIZE (&headers) + H_GET_LINENO_SIZE (&headers) + H_GET_SYMBOL_TABLE_SIZE (&headers)));
1275
1276 /*
1277 * Emit strings.
1278 */
1279
1280 if (string_byte_count > 0)
1281 {
1282 obj_emit_strings (&next_object_file_charP);
1283 } /* only if we have a string table */
1284
1285 #ifdef BFD_HEADERS
1286 bfd_seek (stdoutput, 0, 0);
1287 bfd_write (the_object_file, 1, object_file_size, stdoutput);
1288 #else
1289
1290 /* Write the data to the file */
1291 output_file_append (the_object_file, object_file_size, out_file_name);
1292 #endif
1293 } /* non vms output */
1294 #else /* VMS */
1295 /*
1296 * Now do the VMS-dependent part of writing the object file
1297 */
1298 VMS_write_object_file (H_GET_TEXT_SIZE (&headers),
1299 H_GET_DATA_SIZE (&headers),
1300 H_GET_BSS_SIZE (&headers),
1301 text_frag_root, data_frag_root);
1302 #endif /* VMS */
1303 #else /* BFD_ASSEMBLER */
1304
1305 bfd_map_over_sections (stdoutput, adjust_reloc_syms, (char *)0);
1306
1307 /* Set up symbol table, and write it out. */
1308 if (symbol_rootP)
1309 {
1310 unsigned int i = 0;
1311 unsigned int n;
1312 symbolS *symp;
1313
1314 for (symp = symbol_rootP; symp; symp = symbol_next (symp))
1315 {
1316 if (! symp->sy_resolved)
1317 {
1318 if (symp->sy_value.X_op == O_constant)
1319 {
1320 /* This is the normal case; skip the call. */
1321 S_SET_VALUE (symp,
1322 (S_GET_VALUE (symp)
1323 + symp->sy_frag->fr_address));
1324 symp->sy_resolved = 1;
1325 }
1326 else
1327 resolve_symbol_value (symp);
1328 }
1329
1330 /* So far, common symbols have been treated like undefined symbols.
1331 Put them in the common section now. */
1332 if (S_IS_DEFINED (symp) == 0
1333 && S_GET_VALUE (symp) != 0)
1334 S_SET_SEGMENT (symp, &bfd_com_section);
1335 #if 0
1336 printf ("symbol `%s'\n\t@%x: value=%d flags=%x seg=%s\n",
1337 S_GET_NAME (symp), symp,
1338 S_GET_VALUE (symp),
1339 symp->bsym->flags,
1340 segment_name (symp->bsym->section));
1341 #endif
1342
1343 #ifdef obj_frob_symbol
1344 {
1345 int punt = 0;
1346 obj_frob_symbol (symp, punt);
1347 if (punt)
1348 goto punt_it;
1349 }
1350 #endif
1351 #ifdef tc_frob_symbol
1352 {
1353 int punt = 0;
1354 tc_frob_symbol (symp, punt);
1355 if (punt)
1356 goto punt_it;
1357 }
1358 #endif
1359
1360 /* If we don't want to keep this symbol, splice it out of the
1361 chain now. */
1362 if (S_IS_LOCAL (symp))
1363 {
1364 punt_it:
1365 if (! symp->sy_used_in_reloc)
1366 {
1367 symbolS *prev, *next;
1368 prev = symbol_previous (symp);
1369 next = symbol_next (symp);
1370 #ifdef DEBUG_SYMS
1371 verify_symbol_chain_2 (symp);
1372 #endif
1373 if (prev)
1374 {
1375 symbol_next (prev) = next;
1376 symp = prev;
1377 }
1378 else if (symp == symbol_rootP)
1379 symbol_rootP = next;
1380 else
1381 abort ();
1382 if (next)
1383 symbol_previous (next) = prev;
1384 else
1385 symbol_lastP = prev;
1386 #ifdef DEBUG_SYMS
1387 if (prev)
1388 verify_symbol_chain_2 (prev);
1389 else if (next)
1390 verify_symbol_chain_2 (next);
1391 #endif
1392 continue;
1393 }
1394 }
1395
1396 /* Make sure we really got a value for the symbol. */
1397 if (! symp->sy_resolved)
1398 {
1399 as_bad ("can't resolve value for symbol \"%s\"",
1400 S_GET_NAME (symp));
1401 symp->sy_resolved = 1;
1402 }
1403
1404 /* Set the value into the BFD symbol. Up til now the value
1405 has only been kept in the gas symbolS struct. */
1406 symp->bsym->value = S_GET_VALUE (symp);
1407
1408 i++;
1409 }
1410 n = i;
1411 if (n)
1412 {
1413 asymbol **asympp;
1414 boolean result;
1415 extern PTR bfd_alloc PARAMS ((bfd *, size_t));
1416
1417 asympp = (asymbol **) bfd_alloc (stdoutput,
1418 n * sizeof (asymbol *));
1419 symp = symbol_rootP;
1420 for (i = 0; i < n; i++, symp = symbol_next (symp))
1421 {
1422 asympp[i] = symp->bsym;
1423 symp->written = 1;
1424 }
1425 result = bfd_set_symtab (stdoutput, asympp, n);
1426 assert (result == true);
1427 }
1428 }
1429
1430
1431 #ifdef obj_frob_file
1432 /* If obj_frob_file changes the symbol value at this point, it is
1433 responsible for moving the changed value into symp->bsym->value
1434 as well. Hopefully all symbol value changing can be done in
1435 {obj,tc}_frob_symbol. */
1436 obj_frob_file ();
1437 #endif
1438
1439 /* Now that all the sizes are known, and contents correct, we can
1440 start writing the file. */
1441 bfd_map_over_sections (stdoutput, write_relocs, (char *) 0);
1442
1443 bfd_map_over_sections (stdoutput, write_contents, (char *) 0);
1444 #endif /* BFD_ASSEMBLER */
1445 }
1446 #endif /* ! BFD */
1447
1448 /*
1449 * relax_segment()
1450 *
1451 * Now we have a segment, not a crowd of sub-segments, we can make fr_address
1452 * values.
1453 *
1454 * Relax the frags.
1455 *
1456 * After this, all frags in this segment have addresses that are correct
1457 * within the segment. Since segments live in different file addresses,
1458 * these frag addresses may not be the same as final object-file addresses.
1459 */
1460
1461 #ifndef md_relax_frag
1462
1463 /* Subroutines of relax_segment. */
1464 static int
1465 is_dnrange (f1, f2)
1466 struct frag *f1;
1467 struct frag *f2;
1468 {
1469 for (; f1; f1 = f1->fr_next)
1470 if (f1->fr_next == f2)
1471 return 1;
1472 return 0;
1473 }
1474
1475 #endif /* ! defined (md_relax_frag) */
1476
1477 /* Relax_align. Advance location counter to next address that has 'alignment'
1478 lowest order bits all 0s, return size of adjustment made. */
1479 static relax_addressT
1480 relax_align (address, alignment)
1481 register relax_addressT address; /* Address now. */
1482 register int alignment; /* Alignment (binary). */
1483 {
1484 relax_addressT mask;
1485 relax_addressT new_address;
1486
1487 mask = ~((~0) << alignment);
1488 new_address = (address + mask) & (~mask);
1489 if (linkrelax)
1490 /* We must provide lots of padding, so the linker can discard it
1491 when needed. The linker will not add extra space, ever. */
1492 new_address += (1 << alignment);
1493 return (new_address - address);
1494 }
1495
1496 void
1497 relax_segment (segment_frag_root, segment)
1498 struct frag *segment_frag_root;
1499 segT segment;
1500 {
1501 register struct frag *fragP;
1502 register relax_addressT address;
1503 #if !defined (MANY_SEGMENTS) && !defined (BFD_ASSEMBLER)
1504 know (segment == SEG_DATA || segment == SEG_TEXT || segment == SEG_BSS);
1505 #endif
1506 /* In case md_estimate_size_before_relax() wants to make fixSs. */
1507 subseg_change (segment, 0);
1508
1509 /* For each frag in segment: count and store (a 1st guess of)
1510 fr_address. */
1511 address = 0;
1512 for (fragP = segment_frag_root; fragP; fragP = fragP->fr_next)
1513 {
1514 fragP->fr_address = address;
1515 address += fragP->fr_fix;
1516
1517 switch (fragP->fr_type)
1518 {
1519 case rs_fill:
1520 address += fragP->fr_offset * fragP->fr_var;
1521 break;
1522
1523 case rs_align:
1524 address += relax_align (address, (int) fragP->fr_offset);
1525 break;
1526
1527 case rs_org:
1528 /* Assume .org is nugatory. It will grow with 1st relax. */
1529 break;
1530
1531 case rs_machine_dependent:
1532 address += md_estimate_size_before_relax (fragP, segment);
1533 break;
1534
1535 #ifndef WORKING_DOT_WORD
1536 /* Broken words don't concern us yet */
1537 case rs_broken_word:
1538 break;
1539 #endif
1540
1541 default:
1542 BAD_CASE (fragP->fr_type);
1543 break;
1544 } /* switch(fr_type) */
1545 } /* for each frag in the segment */
1546
1547 /* Do relax(). */
1548 {
1549 long stretch; /* May be any size, 0 or negative. */
1550 /* Cumulative number of addresses we have */
1551 /* relaxed this pass. */
1552 /* We may have relaxed more than one address. */
1553 long stretched; /* Have we stretched on this pass? */
1554 /* This is 'cuz stretch may be zero, when, in fact some piece of code
1555 grew, and another shrank. If a branch instruction doesn't fit anymore,
1556 we could be scrod. */
1557
1558 do
1559 {
1560 stretch = stretched = 0;
1561 for (fragP = segment_frag_root; fragP; fragP = fragP->fr_next)
1562 {
1563 long growth = 0;
1564 unsigned long was_address;
1565 long offset;
1566 symbolS *symbolP;
1567 long target;
1568 long after;
1569
1570 was_address = fragP->fr_address;
1571 address = fragP->fr_address += stretch;
1572 symbolP = fragP->fr_symbol;
1573 offset = fragP->fr_offset;
1574
1575 switch (fragP->fr_type)
1576 {
1577 case rs_fill: /* .fill never relaxes. */
1578 growth = 0;
1579 break;
1580
1581 #ifndef WORKING_DOT_WORD
1582 /* JF: This is RMS's idea. I do *NOT* want to be blamed
1583 for it I do not want to write it. I do not want to have
1584 anything to do with it. This is not the proper way to
1585 implement this misfeature. */
1586 case rs_broken_word:
1587 {
1588 struct broken_word *lie;
1589 struct broken_word *untruth;
1590
1591 /* Yes this is ugly (storing the broken_word pointer
1592 in the symbol slot). Still, this whole chunk of
1593 code is ugly, and I don't feel like doing anything
1594 about it. Think of it as stubbornness in action. */
1595 growth = 0;
1596 for (lie = (struct broken_word *) (fragP->fr_symbol);
1597 lie && lie->dispfrag == fragP;
1598 lie = lie->next_broken_word)
1599 {
1600
1601 if (lie->added)
1602 continue;
1603
1604 offset = (lie->add->sy_frag->fr_address
1605 + S_GET_VALUE (lie->add)
1606 + lie->addnum
1607 - (lie->sub->sy_frag->fr_address
1608 + S_GET_VALUE (lie->sub)));
1609 if (offset <= -32768 || offset >= 32767)
1610 {
1611 if (flagseen['K'])
1612 {
1613 char buf[50];
1614 sprint_value (buf, (addressT) lie->addnum);
1615 as_warn (".word %s-%s+%s didn't fit",
1616 S_GET_NAME (lie->add),
1617 S_GET_NAME (lie->sub),
1618 buf);
1619 }
1620 lie->added = 1;
1621 if (fragP->fr_subtype == 0)
1622 {
1623 fragP->fr_subtype++;
1624 growth += md_short_jump_size;
1625 }
1626 for (untruth = lie->next_broken_word;
1627 untruth && untruth->dispfrag == lie->dispfrag;
1628 untruth = untruth->next_broken_word)
1629 if ((untruth->add->sy_frag == lie->add->sy_frag)
1630 && S_GET_VALUE (untruth->add) == S_GET_VALUE (lie->add))
1631 {
1632 untruth->added = 2;
1633 untruth->use_jump = lie;
1634 }
1635 growth += md_long_jump_size;
1636 }
1637 }
1638
1639 break;
1640 } /* case rs_broken_word */
1641 #endif
1642 case rs_align:
1643 growth = (relax_align ((relax_addressT) (address
1644 + fragP->fr_fix),
1645 (int) offset)
1646 - relax_align ((relax_addressT) (was_address
1647 + fragP->fr_fix),
1648 (int) offset));
1649 break;
1650
1651 case rs_org:
1652 target = offset;
1653
1654 if (symbolP)
1655 {
1656 #if !defined (MANY_SEGMENTS) && !defined (BFD_ASSEMBLER)
1657 know ((S_GET_SEGMENT (symbolP) == SEG_ABSOLUTE)
1658 || (S_GET_SEGMENT (symbolP) == SEG_DATA)
1659 || (S_GET_SEGMENT (symbolP) == SEG_TEXT)
1660 || S_GET_SEGMENT (symbolP) == SEG_BSS);
1661 know (symbolP->sy_frag);
1662 know (!(S_GET_SEGMENT (symbolP) == SEG_ABSOLUTE)
1663 || (symbolP->sy_frag == &zero_address_frag));
1664 #endif
1665 target += S_GET_VALUE (symbolP)
1666 + symbolP->sy_frag->fr_address;
1667 } /* if we have a symbol */
1668
1669 know (fragP->fr_next);
1670 after = fragP->fr_next->fr_address;
1671 growth = ((target - after) > 0) ? (target - after) : 0;
1672 /* Growth may be negative, but variable part of frag
1673 cannot have fewer than 0 chars. That is, we can't
1674 .org backwards. */
1675
1676 growth -= stretch; /* This is an absolute growth factor */
1677 break;
1678
1679 case rs_machine_dependent:
1680 #ifdef md_relax_frag
1681 growth = md_relax_frag (fragP, stretch);
1682 #else
1683 /* The default way to relax a frag is to look through
1684 md_relax_table. */
1685 {
1686 const relax_typeS *this_type;
1687 const relax_typeS *start_type;
1688 relax_substateT next_state;
1689 relax_substateT this_state;
1690 long aim;
1691
1692 this_state = fragP->fr_subtype;
1693 start_type = this_type = md_relax_table + this_state;
1694 target = offset;
1695
1696 if (symbolP)
1697 {
1698 #ifndef DIFF_EXPR_OK
1699 #if !defined (MANY_SEGMENTS) && !defined (BFD_ASSEMBLER)
1700 know ((S_GET_SEGMENT (symbolP) == SEG_ABSOLUTE)
1701 || (S_GET_SEGMENT (symbolP) == SEG_DATA)
1702 || (S_GET_SEGMENT (symbolP) == SEG_BSS)
1703 || (S_GET_SEGMENT (symbolP) == SEG_TEXT));
1704 #endif
1705 know (symbolP->sy_frag);
1706 #endif
1707 know (!(S_GET_SEGMENT (symbolP) == absolute_section)
1708 || symbolP->sy_frag == &zero_address_frag);
1709 target +=
1710 S_GET_VALUE (symbolP)
1711 + symbolP->sy_frag->fr_address;
1712
1713 /* If frag has yet to be reached on this pass,
1714 assume it will move by STRETCH just as we did.
1715 If this is not so, it will be because some frag
1716 between grows, and that will force another pass.
1717
1718 Beware zero-length frags.
1719
1720 There should be a faster way to do this. */
1721
1722 if (symbolP->sy_frag->fr_address >= was_address
1723 && is_dnrange (fragP, symbolP->sy_frag))
1724 {
1725 target += stretch;
1726 }
1727 }
1728
1729 aim = target - address - fragP->fr_fix;
1730 /* The displacement is affected by the instruction size
1731 for the 32k architecture. I think we ought to be able
1732 to add fragP->fr_pcrel_adjust in all cases (it should be
1733 zero if not used), but just in case it breaks something
1734 else we'll put this inside #ifdef NS32K ... #endif */
1735 #ifndef TC_NS32K
1736 if (fragP->fr_pcrel_adjust)
1737 abort ();
1738 #endif
1739 aim += fragP->fr_pcrel_adjust;
1740
1741 if (aim < 0)
1742 {
1743 /* Look backwards. */
1744 for (next_state = this_type->rlx_more; next_state;)
1745 if (aim >= this_type->rlx_backward)
1746 next_state = 0;
1747 else
1748 {
1749 /* Grow to next state. */
1750 this_state = next_state;
1751 this_type = md_relax_table + this_state;
1752 next_state = this_type->rlx_more;
1753 }
1754 }
1755 else
1756 {
1757 #ifdef M68K_AIM_KLUDGE
1758 M68K_AIM_KLUDGE (aim, this_state, this_type);
1759 #endif
1760 /* Look forwards. */
1761 for (next_state = this_type->rlx_more; next_state;)
1762 if (aim <= this_type->rlx_forward)
1763 next_state = 0;
1764 else
1765 {
1766 /* Grow to next state. */
1767 this_state = next_state;
1768 this_type = md_relax_table + this_state;
1769 next_state = this_type->rlx_more;
1770 }
1771 }
1772
1773 growth = this_type->rlx_length - start_type->rlx_length;
1774 if (growth != 0)
1775 fragP->fr_subtype = this_state;
1776 }
1777 #endif
1778 break;
1779
1780 default:
1781 BAD_CASE (fragP->fr_type);
1782 break;
1783 }
1784 if (growth)
1785 {
1786 stretch += growth;
1787 stretched++;
1788 }
1789 } /* For each frag in the segment. */
1790 }
1791 while (stretched); /* Until nothing further to relax. */
1792 } /* do_relax */
1793
1794 /*
1795 * We now have valid fr_address'es for each frag.
1796 */
1797
1798 /*
1799 * All fr_address's are correct, relative to their own segment.
1800 * We have made all the fixS we will ever make.
1801 */
1802 } /* relax_segment() */
1803
1804 #if defined (BFD_ASSEMBLER) || !defined (BFD)
1805
1806 /* fixup_segment()
1807
1808 Go through all the fixS's in a segment and see which ones can be
1809 handled now. (These consist of fixS where we have since discovered
1810 the value of a symbol, or the address of the frag involved.)
1811 For each one, call md_apply_fix to put the fix into the frag data.
1812
1813 Result is a count of how many relocation structs will be needed to
1814 handle the remaining fixS's that we couldn't completely handle here.
1815 These will be output later by emit_relocations(). */
1816
1817 static long
1818 fixup_segment (fixP, this_segment_type)
1819 register fixS *fixP;
1820 segT this_segment_type; /* N_TYPE bits for segment. */
1821 {
1822 long seg_reloc_count = 0;
1823 symbolS *add_symbolP;
1824 symbolS *sub_symbolP;
1825 valueT add_number;
1826 int size;
1827 char *place;
1828 long where;
1829 char pcrel;
1830 fragS *fragP;
1831 segT add_symbol_segment = absolute_section;
1832
1833 /* If the linker is doing the relaxing, we must not do any fixups.
1834
1835 Well, strictly speaking that's not true -- we could do any that are
1836 PC-relative and don't cross regions that could change size. And for the
1837 i960 (the only machine for which we've got a relaxing linker right now),
1838 we might be able to turn callx/callj into bal anyways in cases where we
1839 know the maximum displacement. */
1840 if (linkrelax)
1841 {
1842 for (; fixP; fixP = fixP->fx_next)
1843 seg_reloc_count++;
1844 TC_ADJUST_RELOC_COUNT (fixP, seg_reloc_count);
1845 return seg_reloc_count;
1846 }
1847
1848 for (; fixP; fixP = fixP->fx_next)
1849 {
1850 fragP = fixP->fx_frag;
1851 know (fragP);
1852 where = fixP->fx_where;
1853 place = fragP->fr_literal + where;
1854 size = fixP->fx_size;
1855 add_symbolP = fixP->fx_addsy;
1856 #ifdef TC_VALIDATE_FIX
1857 TC_VALIDATE_FIX (fixP, this_segment_type, skip);
1858 #endif
1859 sub_symbolP = fixP->fx_subsy;
1860 add_number = fixP->fx_offset;
1861 pcrel = fixP->fx_pcrel;
1862
1863 if (add_symbolP)
1864 add_symbol_segment = S_GET_SEGMENT (add_symbolP);
1865
1866 if (sub_symbolP)
1867 {
1868 if (!add_symbolP)
1869 {
1870 /* Its just -sym */
1871 if (S_GET_SEGMENT (sub_symbolP) == absolute_section)
1872 add_number -= S_GET_VALUE (sub_symbolP);
1873 else if (pcrel
1874 && S_GET_SEGMENT (sub_symbolP) == this_segment_type)
1875 {
1876 /* Should try converting to a constant. */
1877 goto bad_sub_reloc;
1878 }
1879 else
1880 bad_sub_reloc:
1881 as_bad ("Negative of non-absolute symbol %s",
1882 S_GET_NAME (sub_symbolP));
1883 }
1884 else if ((S_GET_SEGMENT (sub_symbolP) == add_symbol_segment)
1885 && (SEG_NORMAL (add_symbol_segment)
1886 || (add_symbol_segment == absolute_section)))
1887 {
1888 /* Difference of 2 symbols from same segment.
1889 Can't make difference of 2 undefineds: 'value' means
1890 something different for N_UNDF. */
1891 #ifdef TC_I960
1892 /* Makes no sense to use the difference of 2 arbitrary symbols
1893 as the target of a call instruction. */
1894 if (fixP->fx_tcbit)
1895 as_bad ("callj to difference of 2 symbols");
1896 #endif /* TC_I960 */
1897 add_number += S_GET_VALUE (add_symbolP) -
1898 S_GET_VALUE (sub_symbolP);
1899
1900 add_symbolP = NULL;
1901
1902 /* Let the target machine make the final determination
1903 as to whether or not a relocation will be needed to
1904 handle this fixup. */
1905 if (!TC_FORCE_RELOCATION (fixP))
1906 fixP->fx_addsy = NULL;
1907 }
1908 else
1909 {
1910 /* Different segments in subtraction. */
1911 know (!(S_IS_EXTERNAL (sub_symbolP)
1912 && (S_GET_SEGMENT (sub_symbolP) == absolute_section)));
1913
1914 if ((S_GET_SEGMENT (sub_symbolP) == absolute_section))
1915 add_number -= S_GET_VALUE (sub_symbolP);
1916
1917 #ifdef DIFF_EXPR_OK
1918 else if (S_GET_SEGMENT (sub_symbolP) == this_segment_type
1919 #if 0 /* Do this even if it's already described as pc-relative. For example,
1920 on the m68k, an operand of "pc@(foo-.-2)" should address "foo" in a
1921 pc-relative mode. */
1922 && pcrel
1923 #endif
1924 )
1925 {
1926 /* Make it pc-relative. */
1927 add_number += (md_pcrel_from (fixP)
1928 - S_GET_VALUE (sub_symbolP));
1929 pcrel = 1;
1930 fixP->fx_pcrel = 1;
1931 sub_symbolP = 0;
1932 fixP->fx_subsy = 0;
1933 }
1934 #endif
1935 else
1936 {
1937 char buf[50];
1938 sprint_value (buf, fragP->fr_address + where);
1939 as_bad ("Can't emit reloc {- %s-seg symbol \"%s\"} @ file address %s.",
1940 segment_name (S_GET_SEGMENT (sub_symbolP)),
1941 S_GET_NAME (sub_symbolP), buf);
1942 }
1943 }
1944 }
1945
1946 if (add_symbolP)
1947 {
1948 if (add_symbol_segment == this_segment_type && pcrel)
1949 {
1950 /*
1951 * This fixup was made when the symbol's segment was
1952 * SEG_UNKNOWN, but it is now in the local segment.
1953 * So we know how to do the address without relocation.
1954 */
1955 #ifdef TC_I960
1956 /* reloc_callj() may replace a 'call' with a 'calls' or a
1957 'bal', in which cases it modifies *fixP as appropriate.
1958 In the case of a 'calls', no further work is required,
1959 and *fixP has been set up to make the rest of the code
1960 below a no-op. */
1961 reloc_callj (fixP);
1962 #endif /* TC_I960 */
1963
1964 add_number += S_GET_VALUE (add_symbolP);
1965 add_number -= md_pcrel_from (fixP);
1966 pcrel = 0; /* Lie. Don't want further pcrel processing. */
1967
1968 /* Let the target machine make the final determination
1969 as to whether or not a relocation will be needed to
1970 handle this fixup. */
1971 if (!TC_FORCE_RELOCATION (fixP))
1972 fixP->fx_addsy = NULL;
1973 }
1974 else
1975 {
1976 if (add_symbol_segment == absolute_section)
1977 {
1978 #ifdef TC_I960
1979 /* See comment about reloc_callj() above. */
1980 reloc_callj (fixP);
1981 #endif /* TC_I960 */
1982 add_number += S_GET_VALUE (add_symbolP);
1983
1984 /* Let the target machine make the final determination
1985 as to whether or not a relocation will be needed to
1986 handle this fixup. */
1987 if (!TC_FORCE_RELOCATION (fixP))
1988 {
1989 fixP->fx_addsy = NULL;
1990 add_symbolP = NULL;
1991 }
1992 }
1993 else if (add_symbol_segment == undefined_section
1994 #ifdef BFD_ASSEMBLER
1995 || bfd_is_com_section (add_symbol_segment)
1996 #endif
1997 )
1998 {
1999 #ifdef TC_I960
2000 if ((int) fixP->fx_bit_fixP == 13)
2001 {
2002 /* This is a COBR instruction. They have only a
2003 * 13-bit displacement and are only to be used
2004 * for local branches: flag as error, don't generate
2005 * relocation.
2006 */
2007 as_bad ("can't use COBR format with external label");
2008
2009 /* Let the target machine make the final determination
2010 as to whether or not a relocation will be needed to
2011 handle this fixup. */
2012 if (!TC_FORCE_RELOCATION (fixP))
2013 fixP->fx_addsy = NULL;
2014 continue;
2015 } /* COBR */
2016 #endif /* TC_I960 */
2017
2018 #ifdef OBJ_COFF
2019 #ifdef TE_I386AIX
2020 if (S_IS_COMMON (add_symbolP))
2021 add_number += S_GET_VALUE (add_symbolP);
2022 #endif /* TE_I386AIX */
2023 #endif /* OBJ_COFF */
2024 ++seg_reloc_count;
2025 }
2026 else
2027 {
2028 seg_reloc_count++;
2029 add_number += S_GET_VALUE (add_symbolP);
2030 }
2031 }
2032 }
2033
2034 if (pcrel)
2035 {
2036 add_number -= md_pcrel_from (fixP);
2037 if (add_symbolP == 0)
2038 {
2039 fixP->fx_addsy = &abs_symbol;
2040 ++seg_reloc_count;
2041 } /* if there's an add_symbol */
2042 } /* if pcrel */
2043
2044 if (!fixP->fx_bit_fixP && size > 0)
2045 {
2046 valueT mask = 0;
2047 /* set all bits to one */
2048 mask--;
2049 /* Technically speaking, combining these produces an
2050 undefined result if size is sizeof (valueT), though I
2051 think these two half-way operations should both be
2052 defined. */
2053 mask <<= size * 4;
2054 mask <<= size * 4;
2055 if ((add_number & mask) != 0
2056 && (add_number & mask) != mask)
2057 {
2058 char buf[50], buf2[50];
2059 sprint_value (buf, fragP->fr_address + where);
2060 if (add_number > 1000)
2061 sprint_value (buf2, add_number);
2062 else
2063 sprintf (buf2, "%ld", (long) add_number);
2064 as_bad_where (fixP->fx_file, fixP->fx_line,
2065 "Value of %s too large for field of %d bytes at %s",
2066 buf2, size, buf);
2067 } /* generic error checking */
2068 #ifdef WARN_SIGNED_OVERFLOW_WORD
2069 /* Warn if a .word value is too large when treated as a signed
2070 number. We already know it is not too negative. This is to
2071 catch over-large switches generated by gcc on the 68k. */
2072 if (!flagseen['J']
2073 && size == 2
2074 && add_number > 0x7fff)
2075 as_bad_where (fixP->fx_file, fixP->fx_line,
2076 "Signed .word overflow; switch may be too large; %ld at 0x%lx",
2077 (long) add_number,
2078 (unsigned long) (fragP->fr_address + where));
2079 #endif
2080 } /* not a bit fix */
2081
2082 #ifdef BFD_ASSEMBLER
2083 md_apply_fix (fixP, &add_number);
2084 #else
2085 md_apply_fix (fixP, add_number);
2086 #endif
2087 skip:
2088 ;
2089 } /* For each fixS in this segment. */
2090
2091 TC_ADJUST_RELOC_COUNT (fixP, seg_reloc_count);
2092 return seg_reloc_count;
2093 }
2094
2095 #endif /* defined (BFD_ASSEMBLER) || !defined (BFD) */
2096
2097 void
2098 number_to_chars_bigendian (buf, val, n)
2099 char *buf;
2100 valueT val;
2101 int n;
2102 {
2103 if (n > sizeof (val)|| n <= 0)
2104 abort ();
2105 while (n--)
2106 {
2107 buf[n] = val & 0xff;
2108 val >>= 8;
2109 }
2110 }
2111
2112 void
2113 number_to_chars_littleendian (buf, val, n)
2114 char *buf;
2115 valueT val;
2116 int n;
2117 {
2118 if (n > sizeof (val) || n <= 0)
2119 abort ();
2120 while (n--)
2121 {
2122 *buf++ = val & 0xff;
2123 val >>= 8;
2124 }
2125 }
2126
2127 /* end of write.c */
This page took 0.072151 seconds and 4 git commands to generate.