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