* breakpoint.c, breakpoint.h (breakpoint_init_inferior): New function
[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
KR
546#endif
547 /* If the section symbol isn't going to be output, the relocs
548 at least should still work. If not, figure out what to do
549 when we run into that case. */
550 fixp->fx_offset += S_GET_VALUE (sym);
551 if (sym->sy_frag)
552 fixp->fx_offset += sym->sy_frag->fr_address;
553 if (symseginfo->sym)
554 fixp->fx_addsy = symseginfo->sym;
555 else
556 {
557 fixp->fx_addsy = symbol_find (symsec->name);
558 if (!fixp->fx_addsy)
559 {
560 fixp->fx_addsy = symbol_make (symsec->name);
561 fixp->fx_addsy->bsym = symsec->symbol;
562 }
563 symseginfo->sym = fixp->fx_addsy;
564 }
80aab579 565 fixp->fx_addsy->sy_used_in_reloc = 1;
d5364748
KR
566 }
567
568 dump_section_relocs (abfd, sec, stderr);
569}
570
43ca9aa6 571static void
8d6c34a1 572write_relocs (abfd, sec, xxx)
43ca9aa6
KR
573 bfd *abfd;
574 asection *sec;
575 char *xxx;
576{
577 segment_info_type *seginfo = seg_info (sec);
80aab579
ILT
578 int i;
579 unsigned int n;
43ca9aa6
KR
580 arelent **relocs;
581 fixS *fixp;
582
d5364748
KR
583 /* If seginfo is NULL, we did not create this section; don't do
584 anything with it. */
585 if (seginfo == NULL)
43ca9aa6
KR
586 return;
587
588 fixup_segment (seginfo->fix_root, sec);
589
3d3c5039 590 n = 0;
d5364748
KR
591 for (fixp = seginfo->fix_root; fixp; fixp = fixp->fx_next)
592 n++;
43ca9aa6 593
d5364748 594#ifndef RELOC_EXPANSION_POSSIBLE
43ca9aa6 595 /* Set up reloc information as well. */
43ca9aa6
KR
596 relocs = (arelent **) bfd_alloc_by_size_t (stdoutput,
597 n * sizeof (arelent *));
8d6c34a1 598 memset ((char*)relocs, 0, n * sizeof (arelent*));
43ca9aa6 599
3d3c5039
ILT
600 i = 0;
601 for (fixp = seginfo->fix_root; fixp != (fixS *) NULL; fixp = fixp->fx_next)
602 {
603 arelent *reloc;
3d3c5039
ILT
604 char *data;
605 bfd_reloc_status_type s;
606
607 if (fixp->fx_addsy == 0)
608 {
609 /* @@ Need some other flag to indicate which have already
610 been performed... */
611 n--;
612 continue;
613 }
614 reloc = tc_gen_reloc (sec, fixp);
615 if (!reloc)
616 {
617 n--;
618 continue;
619 }
620 data = fixp->fx_frag->fr_literal + fixp->fx_where;
8d6c34a1 621 /* @@ Assumes max size of reloc is 4. */
3d3c5039
ILT
622 if (fixp->fx_where + 4
623 > fixp->fx_frag->fr_fix + fixp->fx_frag->fr_offset)
624 abort ();
d5364748
KR
625 /* Pass bogus address so that when bfd_perform_relocation adds
626 `address' back in, it'll come up with `data', which is where
627 we want it to operate. */
3d3c5039
ILT
628 s = bfd_perform_relocation (stdoutput, reloc, data - reloc->address,
629 sec, stdoutput);
630 switch (s)
631 {
632 case bfd_reloc_ok:
633 break;
634 default:
635 as_fatal ("bad return from bfd_perform_relocation");
636 }
637 relocs[i++] = reloc;
638 }
d5364748
KR
639#else
640 n = n * MAX_RELOC_EXPANSION;
641 /* Set up reloc information as well. */
642 relocs = (arelent **) bfd_alloc_by_size_t (stdoutput,
643 n * sizeof (arelent *));
644
645 i = 0;
646 for (fixp = seginfo->fix_root; fixp != (fixS *) NULL; fixp = fixp->fx_next)
647 {
648 arelent **reloc;
d5364748
KR
649 char *data;
650 bfd_reloc_status_type s;
651 int j;
652
653 if (fixp->fx_addsy == 0)
654 {
655 /* @@ Need some other flag to indicate which have already
656 been performed... */
657 n--;
658 continue;
659 }
660 reloc = tc_gen_reloc (sec, fixp);
661
662 for (j = 0; reloc[j]; j++)
663 {
664 relocs[i++] = reloc[j];
665 assert(i <= n);
666 }
667 data = fixp->fx_frag->fr_literal + fixp->fx_where;
668 if (fixp->fx_where + 4
669 > fixp->fx_frag->fr_fix + fixp->fx_frag->fr_offset)
670 abort ();
671 for (j = 0; reloc[j]; j++)
672 {
673 s = bfd_perform_relocation (stdoutput, reloc[j], data - reloc[j]->address,
674 sec, stdoutput);
675 switch (s)
676 {
677 case bfd_reloc_ok:
678 break;
679 default:
680 as_fatal ("bad return from bfd_perform_relocation");
681 }
682 }
683 }
684 n = i;
685#endif
686
3d3c5039
ILT
687 if (n)
688 bfd_set_reloc (stdoutput, sec, relocs, n);
d5364748
KR
689 else
690 bfd_set_section_flags (abfd, sec,
80aab579
ILT
691 (bfd_get_section_flags (abfd, sec)
692 & (flagword) ~SEC_RELOC));
d5364748
KR
693#ifdef DEBUG2
694 {
695 int i;
696 arelent *r;
697 asymbol *s;
698 fprintf (stderr, "relocs for sec %s\n", sec->name);
699 for (i = 0; i < n; i++)
700 {
701 r = relocs[i];
702 s = *r->sym_ptr_ptr;
703 fprintf (stderr, " reloc %2d @%08x off %4x : sym %-10s addend %x\n",
704 i, r, r->address, s->name, r->addend);
705 }
706 }
707#endif
8d6c34a1 708}
d5364748 709
8d6c34a1
KR
710static void
711write_contents (abfd, sec, xxx)
712 bfd *abfd;
713 asection *sec;
714 char *xxx;
715{
716 segment_info_type *seginfo = seg_info (sec);
717 unsigned long offset = 0;
80aab579 718 fragS *f;
3d3c5039
ILT
719
720 /* Write out the frags. */
d5364748
KR
721 if (! (bfd_get_section_flags (abfd, sec) & SEC_HAS_CONTENTS))
722 return;
723
80aab579
ILT
724 for (f = seginfo->frchainP->frch_root;
725 f;
726 f = f->fr_next)
43ca9aa6
KR
727 {
728 int x;
729 unsigned long fill_size;
730 char *fill_literal;
731 long count;
732
80aab579
ILT
733 assert (f->fr_type == rs_fill);
734 if (f->fr_fix)
43ca9aa6
KR
735 {
736 x = bfd_set_section_contents (stdoutput, sec,
80aab579
ILT
737 f->fr_literal, (file_ptr) offset,
738 (bfd_size_type) f->fr_fix);
43ca9aa6 739 assert (x == true);
80aab579 740 offset += f->fr_fix;
43ca9aa6 741 }
80aab579
ILT
742 fill_literal = f->fr_literal + f->fr_fix;
743 fill_size = f->fr_var;
744 count = f->fr_offset;
43ca9aa6
KR
745 assert (count >= 0);
746 if (fill_size && count)
747 while (count--)
748 {
749 x = bfd_set_section_contents (stdoutput, sec,
80aab579 750 fill_literal, (file_ptr) offset,
d5364748 751 (bfd_size_type) fill_size);
43ca9aa6
KR
752 assert (x == true);
753 offset += fill_size;
754 }
755 }
43ca9aa6
KR
756}
757#endif
758
80aab579 759#if defined(BFD_ASSEMBLER) || (!defined (BFD) && !defined(OBJ_AOUT))
b23f6743
KR
760static void
761merge_data_into_text ()
762{
4064305e 763#if defined(BFD_ASSEMBLER) || defined(MANY_SEGMENTS)
b23f6743
KR
764 seg_info (text_section)->frchainP->frch_last->fr_next =
765 seg_info (data_section)->frchainP->frch_root;
766 seg_info (text_section)->frchainP->frch_last =
767 seg_info (data_section)->frchainP->frch_last;
768 seg_info (data_section)->frchainP = 0;
769#else
770 fixS *tmp;
771
772 text_last_frag->fr_next = data_frag_root;
773 text_last_frag = data_last_frag;
774 data_last_frag = NULL;
775 data_frag_root = NULL;
776 if (text_fix_root)
777 {
778 for (tmp = text_fix_root; tmp->fx_next; tmp = tmp->fx_next);;
779 tmp->fx_next = data_fix_root;
780 text_fix_tail = data_fix_tail;
781 }
782 else
783 text_fix_root = data_fix_root;
784 data_fix_root = NULL;
785#endif
786}
80aab579 787#endif /* BFD_ASSEMBLER || (! BFD && ! OBJ_AOUT) */
b23f6743
KR
788
789#if !defined (BFD_ASSEMBLER) && !defined (BFD)
790static void
791relax_and_size_all_segments ()
792{
13e9182d
KR
793 fragS *fragP;
794
b23f6743
KR
795 relax_segment (text_frag_root, SEG_TEXT);
796 relax_segment (data_frag_root, SEG_DATA);
797 relax_segment (bss_frag_root, SEG_BSS);
798 /*
799 * Now the addresses of frags are correct within the segment.
800 */
801
802 know (text_last_frag->fr_type == rs_fill && text_last_frag->fr_offset == 0);
803 H_SET_TEXT_SIZE (&headers, text_last_frag->fr_address);
804 text_last_frag->fr_address = H_GET_TEXT_SIZE (&headers);
805
806 /*
807 * Join the 2 segments into 1 huge segment.
808 * To do this, re-compute every rn_address in the SEG_DATA frags.
809 * Then join the data frags after the text frags.
810 *
811 * Determine a_data [length of data segment].
812 */
813 if (data_frag_root)
814 {
815 register relax_addressT slide;
816
817 know ((text_last_frag->fr_type == rs_fill) && (text_last_frag->fr_offset == 0));
818
819 H_SET_DATA_SIZE (&headers, data_last_frag->fr_address);
820 data_last_frag->fr_address = H_GET_DATA_SIZE (&headers);
821 slide = H_GET_TEXT_SIZE (&headers); /* & in file of the data segment. */
822#ifdef OBJ_BOUT
823#define RoundUp(N,S) (((N)+(S)-1)&-(S))
824 /* For b.out: If the data section has a strict alignment
825 requirement, its load address in the .o file will be
826 rounded up from the size of the text section. These
827 two values are *not* the same! Similarly for the bss
828 section.... */
829 slide = RoundUp (slide, 1 << section_alignment[SEG_DATA]);
830#endif
831
832 for (fragP = data_frag_root; fragP; fragP = fragP->fr_next)
833 {
834 fragP->fr_address += slide;
835 } /* for each data frag */
836
837 know (text_last_frag != 0);
838 text_last_frag->fr_next = data_frag_root;
839 }
840 else
841 {
842 H_SET_DATA_SIZE (&headers, 0);
843 }
844
845#ifdef OBJ_BOUT
846 /* See above comments on b.out data section address. */
847 {
848 long bss_vma;
849 if (data_last_frag == 0)
850 bss_vma = H_GET_TEXT_SIZE (&headers);
851 else
852 bss_vma = data_last_frag->fr_address;
853 bss_vma = RoundUp (bss_vma, 1 << section_alignment[SEG_BSS]);
854 bss_address_frag.fr_address = bss_vma;
855 }
856#else /* ! OBJ_BOUT */
857 bss_address_frag.fr_address = (H_GET_TEXT_SIZE (&headers) +
858 H_GET_DATA_SIZE (&headers));
859
860
861 /* Slide all the frags */
862 if (bss_frag_root)
863 {
864 relax_addressT slide = bss_address_frag.fr_address;
865
866 for (fragP = bss_frag_root; fragP; fragP = fragP->fr_next)
867 {
868 fragP->fr_address += slide;
869 } /* for each bss frag */
870 }
871
872#endif /* ! OBJ_BOUT */
873
874 if (bss_last_frag)
875 H_SET_BSS_SIZE (&headers,
876 bss_last_frag->fr_address - bss_frag_root->fr_address);
877 else
878 H_SET_BSS_SIZE (&headers, 0);
879}
880#endif /* ! BFD_ASSEMBLER && ! BFD */
881
d5364748
KR
882#if defined (BFD_ASSEMBLER) || !defined (BFD)
883
6efd877d
KR
884void
885write_object_file ()
45432836 886{
6efd877d 887 register struct frchain *frchainP; /* Track along all frchains. */
58d4951d 888#if ! defined (BFD_ASSEMBLER) || ! defined (WORKING_DOT_WORD)
6efd877d 889 register fragS *fragP; /* Track along all frags. */
58d4951d 890#endif
d5364748 891#if !defined (BFD_ASSEMBLER) && !defined (OBJ_VMS)
6efd877d 892 long object_file_size;
d5364748 893#endif
6efd877d 894
43ca9aa6
KR
895 /* Do we really want to write it? */
896 {
897 int n_warns, n_errs;
898 n_warns = had_warnings ();
899 n_errs = had_errors ();
900 /* The -Z flag indicates that an object file should be generated,
901 regardless of warnings and errors. */
902 if (flagseen['Z'])
903 {
904 if (n_warns || n_errs)
905 as_warn ("%d error%s, %d warning%s, generating bad object file.\n",
906 n_errs, n_errs == 1 ? "" : "s",
907 n_warns, n_warns == 1 ? "" : "s");
908 }
909 else
910 {
911 if (n_errs)
912 as_fatal ("%d error%s, %d warning%s, no object file generated.\n",
913 n_errs, n_errs == 1 ? "" : "s",
914 n_warns, n_warns == 1 ? "" : "s");
915 }
916 }
917
3eb802b5 918#ifdef OBJ_VMS
6efd877d 919 /*
3eb802b5
ILT
920 * Under VMS we try to be compatible with VAX-11 "C". Thus, we
921 * call a routine to check for the definition of the procedure
922 * "_main", and if so -- fix it up so that it can be program
923 * entry point.
924 */
6efd877d 925 VMS_Check_For_Main ();
fecd2382 926#endif /* VMS */
43ca9aa6
KR
927
928 /* After every sub-segment, we fake an ".align ...". This conforms to
929 BSD4.2 brane-damage. We then fake ".fill 0" because that is the kind of
930 frag that requires least thought. ".align" frags like to have a
931 following frag since that makes calculating their intended length
932 trivial.
933
934 @@ Is this really necessary?? */
3eb802b5 935#ifndef SUB_SEGMENT_ALIGN
43ca9aa6 936#ifdef BFD_ASSEMBLER
f2f7d044 937#define SUB_SEGMENT_ALIGN(SEG) (0)
43ca9aa6 938#else
f2f7d044 939#define SUB_SEGMENT_ALIGN(SEG) (2)
43ca9aa6 940#endif
3eb802b5 941#endif
6efd877d
KR
942 for (frchainP = frchain_root; frchainP; frchainP = frchainP->frch_next)
943 {
43ca9aa6 944 subseg_set (frchainP->frch_seg, frchainP->frch_subseg);
f2f7d044 945 frag_align (SUB_SEGMENT_ALIGN (now_seg), NOP_OPCODE);
43ca9aa6
KR
946 /* frag_align will have left a new frag.
947 Use this last frag for an empty ".fill".
948
949 For this segment ...
950 Create a last frag. Do not leave a "being filled in frag". */
6efd877d
KR
951 frag_wane (frag_now);
952 frag_now->fr_fix = 0;
953 know (frag_now->fr_next == NULL);
43ca9aa6 954 }
6efd877d 955
43ca9aa6
KR
956 /* From now on, we don't care about sub-segments. Build one frag chain
957 for each segment. Linked thru fr_next. */
65bfcf2e 958
43ca9aa6
KR
959#ifdef BFD_ASSEMBLER
960 /* Remove the sections created by gas for its own purposes. */
961 {
962 asection **seclist, *sec;
963 seclist = &stdoutput->sections;
964 while (seclist && *seclist)
965 {
966 sec = *seclist;
5ac34ac3 967 while (sec == reg_section || sec == expr_section)
43ca9aa6
KR
968 {
969 sec = sec->next;
970 *seclist = sec;
971 stdoutput->section_count--;
972 if (!sec)
973 break;
974 }
975 if (*seclist)
976 seclist = &(*seclist)->next;
977 }
978 }
979
980 bfd_map_over_sections (stdoutput, chain_frchains_together, (char *) 0);
981#else
6efd877d
KR
982 remove_subsegs (frchain_root, SEG_TEXT, &text_frag_root, &text_last_frag);
983 remove_subsegs (data0_frchainP, SEG_DATA, &data_frag_root, &data_last_frag);
984 remove_subsegs (bss0_frchainP, SEG_BSS, &bss_frag_root, &bss_last_frag);
43ca9aa6 985#endif
6efd877d 986
43ca9aa6
KR
987 /* We have two segments. If user gave -R flag, then we must put the
988 data frags into the text segment. Do this before relaxing so
989 we know to take advantage of -R and make shorter addresses. */
990#if !defined (OBJ_AOUT) || defined (BFD_ASSEMBLER)
6efd877d
KR
991 if (flagseen['R'])
992 {
b23f6743 993 merge_data_into_text ();
6efd877d
KR
994 }
995#endif
43ca9aa6
KR
996
997#ifdef BFD_ASSEMBLER
998 bfd_map_over_sections (stdoutput, relax_and_size_seg, (char *) 0);
999#else
b23f6743 1000 relax_and_size_all_segments ();
43ca9aa6 1001#endif /* BFD_ASSEMBLER */
65bfcf2e 1002
43ca9aa6 1003#ifndef BFD_ASSEMBLER
6efd877d 1004 /*
7f2cb270
KR
1005 *
1006 * Crawl the symbol chain.
1007 *
1008 * For each symbol whose value depends on a frag, take the address of
1009 * that frag and subsume it into the value of the symbol.
1010 * After this, there is just one way to lookup a symbol value.
1011 * Values are left in their final state for object file emission.
1012 * We adjust the values of 'L' local symbols, even if we do
1013 * not intend to emit them to the object file, because their values
1014 * are needed for fix-ups.
1015 *
1016 * Unless we saw a -L flag, remove all symbols that begin with 'L'
1017 * from the symbol chain. (They are still pointed to by the fixes.)
1018 *
1019 * Count the remaining symbols.
1020 * Assign a symbol number to each symbol.
1021 * Count the number of string-table chars we will emit.
1022 * Put this info into the headers as appropriate.
1023 *
1024 */
6efd877d
KR
1025 know (zero_address_frag.fr_address == 0);
1026 string_byte_count = sizeof (string_byte_count);
1027
1028 obj_crawl_symbol_chain (&headers);
1029
1030 if (string_byte_count == sizeof (string_byte_count))
43ca9aa6 1031 string_byte_count = 0;
6efd877d
KR
1032
1033 H_SET_STRING_SIZE (&headers, string_byte_count);
1034
1035 /*
7f2cb270
KR
1036 * Addresses of frags now reflect addresses we use in the object file.
1037 * Symbol values are correct.
1038 * Scan the frags, converting any ".org"s and ".align"s to ".fill"s.
1039 * Also converting any machine-dependent frags using md_convert_frag();
1040 */
6efd877d
KR
1041 subseg_change (SEG_TEXT, 0);
1042
1043 for (fragP = text_frag_root; fragP; fragP = fragP->fr_next)
1044 {
43ca9aa6 1045 cvt_frag_to_fill (&headers, fragP);
6efd877d 1046
43ca9aa6
KR
1047 /* Some assert macros don't work with # directives mixed in. */
1048#ifndef NDEBUG
1049 if (!(fragP->fr_next == NULL
ebfb4167 1050#ifdef OBJ_BOUT
43ca9aa6 1051 || fragP->fr_next == data_frag_root
ebfb4167 1052#endif
6efd877d 1053 || ((fragP->fr_next->fr_address - fragP->fr_address)
43ca9aa6
KR
1054 == (fragP->fr_fix + fragP->fr_offset * fragP->fr_var))))
1055 abort ();
1056#endif
1057 }
1058#endif /* ! BFD_ASSEMBLER */
6efd877d 1059
fecd2382 1060#ifndef WORKING_DOT_WORD
6efd877d
KR
1061 {
1062 struct broken_word *lie;
1063 struct broken_word **prevP;
1064
1065 prevP = &broken_words;
1066 for (lie = broken_words; lie; lie = lie->next_broken_word)
1067 if (!lie->added)
a39116f1 1068 {
5ac34ac3
ILT
1069 expressionS exp;
1070
1071 exp.X_op = O_subtract;
1072 exp.X_add_symbol = lie->add;
1073 exp.X_op_symbol = lie->sub;
1074 exp.X_add_number = lie->addnum;
43ca9aa6 1075#ifdef BFD_ASSEMBLER
5ac34ac3
ILT
1076 fix_new_exp (lie->frag,
1077 lie->word_goes_here - lie->frag->fr_literal,
1078 2, &exp, 0, BFD_RELOC_NONE);
43ca9aa6
KR
1079#else
1080#if defined(TC_SPARC) || defined(TC_A29K) || defined(NEED_FX_R_TYPE)
5ac34ac3
ILT
1081 fix_new_exp (lie->frag,
1082 lie->word_goes_here - lie->frag->fr_literal,
1083 2, &exp, 0, NO_RELOC);
43ca9aa6 1084#else
fecd2382 1085#ifdef TC_NS32K
5ac34ac3
ILT
1086 fix_new_ns32k_exp (lie->frag,
1087 lie->word_goes_here - lie->frag->fr_literal,
1088 2, &exp, 0, 0, 2, 0, 0);
343fb08d 1089#else
5ac34ac3
ILT
1090 fix_new_exp (lie->frag,
1091 lie->word_goes_here - lie->frag->fr_literal,
1092 2, &exp, 0, 0);
fecd2382 1093#endif /* TC_NS32K */
43ca9aa6
KR
1094#endif /* TC_SPARC|TC_A29K|NEED_FX_R_TYPE */
1095#endif /* BFD_ASSEMBLER */
6efd877d 1096 *prevP = lie->next_broken_word;
a39116f1 1097 }
6efd877d
KR
1098 else
1099 prevP = &(lie->next_broken_word);
1100
1101 for (lie = broken_words; lie;)
1102 {
1103 struct broken_word *untruth;
1104 char *table_ptr;
d5364748
KR
1105 addressT table_addr;
1106 addressT from_addr, to_addr;
6efd877d
KR
1107 int n, m;
1108
6efd877d
KR
1109 fragP = lie->dispfrag;
1110
43ca9aa6 1111 /* Find out how many broken_words go here. */
6efd877d
KR
1112 n = 0;
1113 for (untruth = lie; untruth && untruth->dispfrag == fragP; untruth = untruth->next_broken_word)
1114 if (untruth->added == 1)
1115 n++;
1116
1117 table_ptr = lie->dispfrag->fr_opcode;
1118 table_addr = lie->dispfrag->fr_address + (table_ptr - lie->dispfrag->fr_literal);
43ca9aa6
KR
1119 /* Create the jump around the long jumps. This is a short
1120 jump from table_ptr+0 to table_ptr+n*long_jump_size. */
6efd877d
KR
1121 from_addr = table_addr;
1122 to_addr = table_addr + md_short_jump_size + n * md_long_jump_size;
1123 md_create_short_jump (table_ptr, from_addr, to_addr, lie->dispfrag, lie->add);
1124 table_ptr += md_short_jump_size;
1125 table_addr += md_short_jump_size;
1126
1127 for (m = 0; lie && lie->dispfrag == fragP; m++, lie = lie->next_broken_word)
1128 {
1129 if (lie->added == 2)
1130 continue;
1131 /* Patch the jump table */
1132 /* This is the offset from ??? to table_ptr+0 */
d5364748 1133 to_addr = table_addr - S_GET_VALUE (lie->sub);
6efd877d
KR
1134 md_number_to_chars (lie->word_goes_here, to_addr, 2);
1135 for (untruth = lie->next_broken_word; untruth && untruth->dispfrag == fragP; untruth = untruth->next_broken_word)
1136 {
1137 if (untruth->use_jump == lie)
1138 md_number_to_chars (untruth->word_goes_here, to_addr, 2);
1139 }
1140
1141 /* Install the long jump */
1142 /* this is a long jump from table_ptr+0 to the final target */
1143 from_addr = table_addr;
1144 to_addr = S_GET_VALUE (lie->add) + lie->addnum;
1145 md_create_long_jump (table_ptr, from_addr, to_addr, lie->dispfrag, lie->add);
1146 table_ptr += md_long_jump_size;
1147 table_addr += md_long_jump_size;
1148 }
1149 }
1150 }
fecd2382 1151#endif /* not WORKING_DOT_WORD */
6efd877d 1152
43ca9aa6 1153#ifndef BFD_ASSEMBLER
3eb802b5 1154#ifndef OBJ_VMS
6efd877d
KR
1155 { /* not vms */
1156 /*
3eb802b5
ILT
1157 * Scan every FixS performing fixups. We had to wait until now to do
1158 * this because md_convert_frag() may have made some fixSs.
1159 */
6efd877d
KR
1160 int trsize, drsize;
1161
1162 subseg_change (SEG_TEXT, 0);
d5364748 1163 trsize = md_reloc_size * fixup_segment (text_fix_root, SEG_TEXT);
6efd877d 1164 subseg_change (SEG_DATA, 0);
d5364748 1165 drsize = md_reloc_size * fixup_segment (data_fix_root, SEG_DATA);
6efd877d
KR
1166 H_SET_RELOCATION_SIZE (&headers, trsize, drsize);
1167
1168 /* FIXME move this stuff into the pre-write-hook */
1169 H_SET_MAGIC_NUMBER (&headers, magic_number_for_object_file);
1170 H_SET_ENTRY_POINT (&headers, 0);
1171
1172 obj_pre_write_hook (&headers); /* extra coff stuff */
6efd877d
KR
1173
1174 object_file_size = H_GET_FILE_SIZE (&headers);
1175 next_object_file_charP = the_object_file = xmalloc (object_file_size);
1176
1177 output_file_create (out_file_name);
1178
1179 obj_header_append (&next_object_file_charP, &headers);
1180
1181 know ((next_object_file_charP - the_object_file) == H_GET_HEADER_SIZE (&headers));
1182
1183 /*
43ca9aa6
KR
1184 * Emit code.
1185 */
6efd877d
KR
1186 for (fragP = text_frag_root; fragP; fragP = fragP->fr_next)
1187 {
1188 register long count;
1189 register char *fill_literal;
1190 register long fill_size;
1191
1192 know (fragP->fr_type == rs_fill);
1193 append (&next_object_file_charP, fragP->fr_literal, (unsigned long) fragP->fr_fix);
1194 fill_literal = fragP->fr_literal + fragP->fr_fix;
1195 fill_size = fragP->fr_var;
1196 know (fragP->fr_offset >= 0);
1197
1198 for (count = fragP->fr_offset; count; count--)
1199 {
1200 append (&next_object_file_charP, fill_literal, (unsigned long) fill_size);
1201 } /* for each */
1202
1203 } /* for each code frag. */
1204
1205 know ((next_object_file_charP - the_object_file) == (H_GET_HEADER_SIZE (&headers) + H_GET_TEXT_SIZE (&headers) + H_GET_DATA_SIZE (&headers)));
1206
1207 /*
43ca9aa6
KR
1208 * Emit relocations.
1209 */
6efd877d
KR
1210 obj_emit_relocations (&next_object_file_charP, text_fix_root, (relax_addressT) 0);
1211 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 1212#ifdef TC_I960
6efd877d 1213 /* Make addresses in data relocation directives relative to beginning of
43ca9aa6
KR
1214 * first data fragment, not end of last text fragment: alignment of the
1215 * start of the data segment may place a gap between the segments.
1216 */
6efd877d 1217 obj_emit_relocations (&next_object_file_charP, data_fix_root, data0_frchainP->frch_root->fr_address);
fecd2382 1218#else /* TC_I960 */
6efd877d 1219 obj_emit_relocations (&next_object_file_charP, data_fix_root, text_last_frag->fr_address);
fecd2382 1220#endif /* TC_I960 */
6efd877d
KR
1221
1222 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)));
1223
1224 /*
43ca9aa6
KR
1225 * Emit line number entries.
1226 */
6efd877d
KR
1227 OBJ_EMIT_LINENO (&next_object_file_charP, lineno_rootP, the_object_file);
1228 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)));
1229
1230 /*
3eb802b5
ILT
1231 * Emit symbols.
1232 */
6efd877d
KR
1233 obj_emit_symbols (&next_object_file_charP, symbol_rootP);
1234 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)));
1235
1236 /*
3eb802b5
ILT
1237 * Emit strings.
1238 */
6efd877d
KR
1239
1240 if (string_byte_count > 0)
1241 {
1242 obj_emit_strings (&next_object_file_charP);
1243 } /* only if we have a string table */
1244
45432836 1245#ifdef BFD_HEADERS
6efd877d
KR
1246 bfd_seek (stdoutput, 0, 0);
1247 bfd_write (the_object_file, 1, object_file_size, stdoutput);
45432836 1248#else
6efd877d
KR
1249
1250 /* Write the data to the file */
1251 output_file_append (the_object_file, object_file_size, out_file_name);
45432836 1252#endif
6efd877d
KR
1253
1254 output_file_close (out_file_name);
1255 } /* non vms output */
1256#else /* VMS */
1257 /*
3eb802b5
ILT
1258 * Now do the VMS-dependent part of writing the object file
1259 */
85825401
ILT
1260 VMS_write_object_file (H_GET_TEXT_SIZE (&headers),
1261 H_GET_DATA_SIZE (&headers),
1262 H_GET_BSS_SIZE (&headers),
3eb802b5 1263 text_frag_root, data_frag_root);
6efd877d 1264#endif /* VMS */
43ca9aa6 1265#else /* BFD_ASSEMBLER */
6efd877d 1266
d5364748
KR
1267#ifdef obj_check_file_symbols
1268 obj_check_file_symbols ();
1269#endif
1270
1271 bfd_map_over_sections (stdoutput, adjust_reloc_syms, (char *)0);
1272
43ca9aa6
KR
1273 /* Set up symbol table, and write it out. */
1274 if (symbol_rootP)
1275 {
80aab579
ILT
1276 unsigned int i = 0;
1277 unsigned int n;
43ca9aa6
KR
1278 symbolS *symp;
1279
1280 for (symp = symbol_rootP; symp; symp = symbol_next (symp))
1281 {
5868b1fe
ILT
1282 if (! symp->sy_resolved)
1283 {
5ac34ac3 1284 if (symp->sy_value.X_op == O_constant)
5868b1fe
ILT
1285 {
1286 /* This is the normal case; skip the call. */
1287 S_SET_VALUE (symp,
1288 (S_GET_VALUE (symp)
1289 + symp->sy_frag->fr_address));
1290 symp->sy_resolved = 1;
1291 }
1292 else
1293 resolve_symbol_value (symp);
1294 }
1295
43ca9aa6
KR
1296 /* So far, common symbols have been treated like undefined symbols.
1297 Put them in the common section now. */
1298 if (S_IS_DEFINED (symp) == 0
1299 && S_GET_VALUE (symp) != 0)
1300 S_SET_SEGMENT (symp, &bfd_com_section);
1301#if 0
5868b1fe 1302 printf ("symbol `%s'\n\t@%x: value=%d flags=%x seg=%s\n",
43ca9aa6
KR
1303 S_GET_NAME (symp), symp,
1304 S_GET_VALUE (symp),
d5364748 1305 symp->bsym->flags,
43ca9aa6
KR
1306 segment_name (symp->bsym->section));
1307#endif
80aab579 1308 if (! symp->sy_used_in_reloc)
58d4951d 1309 {
80aab579
ILT
1310#ifdef obj_frob_symbol
1311 {
1312 int punt = 0;
1313 obj_frob_symbol (symp, punt);
1314 if (punt)
1315 goto punt_it;
1316 }
43ca9aa6
KR
1317#endif
1318#ifdef tc_frob_symbol
80aab579
ILT
1319 {
1320 int punt = 0;
1321 tc_frob_symbol (symp, punt);
1322 if (punt)
1323 goto punt_it;
1324 }
43ca9aa6 1325#endif
80aab579
ILT
1326 }
1327
43ca9aa6
KR
1328 /* If we don't want to keep this symbol, splice it out of the
1329 chain now. */
80aab579
ILT
1330 if (! symp->sy_used_in_reloc
1331 && S_IS_LOCAL (symp))
43ca9aa6
KR
1332 {
1333 symbolS *prev, *next;
58d4951d 1334#if defined (obj_frob_symbol) || defined (tc_frob_symbol)
43ca9aa6 1335 punt_it:
58d4951d 1336#endif
43ca9aa6
KR
1337 prev = symbol_previous (symp);
1338 next = symbol_next (symp);
b23f6743 1339#ifdef DEBUG_SYMS
d5364748 1340 verify_symbol_chain_2 (symp);
43ca9aa6
KR
1341#endif
1342 if (prev)
1343 {
1344 symbol_next (prev) = next;
1345 symp = prev;
1346 }
d5364748
KR
1347 else if (symp == symbol_rootP)
1348 symbol_rootP = next;
43ca9aa6
KR
1349 else
1350 abort ();
1351 if (next)
1352 symbol_previous (next) = prev;
1353 else
1354 symbol_lastP = prev;
b23f6743 1355#ifdef DEBUG_SYMS
d5364748
KR
1356 if (prev)
1357 verify_symbol_chain_2 (prev);
1358 else if (next)
1359 verify_symbol_chain_2 (next);
45432836 1360#endif
43ca9aa6
KR
1361 continue;
1362 }
85051959 1363
80aab579
ILT
1364 /* Make sure we really got a value for the symbol. */
1365 if (! symp->sy_resolved)
1366 {
1367 as_bad ("can't resolve value for symbol \"%s\"",
1368 S_GET_NAME (symp));
1369 symp->sy_resolved = 1;
1370 }
1371
85051959
ILT
1372 /* Set the value into the BFD symbol. Up til now the value
1373 has only been kept in the gas symbolS struct. */
1374 symp->bsym->value = S_GET_VALUE (symp);
1375
43ca9aa6
KR
1376 i++;
1377 }
1378 n = i;
1379 if (n)
1380 {
1381 asymbol **asympp;
1382 boolean result;
d5364748 1383 extern PTR bfd_alloc PARAMS ((bfd *, size_t));
43ca9aa6 1384
d5364748
KR
1385 asympp = (asymbol **) bfd_alloc (stdoutput,
1386 n * sizeof (asymbol *));
43ca9aa6
KR
1387 symp = symbol_rootP;
1388 for (i = 0; i < n; i++, symp = symbol_next (symp))
1389 {
1390 asympp[i] = symp->bsym;
1391 symp->written = 1;
1392 }
1393 result = bfd_set_symtab (stdoutput, asympp, n);
1394 assert (result == true);
1395 }
1396 }
1397
d5364748 1398
f2f7d044 1399#ifdef obj_frob_file
85051959
ILT
1400 /* If obj_frob_file changes the symbol value at this point, it is
1401 responsible for moving the changed value into symp->bsym->value
1402 as well. Hopefully all symbol value changing can be done in
1403 {obj,tc}_frob_symbol. */
f2f7d044
ILT
1404 obj_frob_file ();
1405#endif
1406
43ca9aa6
KR
1407 /* Now that all the sizes are known, and contents correct, we can
1408 start writing the file. */
8d6c34a1
KR
1409 bfd_map_over_sections (stdoutput, write_relocs, (char *) 0);
1410
43ca9aa6
KR
1411 bfd_map_over_sections (stdoutput, write_contents, (char *) 0);
1412
1413 output_file_close (out_file_name);
1414#endif /* BFD_ASSEMBLER */
1415}
d5364748 1416#endif /* ! BFD */
fecd2382
RP
1417
1418/*
1419 * relax_segment()
1420 *
1421 * Now we have a segment, not a crowd of sub-segments, we can make fr_address
1422 * values.
1423 *
1424 * Relax the frags.
1425 *
1426 * After this, all frags in this segment have addresses that are correct
1427 * within the segment. Since segments live in different file addresses,
1428 * these frag addresses may not be the same as final object-file addresses.
1429 */
45432836 1430
d5364748 1431/* Subroutines of relax_segment. */
43ca9aa6
KR
1432static int
1433is_dnrange (f1, f2)
1434 struct frag *f1;
1435 struct frag *f2;
1436{
1437 for (; f1; f1 = f1->fr_next)
1438 if (f1->fr_next == f2)
1439 return 1;
1440 return 0;
1441}
1442
1443/* Relax_align. Advance location counter to next address that has 'alignment'
d5364748 1444 lowest order bits all 0s, return size of adjustment made. */
43ca9aa6
KR
1445static relax_addressT
1446relax_align (address, alignment)
1447 register relax_addressT address; /* Address now. */
d5364748 1448 register int alignment; /* Alignment (binary). */
43ca9aa6
KR
1449{
1450 relax_addressT mask;
1451 relax_addressT new_address;
1452
1453 mask = ~((~0) << alignment);
1454 new_address = (address + mask) & (~mask);
1455 if (linkrelax)
1456 /* We must provide lots of padding, so the linker can discard it
1457 when needed. The linker will not add extra space, ever. */
1458 new_address += (1 << alignment);
1459 return (new_address - address);
1460}
45432836 1461
6efd877d
KR
1462void
1463relax_segment (segment_frag_root, segment)
1464 struct frag *segment_frag_root;
43ca9aa6 1465 segT segment;
fecd2382 1466{
6efd877d
KR
1467 register struct frag *fragP;
1468 register relax_addressT address;
43ca9aa6 1469#if !defined (MANY_SEGMENTS) && !defined (BFD_ASSEMBLER)
6efd877d 1470 know (segment == SEG_DATA || segment == SEG_TEXT || segment == SEG_BSS);
45432836 1471#endif
6efd877d
KR
1472 /* In case md_estimate_size_before_relax() wants to make fixSs. */
1473 subseg_change (segment, 0);
1474
7f2cb270
KR
1475 /* For each frag in segment: count and store (a 1st guess of)
1476 fr_address. */
6efd877d
KR
1477 address = 0;
1478 for (fragP = segment_frag_root; fragP; fragP = fragP->fr_next)
1479 {
1480 fragP->fr_address = address;
1481 address += fragP->fr_fix;
1482
1483 switch (fragP->fr_type)
1484 {
1485 case rs_fill:
1486 address += fragP->fr_offset * fragP->fr_var;
1487 break;
1488
1489 case rs_align:
d5364748 1490 address += relax_align (address, (int) fragP->fr_offset);
6efd877d
KR
1491 break;
1492
1493 case rs_org:
7f2cb270 1494 /* Assume .org is nugatory. It will grow with 1st relax. */
6efd877d
KR
1495 break;
1496
1497 case rs_machine_dependent:
1498 address += md_estimate_size_before_relax (fragP, segment);
1499 break;
1500
fecd2382 1501#ifndef WORKING_DOT_WORD
6efd877d
KR
1502 /* Broken words don't concern us yet */
1503 case rs_broken_word:
1504 break;
fecd2382 1505#endif
6efd877d
KR
1506
1507 default:
1508 BAD_CASE (fragP->fr_type);
1509 break;
1510 } /* switch(fr_type) */
1511 } /* for each frag in the segment */
1512
7f2cb270 1513 /* Do relax(). */
6efd877d 1514 {
7f2cb270 1515 long stretch; /* May be any size, 0 or negative. */
6efd877d
KR
1516 /* Cumulative number of addresses we have */
1517 /* relaxed this pass. */
1518 /* We may have relaxed more than one address. */
7f2cb270
KR
1519 long stretched; /* Have we stretched on this pass? */
1520 /* This is 'cuz stretch may be zero, when, in fact some piece of code
1521 grew, and another shrank. If a branch instruction doesn't fit anymore,
1522 we could be scrod. */
6efd877d
KR
1523
1524 do
1525 {
1526 stretch = stretched = 0;
1527 for (fragP = segment_frag_root; fragP; fragP = fragP->fr_next)
1528 {
7f2cb270
KR
1529 long growth = 0;
1530 unsigned long was_address;
1531 long offset;
1532 symbolS *symbolP;
1533 long target;
1534 long after;
6efd877d
KR
1535
1536 was_address = fragP->fr_address;
1537 address = fragP->fr_address += stretch;
1538 symbolP = fragP->fr_symbol;
1539 offset = fragP->fr_offset;
6efd877d
KR
1540
1541 switch (fragP->fr_type)
1542 {
1543 case rs_fill: /* .fill never relaxes. */
1544 growth = 0;
1545 break;
1546
fecd2382 1547#ifndef WORKING_DOT_WORD
6efd877d 1548 /* JF: This is RMS's idea. I do *NOT* want to be blamed
7f2cb270
KR
1549 for it I do not want to write it. I do not want to have
1550 anything to do with it. This is not the proper way to
1551 implement this misfeature. */
6efd877d
KR
1552 case rs_broken_word:
1553 {
1554 struct broken_word *lie;
1555 struct broken_word *untruth;
6efd877d
KR
1556
1557 /* Yes this is ugly (storing the broken_word pointer
7f2cb270
KR
1558 in the symbol slot). Still, this whole chunk of
1559 code is ugly, and I don't feel like doing anything
1560 about it. Think of it as stubbornness in action. */
6efd877d
KR
1561 growth = 0;
1562 for (lie = (struct broken_word *) (fragP->fr_symbol);
1563 lie && lie->dispfrag == fragP;
1564 lie = lie->next_broken_word)
1565 {
1566
1567 if (lie->added)
1568 continue;
1569
7f2cb270
KR
1570 offset = (lie->add->sy_frag->fr_address
1571 + S_GET_VALUE (lie->add)
1572 + lie->addnum
1573 - (lie->sub->sy_frag->fr_address
1574 + S_GET_VALUE (lie->sub)));
6efd877d
KR
1575 if (offset <= -32768 || offset >= 32767)
1576 {
1577 if (flagseen['K'])
d5364748
KR
1578 {
1579 char buf[50];
80aab579 1580 sprint_value (buf, (addressT) lie->addnum);
d5364748
KR
1581 as_warn (".word %s-%s+%s didn't fit",
1582 S_GET_NAME (lie->add),
1583 S_GET_NAME (lie->sub),
1584 buf);
1585 }
6efd877d
KR
1586 lie->added = 1;
1587 if (fragP->fr_subtype == 0)
1588 {
1589 fragP->fr_subtype++;
1590 growth += md_short_jump_size;
1591 }
7f2cb270
KR
1592 for (untruth = lie->next_broken_word;
1593 untruth && untruth->dispfrag == lie->dispfrag;
1594 untruth = untruth->next_broken_word)
6efd877d
KR
1595 if ((untruth->add->sy_frag == lie->add->sy_frag)
1596 && S_GET_VALUE (untruth->add) == S_GET_VALUE (lie->add))
1597 {
1598 untruth->added = 2;
1599 untruth->use_jump = lie;
1600 }
1601 growth += md_long_jump_size;
1602 }
1603 }
1604
1605 break;
1606 } /* case rs_broken_word */
fecd2382 1607#endif
6efd877d 1608 case rs_align:
43ca9aa6
KR
1609 growth = (relax_align ((relax_addressT) (address
1610 + fragP->fr_fix),
d5364748 1611 (int) offset)
43ca9aa6
KR
1612 - relax_align ((relax_addressT) (was_address
1613 + fragP->fr_fix),
d5364748 1614 (int) offset));
6efd877d
KR
1615 break;
1616
1617 case rs_org:
1618 target = offset;
1619
1620 if (symbolP)
1621 {
43ca9aa6
KR
1622#if !defined (MANY_SEGMENTS) && !defined (BFD_ASSEMBLER)
1623 know ((S_GET_SEGMENT (symbolP) == SEG_ABSOLUTE)
1624 || (S_GET_SEGMENT (symbolP) == SEG_DATA)
1625 || (S_GET_SEGMENT (symbolP) == SEG_TEXT)
1626 || S_GET_SEGMENT (symbolP) == SEG_BSS);
6efd877d 1627 know (symbolP->sy_frag);
43ca9aa6
KR
1628 know (!(S_GET_SEGMENT (symbolP) == SEG_ABSOLUTE)
1629 || (symbolP->sy_frag == &zero_address_frag));
45432836 1630#endif
6efd877d
KR
1631 target += S_GET_VALUE (symbolP)
1632 + symbolP->sy_frag->fr_address;
1633 } /* if we have a symbol */
1634
1635 know (fragP->fr_next);
1636 after = fragP->fr_next->fr_address;
1637 growth = ((target - after) > 0) ? (target - after) : 0;
43ca9aa6
KR
1638 /* Growth may be negative, but variable part of frag
1639 cannot have fewer than 0 chars. That is, we can't
1640 .org backwards. */
6efd877d
KR
1641
1642 growth -= stretch; /* This is an absolute growth factor */
1643 break;
1644
1645 case rs_machine_dependent:
1646 {
7f2cb270
KR
1647 const relax_typeS *this_type;
1648 const relax_typeS *start_type;
1649 relax_substateT next_state;
1650 relax_substateT this_state;
80aab579 1651 long aim;
6efd877d 1652
7f2cb270
KR
1653 this_state = fragP->fr_subtype;
1654 start_type = this_type = md_relax_table + this_state;
6efd877d
KR
1655 target = offset;
1656
1657 if (symbolP)
1658 {
80aab579 1659#ifndef DIFF_EXPR_OK
43ca9aa6
KR
1660#if !defined (MANY_SEGMENTS) && !defined (BFD_ASSEMBLER)
1661 know ((S_GET_SEGMENT (symbolP) == SEG_ABSOLUTE)
1662 || (S_GET_SEGMENT (symbolP) == SEG_DATA)
1663 || (S_GET_SEGMENT (symbolP) == SEG_BSS)
1664 || (S_GET_SEGMENT (symbolP) == SEG_TEXT));
45432836 1665#endif
6efd877d 1666 know (symbolP->sy_frag);
80aab579 1667#endif
43ca9aa6
KR
1668 know (!(S_GET_SEGMENT (symbolP) == absolute_section)
1669 || symbolP->sy_frag == &zero_address_frag);
6efd877d
KR
1670 target +=
1671 S_GET_VALUE (symbolP)
1672 + symbolP->sy_frag->fr_address;
1673
1674 /* If frag has yet to be reached on this pass,
7f2cb270
KR
1675 assume it will move by STRETCH just as we did.
1676 If this is not so, it will be because some frag
d5364748
KR
1677 between grows, and that will force another pass.
1678
1679 Beware zero-length frags.
1680
1681 There should be a faster way to do this. */
6efd877d
KR
1682
1683 if (symbolP->sy_frag->fr_address >= was_address
1684 && is_dnrange (fragP, symbolP->sy_frag))
1685 {
1686 target += stretch;
7f2cb270 1687 }
d5364748 1688 }
6efd877d
KR
1689
1690 aim = target - address - fragP->fr_fix;
1691 /* The displacement is affected by the instruction size
7f2cb270
KR
1692 for the 32k architecture. I think we ought to be able
1693 to add fragP->fr_pcrel_adjust in all cases (it should be
1694 zero if not used), but just in case it breaks something
1695 else we'll put this inside #ifdef NS32K ... #endif */
d5364748
KR
1696#ifndef TC_NS32K
1697 if (fragP->fr_pcrel_adjust)
1698 abort ();
1699#endif
6efd877d 1700 aim += fragP->fr_pcrel_adjust;
6efd877d
KR
1701
1702 if (aim < 0)
1703 {
1704 /* Look backwards. */
1705 for (next_state = this_type->rlx_more; next_state;)
7f2cb270
KR
1706 if (aim >= this_type->rlx_backward)
1707 next_state = 0;
1708 else
1709 {
1710 /* Grow to next state. */
1711 this_state = next_state;
1712 this_type = md_relax_table + this_state;
1713 next_state = this_type->rlx_more;
1714 }
6efd877d
KR
1715 }
1716 else
1717 {
a39116f1 1718#ifdef M68K_AIM_KLUDGE
6efd877d 1719 M68K_AIM_KLUDGE (aim, this_state, this_type);
fecd2382 1720#endif
6efd877d
KR
1721 /* Look forwards. */
1722 for (next_state = this_type->rlx_more; next_state;)
7f2cb270
KR
1723 if (aim <= this_type->rlx_forward)
1724 next_state = 0;
1725 else
1726 {
1727 /* Grow to next state. */
1728 this_state = next_state;
1729 this_type = md_relax_table + this_state;
1730 next_state = this_type->rlx_more;
1731 }
6efd877d
KR
1732 }
1733
7f2cb270
KR
1734 growth = this_type->rlx_length - start_type->rlx_length;
1735 if (growth != 0)
6efd877d 1736 fragP->fr_subtype = this_state;
7f2cb270
KR
1737 }
1738 break;
6efd877d
KR
1739
1740 default:
1741 BAD_CASE (fragP->fr_type);
1742 break;
1743 }
1744 if (growth)
1745 {
1746 stretch += growth;
1747 stretched++;
1748 }
1749 } /* For each frag in the segment. */
1750 }
1751 while (stretched); /* Until nothing further to relax. */
1752 } /* do_relax */
1753
1754 /*
7f2cb270
KR
1755 * We now have valid fr_address'es for each frag.
1756 */
6efd877d
KR
1757
1758 /*
7f2cb270
KR
1759 * All fr_address's are correct, relative to their own segment.
1760 * We have made all the fixS we will ever make.
1761 */
6efd877d 1762} /* relax_segment() */
fecd2382 1763
80aab579
ILT
1764#if defined (BFD_ASSEMBLER) || !defined (BFD)
1765
fecd2382 1766/* fixup_segment()
6efd877d 1767
fecd2382
RP
1768 Go through all the fixS's in a segment and see which ones can be
1769 handled now. (These consist of fixS where we have since discovered
1770 the value of a symbol, or the address of the frag involved.)
1771 For each one, call md_apply_fix to put the fix into the frag data.
6efd877d 1772
fecd2382
RP
1773 Result is a count of how many relocation structs will be needed to
1774 handle the remaining fixS's that we couldn't completely handle here.
1775 These will be output later by emit_relocations(). */
1776
09952cd9 1777static long
6efd877d 1778fixup_segment (fixP, this_segment_type)
09952cd9 1779 register fixS *fixP;
6efd877d 1780 segT this_segment_type; /* N_TYPE bits for segment. */
fecd2382 1781{
6efd877d
KR
1782 register long seg_reloc_count;
1783 register symbolS *add_symbolP;
1784 register symbolS *sub_symbolP;
d5364748 1785 valueT add_number;
6efd877d
KR
1786 register int size;
1787 register char *place;
1788 register long where;
1789 register char pcrel;
1790 register fragS *fragP;
43ca9aa6 1791 register segT add_symbol_segment = absolute_section;
6efd877d 1792
6efd877d 1793 seg_reloc_count = 0;
13e9182d
KR
1794 /* If the linker is doing the relaxing, we must not do any fixups. */
1795 /* Well, strictly speaking that's not true -- we could do any that
1796 are PC-relative and don't cross regions that could change size.
1797 And for the i960 (the only machine for which we've got a relaxing
1798 linker right now), we might be able to turn callx/callj into bal
1799 in cases where we know the maximum displacement. */
6efd877d 1800 if (linkrelax)
43ca9aa6
KR
1801 for (; fixP; fixP = fixP->fx_next)
1802 seg_reloc_count++;
6efd877d 1803 else
6efd877d
KR
1804 for (; fixP; fixP = fixP->fx_next)
1805 {
1806 fragP = fixP->fx_frag;
1807 know (fragP);
1808 where = fixP->fx_where;
1809 place = fragP->fr_literal + where;
1810 size = fixP->fx_size;
1811 add_symbolP = fixP->fx_addsy;
fecd2382 1812#ifdef TC_I960
6efd877d
KR
1813 if (fixP->fx_callj && TC_S_IS_CALLNAME (add_symbolP))
1814 {
43ca9aa6
KR
1815 /* Relocation should be done via the associated 'bal'
1816 entry point symbol. */
6efd877d
KR
1817
1818 if (!TC_S_IS_BALNAME (tc_get_bal_of_call (add_symbolP)))
1819 {
1820 as_bad ("No 'bal' entry point for leafproc %s",
1821 S_GET_NAME (add_symbolP));
1822 continue;
1823 }
1824 fixP->fx_addsy = add_symbolP = tc_get_bal_of_call (add_symbolP);
43ca9aa6 1825 }
fecd2382 1826#endif
6efd877d
KR
1827 sub_symbolP = fixP->fx_subsy;
1828 add_number = fixP->fx_offset;
1829 pcrel = fixP->fx_pcrel;
1830
1831 if (add_symbolP)
43ca9aa6 1832 add_symbol_segment = S_GET_SEGMENT (add_symbolP);
6efd877d
KR
1833
1834 if (sub_symbolP)
1835 {
1836 if (!add_symbolP)
1837 {
1838 /* Its just -sym */
80aab579 1839 /* @@ Should try converting to pcrel ref to fixed addr. */
43ca9aa6
KR
1840 if (S_GET_SEGMENT (sub_symbolP) != absolute_section)
1841 as_bad ("Negative of non-absolute symbol %s",
1842 S_GET_NAME (sub_symbolP));
6efd877d
KR
1843
1844 add_number -= S_GET_VALUE (sub_symbolP);
6efd877d
KR
1845 }
1846 else if ((S_GET_SEGMENT (sub_symbolP) == add_symbol_segment)
1847 && (SEG_NORMAL (add_symbol_segment)
43ca9aa6 1848 || (add_symbol_segment == absolute_section)))
6efd877d 1849 {
43ca9aa6
KR
1850 /* Difference of 2 symbols from same segment.
1851 Can't make difference of 2 undefineds: 'value' means
1852 something different for N_UNDF. */
fecd2382 1853#ifdef TC_I960
6efd877d 1854 /* Makes no sense to use the difference of 2 arbitrary symbols
43ca9aa6 1855 as the target of a call instruction. */
6efd877d
KR
1856 if (fixP->fx_callj)
1857 {
1858 as_bad ("callj to difference of 2 symbols");
1859 }
1860#endif /* TC_I960 */
1861 add_number += S_GET_VALUE (add_symbolP) -
1862 S_GET_VALUE (sub_symbolP);
1863
1864 add_symbolP = NULL;
1865 fixP->fx_addsy = NULL;
1866 }
1867 else
1868 {
1869 /* Different segments in subtraction. */
43ca9aa6
KR
1870 know (!(S_IS_EXTERNAL (sub_symbolP)
1871 && (S_GET_SEGMENT (sub_symbolP) == absolute_section)));
6efd877d 1872
43ca9aa6 1873 if ((S_GET_SEGMENT (sub_symbolP) == absolute_section))
6efd877d
KR
1874 {
1875 add_number -= S_GET_VALUE (sub_symbolP);
1876 }
80aab579
ILT
1877#ifdef DIFF_EXPR_OK
1878 else if (!pcrel
1879 && S_GET_SEGMENT (sub_symbolP) == this_segment_type)
1880 {
1881 /* Make it pc-relative. */
1882 add_number += (md_pcrel_from (fixP)
1883 - S_GET_VALUE (sub_symbolP));
1884 pcrel = 1;
1885 fixP->fx_pcrel = 1;
1886 sub_symbolP = 0;
1887 fixP->fx_subsy = 0;
1888 }
1889#endif
6efd877d
KR
1890 else
1891 {
d5364748
KR
1892 char buf[50];
1893 sprint_value (buf, fragP->fr_address + where);
1894 as_bad ("Can't emit reloc {- %s-seg symbol \"%s\"} @ file address %s.",
6efd877d 1895 segment_name (S_GET_SEGMENT (sub_symbolP)),
d5364748
KR
1896 S_GET_NAME (sub_symbolP), buf);
1897 }
6efd877d 1898 }
d5364748 1899 }
6efd877d
KR
1900
1901 if (add_symbolP)
1902 {
1903 if (add_symbol_segment == this_segment_type && pcrel)
1904 {
1905 /*
43ca9aa6
KR
1906 * This fixup was made when the symbol's segment was
1907 * SEG_UNKNOWN, but it is now in the local segment.
1908 * So we know how to do the address without relocation.
1909 */
fecd2382 1910#ifdef TC_I960
43ca9aa6
KR
1911 /* reloc_callj() may replace a 'call' with a 'calls' or a
1912 'bal', in which cases it modifies *fixP as appropriate.
1913 In the case of a 'calls', no further work is required,
1914 and *fixP has been set up to make the rest of the code
1915 below a no-op. */
6efd877d 1916 reloc_callj (fixP);
fecd2382 1917#endif /* TC_I960 */
6efd877d
KR
1918
1919 add_number += S_GET_VALUE (add_symbolP);
1920 add_number -= md_pcrel_from (fixP);
1921 pcrel = 0; /* Lie. Don't want further pcrel processing. */
1922 fixP->fx_addsy = NULL; /* No relocations please. */
1923 }
1924 else
1925 {
43ca9aa6 1926 if (add_symbol_segment == absolute_section)
6efd877d 1927 {
fecd2382 1928#ifdef TC_I960
43ca9aa6
KR
1929 /* See comment about reloc_callj() above. */
1930 reloc_callj (fixP);
fecd2382 1931#endif /* TC_I960 */
6efd877d
KR
1932 add_number += S_GET_VALUE (add_symbolP);
1933 fixP->fx_addsy = NULL;
1934 add_symbolP = NULL;
43ca9aa6
KR
1935 }
1936 else if (add_symbol_segment == undefined_section
1937#ifdef BFD_ASSEMBLER
13e9182d 1938 || bfd_is_com_section (add_symbol_segment)
43ca9aa6
KR
1939#endif
1940 )
1941 {
fecd2382 1942#ifdef TC_I960
6efd877d
KR
1943 if ((int) fixP->fx_bit_fixP == 13)
1944 {
1945 /* This is a COBR instruction. They have only a
43ca9aa6
KR
1946 * 13-bit displacement and are only to be used
1947 * for local branches: flag as error, don't generate
1948 * relocation.
1949 */
6efd877d
KR
1950 as_bad ("can't use COBR format with external label");
1951 fixP->fx_addsy = NULL; /* No relocations please. */
1952 continue;
1953 } /* COBR */
fecd2382 1954#endif /* TC_I960 */
6d5460ab 1955
fecd2382 1956#ifdef OBJ_COFF
c593cf41 1957#ifdef TE_I386AIX
6efd877d
KR
1958 if (S_IS_COMMON (add_symbolP))
1959 add_number += S_GET_VALUE (add_symbolP);
c593cf41 1960#endif /* TE_I386AIX */
fecd2382 1961#endif /* OBJ_COFF */
6efd877d 1962 ++seg_reloc_count;
43ca9aa6
KR
1963 }
1964 else
1965 {
1966 seg_reloc_count++;
1967 add_number += S_GET_VALUE (add_symbolP);
1968 }
6efd877d
KR
1969 } /* if not in local seg */
1970 } /* if there was a + symbol */
1971
1972 if (pcrel)
1973 {
1974 add_number -= md_pcrel_from (fixP);
1975 if (add_symbolP == 0)
1976 {
1977 fixP->fx_addsy = &abs_symbol;
1978 ++seg_reloc_count;
1979 } /* if there's an add_symbol */
1980 } /* if pcrel */
1981
1982 if (!fixP->fx_bit_fixP)
1983 {
13e9182d
KR
1984 valueT mask = 0;
1985 /* set all bits to one */
1986 mask--;
1987 /* Technically speaking, combining these produces an
1988 undefined result if size is sizeof (valueT), though I
1989 think these two half-way operations should both be
1990 defined. */
1991 mask <<= size * 4;
1992 mask <<= size * 4;
1993 if ((add_number & mask) != 0
1994 && (add_number & mask) != mask)
6efd877d 1995 {
d5364748
KR
1996 char buf[50];
1997 sprint_value (buf, fragP->fr_address + where);
58d4951d
ILT
1998 as_bad ("Value of %ld too large for field of %d bytes at %s",
1999 (long) add_number, size, buf);
6efd877d
KR
2000 } /* generic error checking */
2001#ifdef WARN_SIGNED_OVERFLOW_WORD
43ca9aa6
KR
2002 /* Warn if a .word value is too large when treated as a signed
2003 number. We already know it is not too negative. This is to
2004 catch over-large switches generated by gcc on the 68k. */
6efd877d
KR
2005 if (!flagseen['J']
2006 && size == 2
2007 && add_number > 0x7fff)
80aab579
ILT
2008 as_bad ("Signed .word overflow; switch may be too large; %ld at 0x%lx",
2009 (long) add_number,
2010 (unsigned long) (fragP->fr_address + where));
6efd877d
KR
2011#endif
2012 } /* not a bit fix */
2013
43ca9aa6
KR
2014#ifdef BFD_ASSEMBLER
2015 md_apply_fix (fixP, &add_number);
2016#else
6efd877d 2017 md_apply_fix (fixP, add_number);
43ca9aa6 2018#endif
6efd877d
KR
2019 } /* For each fixS in this segment. */
2020
13e9182d 2021#if defined (OBJ_COFF) && defined (TC_I960)
6efd877d
KR
2022 {
2023 fixS *topP = fixP;
2024
2025 /* two relocs per callj under coff. */
2026 for (fixP = topP; fixP; fixP = fixP->fx_next)
13e9182d
KR
2027 if (fixP->fx_callj && fixP->fx_addsy != 0)
2028 ++seg_reloc_count;
6efd877d 2029 }
13e9182d 2030#endif /* OBJ_COFF && TC_I960 */
6efd877d 2031
6efd877d 2032 return (seg_reloc_count);
d5364748 2033}
fecd2382 2034
80aab579
ILT
2035#endif /* defined (BFD_ASSEMBLER) || !defined (BFD) */
2036
fecd2382 2037/* end of write.c */
This page took 0.180445 seconds and 4 git commands to generate.