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