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