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