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