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