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