1 /* write.c - emit .o file
3 Copyright (C) 1986, 1987, 1990, 1991, 1992 Free Software Foundation, Inc.
5 This file is part of GAS, the GNU Assembler.
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)
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.
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
19 the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */
21 /* This thing should be set up to do byteordering correctly. But... */
26 #include "output-file.h"
28 /* The NOP_OPCODE is for the alignment fill value.
29 * fill it a nop instruction so that the disassembler does not choke
33 #define NOP_OPCODE 0x00
37 struct frag *text_frag_root;
38 struct frag *data_frag_root;
39 struct frag *bss_frag_root;
41 struct frag *text_last_frag; /* Last frag in segment. */
42 struct frag *data_last_frag; /* Last frag in segment. */
43 static struct frag *bss_last_frag; /* Last frag in segment. */
46 static object_headers headers;
48 long string_byte_count;
50 static char *the_object_file;
52 char *next_object_file_charP; /* Tracks object file bytes. */
55 int magic_number_for_object_file = DEFAULT_MAGIC_NUMBER_FOR_OBJECT_FILE;
58 static int is_dnrange PARAMS ((struct frag * f1, struct frag * f2));
59 static long fixup_segment PARAMS ((fixS * fixP, segT this_segment_type));
60 static relax_addressT relax_align PARAMS ((relax_addressT addr, long align));
61 void relax_segment PARAMS ((struct frag * seg_frag_root, segT seg_type));
66 * Create a fixS in obstack 'notes'.
69 fix_new (frag, where, size, add_symbol, sub_symbol, offset, pcrel, r_type)
70 fragS *frag; /* Which frag? */
71 int where; /* Where in that frag? */
72 short int size; /* 1, 2, or 4 usually. */
73 symbolS *add_symbol; /* X_add_symbol. */
74 symbolS *sub_symbol; /* X_subtract_symbol. */
75 long offset; /* X_add_number. */
76 int pcrel; /* TRUE if PC-relative relocation. */
77 int r_type; /* Relocation type */
81 fixP = (fixS *) obstack_alloc (¬es, sizeof (fixS));
84 fixP->fx_where = where;
86 fixP->fx_addsy = add_symbol;
87 fixP->fx_subsy = sub_symbol;
88 fixP->fx_offset = offset;
89 fixP->fx_pcrel = pcrel;
90 #if defined(TC_SPARC) || defined(TC_A29K) || defined( NEED_FX_R_TYPE)
91 fixP->fx_r_type = r_type;
93 /* JF these 'cuz of the NS32K stuff */
95 fixP->fx_pcrel_adjust = 0;
97 fixP->fx_bit_fixP = 0;
99 /* usually, we want relocs sorted numerically, but while
100 comparing to older versions of gas that have relocs
101 reverse sorted, it is convenient to have this compile
102 time option. xoxorich. */
104 #ifdef REVERSE_SORT_RELOCS
106 fixP->fx_next = *seg_fix_rootP;
107 *seg_fix_rootP = fixP;
109 #else /* REVERSE_SORT_RELOCS */
111 fixP->fx_next = NULL;
114 (*seg_fix_tailP)->fx_next = fixP;
116 *seg_fix_rootP = fixP;
117 *seg_fix_tailP = fixP;
119 #endif /* REVERSE_SORT_RELOCS */
128 remove_subsegs (head, seg, root, last)
135 fragS *prev_frag = &dummy;
136 *root = head->frch_root;
137 while (head && head->frch_seg == seg)
139 prev_frag->fr_next = head->frch_root;
141 prev_frag = head->frch_last;
142 head = head->frch_next;
145 prev_frag->fr_next = 0;
151 register struct frchain *frchainP; /* Track along all frchains. */
152 register fragS *fragP; /* Track along all frags. */
153 register struct frchain *next_frchainP;
154 register fragS **prev_fragPP;
155 unsigned int data_siz;
157 long object_file_size;
161 * Under VMS we try to be compatible with VAX-11 "C". Thus, we
162 * call a routine to check for the definition of the procedure
163 * "_main", and if so -- fix it up so that it can be program
166 VMS_Check_For_Main ();
169 * After every sub-segment, we fake an ".align ...". This conforms to
170 * BSD4.2 brane-damage. We then fake ".fill 0" because that is the
171 * kind of frag that requires least thought. ".align" frags like to
172 * have a following frag since that makes calculating their intended
175 #ifndef SUB_SEGMENT_ALIGN
176 #define SUB_SEGMENT_ALIGN (2)
178 for (frchainP = frchain_root; frchainP; frchainP = frchainP->frch_next)
182 * Under VAX/VMS, the linker (and PSECT specifications)
183 * take care of correctly aligning the segments.
184 * Doing the alignment here (on initialized data) can
185 * mess up the calculation of global data PSECT sizes.
187 #undef SUB_SEGMENT_ALIGN
188 #define SUB_SEGMENT_ALIGN ((frchainP->frch_seg != SEG_DATA) ? 2 : 0)
190 subseg_new (frchainP->frch_seg, frchainP->frch_subseg);
191 frag_align (SUB_SEGMENT_ALIGN, NOP_OPCODE);
192 /* frag_align will have left a new frag. */
193 /* Use this last frag for an empty ".fill". */
195 * For this segment ...
196 * Create a last frag. Do not leave a "being filled in frag".
198 frag_wane (frag_now);
199 frag_now->fr_fix = 0;
200 know (frag_now->fr_next == NULL);
201 /* know( frags . obstack_c_base == frags . obstack_c_next_free ); */
202 /* Above shows we haven't left a half-completed object on obstack. */
203 } /* walk the frag chain */
206 * From now on, we don't care about sub-segments.
207 * Build one frag chain for each segment. Linked thru fr_next.
208 * We know that there is at least 1 text frchain & at least 1 data
212 remove_subsegs (frchain_root, SEG_TEXT, &text_frag_root, &text_last_frag);
213 remove_subsegs (data0_frchainP, SEG_DATA, &data_frag_root, &data_last_frag);
214 remove_subsegs (bss0_frchainP, SEG_BSS, &bss_frag_root, &bss_last_frag);
217 * We have two segments. If user gave -R flag, then we must put the
218 * data frags into the text segment. Do this before relaxing so
219 * we know to take advantage of -R and make shorter addresses.
226 text_last_frag->fr_next = data_frag_root;
227 text_last_frag = data_last_frag;
228 data_last_frag = NULL;
229 data_frag_root = NULL;
232 for (tmp = text_fix_root; tmp->fx_next; tmp = tmp->fx_next);;
233 tmp->fx_next = data_fix_root;
234 text_fix_tail = data_fix_tail;
237 text_fix_root = data_fix_root;
238 data_fix_root = NULL;
241 relax_segment (text_frag_root, SEG_TEXT);
242 relax_segment (data_frag_root, SEG_DATA);
243 relax_segment (bss_frag_root, SEG_BSS);
245 * Now the addresses of frags are correct within the segment.
248 know (text_last_frag->fr_type == rs_fill && text_last_frag->fr_offset == 0);
249 H_SET_TEXT_SIZE (&headers, text_last_frag->fr_address);
250 text_last_frag->fr_address = H_GET_TEXT_SIZE (&headers);
253 * Join the 2 segments into 1 huge segment.
254 * To do this, re-compute every rn_address in the SEG_DATA frags.
255 * Then join the data frags after the text frags.
257 * Determine a_data [length of data segment].
261 register relax_addressT slide;
263 know ((text_last_frag->fr_type == rs_fill) && (text_last_frag->fr_offset == 0));
265 H_SET_DATA_SIZE (&headers, data_last_frag->fr_address);
266 data_last_frag->fr_address = H_GET_DATA_SIZE (&headers);
267 slide = H_GET_TEXT_SIZE (&headers); /* & in file of the data segment. */
269 #define RoundUp(N,S) (((N)+(S)-1)&-(S))
270 /* For b.out: If the data section has a strict alignment
271 requirement, its load address in the .o file will be
272 rounded up from the size of the text section. These
273 two values are *not* the same! Similarly for the bss
275 slide = RoundUp (slide, 1 << section_alignment[SEG_DATA]);
278 for (fragP = data_frag_root; fragP; fragP = fragP->fr_next)
280 fragP->fr_address += slide;
281 } /* for each data frag */
283 know (text_last_frag != 0);
284 text_last_frag->fr_next = data_frag_root;
288 H_SET_DATA_SIZE (&headers, 0);
293 /* See above comments on b.out data section address. */
296 if (data_last_frag == 0)
297 bss_vma = H_GET_TEXT_SIZE (&headers);
299 bss_vma = data_last_frag->fr_address;
300 bss_vma = RoundUp (bss_vma, 1 << section_alignment[SEG_BSS]);
301 bss_address_frag.fr_address = bss_vma;
304 bss_address_frag.fr_address = (H_GET_TEXT_SIZE (&headers) +
305 H_GET_DATA_SIZE (&headers));
308 /* Slide all the frags */
311 relax_addressT slide = bss_address_frag.fr_address + local_bss_counter;
313 for (fragP = bss_frag_root; fragP; fragP = fragP->fr_next)
315 fragP->fr_address += slide;
316 } /* for each bss frag */
322 local_bss_counter += bss_last_frag->fr_address - bss_frag_root->fr_address;
324 H_SET_BSS_SIZE (&headers, local_bss_counter);
328 * Crawl the symbol chain.
330 * For each symbol whose value depends on a frag, take the address of
331 * that frag and subsume it into the value of the symbol.
332 * After this, there is just one way to lookup a symbol value.
333 * Values are left in their final state for object file emission.
334 * We adjust the values of 'L' local symbols, even if we do
335 * not intend to emit them to the object file, because their values
336 * are needed for fix-ups.
338 * Unless we saw a -L flag, remove all symbols that begin with 'L'
339 * from the symbol chain. (They are still pointed to by the fixes.)
341 * Count the remaining symbols.
342 * Assign a symbol number to each symbol.
343 * Count the number of string-table chars we will emit.
344 * Put this info into the headers as appropriate.
347 know (zero_address_frag.fr_address == 0);
348 string_byte_count = sizeof (string_byte_count);
350 obj_crawl_symbol_chain (&headers);
352 if (string_byte_count == sizeof (string_byte_count))
354 string_byte_count = 0;
355 } /* if no strings, then no count. */
357 H_SET_STRING_SIZE (&headers, string_byte_count);
360 * Addresses of frags now reflect addresses we use in the object file.
361 * Symbol values are correct.
362 * Scan the frags, converting any ".org"s and ".align"s to ".fill"s.
363 * Also converting any machine-dependent frags using md_convert_frag();
365 subseg_change (SEG_TEXT, 0);
367 for (fragP = text_frag_root; fragP; fragP = fragP->fr_next)
369 switch (fragP->fr_type)
374 HANDLE_ALIGN (fragP);
376 fragP->fr_type = rs_fill;
377 know (fragP->fr_var == 1);
378 know (fragP->fr_next != NULL);
380 fragP->fr_offset = (fragP->fr_next->fr_address
388 case rs_machine_dependent:
389 md_convert_frag (&headers, fragP);
391 know ((fragP->fr_next == NULL) || ((fragP->fr_next->fr_address - fragP->fr_address) == fragP->fr_fix));
394 * After md_convert_frag, we make the frag into a ".space 0".
395 * Md_convert_frag() should set up any fixSs and constants
401 #ifndef WORKING_DOT_WORD
404 struct broken_word *lie;
405 extern md_short_jump_size;
406 extern md_long_jump_size;
408 if (fragP->fr_subtype)
410 fragP->fr_fix += md_short_jump_size;
411 for (lie = (struct broken_word *) (fragP->fr_symbol); lie && lie->dispfrag == fragP; lie = lie->next_broken_word)
413 fragP->fr_fix += md_long_jump_size;
421 BAD_CASE (fragP->fr_type);
423 } /* switch (fr_type) */
425 if (!((fragP->fr_next == NULL)
427 || (fragP->fr_next == data_frag_root)
429 || ((fragP->fr_next->fr_address - fragP->fr_address)
430 == (fragP->fr_fix + (fragP->fr_offset * fragP->fr_var)))))
432 fprintf (stderr, "assertion failed: file `%s', line %d\n",
433 __FILE__, __LINE__ - 4);
436 } /* for each frag. */
438 #ifndef WORKING_DOT_WORD
440 struct broken_word *lie;
441 struct broken_word **prevP;
443 prevP = &broken_words;
444 for (lie = broken_words; lie; lie = lie->next_broken_word)
448 fix_new_ns32k (lie->frag,
449 lie->word_goes_here - lie->frag->fr_literal,
456 # if defined(TC_SPARC) || defined(TC_A29K) || defined(NEED_FX_R_TYPE)
457 fix_new (lie->frag, lie->word_goes_here - lie->frag->fr_literal,
459 lie->sub, lie->addnum,
462 fix_new (lie->frag, lie->word_goes_here - lie->frag->fr_literal,
464 lie->sub, lie->addnum,
467 # endif /* tc_sparc|tc_a29k|need_fx_r_type */
468 #endif /* TC_NS32K */
469 /* md_number_to_chars(lie->word_goes_here,
470 S_GET_VALUE(lie->add)
472 - S_GET_VALUE(lie->sub),
474 *prevP = lie->next_broken_word;
477 prevP = &(lie->next_broken_word);
479 for (lie = broken_words; lie;)
481 struct broken_word *untruth;
484 long from_addr, to_addr;
487 extern md_short_jump_size;
488 extern md_long_jump_size;
490 fragP = lie->dispfrag;
492 /* Find out how many broken_words go here */
494 for (untruth = lie; untruth && untruth->dispfrag == fragP; untruth = untruth->next_broken_word)
495 if (untruth->added == 1)
498 table_ptr = lie->dispfrag->fr_opcode;
499 table_addr = lie->dispfrag->fr_address + (table_ptr - lie->dispfrag->fr_literal);
500 /* Create the jump around the long jumps */
501 /* This is a short jump from table_ptr+0 to table_ptr+n*long_jump_size */
502 from_addr = table_addr;
503 to_addr = table_addr + md_short_jump_size + n * md_long_jump_size;
504 md_create_short_jump (table_ptr, from_addr, to_addr, lie->dispfrag, lie->add);
505 table_ptr += md_short_jump_size;
506 table_addr += md_short_jump_size;
508 for (m = 0; lie && lie->dispfrag == fragP; m++, lie = lie->next_broken_word)
512 /* Patch the jump table */
513 /* This is the offset from ??? to table_ptr+0 */
515 - S_GET_VALUE (lie->sub);
516 md_number_to_chars (lie->word_goes_here, to_addr, 2);
517 for (untruth = lie->next_broken_word; untruth && untruth->dispfrag == fragP; untruth = untruth->next_broken_word)
519 if (untruth->use_jump == lie)
520 md_number_to_chars (untruth->word_goes_here, to_addr, 2);
523 /* Install the long jump */
524 /* this is a long jump from table_ptr+0 to the final target */
525 from_addr = table_addr;
526 to_addr = S_GET_VALUE (lie->add) + lie->addnum;
527 md_create_long_jump (table_ptr, from_addr, to_addr, lie->dispfrag, lie->add);
528 table_ptr += md_long_jump_size;
529 table_addr += md_long_jump_size;
533 #endif /* not WORKING_DOT_WORD */
538 * Scan every FixS performing fixups. We had to wait until now to do
539 * this because md_convert_frag() may have made some fixSs.
543 subseg_change (SEG_TEXT, 0);
544 trsize = md_reloc_size * fixup_segment (text_fix_root,
546 subseg_change (SEG_DATA, 0);
547 drsize = md_reloc_size * fixup_segment (data_fix_root,
549 H_SET_RELOCATION_SIZE (&headers, trsize, drsize);
551 /* FIXME move this stuff into the pre-write-hook */
552 H_SET_MAGIC_NUMBER (&headers, magic_number_for_object_file);
553 H_SET_ENTRY_POINT (&headers, 0);
555 obj_pre_write_hook (&headers); /* extra coff stuff */
556 if ((had_warnings () && flagseen['Z'])
557 || had_errors () > 0)
561 as_warn ("%d error%s, %d warning%s, generating bad object file.\n",
562 had_errors (), had_errors () == 1 ? "" : "s",
563 had_warnings (), had_warnings () == 1 ? "" : "s");
567 as_fatal ("%d error%s, %d warning%s, no object file generated.\n",
568 had_errors (), had_errors () == 1 ? "" : "s",
569 had_warnings (), had_warnings () == 1 ? "" : "s");
570 } /* on want output */
571 } /* on error condition */
573 object_file_size = H_GET_FILE_SIZE (&headers);
574 next_object_file_charP = the_object_file = xmalloc (object_file_size);
576 output_file_create (out_file_name);
578 obj_header_append (&next_object_file_charP, &headers);
580 know ((next_object_file_charP - the_object_file) == H_GET_HEADER_SIZE (&headers));
585 for (fragP = text_frag_root; fragP; fragP = fragP->fr_next)
588 register char *fill_literal;
589 register long fill_size;
591 know (fragP->fr_type == rs_fill);
592 append (&next_object_file_charP, fragP->fr_literal, (unsigned long) fragP->fr_fix);
593 fill_literal = fragP->fr_literal + fragP->fr_fix;
594 fill_size = fragP->fr_var;
595 know (fragP->fr_offset >= 0);
597 for (count = fragP->fr_offset; count; count--)
599 append (&next_object_file_charP, fill_literal, (unsigned long) fill_size);
602 } /* for each code frag. */
604 know ((next_object_file_charP - the_object_file) == (H_GET_HEADER_SIZE (&headers) + H_GET_TEXT_SIZE (&headers) + H_GET_DATA_SIZE (&headers)));
609 obj_emit_relocations (&next_object_file_charP, text_fix_root, (relax_addressT) 0);
610 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)));
612 /* Make addresses in data relocation directives relative to beginning of
613 * first data fragment, not end of last text fragment: alignment of the
614 * start of the data segment may place a gap between the segments.
616 obj_emit_relocations (&next_object_file_charP, data_fix_root, data0_frchainP->frch_root->fr_address);
618 obj_emit_relocations (&next_object_file_charP, data_fix_root, text_last_frag->fr_address);
621 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)));
624 * Emit line number entries.
626 OBJ_EMIT_LINENO (&next_object_file_charP, lineno_rootP, the_object_file);
627 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)));
632 obj_emit_symbols (&next_object_file_charP, symbol_rootP);
633 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)));
639 if (string_byte_count > 0)
641 obj_emit_strings (&next_object_file_charP);
642 } /* only if we have a string table */
644 /* 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) + H_GET_STRING_SIZE(&headers)));
646 /* know(next_object_file_charP == the_object_file + object_file_size);*/
649 bfd_seek (stdoutput, 0, 0);
650 bfd_write (the_object_file, 1, object_file_size, stdoutput);
653 /* Write the data to the file */
654 output_file_append (the_object_file, object_file_size, out_file_name);
657 output_file_close (out_file_name);
658 } /* non vms output */
661 * Now do the VMS-dependent part of writing the object file
663 VMS_write_object_file (H_GET_TEXT_SIZE (&headers), data_siz,
664 text_frag_root, data_frag_root);
666 } /* write_object_file() */
674 * Now we have a segment, not a crowd of sub-segments, we can make fr_address
679 * After this, all frags in this segment have addresses that are correct
680 * within the segment. Since segments live in different file addresses,
681 * these frag addresses may not be the same as final object-file addresses.
687 relax_segment (segment_frag_root, segment)
688 struct frag *segment_frag_root;
689 segT segment; /* SEG_DATA or SEG_TEXT */
691 register struct frag *fragP;
692 register relax_addressT address;
693 #ifndef MANY_SEGMENTS
694 know (segment == SEG_DATA || segment == SEG_TEXT || segment == SEG_BSS);
696 /* In case md_estimate_size_before_relax() wants to make fixSs. */
697 subseg_change (segment, 0);
699 /* For each frag in segment: count and store (a 1st guess of)
702 for (fragP = segment_frag_root; fragP; fragP = fragP->fr_next)
704 fragP->fr_address = address;
705 address += fragP->fr_fix;
707 switch (fragP->fr_type)
710 address += fragP->fr_offset * fragP->fr_var;
714 address += relax_align (address, fragP->fr_offset);
718 /* Assume .org is nugatory. It will grow with 1st relax. */
721 case rs_machine_dependent:
722 address += md_estimate_size_before_relax (fragP, segment);
725 #ifndef WORKING_DOT_WORD
726 /* Broken words don't concern us yet */
732 BAD_CASE (fragP->fr_type);
734 } /* switch(fr_type) */
735 } /* for each frag in the segment */
739 long stretch; /* May be any size, 0 or negative. */
740 /* Cumulative number of addresses we have */
741 /* relaxed this pass. */
742 /* We may have relaxed more than one address. */
743 long stretched; /* Have we stretched on this pass? */
744 /* This is 'cuz stretch may be zero, when, in fact some piece of code
745 grew, and another shrank. If a branch instruction doesn't fit anymore,
746 we could be scrod. */
750 stretch = stretched = 0;
751 for (fragP = segment_frag_root; fragP; fragP = fragP->fr_next)
754 unsigned long was_address;
761 was_address = fragP->fr_address;
762 address = fragP->fr_address += stretch;
763 symbolP = fragP->fr_symbol;
764 offset = fragP->fr_offset;
766 switch (fragP->fr_type)
768 case rs_fill: /* .fill never relaxes. */
772 #ifndef WORKING_DOT_WORD
773 /* JF: This is RMS's idea. I do *NOT* want to be blamed
774 for it I do not want to write it. I do not want to have
775 anything to do with it. This is not the proper way to
776 implement this misfeature. */
779 struct broken_word *lie;
780 struct broken_word *untruth;
781 extern int md_short_jump_size;
782 extern int md_long_jump_size;
784 /* Yes this is ugly (storing the broken_word pointer
785 in the symbol slot). Still, this whole chunk of
786 code is ugly, and I don't feel like doing anything
787 about it. Think of it as stubbornness in action. */
789 for (lie = (struct broken_word *) (fragP->fr_symbol);
790 lie && lie->dispfrag == fragP;
791 lie = lie->next_broken_word)
797 offset = (lie->add->sy_frag->fr_address
798 + S_GET_VALUE (lie->add)
800 - (lie->sub->sy_frag->fr_address
801 + S_GET_VALUE (lie->sub)));
802 if (offset <= -32768 || offset >= 32767)
805 as_warn (".word %s-%s+%ld didn't fit",
806 S_GET_NAME (lie->add),
807 S_GET_NAME (lie->sub),
810 if (fragP->fr_subtype == 0)
813 growth += md_short_jump_size;
815 for (untruth = lie->next_broken_word;
816 untruth && untruth->dispfrag == lie->dispfrag;
817 untruth = untruth->next_broken_word)
818 if ((untruth->add->sy_frag == lie->add->sy_frag)
819 && S_GET_VALUE (untruth->add) == S_GET_VALUE (lie->add))
822 untruth->use_jump = lie;
824 growth += md_long_jump_size;
829 } /* case rs_broken_word */
832 growth = (relax_align ((relax_addressT) (address + fragP->fr_fix), offset)
833 - relax_align ((relax_addressT) (was_address + fragP->fr_fix), offset));
843 know ((S_GET_SEGMENT (symbolP) == SEG_ABSOLUTE) || (S_GET_SEGMENT (symbolP) == SEG_DATA) || (S_GET_SEGMENT (symbolP) == SEG_TEXT) || S_GET_SEGMENT (symbolP) == SEG_BSS);
844 know (symbolP->sy_frag);
845 know (!(S_GET_SEGMENT (symbolP) == SEG_ABSOLUTE) || (symbolP->sy_frag == &zero_address_frag));
847 target += S_GET_VALUE (symbolP)
848 + symbolP->sy_frag->fr_address;
849 } /* if we have a symbol */
851 know (fragP->fr_next);
852 after = fragP->fr_next->fr_address;
853 growth = ((target - after) > 0) ? (target - after) : 0;
854 /* Growth may be -ve, but variable part of frag cannot have
855 fewer than 0 chars. That is, we can't .org backwards. */
857 growth -= stretch; /* This is an absolute growth factor */
860 case rs_machine_dependent:
862 const relax_typeS *this_type;
863 const relax_typeS *start_type;
864 relax_substateT next_state;
865 relax_substateT this_state;
867 this_state = fragP->fr_subtype;
868 start_type = this_type = md_relax_table + this_state;
873 #ifndef MANY_SEGMENTS
874 know ((S_GET_SEGMENT (symbolP) == SEG_ABSOLUTE) || (S_GET_SEGMENT (symbolP) == SEG_DATA) || (S_GET_SEGMENT (symbolP) == SEG_BSS) || (S_GET_SEGMENT (symbolP) == SEG_TEXT));
876 know (symbolP->sy_frag);
877 know (!(S_GET_SEGMENT (symbolP) == SEG_ABSOLUTE) || symbolP->sy_frag == &zero_address_frag);
879 S_GET_VALUE (symbolP)
880 + symbolP->sy_frag->fr_address;
882 /* If frag has yet to be reached on this pass,
883 assume it will move by STRETCH just as we did.
884 If this is not so, it will be because some frag
885 between grows, and that will force another pass. */
887 /* JF was just address */
888 /* JF also added is_dnrange hack */
889 /* There's gotta be a better/faster/etc way
891 /* gnu@cygnus.com: I changed this from > to >=
892 because I ran into a zero-length frag (fr_fix=0)
893 which was created when the obstack needed a new
894 chunk JUST AFTER the opcode of a branch. Since
895 fr_fix is zero, fr_address of this frag is the same
896 as fr_address of the next frag. This
897 zero-length frag was variable and jumped to .+2
898 (in the next frag), but since the > comparison
899 below failed (the two were =, not >), "stretch"
900 was not added to the target. Stretch was 178, so
901 the offset appeared to be .-176 instead, which did
902 not fit into a byte branch, so the assembler
903 relaxed the branch to a word. This didn't compare
904 with what happened when the same source file was
905 assembled on other machines, which is how I found it.
906 You might want to think about what other places have
907 trouble with zero length frags... */
909 if (symbolP->sy_frag->fr_address >= was_address
910 && is_dnrange (fragP, symbolP->sy_frag))
914 } /* if there's a symbol attached */
916 aim = target - address - fragP->fr_fix;
917 /* The displacement is affected by the instruction size
918 for the 32k architecture. I think we ought to be able
919 to add fragP->fr_pcrel_adjust in all cases (it should be
920 zero if not used), but just in case it breaks something
921 else we'll put this inside #ifdef NS32K ... #endif */
923 aim += fragP->fr_pcrel_adjust;
924 #endif /* TC_NS32K */
928 /* Look backwards. */
929 for (next_state = this_type->rlx_more; next_state;)
930 if (aim >= this_type->rlx_backward)
934 /* Grow to next state. */
935 this_state = next_state;
936 this_type = md_relax_table + this_state;
937 next_state = this_type->rlx_more;
942 #ifdef M68K_AIM_KLUDGE
943 M68K_AIM_KLUDGE (aim, this_state, this_type);
946 for (next_state = this_type->rlx_more; next_state;)
947 if (aim <= this_type->rlx_forward)
951 /* Grow to next state. */
952 this_state = next_state;
953 this_type = md_relax_table + this_state;
954 next_state = this_type->rlx_more;
958 growth = this_type->rlx_length - start_type->rlx_length;
960 fragP->fr_subtype = this_state;
965 BAD_CASE (fragP->fr_type);
973 } /* For each frag in the segment. */
975 while (stretched); /* Until nothing further to relax. */
979 * We now have valid fr_address'es for each frag.
983 * All fr_address's are correct, relative to their own segment.
984 * We have made all the fixS we will ever make.
986 } /* relax_segment() */
989 * Relax_align. Advance location counter to next address that has 'alignment'
990 * lowest order bits all 0s.
993 /* How many addresses does the .align take? */
994 static relax_addressT
995 relax_align (address, alignment)
996 register relax_addressT address; /* Address now. */
997 register long alignment; /* Alignment (binary). */
1000 relax_addressT new_address;
1002 mask = ~((~0) << alignment);
1003 new_address = (address + mask) & (~mask);
1005 /* We must provide lots of padding, so the linker can discard it
1006 when needed. The linker will not add extra space, ever. */
1007 new_address += (1 << alignment);
1008 return (new_address - address);
1009 } /* relax_align() */
1013 Go through all the fixS's in a segment and see which ones can be
1014 handled now. (These consist of fixS where we have since discovered
1015 the value of a symbol, or the address of the frag involved.)
1016 For each one, call md_apply_fix to put the fix into the frag data.
1018 Result is a count of how many relocation structs will be needed to
1019 handle the remaining fixS's that we couldn't completely handle here.
1020 These will be output later by emit_relocations(). */
1023 fixup_segment (fixP, this_segment_type)
1024 register fixS *fixP;
1025 segT this_segment_type; /* N_TYPE bits for segment. */
1027 register long seg_reloc_count;
1028 register symbolS *add_symbolP;
1029 register symbolS *sub_symbolP;
1030 register long add_number;
1032 register char *place;
1033 register long where;
1034 register char pcrel;
1035 register fragS *fragP;
1036 register segT add_symbol_segment = SEG_ABSOLUTE;
1038 /* FIXME: remove this line *//* fixS *orig = fixP; */
1039 seg_reloc_count = 0;
1041 /* If the linker is doing the relaxing, we must not do any fixups */
1044 for (; fixP; fixP = fixP->fx_next)
1051 for (; fixP; fixP = fixP->fx_next)
1053 fragP = fixP->fx_frag;
1055 where = fixP->fx_where;
1056 place = fragP->fr_literal + where;
1057 size = fixP->fx_size;
1058 add_symbolP = fixP->fx_addsy;
1060 if (fixP->fx_callj && TC_S_IS_CALLNAME (add_symbolP))
1062 /* Relocation should be done via the
1063 associated 'bal' entry point
1066 if (!TC_S_IS_BALNAME (tc_get_bal_of_call (add_symbolP)))
1068 as_bad ("No 'bal' entry point for leafproc %s",
1069 S_GET_NAME (add_symbolP));
1072 fixP->fx_addsy = add_symbolP = tc_get_bal_of_call (add_symbolP);
1073 } /* callj relocation */
1075 sub_symbolP = fixP->fx_subsy;
1076 add_number = fixP->fx_offset;
1077 pcrel = fixP->fx_pcrel;
1081 add_symbol_segment = S_GET_SEGMENT (add_symbolP);
1082 } /* if there is an addend */
1089 if (S_GET_SEGMENT (sub_symbolP) != SEG_ABSOLUTE)
1091 as_bad ("Negative of non-absolute symbol %s", S_GET_NAME (sub_symbolP));
1092 } /* not absolute */
1094 add_number -= S_GET_VALUE (sub_symbolP);
1096 /* if sub_symbol is in the same segment that add_symbol
1097 and add_symbol is either in DATA, TEXT, BSS or ABSOLUTE */
1099 else if ((S_GET_SEGMENT (sub_symbolP) == add_symbol_segment)
1100 && (SEG_NORMAL (add_symbol_segment)
1101 || (add_symbol_segment == SEG_ABSOLUTE)))
1103 /* Difference of 2 symbols from same segment. */
1104 /* Can't make difference of 2 undefineds: 'value' means */
1105 /* something different for N_UNDF. */
1107 /* Makes no sense to use the difference of 2 arbitrary symbols
1108 * as the target of a call instruction.
1112 as_bad ("callj to difference of 2 symbols");
1114 #endif /* TC_I960 */
1115 add_number += S_GET_VALUE (add_symbolP) -
1116 S_GET_VALUE (sub_symbolP);
1119 fixP->fx_addsy = NULL;
1123 /* Different segments in subtraction. */
1124 know (!(S_IS_EXTERNAL (sub_symbolP) && (S_GET_SEGMENT (sub_symbolP) == SEG_ABSOLUTE)));
1126 if ((S_GET_SEGMENT (sub_symbolP) == SEG_ABSOLUTE))
1128 add_number -= S_GET_VALUE (sub_symbolP);
1132 as_bad ("Can't emit reloc {- %s-seg symbol \"%s\"} @ file address %d.",
1133 segment_name (S_GET_SEGMENT (sub_symbolP)),
1134 S_GET_NAME (sub_symbolP), fragP->fr_address + where);
1137 } /* if sub_symbolP */
1141 if (add_symbol_segment == this_segment_type && pcrel)
1144 * This fixup was made when the symbol's segment was
1145 * SEG_UNKNOWN, but it is now in the local segment.
1146 * So we know how to do the address without relocation.
1149 /* reloc_callj() may replace a 'call' with a 'calls' or a 'bal',
1150 * in which cases it modifies *fixP as appropriate. In the case
1151 * of a 'calls', no further work is required, and *fixP has been
1152 * set up to make the rest of the code below a no-op.
1155 #endif /* TC_I960 */
1157 add_number += S_GET_VALUE (add_symbolP);
1158 add_number -= md_pcrel_from (fixP);
1159 pcrel = 0; /* Lie. Don't want further pcrel processing. */
1160 fixP->fx_addsy = NULL; /* No relocations please. */
1164 switch (add_symbol_segment)
1168 reloc_callj (fixP); /* See comment about reloc_callj() above*/
1169 #endif /* TC_I960 */
1170 add_number += S_GET_VALUE (add_symbolP);
1171 fixP->fx_addsy = NULL;
1176 add_number += S_GET_VALUE (add_symbolP);
1181 if ((int) fixP->fx_bit_fixP == 13)
1183 /* This is a COBR instruction. They have only a
1184 * 13-bit displacement and are only to be used
1185 * for local branches: flag as error, don't generate
1188 as_bad ("can't use COBR format with external label");
1189 fixP->fx_addsy = NULL; /* No relocations please. */
1192 #endif /* TC_I960 */
1196 if (S_IS_COMMON (add_symbolP))
1197 add_number += S_GET_VALUE (add_symbolP);
1198 #endif /* TE_I386AIX */
1199 #endif /* OBJ_COFF */
1205 } /* switch on symbol seg */
1206 } /* if not in local seg */
1207 } /* if there was a + symbol */
1211 add_number -= md_pcrel_from (fixP);
1212 if (add_symbolP == 0)
1214 fixP->fx_addsy = &abs_symbol;
1216 } /* if there's an add_symbol */
1219 if (!fixP->fx_bit_fixP)
1222 (add_number & ~0xFF) && ((add_number & ~0xFF) != (-1 & ~0xFF))) ||
1224 (add_number & ~0xFFFF) && ((add_number & ~0xFFFF) != (-1 & ~0xFFFF))))
1226 as_bad ("Value of %d too large for field of %d bytes at 0x%x",
1227 add_number, size, fragP->fr_address + where);
1228 } /* generic error checking */
1229 #ifdef WARN_SIGNED_OVERFLOW_WORD
1230 /* Warn if a .word value is too large when
1231 treated as a signed number. We already
1232 know it is not too negative. This is to
1233 catch over-large switches generated by gcc
1237 && add_number > 0x7fff)
1238 as_bad ("Signed .word overflow; switch may be too large; %d at 0x%x",
1239 add_number, fragP->fr_address + where);
1241 } /* not a bit fix */
1243 md_apply_fix (fixP, add_number);
1244 } /* For each fixS in this segment. */
1251 /* two relocs per callj under coff. */
1252 for (fixP = topP; fixP; fixP = fixP->fx_next)
1254 if (fixP->fx_callj && fixP->fx_addsy != 0)
1257 } /* if callj and not already fixed. */
1258 } /* for each fix */
1260 #endif /* TC_I960 */
1262 #endif /* OBJ_COFF */
1263 return (seg_reloc_count);
1264 } /* fixup_segment() */
1274 if (f1->fr_next == f2)
1279 } /* is_dnrange() */
1281 /* Append a string onto another string, bumping the pointer along. */
1283 append (charPP, fromP, length)
1286 unsigned long length;
1289 { /* Don't trust memcpy() of 0 chars. */
1290 memcpy (*charPP, fromP, (int) length);
1295 int section_alignment[SEG_MAXIMUM_ORDINAL];
1298 * This routine records the largest alignment seen for each segment.
1299 * If the beginning of the segment is aligned on the worst-case
1300 * boundary, all of the other alignments within it will work. At
1301 * least one object format really uses this info.
1304 record_alignment (seg, align)
1305 segT seg; /* Segment to which alignment pertains */
1306 int align; /* Alignment, as a power of 2
1307 * (e.g., 1 => 2-byte boundary, 2 => 4-byte boundary, etc.)
1311 if (align > section_alignment[(int) seg])
1313 section_alignment[(int) seg] = align;
1314 } /* if highest yet */
1317 } /* record_alignment() */
1319 /* end of write.c */