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