(write_object_file): Test DEBUG_SYMS instead of DEBUG for verifying sym chain.
[external/binutils.git] / gas / write.c
1 /* write.c - emit .o file
2    Copyright (C) 1986, 1987, 1990, 1991, 1992, 1993 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 /* The NOP_OPCODE is for the alignment fill value.  Fill it with a nop
28    instruction so that the disassembler does not choke on it.  */
29 #ifndef NOP_OPCODE
30 #define NOP_OPCODE 0x00
31 #endif
32
33 #ifndef WORKING_DOT_WORD
34 extern CONST int md_short_jump_size;
35 extern CONST int md_long_jump_size;
36 #endif
37
38 #ifndef BFD_ASSEMBLER
39
40 #ifndef MANY_SEGMENTS
41 struct frag *text_frag_root;
42 struct frag *data_frag_root;
43 struct frag *bss_frag_root;
44
45 struct frag *text_last_frag;    /* Last frag in segment. */
46 struct frag *data_last_frag;    /* Last frag in segment. */
47 static struct frag *bss_last_frag;      /* Last frag in segment. */
48 #endif
49
50 static object_headers headers;
51 long string_byte_count;
52 static char *the_object_file;
53 char *next_object_file_charP;   /* Tracks object file bytes. */
54
55 #ifndef OBJ_VMS
56 int magic_number_for_object_file = DEFAULT_MAGIC_NUMBER_FOR_OBJECT_FILE;
57 #endif
58
59 #endif /* BFD_ASSEMBLER */
60
61 #ifdef BFD_ASSEMBLER
62 static fixS *fix_new_internal PARAMS ((fragS *, int where, int size,
63                                        symbolS *add, symbolS *sub,
64                                        offsetT offset, int pcrel,
65                                        bfd_reloc_code_real_type r_type));
66 #else
67 static fixS *fix_new_internal PARAMS ((fragS *, int where, int size,
68                                        symbolS *add, symbolS *sub,
69                                        offsetT offset, int pcrel,
70                                        int r_type));
71 #endif
72 static long fixup_segment PARAMS ((fixS * fixP, segT this_segment_type));
73 static relax_addressT relax_align PARAMS ((relax_addressT addr, int align));
74 void relax_segment PARAMS ((struct frag * seg_frag_root, segT seg_type));
75
76 /*
77  *                      fix_new()
78  *
79  * Create a fixS in obstack 'notes'.
80  */
81 static fixS *
82 fix_new_internal (frag, where, size, add_symbol, sub_symbol, offset, pcrel,
83                   r_type)
84      fragS *frag;               /* Which frag? */
85      int where;                 /* Where in that frag? */
86      int size;                  /* 1, 2, or 4 usually. */
87      symbolS *add_symbol;       /* X_add_symbol. */
88      symbolS *sub_symbol;       /* X_op_symbol. */
89      offsetT offset;            /* X_add_number. */
90      int pcrel;                 /* TRUE if PC-relative relocation. */
91 #ifdef BFD_ASSEMBLER
92      bfd_reloc_code_real_type r_type; /* Relocation type */
93 #else
94      int r_type;                /* Relocation type */
95 #endif
96 {
97   fixS *fixP;
98
99   fixP = (fixS *) obstack_alloc (&notes, sizeof (fixS));
100
101   fixP->fx_frag = frag;
102   fixP->fx_where = where;
103   fixP->fx_size = size;
104   fixP->fx_addsy = add_symbol;
105   fixP->fx_subsy = sub_symbol;
106   fixP->fx_offset = offset;
107   fixP->fx_pcrel = pcrel;
108 #if defined(NEED_FX_R_TYPE) || defined (BFD_ASSEMBLER)
109   fixP->fx_r_type = r_type;
110 #endif
111   fixP->fx_im_disp = 0;
112   fixP->fx_pcrel_adjust = 0;
113   fixP->fx_bit_fixP = 0;
114   fixP->fx_addnumber = 0;
115
116 #ifdef TC_something
117   fixP->fx_bsr = 0;
118 #endif
119 #ifdef TC_I960
120   fixP->fx_callj = 0;
121 #endif
122
123   /* Usually, we want relocs sorted numerically, but while
124      comparing to older versions of gas that have relocs
125      reverse sorted, it is convenient to have this compile
126      time option.  xoxorich. */
127
128   {
129
130 #ifdef BFD_ASSEMBLER
131     fixS **seg_fix_rootP = & (seg_info (now_seg)->fix_root);
132     fixS **seg_fix_tailP = & (seg_info (now_seg)->fix_tail);
133 #endif
134
135 #ifdef REVERSE_SORT_RELOCS
136
137     fixP->fx_next = *seg_fix_rootP;
138     *seg_fix_rootP = fixP;
139
140 #else /* REVERSE_SORT_RELOCS */
141
142     fixP->fx_next = NULL;
143
144     if (*seg_fix_tailP)
145       (*seg_fix_tailP)->fx_next = fixP;
146     else
147       *seg_fix_rootP = fixP;
148     *seg_fix_tailP = fixP;
149
150 #endif /* REVERSE_SORT_RELOCS */
151
152   }
153
154   return fixP;
155 }
156
157 /* Create a fixup relative to a symbol (plus a constant).  */
158
159 fixS *
160 fix_new (frag, where, size, add_symbol, offset, pcrel, r_type)
161      fragS *frag;               /* Which frag? */
162      int where;                 /* Where in that frag? */
163      short int size;            /* 1, 2, or 4 usually. */
164      symbolS *add_symbol;       /* X_add_symbol. */
165      offsetT offset;            /* X_add_number. */
166      int pcrel;                 /* TRUE if PC-relative relocation. */
167 #ifdef BFD_ASSEMBLER
168      bfd_reloc_code_real_type r_type; /* Relocation type */
169 #else
170      int r_type;                /* Relocation type */
171 #endif
172 {
173   return fix_new_internal (frag, where, size, add_symbol,
174                            (symbolS *) NULL, offset, pcrel, r_type);
175 }
176
177 /* Create a fixup for an expression.  Currently we only support fixups
178    for difference expressions.  That is itself more than most object
179    file formats support anyhow.  */
180
181 fixS *
182 fix_new_exp (frag, where, size, exp, pcrel, r_type)
183      fragS *frag;               /* Which frag? */
184      int where;                 /* Where in that frag? */
185      short int size;            /* 1, 2, or 4 usually. */
186      expressionS *exp;          /* Expression.  */
187      int pcrel;                 /* TRUE if PC-relative relocation. */
188 #ifdef BFD_ASSEMBLER
189      bfd_reloc_code_real_type r_type; /* Relocation type */
190 #else
191      int r_type;                /* Relocation type */
192 #endif
193 {
194   symbolS *add = NULL;
195   symbolS *sub = NULL;
196   offsetT off = 0;
197   
198   switch (exp->X_op)
199     {
200     case O_absent:
201       break;
202
203     case O_uminus:
204       sub = exp->X_add_symbol;
205       off = exp->X_add_number;
206       break;
207
208     case O_subtract:
209       sub = exp->X_op_symbol;
210       /* Fall through.  */
211     case O_symbol:
212       add = exp->X_add_symbol;
213       /* Fall through.   */
214     case O_constant:
215       off = exp->X_add_number;
216       break;
217       
218     default:
219       as_bad ("expression too complex for fixup");
220     }
221
222   return fix_new_internal (frag, where, size, add, sub, off,
223                            pcrel, r_type);
224 }
225
226 /* Append a string onto another string, bumping the pointer along.  */
227 void
228 append (charPP, fromP, length)
229      char **charPP;
230      char *fromP;
231      unsigned long length;
232 {
233   /* Don't trust memcpy() of 0 chars. */
234   if (length == 0)
235     return;
236
237   memcpy (*charPP, fromP, (int) length);
238   *charPP += length;
239 }
240
241 #ifndef BFD_ASSEMBLER 
242 int section_alignment[SEG_MAXIMUM_ORDINAL];
243 #endif
244
245 /*
246  * This routine records the largest alignment seen for each segment.
247  * If the beginning of the segment is aligned on the worst-case
248  * boundary, all of the other alignments within it will work.  At
249  * least one object format really uses this info.
250  */
251 void 
252 record_alignment (seg, align)
253      /* Segment to which alignment pertains */
254      segT seg;
255      /* Alignment, as a power of 2 (e.g., 1 => 2-byte boundary, 2 => 4-byte
256         boundary, etc.)  */
257      int align;
258 {
259 #ifdef BFD_ASSEMBLER
260   if (align > bfd_get_section_alignment (stdoutput, seg))
261     bfd_set_section_alignment (stdoutput, seg, align);
262 #else
263   if (align > section_alignment[(int) seg])
264     section_alignment[(int) seg] = align;
265 #endif
266 }
267
268 #if defined (BFD_ASSEMBLER) || ! defined (BFD)
269
270 static fragS *
271 chain_frchains_together_1 (section, frchp)
272      segT section;
273      struct frchain *frchp;
274 {
275   fragS dummy, *prev_frag = &dummy;
276   for (; frchp && frchp->frch_seg == section; frchp = frchp->frch_next)
277     {
278       prev_frag->fr_next = frchp->frch_root;
279       prev_frag = frchp->frch_last;
280     }
281   prev_frag->fr_next = 0;
282   return prev_frag;
283 }
284
285 #endif
286
287 #ifdef BFD_ASSEMBLER
288
289 static void
290 chain_frchains_together (abfd, section, xxx)
291      bfd *abfd;                 /* unused */
292      segT section;
293      char *xxx;                 /* unused */
294 {
295   segment_info_type *info;
296
297   /* BFD may have introduced its own sections without using
298      subseg_new, so it is possible that seg_info is NULL.  */
299   info = seg_info (section);
300   if (info != (segment_info_type *) NULL)
301     chain_frchains_together_1 (section, info->frchainP);
302 }
303
304 #endif
305
306 #if !defined (BFD) && !defined (BFD_ASSEMBLER)
307
308 void 
309 remove_subsegs (head, seg, root, last)
310      frchainS *head;
311      int seg;
312      fragS **root;
313      fragS **last;
314 {
315   *root = head->frch_root;
316   *last = chain_frchains_together_1 (seg, head);
317 }
318
319 #endif /* BFD */
320
321 static void
322 cvt_frag_to_fill (x, fragP)
323 #ifdef BFD_ASSEMBLER
324      segT x;
325 #else
326      object_headers *x;
327 #endif
328      fragS *fragP;
329 {
330 #ifdef BFD_ASSEMBLER
331   segT sec = x;
332 #else
333   object_headers *headers = x;
334 #endif
335
336   switch (fragP->fr_type)
337     {
338     case rs_align:
339     case rs_org:
340 #ifdef HANDLE_ALIGN
341       HANDLE_ALIGN (fragP);
342 #endif
343       fragP->fr_type = rs_fill;
344       know (fragP->fr_var == 1);
345       know (fragP->fr_next != NULL);
346
347       fragP->fr_offset = (fragP->fr_next->fr_address
348                           - fragP->fr_address
349                           - fragP->fr_fix);
350       break;
351
352     case rs_fill:
353       break;
354
355     case rs_machine_dependent:
356 #ifdef BFD_ASSEMBLER
357       md_convert_frag (stdoutput, sec, fragP);
358 #else
359       md_convert_frag (headers, fragP);
360 #endif
361
362       assert (fragP->fr_next == NULL || (fragP->fr_next->fr_address - fragP->fr_address == fragP->fr_fix));
363
364       /*
365        * After md_convert_frag, we make the frag into a ".space 0".
366        * Md_convert_frag() should set up any fixSs and constants
367        * required.
368        */
369       frag_wane (fragP);
370       break;
371
372 #ifndef WORKING_DOT_WORD
373     case rs_broken_word:
374       {
375         struct broken_word *lie;
376
377         if (fragP->fr_subtype)
378           {
379             fragP->fr_fix += md_short_jump_size;
380             for (lie = (struct broken_word *) (fragP->fr_symbol);
381                  lie && lie->dispfrag == fragP;
382                  lie = lie->next_broken_word)
383               if (lie->added == 1)
384                 fragP->fr_fix += md_long_jump_size;
385           }
386         frag_wane (fragP);
387       }
388       break;
389 #endif
390
391     default:
392       BAD_CASE (fragP->fr_type);
393       break;
394     }
395 }
396
397 #ifdef BFD_ASSEMBLER
398 static void
399 relax_and_size_seg (abfd, sec, xxx)
400      bfd *abfd;
401      asection *sec;
402      char *xxx;
403 {
404   flagword flags;
405
406   flags = bfd_get_section_flags (abfd, sec);
407
408   if (/*flags & SEC_ALLOC*/ 1)
409     {
410       fragS *fragp;
411       segment_info_type *seginfo;
412       int x;
413       valueT size, newsize;
414
415       seginfo = (segment_info_type *) bfd_get_section_userdata (abfd, sec);
416       if (seginfo && seginfo->frchainP)
417         {
418           relax_segment (seginfo->frchainP->frch_root, sec);
419           for (fragp = seginfo->frchainP->frch_root; fragp; fragp = fragp->fr_next)
420             cvt_frag_to_fill (sec, fragp);
421           for (fragp = seginfo->frchainP->frch_root;
422                fragp->fr_next;
423                fragp = fragp->fr_next)
424             /* walk to last elt */;
425           size = fragp->fr_address + fragp->fr_fix;
426         }
427       else
428         size = 0;
429       if (size > 0)
430         {
431           flags |= SEC_HAS_CONTENTS;
432           /* @@ This is just an approximation.  */
433           if (seginfo->fix_root)
434             flags |= SEC_RELOC;
435           else
436             flags &= ~SEC_RELOC;
437           x = bfd_set_section_flags (abfd, sec, flags);
438           assert (x == true);
439         }
440       size = md_section_align (sec, size);
441       x = bfd_set_section_size (abfd, sec, size);
442       assert (x == true);
443
444       /* If the size had to be rounded up, add some padding in the last
445          non-empty frag.  */
446       newsize = bfd_get_section_size_before_reloc (sec);
447       assert (newsize >= size);
448       if (size != newsize)
449         {
450           fragS *last = seginfo->frchainP->frch_last;
451           fragp = seginfo->frchainP->frch_root;
452           while (fragp->fr_next != last)
453             fragp = fragp->fr_next;
454           last->fr_address = size;
455           fragp->fr_offset += newsize - size;
456         }
457     }
458 #ifdef tc_frob_section
459   tc_frob_section (sec);
460 #endif
461 #ifdef obj_frob_section
462   obj_frob_section (sec);
463 #endif
464 }
465
466 #ifdef DEBUG2
467 static void
468 dump_section_relocs (abfd, sec, stream_)
469      bfd *abfd;
470      asection *sec;
471      char *stream_;
472 {
473   FILE *stream = (FILE *) stream_;
474   segment_info_type *seginfo = seg_info (sec);
475   fixS *fixp = seginfo->fix_root;
476
477   if (!fixp)
478     return;
479
480   fprintf (stream, "sec %s relocs:\n", sec->name);
481   while (fixp)
482     {
483       symbolS *s = fixp->fx_addsy;
484       if (s)
485         fprintf (stream, "  %08x: %s(%s+%x)+%x\n", fixp,
486                  S_GET_NAME (s), s->bsym->section->name,
487                  S_GET_VALUE (s), fixp->fx_offset);
488       else
489         fprintf (stream, "  %08x: type %d no sym\n", fixp, fixp->fx_r_type);
490       fixp = fixp->fx_next;
491     }
492 }
493 #else
494 #define dump_section_relocs(ABFD,SEC,STREAM)    (void)(ABFD,SEC,STREAM)
495 #endif
496
497 static void
498 adjust_reloc_syms (abfd, sec, xxx)
499      bfd *abfd;
500      asection *sec;
501      char *xxx;
502 {
503   segment_info_type *seginfo = seg_info (sec);
504   fixS *fixp;
505
506   if (seginfo == NULL)
507     return;
508
509   dump_section_relocs (abfd, sec, stderr);
510
511   for (fixp = seginfo->fix_root; fixp; fixp = fixp->fx_next)
512     if (fixp->fx_addsy)
513       {
514         symbolS *sym = fixp->fx_addsy;
515         asection *symsec = sym->bsym->section;
516         segment_info_type *symseginfo = seg_info (symsec);
517
518         /* If it's one of these sections, assume the symbol is definitely
519            going to be output.  */
520         if (symsec == &bfd_und_section
521             || symsec == &bfd_abs_section
522             || bfd_is_com_section (symsec))
523           continue;
524
525         /* Since we're reducing to section symbols, don't attempt to reduce
526            anything that's already using one.  */
527         if (sym->bsym == symsec->symbol)
528           continue;
529
530         /* Is there some other reason we can't adjust this one?  (E.g.,
531            call/bal links in i960-bout symbols.)  */
532 #ifdef obj_fix_adjustable
533         if (! obj_fix_adjustable (fixp))
534           continue;
535 #endif
536         /* If the section symbol isn't going to be output, the relocs
537            at least should still work.  If not, figure out what to do
538            when we run into that case.  */
539         fixp->fx_offset += S_GET_VALUE (sym);
540         if (sym->sy_frag)
541           fixp->fx_offset += sym->sy_frag->fr_address;
542         if (symseginfo->sym)
543           fixp->fx_addsy = symseginfo->sym;
544         else
545           {
546             fixp->fx_addsy = symbol_find (symsec->name);
547             if (!fixp->fx_addsy)
548               {
549                 fixp->fx_addsy = symbol_make (symsec->name);
550                 fixp->fx_addsy->bsym = symsec->symbol;
551               }
552             symseginfo->sym = fixp->fx_addsy;
553           }
554       }
555
556   dump_section_relocs (abfd, sec, stderr);
557 }
558
559 static void
560 write_relocs (abfd, sec, xxx)
561      bfd *abfd;
562      asection *sec;
563      char *xxx;
564 {
565   segment_info_type *seginfo = seg_info (sec);
566   unsigned long offset = 0;
567   fragS *frags;
568   int i, n;
569   arelent **relocs;
570   fixS *fixp;
571
572   /* If seginfo is NULL, we did not create this section; don't do
573      anything with it.  */
574   if (seginfo == NULL)
575     return;
576
577   fixup_segment (seginfo->fix_root, sec);
578
579   n = 0;
580   for (fixp = seginfo->fix_root; fixp; fixp = fixp->fx_next)
581     n++;
582
583 #ifndef RELOC_EXPANSION_POSSIBLE
584   /* Set up reloc information as well.  */
585   relocs = (arelent **) bfd_alloc_by_size_t (stdoutput,
586                                              n * sizeof (arelent *));
587   memset ((char*)relocs, 0, n * sizeof (arelent*));
588
589   i = 0;
590   for (fixp = seginfo->fix_root; fixp != (fixS *) NULL; fixp = fixp->fx_next)
591     {
592       arelent *reloc;
593       extern arelent *tc_gen_reloc ();
594       char *data;
595       bfd_reloc_status_type s;
596
597       if (fixp->fx_addsy == 0)
598         {
599           /* @@ Need some other flag to indicate which have already
600              been performed...  */
601           n--;
602           continue;
603         }
604       reloc = tc_gen_reloc (sec, fixp);
605       if (!reloc)
606         {
607           n--;
608           continue;
609         }
610       data = fixp->fx_frag->fr_literal + fixp->fx_where;
611       /* @@ Assumes max size of reloc is 4. */
612       if (fixp->fx_where + 4
613           > fixp->fx_frag->fr_fix + fixp->fx_frag->fr_offset)
614         abort ();
615       /* Pass bogus address so that when bfd_perform_relocation adds
616          `address' back in, it'll come up with `data', which is where
617          we want it to operate.  */
618       s = bfd_perform_relocation (stdoutput, reloc, data - reloc->address,
619                                   sec, stdoutput);
620       switch (s)
621         {
622         case bfd_reloc_ok:
623           break;
624         default:
625           as_fatal ("bad return from bfd_perform_relocation");
626         }
627       relocs[i++] = reloc;
628     }
629 #else
630   n = n * MAX_RELOC_EXPANSION;
631   /* Set up reloc information as well.  */
632   relocs = (arelent **) bfd_alloc_by_size_t (stdoutput,
633                                              n * sizeof (arelent *));
634
635   i = 0;
636   for (fixp = seginfo->fix_root; fixp != (fixS *) NULL; fixp = fixp->fx_next)
637     {
638       arelent **reloc;
639       extern arelent *tc_gen_reloc ();
640       char *data;
641       bfd_reloc_status_type s;
642       int j;
643
644       if (fixp->fx_addsy == 0)
645         {
646           /* @@ Need some other flag to indicate which have already
647              been performed...  */
648           n--;
649           continue;
650         }
651       reloc = tc_gen_reloc (sec, fixp);
652
653       for (j = 0; reloc[j]; j++)
654         {
655           relocs[i++] = reloc[j];
656           assert(i <= n);
657         }
658       data = fixp->fx_frag->fr_literal + fixp->fx_where;
659       if (fixp->fx_where + 4
660           > fixp->fx_frag->fr_fix + fixp->fx_frag->fr_offset)
661         abort ();
662       for (j = 0; reloc[j]; j++)
663         {
664           s = bfd_perform_relocation (stdoutput, reloc[j], data - reloc[j]->address,
665                                       sec, stdoutput);
666           switch (s)
667             {
668               case bfd_reloc_ok:
669                 break;
670               default:
671                 as_fatal ("bad return from bfd_perform_relocation");
672             }
673         }
674     }
675   n = i;
676 #endif
677
678   if (n)
679     bfd_set_reloc (stdoutput, sec, relocs, n);
680   else
681     bfd_set_section_flags (abfd, sec,
682                            bfd_get_section_flags (abfd, sec) & ~SEC_RELOC);
683 #ifdef DEBUG2
684   {
685     int i;
686     arelent *r;
687     asymbol *s;
688     fprintf (stderr, "relocs for sec %s\n", sec->name);
689     for (i = 0; i < n; i++)
690       {
691         r = relocs[i];
692         s = *r->sym_ptr_ptr;
693         fprintf (stderr, "  reloc %2d @%08x off %4x : sym %-10s addend %x\n",
694                  i, r, r->address, s->name, r->addend);
695       }
696   }
697 #endif
698 }
699
700 static void
701 write_contents (abfd, sec, xxx)
702      bfd *abfd;
703      asection *sec;
704      char *xxx;
705 {
706   segment_info_type *seginfo = seg_info (sec);
707   unsigned long offset = 0;
708   fragS *frags;
709   int i, n;
710   arelent **relocs;
711   fixS *fixp;
712
713   /* Write out the frags.  */
714   if (! (bfd_get_section_flags (abfd, sec) & SEC_HAS_CONTENTS))
715     return;
716
717   for (frags = seginfo->frchainP->frch_root;
718        frags;
719        frags = frags->fr_next)
720     {
721       int x;
722       unsigned long fill_size;
723       char *fill_literal;
724       long count;
725
726       assert (frags->fr_type == rs_fill);
727       if (frags->fr_fix)
728         {
729           x = bfd_set_section_contents (stdoutput, sec,
730                                         frags->fr_literal, offset,
731                                         frags->fr_fix);
732           assert (x == true);
733           offset += frags->fr_fix;
734         }
735       fill_literal = frags->fr_literal + frags->fr_fix;
736       fill_size = frags->fr_var;
737       count = frags->fr_offset;
738       assert (count >= 0);
739       if (fill_size && count)
740         while (count--)
741           {
742             x = bfd_set_section_contents (stdoutput, sec,
743                                           fill_literal, offset,
744                                           (bfd_size_type) fill_size);
745             assert (x == true);
746             offset += fill_size;
747           }
748     }
749 }
750 #endif
751
752 static void
753 merge_data_into_text ()
754 {
755 #ifdef BFD_ASSEMBLER
756   seg_info (text_section)->frchainP->frch_last->fr_next =
757     seg_info (data_section)->frchainP->frch_root;
758   seg_info (text_section)->frchainP->frch_last =
759     seg_info (data_section)->frchainP->frch_last;
760   seg_info (data_section)->frchainP = 0;
761 #else
762   fixS *tmp;
763
764   text_last_frag->fr_next = data_frag_root;
765   text_last_frag = data_last_frag;
766   data_last_frag = NULL;
767   data_frag_root = NULL;
768   if (text_fix_root)
769     {
770       for (tmp = text_fix_root; tmp->fx_next; tmp = tmp->fx_next);;
771       tmp->fx_next = data_fix_root;
772       text_fix_tail = data_fix_tail;
773     }
774   else
775     text_fix_root = data_fix_root;
776   data_fix_root = NULL;
777 #endif
778 }
779
780 #if !defined (BFD_ASSEMBLER) && !defined (BFD)
781 static void
782 relax_and_size_all_segments ()
783 {
784   relax_segment (text_frag_root, SEG_TEXT);
785   relax_segment (data_frag_root, SEG_DATA);
786   relax_segment (bss_frag_root, SEG_BSS);
787   /*
788    * Now the addresses of frags are correct within the segment.
789    */
790
791   know (text_last_frag->fr_type == rs_fill && text_last_frag->fr_offset == 0);
792   H_SET_TEXT_SIZE (&headers, text_last_frag->fr_address);
793   text_last_frag->fr_address = H_GET_TEXT_SIZE (&headers);
794
795   /*
796    * Join the 2 segments into 1 huge segment.
797    * To do this, re-compute every rn_address in the SEG_DATA frags.
798    * Then join the data frags after the text frags.
799    *
800    * Determine a_data [length of data segment].
801    */
802   if (data_frag_root)
803     {
804       register relax_addressT slide;
805
806       know ((text_last_frag->fr_type == rs_fill) && (text_last_frag->fr_offset == 0));
807
808       H_SET_DATA_SIZE (&headers, data_last_frag->fr_address);
809       data_last_frag->fr_address = H_GET_DATA_SIZE (&headers);
810       slide = H_GET_TEXT_SIZE (&headers);       /* & in file of the data segment. */
811 #ifdef OBJ_BOUT
812 #define RoundUp(N,S) (((N)+(S)-1)&-(S))
813       /* For b.out: If the data section has a strict alignment
814          requirement, its load address in the .o file will be
815          rounded up from the size of the text section.  These
816          two values are *not* the same!  Similarly for the bss
817          section....  */
818       slide = RoundUp (slide, 1 << section_alignment[SEG_DATA]);
819 #endif
820
821       for (fragP = data_frag_root; fragP; fragP = fragP->fr_next)
822         {
823           fragP->fr_address += slide;
824         }                       /* for each data frag */
825
826       know (text_last_frag != 0);
827       text_last_frag->fr_next = data_frag_root;
828     }
829   else
830     {
831       H_SET_DATA_SIZE (&headers, 0);
832     }
833
834 #ifdef OBJ_BOUT
835   /* See above comments on b.out data section address.  */
836   {
837     long bss_vma;
838     if (data_last_frag == 0)
839       bss_vma = H_GET_TEXT_SIZE (&headers);
840     else
841       bss_vma = data_last_frag->fr_address;
842     bss_vma = RoundUp (bss_vma, 1 << section_alignment[SEG_BSS]);
843     bss_address_frag.fr_address = bss_vma;
844   }
845 #else /* ! OBJ_BOUT */
846   bss_address_frag.fr_address = (H_GET_TEXT_SIZE (&headers) +
847                                  H_GET_DATA_SIZE (&headers));
848
849
850   /* Slide all the frags */
851   if (bss_frag_root)
852     {
853       relax_addressT slide = bss_address_frag.fr_address;
854
855       for (fragP = bss_frag_root; fragP; fragP = fragP->fr_next)
856         {
857           fragP->fr_address += slide;
858         }                       /* for each bss frag */
859     }
860
861 #endif /* ! OBJ_BOUT */
862
863   if (bss_last_frag)
864     H_SET_BSS_SIZE (&headers,
865                     bss_last_frag->fr_address - bss_frag_root->fr_address);
866   else
867     H_SET_BSS_SIZE (&headers, 0);
868 }
869 #endif /* ! BFD_ASSEMBLER && ! BFD */
870
871 #if defined (BFD_ASSEMBLER) || !defined (BFD)
872
873 void 
874 write_object_file ()
875 {
876   register struct frchain *frchainP;    /* Track along all frchains. */
877   register fragS *fragP;        /* Track along all frags. */
878 #if !defined (BFD_ASSEMBLER) && !defined (OBJ_VMS)
879   long object_file_size;
880 #endif
881
882   /* Do we really want to write it?  */
883   {
884     int n_warns, n_errs;
885     n_warns = had_warnings ();
886     n_errs = had_errors ();
887     /* The -Z flag indicates that an object file should be generated,
888        regardless of warnings and errors.  */
889     if (flagseen['Z'])
890       {
891         if (n_warns || n_errs)
892           as_warn ("%d error%s, %d warning%s, generating bad object file.\n",
893                    n_errs, n_errs == 1 ? "" : "s",
894                    n_warns, n_warns == 1 ? "" : "s");
895       }
896     else
897       {
898         if (n_errs)
899           as_fatal ("%d error%s, %d warning%s, no object file generated.\n",
900                     n_errs, n_errs == 1 ? "" : "s",
901                     n_warns, n_warns == 1 ? "" : "s");
902       }
903   }
904
905 #ifdef  OBJ_VMS
906   /*
907    *    Under VMS we try to be compatible with VAX-11 "C".  Thus, we
908    *    call a routine to check for the definition of the procedure
909    *    "_main", and if so -- fix it up so that it can be program
910    *    entry point.
911    */
912   VMS_Check_For_Main ();
913 #endif /* VMS */
914
915   /* After every sub-segment, we fake an ".align ...". This conforms to
916      BSD4.2 brane-damage. We then fake ".fill 0" because that is the kind of
917      frag that requires least thought. ".align" frags like to have a
918      following frag since that makes calculating their intended length
919      trivial.
920
921      @@ Is this really necessary??  */
922 #ifndef SUB_SEGMENT_ALIGN
923 #ifdef BFD_ASSEMBLER
924 #define SUB_SEGMENT_ALIGN(SEG) (0)
925 #else
926 #define SUB_SEGMENT_ALIGN(SEG) (2)
927 #endif
928 #endif
929   for (frchainP = frchain_root; frchainP; frchainP = frchainP->frch_next)
930     {
931 #ifdef BFD_ASSEMBLER
932       subseg_set (frchainP->frch_seg, frchainP->frch_subseg);
933 #else
934       subseg_new (frchainP->frch_seg, frchainP->frch_subseg);
935 #endif
936       frag_align (SUB_SEGMENT_ALIGN (now_seg), NOP_OPCODE);
937       /* frag_align will have left a new frag.
938          Use this last frag for an empty ".fill".
939
940          For this segment ...
941          Create a last frag. Do not leave a "being filled in frag".  */
942       frag_wane (frag_now);
943       frag_now->fr_fix = 0;
944       know (frag_now->fr_next == NULL);
945     }
946
947   /* From now on, we don't care about sub-segments.  Build one frag chain
948      for each segment. Linked thru fr_next.  */
949
950 #ifdef BFD_ASSEMBLER
951   /* Remove the sections created by gas for its own purposes.  */
952   {
953     asection **seclist, *sec;
954     seclist = &stdoutput->sections;
955     while (seclist && *seclist)
956       {
957         sec = *seclist;
958         while (sec == reg_section || sec == expr_section)
959           {
960             sec = sec->next;
961             *seclist = sec;
962             stdoutput->section_count--;
963             if (!sec)
964               break;
965           }
966         if (*seclist)
967           seclist = &(*seclist)->next;
968       }
969   }
970
971   bfd_map_over_sections (stdoutput, chain_frchains_together, (char *) 0);
972 #else
973   remove_subsegs (frchain_root, SEG_TEXT, &text_frag_root, &text_last_frag);
974   remove_subsegs (data0_frchainP, SEG_DATA, &data_frag_root, &data_last_frag);
975   remove_subsegs (bss0_frchainP, SEG_BSS, &bss_frag_root, &bss_last_frag);
976 #endif
977
978   /* We have two segments. If user gave -R flag, then we must put the
979      data frags into the text segment. Do this before relaxing so
980      we know to take advantage of -R and make shorter addresses.  */
981 #if !defined (OBJ_AOUT) || defined (BFD_ASSEMBLER)
982   if (flagseen['R'])
983     {
984       merge_data_into_text ();
985     }
986 #endif
987
988 #ifdef BFD_ASSEMBLER
989   bfd_map_over_sections (stdoutput, relax_and_size_seg, (char *) 0);
990 #else
991   relax_and_size_all_segments ();
992 #endif /* BFD_ASSEMBLER */
993
994 #ifndef BFD_ASSEMBLER
995   /*
996    *
997    * Crawl the symbol chain.
998    *
999    * For each symbol whose value depends on a frag, take the address of
1000    * that frag and subsume it into the value of the symbol.
1001    * After this, there is just one way to lookup a symbol value.
1002    * Values are left in their final state for object file emission.
1003    * We adjust the values of 'L' local symbols, even if we do
1004    * not intend to emit them to the object file, because their values
1005    * are needed for fix-ups.
1006    *
1007    * Unless we saw a -L flag, remove all symbols that begin with 'L'
1008    * from the symbol chain.  (They are still pointed to by the fixes.)
1009    *
1010    * Count the remaining symbols.
1011    * Assign a symbol number to each symbol.
1012    * Count the number of string-table chars we will emit.
1013    * Put this info into the headers as appropriate.
1014    *
1015    */
1016   know (zero_address_frag.fr_address == 0);
1017   string_byte_count = sizeof (string_byte_count);
1018
1019   obj_crawl_symbol_chain (&headers);
1020
1021   if (string_byte_count == sizeof (string_byte_count))
1022     string_byte_count = 0;
1023
1024   H_SET_STRING_SIZE (&headers, string_byte_count);
1025
1026   /*
1027    * Addresses of frags now reflect addresses we use in the object file.
1028    * Symbol values are correct.
1029    * Scan the frags, converting any ".org"s and ".align"s to ".fill"s.
1030    * Also converting any machine-dependent frags using md_convert_frag();
1031    */
1032   subseg_change (SEG_TEXT, 0);
1033
1034   for (fragP = text_frag_root; fragP; fragP = fragP->fr_next)
1035     {
1036       cvt_frag_to_fill (&headers, fragP);
1037
1038       /* Some assert macros don't work with # directives mixed in.  */
1039 #ifndef NDEBUG
1040       if (!(fragP->fr_next == NULL
1041 #ifdef OBJ_BOUT
1042             || fragP->fr_next == data_frag_root
1043 #endif
1044             || ((fragP->fr_next->fr_address - fragP->fr_address)
1045                 == (fragP->fr_fix + fragP->fr_offset * fragP->fr_var))))
1046         abort ();
1047 #endif
1048     }
1049 #endif /* ! BFD_ASSEMBLER */
1050
1051 #ifndef WORKING_DOT_WORD
1052   {
1053     struct broken_word *lie;
1054     struct broken_word **prevP;
1055
1056     prevP = &broken_words;
1057     for (lie = broken_words; lie; lie = lie->next_broken_word)
1058       if (!lie->added)
1059         {
1060           expressionS exp;
1061
1062           exp.X_op = O_subtract;
1063           exp.X_add_symbol = lie->add;
1064           exp.X_op_symbol = lie->sub;
1065           exp.X_add_number = lie->addnum;
1066 #ifdef BFD_ASSEMBLER
1067           fix_new_exp (lie->frag,
1068                        lie->word_goes_here - lie->frag->fr_literal,
1069                        2, &exp, 0, BFD_RELOC_NONE);
1070 #else
1071 #if defined(TC_SPARC) || defined(TC_A29K) || defined(NEED_FX_R_TYPE)
1072           fix_new_exp (lie->frag,
1073                        lie->word_goes_here - lie->frag->fr_literal,
1074                        2, &exp, 0, NO_RELOC);
1075 #else
1076 #ifdef TC_NS32K
1077           fix_new_ns32k_exp (lie->frag,
1078                              lie->word_goes_here - lie->frag->fr_literal,
1079                              2, &exp, 0, 0, 2, 0, 0);
1080 #else
1081           fix_new_exp (lie->frag,
1082                        lie->word_goes_here - lie->frag->fr_literal,
1083                        2, &exp, 0, 0);
1084 #endif /* TC_NS32K */
1085 #endif /* TC_SPARC|TC_A29K|NEED_FX_R_TYPE */
1086 #endif /* BFD_ASSEMBLER */
1087           *prevP = lie->next_broken_word;
1088         }
1089       else
1090         prevP = &(lie->next_broken_word);
1091
1092     for (lie = broken_words; lie;)
1093       {
1094         struct broken_word *untruth;
1095         char *table_ptr;
1096         addressT table_addr;
1097         addressT from_addr, to_addr;
1098         int n, m;
1099
1100         fragP = lie->dispfrag;
1101
1102         /* Find out how many broken_words go here.  */
1103         n = 0;
1104         for (untruth = lie; untruth && untruth->dispfrag == fragP; untruth = untruth->next_broken_word)
1105           if (untruth->added == 1)
1106             n++;
1107
1108         table_ptr = lie->dispfrag->fr_opcode;
1109         table_addr = lie->dispfrag->fr_address + (table_ptr - lie->dispfrag->fr_literal);
1110         /* Create the jump around the long jumps.  This is a short
1111            jump from table_ptr+0 to table_ptr+n*long_jump_size.  */
1112         from_addr = table_addr;
1113         to_addr = table_addr + md_short_jump_size + n * md_long_jump_size;
1114         md_create_short_jump (table_ptr, from_addr, to_addr, lie->dispfrag, lie->add);
1115         table_ptr += md_short_jump_size;
1116         table_addr += md_short_jump_size;
1117
1118         for (m = 0; lie && lie->dispfrag == fragP; m++, lie = lie->next_broken_word)
1119           {
1120             if (lie->added == 2)
1121               continue;
1122             /* Patch the jump table */
1123             /* This is the offset from ??? to table_ptr+0 */
1124             to_addr = table_addr - S_GET_VALUE (lie->sub);
1125             md_number_to_chars (lie->word_goes_here, to_addr, 2);
1126             for (untruth = lie->next_broken_word; untruth && untruth->dispfrag == fragP; untruth = untruth->next_broken_word)
1127               {
1128                 if (untruth->use_jump == lie)
1129                   md_number_to_chars (untruth->word_goes_here, to_addr, 2);
1130               }
1131
1132             /* Install the long jump */
1133             /* this is a long jump from table_ptr+0 to the final target */
1134             from_addr = table_addr;
1135             to_addr = S_GET_VALUE (lie->add) + lie->addnum;
1136             md_create_long_jump (table_ptr, from_addr, to_addr, lie->dispfrag, lie->add);
1137             table_ptr += md_long_jump_size;
1138             table_addr += md_long_jump_size;
1139           }
1140       }
1141   }
1142 #endif /* not WORKING_DOT_WORD */
1143
1144 #ifndef BFD_ASSEMBLER
1145 #ifndef OBJ_VMS
1146   {                             /* not vms */
1147     /*
1148      * Scan every FixS performing fixups. We had to wait until now to do
1149      * this because md_convert_frag() may have made some fixSs.
1150      */
1151     int trsize, drsize;
1152
1153     subseg_change (SEG_TEXT, 0);
1154     trsize = md_reloc_size * fixup_segment (text_fix_root, SEG_TEXT);
1155     subseg_change (SEG_DATA, 0);
1156     drsize = md_reloc_size * fixup_segment (data_fix_root, SEG_DATA);
1157     H_SET_RELOCATION_SIZE (&headers, trsize, drsize);
1158
1159     /* FIXME move this stuff into the pre-write-hook */
1160     H_SET_MAGIC_NUMBER (&headers, magic_number_for_object_file);
1161     H_SET_ENTRY_POINT (&headers, 0);
1162
1163     obj_pre_write_hook (&headers);      /* extra coff stuff */
1164
1165     object_file_size = H_GET_FILE_SIZE (&headers);
1166     next_object_file_charP = the_object_file = xmalloc (object_file_size);
1167
1168     output_file_create (out_file_name);
1169
1170     obj_header_append (&next_object_file_charP, &headers);
1171
1172     know ((next_object_file_charP - the_object_file) == H_GET_HEADER_SIZE (&headers));
1173
1174     /*
1175      * Emit code.
1176      */
1177     for (fragP = text_frag_root; fragP; fragP = fragP->fr_next)
1178       {
1179         register long count;
1180         register char *fill_literal;
1181         register long fill_size;
1182
1183         know (fragP->fr_type == rs_fill);
1184         append (&next_object_file_charP, fragP->fr_literal, (unsigned long) fragP->fr_fix);
1185         fill_literal = fragP->fr_literal + fragP->fr_fix;
1186         fill_size = fragP->fr_var;
1187         know (fragP->fr_offset >= 0);
1188
1189         for (count = fragP->fr_offset; count; count--)
1190           {
1191             append (&next_object_file_charP, fill_literal, (unsigned long) fill_size);
1192           }                     /* for each  */
1193
1194       }                         /* for each code frag. */
1195
1196     know ((next_object_file_charP - the_object_file) == (H_GET_HEADER_SIZE (&headers) + H_GET_TEXT_SIZE (&headers) + H_GET_DATA_SIZE (&headers)));
1197
1198     /*
1199      * Emit relocations.
1200      */
1201     obj_emit_relocations (&next_object_file_charP, text_fix_root, (relax_addressT) 0);
1202     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)));
1203 #ifdef TC_I960
1204     /* Make addresses in data relocation directives relative to beginning of
1205      * first data fragment, not end of last text fragment:  alignment of the
1206      * start of the data segment may place a gap between the segments.
1207      */
1208     obj_emit_relocations (&next_object_file_charP, data_fix_root, data0_frchainP->frch_root->fr_address);
1209 #else /* TC_I960 */
1210     obj_emit_relocations (&next_object_file_charP, data_fix_root, text_last_frag->fr_address);
1211 #endif /* TC_I960 */
1212
1213     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)));
1214
1215     /*
1216      * Emit line number entries.
1217      */
1218     OBJ_EMIT_LINENO (&next_object_file_charP, lineno_rootP, the_object_file);
1219     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)));
1220
1221     /*
1222      * Emit symbols.
1223      */
1224     obj_emit_symbols (&next_object_file_charP, symbol_rootP);
1225     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)));
1226
1227     /*
1228      * Emit strings.
1229      */
1230
1231     if (string_byte_count > 0)
1232       {
1233         obj_emit_strings (&next_object_file_charP);
1234       }                         /* only if we have a string table */
1235
1236 #ifdef BFD_HEADERS
1237     bfd_seek (stdoutput, 0, 0);
1238     bfd_write (the_object_file, 1, object_file_size, stdoutput);
1239 #else
1240
1241     /* Write the data to the file */
1242     output_file_append (the_object_file, object_file_size, out_file_name);
1243 #endif
1244
1245     output_file_close (out_file_name);
1246   }                             /* non vms output */
1247 #else /* VMS */
1248   /*
1249    *    Now do the VMS-dependent part of writing the object file
1250    */
1251   VMS_write_object_file (H_GET_TEXT_SIZE (&headers),
1252                          H_GET_DATA_SIZE (&headers),
1253                          H_GET_BSS_SIZE (&headers),
1254                          text_frag_root, data_frag_root);
1255 #endif /* VMS */
1256 #else /* BFD_ASSEMBLER */
1257
1258 #ifdef obj_check_file_symbols
1259   obj_check_file_symbols ();
1260 #endif
1261
1262   bfd_map_over_sections (stdoutput, adjust_reloc_syms, (char *)0);
1263
1264   /* Set up symbol table, and write it out.  */
1265   if (symbol_rootP)
1266     {
1267       int i = 0, n;
1268       symbolS *symp;
1269
1270       for (symp = symbol_rootP; symp; symp = symbol_next (symp))
1271         {
1272           int keep = 0;
1273
1274           if (! symp->sy_resolved)
1275             {
1276               if (symp->sy_value.X_op == O_constant)
1277                 {
1278                   /* This is the normal case; skip the call.  */
1279                   S_SET_VALUE (symp,
1280                                (S_GET_VALUE (symp)
1281                                 + symp->sy_frag->fr_address));
1282                   symp->sy_resolved = 1;
1283                 }
1284               else
1285                 resolve_symbol_value (symp);
1286             }
1287
1288           /* So far, common symbols have been treated like undefined symbols.
1289              Put them in the common section now.  */
1290           if (S_IS_DEFINED (symp) == 0
1291               && S_GET_VALUE (symp) != 0)
1292             S_SET_SEGMENT (symp, &bfd_com_section);
1293 #if 0
1294           printf ("symbol `%s'\n\t@%x: value=%d flags=%x seg=%s\n",
1295                   S_GET_NAME (symp), symp,
1296                   S_GET_VALUE (symp),
1297                   symp->bsym->flags,
1298                   segment_name (symp->bsym->section));
1299 #endif
1300           {
1301             int punt = 0;
1302 #ifdef obj_frob_symbol
1303             obj_frob_symbol (symp, punt);
1304             if (punt)
1305               goto punt_it;
1306 #endif
1307 #ifdef tc_frob_symbol
1308             tc_frob_symbol (symp, punt);
1309             if (punt)
1310               goto punt_it;
1311 #endif
1312           }
1313           /* If we don't want to keep this symbol, splice it out of the
1314              chain now.  */
1315           if (S_IS_LOCAL (symp))
1316             {
1317               symbolS *prev, *next;
1318             punt_it:
1319               prev = symbol_previous (symp);
1320               next = symbol_next (symp);
1321 #ifdef DEBUG_SYMS
1322               verify_symbol_chain_2 (symp);
1323 #endif
1324               if (prev)
1325                 {
1326                   symbol_next (prev) = next;
1327                   symp = prev;
1328                 }
1329               else if (symp == symbol_rootP)
1330                 symbol_rootP = next;
1331               else
1332                 abort ();
1333               if (next)
1334                 symbol_previous (next) = prev;
1335               else
1336                 symbol_lastP = prev;
1337 #ifdef DEBUG_SYMS
1338               if (prev)
1339                 verify_symbol_chain_2 (prev);
1340               else if (next)
1341                 verify_symbol_chain_2 (next);
1342 #endif
1343               continue;
1344             }
1345
1346           /* Set the value into the BFD symbol.  Up til now the value
1347              has only been kept in the gas symbolS struct.  */
1348           symp->bsym->value = S_GET_VALUE (symp);
1349
1350           i++;
1351         }
1352       n = i;
1353       if (n)
1354         {
1355           asymbol **asympp;
1356           boolean result;
1357           extern PTR bfd_alloc PARAMS ((bfd *, size_t));
1358
1359           asympp = (asymbol **) bfd_alloc (stdoutput,
1360                                            n * sizeof (asymbol *));
1361           symp = symbol_rootP;
1362           for (i = 0; i < n; i++, symp = symbol_next (symp))
1363             {
1364               asympp[i] = symp->bsym;
1365               symp->written = 1;
1366             }
1367           result = bfd_set_symtab (stdoutput, asympp, n);
1368           assert (result == true);
1369         }
1370     }
1371
1372
1373 #ifdef obj_frob_file
1374   /* If obj_frob_file changes the symbol value at this point, it is
1375      responsible for moving the changed value into symp->bsym->value
1376      as well.  Hopefully all symbol value changing can be done in
1377      {obj,tc}_frob_symbol.  */
1378   obj_frob_file ();
1379 #endif
1380
1381   /* Now that all the sizes are known, and contents correct, we can
1382      start writing the file.  */
1383   bfd_map_over_sections (stdoutput, write_relocs, (char *) 0);
1384
1385   bfd_map_over_sections (stdoutput, write_contents, (char *) 0);
1386
1387   output_file_close (out_file_name);
1388 #endif /* BFD_ASSEMBLER */
1389 }
1390 #endif /* ! BFD */
1391
1392 /*
1393  *                      relax_segment()
1394  *
1395  * Now we have a segment, not a crowd of sub-segments, we can make fr_address
1396  * values.
1397  *
1398  * Relax the frags.
1399  *
1400  * After this, all frags in this segment have addresses that are correct
1401  * within the segment. Since segments live in different file addresses,
1402  * these frag addresses may not be the same as final object-file addresses.
1403  */
1404
1405 /* Subroutines of relax_segment.  */
1406 static int 
1407 is_dnrange (f1, f2)
1408      struct frag *f1;
1409      struct frag *f2;
1410 {
1411   for (; f1; f1 = f1->fr_next)
1412     if (f1->fr_next == f2)
1413       return 1;
1414   return 0;
1415 }
1416
1417 /* Relax_align. Advance location counter to next address that has 'alignment'
1418    lowest order bits all 0s, return size of adjustment made.  */
1419 static relax_addressT
1420 relax_align (address, alignment)
1421      register relax_addressT address;   /* Address now. */
1422      register int alignment;    /* Alignment (binary). */
1423 {
1424   relax_addressT mask;
1425   relax_addressT new_address;
1426
1427   mask = ~((~0) << alignment);
1428   new_address = (address + mask) & (~mask);
1429   if (linkrelax)
1430     /* We must provide lots of padding, so the linker can discard it
1431        when needed.  The linker will not add extra space, ever.  */
1432     new_address += (1 << alignment);
1433   return (new_address - address);
1434 }
1435
1436 void 
1437 relax_segment (segment_frag_root, segment)
1438      struct frag *segment_frag_root;
1439      segT segment;
1440 {
1441   register struct frag *fragP;
1442   register relax_addressT address;
1443 #if !defined (MANY_SEGMENTS) && !defined (BFD_ASSEMBLER)
1444   know (segment == SEG_DATA || segment == SEG_TEXT || segment == SEG_BSS);
1445 #endif
1446   /* In case md_estimate_size_before_relax() wants to make fixSs. */
1447   subseg_change (segment, 0);
1448
1449   /* For each frag in segment: count and store  (a 1st guess of)
1450      fr_address.  */
1451   address = 0;
1452   for (fragP = segment_frag_root; fragP; fragP = fragP->fr_next)
1453     {
1454       fragP->fr_address = address;
1455       address += fragP->fr_fix;
1456
1457       switch (fragP->fr_type)
1458         {
1459         case rs_fill:
1460           address += fragP->fr_offset * fragP->fr_var;
1461           break;
1462
1463         case rs_align:
1464           address += relax_align (address, (int) fragP->fr_offset);
1465           break;
1466
1467         case rs_org:
1468           /* Assume .org is nugatory. It will grow with 1st relax.  */
1469           break;
1470
1471         case rs_machine_dependent:
1472           address += md_estimate_size_before_relax (fragP, segment);
1473           break;
1474
1475 #ifndef WORKING_DOT_WORD
1476           /* Broken words don't concern us yet */
1477         case rs_broken_word:
1478           break;
1479 #endif
1480
1481         default:
1482           BAD_CASE (fragP->fr_type);
1483           break;
1484         }                       /* switch(fr_type) */
1485     }                           /* for each frag in the segment */
1486
1487   /* Do relax().  */
1488   {
1489     long stretch;       /* May be any size, 0 or negative. */
1490     /* Cumulative number of addresses we have */
1491     /* relaxed this pass. */
1492     /* We may have relaxed more than one address. */
1493     long stretched;     /* Have we stretched on this pass? */
1494     /* This is 'cuz stretch may be zero, when, in fact some piece of code
1495        grew, and another shrank.  If a branch instruction doesn't fit anymore,
1496        we could be scrod.  */
1497
1498     do
1499       {
1500         stretch = stretched = 0;
1501         for (fragP = segment_frag_root; fragP; fragP = fragP->fr_next)
1502           {
1503             long growth = 0;
1504             unsigned long was_address;
1505             long offset;
1506             symbolS *symbolP;
1507             long target;
1508             long after;
1509             long aim;
1510
1511             was_address = fragP->fr_address;
1512             address = fragP->fr_address += stretch;
1513             symbolP = fragP->fr_symbol;
1514             offset = fragP->fr_offset;
1515
1516             switch (fragP->fr_type)
1517               {
1518               case rs_fill:     /* .fill never relaxes. */
1519                 growth = 0;
1520                 break;
1521
1522 #ifndef WORKING_DOT_WORD
1523                 /* JF:  This is RMS's idea.  I do *NOT* want to be blamed
1524                    for it I do not want to write it.  I do not want to have
1525                    anything to do with it.  This is not the proper way to
1526                    implement this misfeature.  */
1527               case rs_broken_word:
1528                 {
1529                   struct broken_word *lie;
1530                   struct broken_word *untruth;
1531
1532                   /* Yes this is ugly (storing the broken_word pointer
1533                      in the symbol slot).  Still, this whole chunk of
1534                      code is ugly, and I don't feel like doing anything
1535                      about it.  Think of it as stubbornness in action.  */
1536                   growth = 0;
1537                   for (lie = (struct broken_word *) (fragP->fr_symbol);
1538                        lie && lie->dispfrag == fragP;
1539                        lie = lie->next_broken_word)
1540                     {
1541
1542                       if (lie->added)
1543                         continue;
1544
1545                       offset = (lie->add->sy_frag->fr_address
1546                                 + S_GET_VALUE (lie->add)
1547                                 + lie->addnum
1548                                 - (lie->sub->sy_frag->fr_address
1549                                    + S_GET_VALUE (lie->sub)));
1550                       if (offset <= -32768 || offset >= 32767)
1551                         {
1552                           if (flagseen['K'])
1553                             {
1554                               char buf[50];
1555                               sprint_value (buf, lie->addnum);
1556                               as_warn (".word %s-%s+%s didn't fit",
1557                                        S_GET_NAME (lie->add),
1558                                        S_GET_NAME (lie->sub),
1559                                        buf);
1560                             }
1561                           lie->added = 1;
1562                           if (fragP->fr_subtype == 0)
1563                             {
1564                               fragP->fr_subtype++;
1565                               growth += md_short_jump_size;
1566                             }
1567                           for (untruth = lie->next_broken_word;
1568                                untruth && untruth->dispfrag == lie->dispfrag;
1569                                untruth = untruth->next_broken_word)
1570                             if ((untruth->add->sy_frag == lie->add->sy_frag)
1571                                 && S_GET_VALUE (untruth->add) == S_GET_VALUE (lie->add))
1572                               {
1573                                 untruth->added = 2;
1574                                 untruth->use_jump = lie;
1575                               }
1576                           growth += md_long_jump_size;
1577                         }
1578                     }
1579
1580                   break;
1581                 }               /* case rs_broken_word */
1582 #endif
1583               case rs_align:
1584                 growth = (relax_align ((relax_addressT) (address
1585                                                          + fragP->fr_fix),
1586                                        (int) offset)
1587                           - relax_align ((relax_addressT) (was_address
1588                                                            + fragP->fr_fix),
1589                                          (int) offset));
1590                 break;
1591
1592               case rs_org:
1593                 target = offset;
1594
1595                 if (symbolP)
1596                   {
1597 #if !defined (MANY_SEGMENTS) && !defined (BFD_ASSEMBLER)
1598                     know ((S_GET_SEGMENT (symbolP) == SEG_ABSOLUTE)
1599                           || (S_GET_SEGMENT (symbolP) == SEG_DATA)
1600                           || (S_GET_SEGMENT (symbolP) == SEG_TEXT)
1601                           || S_GET_SEGMENT (symbolP) == SEG_BSS);
1602                     know (symbolP->sy_frag);
1603                     know (!(S_GET_SEGMENT (symbolP) == SEG_ABSOLUTE)
1604                           || (symbolP->sy_frag == &zero_address_frag));
1605 #endif
1606                     target += S_GET_VALUE (symbolP)
1607                       + symbolP->sy_frag->fr_address;
1608                   }             /* if we have a symbol */
1609
1610                 know (fragP->fr_next);
1611                 after = fragP->fr_next->fr_address;
1612                 growth = ((target - after) > 0) ? (target - after) : 0;
1613                 /* Growth may be negative, but variable part of frag
1614                    cannot have fewer than 0 chars.  That is, we can't
1615                    .org backwards. */
1616
1617                 growth -= stretch;      /* This is an absolute growth factor */
1618                 break;
1619
1620               case rs_machine_dependent:
1621                 {
1622                   const relax_typeS *this_type;
1623                   const relax_typeS *start_type;
1624                   relax_substateT next_state;
1625                   relax_substateT this_state;
1626
1627                   this_state = fragP->fr_subtype;
1628                   start_type = this_type = md_relax_table + this_state;
1629                   target = offset;
1630
1631                   if (symbolP)
1632                     {
1633 #if !defined (MANY_SEGMENTS) && !defined (BFD_ASSEMBLER)
1634                       know ((S_GET_SEGMENT (symbolP) == SEG_ABSOLUTE)
1635                             || (S_GET_SEGMENT (symbolP) == SEG_DATA)
1636                             || (S_GET_SEGMENT (symbolP) == SEG_BSS)
1637                             || (S_GET_SEGMENT (symbolP) == SEG_TEXT));
1638 #endif
1639                       know (symbolP->sy_frag);
1640                       know (!(S_GET_SEGMENT (symbolP) == absolute_section)
1641                             || symbolP->sy_frag == &zero_address_frag);
1642                       target +=
1643                         S_GET_VALUE (symbolP)
1644                         + symbolP->sy_frag->fr_address;
1645
1646                       /* If frag has yet to be reached on this pass,
1647                          assume it will move by STRETCH just as we did.
1648                          If this is not so, it will be because some frag
1649                          between grows, and that will force another pass.
1650
1651                          Beware zero-length frags.
1652
1653                          There should be a faster way to do this.  */
1654
1655                       if (symbolP->sy_frag->fr_address >= was_address
1656                           && is_dnrange (fragP, symbolP->sy_frag))
1657                         {
1658                           target += stretch;
1659                         }
1660                     }
1661
1662                   aim = target - address - fragP->fr_fix;
1663                   /* The displacement is affected by the instruction size
1664                      for the 32k architecture. I think we ought to be able
1665                      to add fragP->fr_pcrel_adjust in all cases (it should be
1666                      zero if not used), but just in case it breaks something
1667                      else we'll put this inside #ifdef NS32K ... #endif  */
1668 #ifndef TC_NS32K
1669                   if (fragP->fr_pcrel_adjust)
1670                     abort ();
1671 #endif
1672                   aim += fragP->fr_pcrel_adjust;
1673
1674                   if (aim < 0)
1675                     {
1676                       /* Look backwards. */
1677                       for (next_state = this_type->rlx_more; next_state;)
1678                         if (aim >= this_type->rlx_backward)
1679                           next_state = 0;
1680                         else
1681                           {
1682                             /* Grow to next state. */
1683                             this_state = next_state;
1684                             this_type = md_relax_table + this_state;
1685                             next_state = this_type->rlx_more;
1686                           }
1687                     }
1688                   else
1689                     {
1690 #ifdef M68K_AIM_KLUDGE
1691                       M68K_AIM_KLUDGE (aim, this_state, this_type);
1692 #endif
1693                       /* Look forwards. */
1694                       for (next_state = this_type->rlx_more; next_state;)
1695                         if (aim <= this_type->rlx_forward)
1696                           next_state = 0;
1697                         else
1698                           {
1699                             /* Grow to next state. */
1700                             this_state = next_state;
1701                             this_type = md_relax_table + this_state;
1702                             next_state = this_type->rlx_more;
1703                           }
1704                     }
1705
1706                   growth = this_type->rlx_length - start_type->rlx_length;
1707                   if (growth != 0)
1708                     fragP->fr_subtype = this_state;
1709                 }
1710                 break;
1711
1712               default:
1713                 BAD_CASE (fragP->fr_type);
1714                 break;
1715               }
1716             if (growth)
1717               {
1718                 stretch += growth;
1719                 stretched++;
1720               }
1721           }                     /* For each frag in the segment. */
1722       }
1723     while (stretched);          /* Until nothing further to relax. */
1724   }                             /* do_relax */
1725
1726   /*
1727    * We now have valid fr_address'es for each frag.
1728    */
1729
1730   /*
1731    * All fr_address's are correct, relative to their own segment.
1732    * We have made all the fixS we will ever make.
1733    */
1734 }                               /* relax_segment() */
1735
1736 /* fixup_segment()
1737
1738    Go through all the fixS's in a segment and see which ones can be
1739    handled now.  (These consist of fixS where we have since discovered
1740    the value of a symbol, or the address of the frag involved.)
1741    For each one, call md_apply_fix to put the fix into the frag data.
1742
1743    Result is a count of how many relocation structs will be needed to
1744    handle the remaining fixS's that we couldn't completely handle here.
1745    These will be output later by emit_relocations().  */
1746
1747 static long
1748 fixup_segment (fixP, this_segment_type)
1749      register fixS *fixP;
1750      segT this_segment_type;    /* N_TYPE bits for segment. */
1751 {
1752   register long seg_reloc_count;
1753   register symbolS *add_symbolP;
1754   register symbolS *sub_symbolP;
1755   valueT add_number;
1756   register int size;
1757   register char *place;
1758   register long where;
1759   register char pcrel;
1760   register fragS *fragP;
1761   register segT add_symbol_segment = absolute_section;
1762
1763   seg_reloc_count = 0;
1764   /* If the linker is doing the relaxing, we must not do any fixups */
1765   if (linkrelax)
1766     for (; fixP; fixP = fixP->fx_next)
1767       seg_reloc_count++;
1768   else
1769     for (; fixP; fixP = fixP->fx_next)
1770       {
1771         fragP = fixP->fx_frag;
1772         know (fragP);
1773         where = fixP->fx_where;
1774         place = fragP->fr_literal + where;
1775         size = fixP->fx_size;
1776         add_symbolP = fixP->fx_addsy;
1777 #ifdef TC_I960
1778         if (fixP->fx_callj && TC_S_IS_CALLNAME (add_symbolP))
1779           {
1780             /* Relocation should be done via the associated 'bal'
1781                entry point symbol. */
1782
1783             if (!TC_S_IS_BALNAME (tc_get_bal_of_call (add_symbolP)))
1784               {
1785                 as_bad ("No 'bal' entry point for leafproc %s",
1786                         S_GET_NAME (add_symbolP));
1787                 continue;
1788               }
1789             fixP->fx_addsy = add_symbolP = tc_get_bal_of_call (add_symbolP);
1790           }
1791 #endif
1792         sub_symbolP = fixP->fx_subsy;
1793         add_number = fixP->fx_offset;
1794         pcrel = fixP->fx_pcrel;
1795
1796         if (add_symbolP)
1797           add_symbol_segment = S_GET_SEGMENT (add_symbolP);
1798
1799         if (sub_symbolP)
1800           {
1801             if (!add_symbolP)
1802               {
1803                 /* Its just -sym */
1804                 if (S_GET_SEGMENT (sub_symbolP) != absolute_section)
1805                   as_bad ("Negative of non-absolute symbol %s",
1806                           S_GET_NAME (sub_symbolP));
1807
1808                 add_number -= S_GET_VALUE (sub_symbolP);
1809               }
1810             else if ((S_GET_SEGMENT (sub_symbolP) == add_symbol_segment)
1811                      && (SEG_NORMAL (add_symbol_segment)
1812                          || (add_symbol_segment == absolute_section)))
1813               {
1814                 /* Difference of 2 symbols from same segment.
1815                    Can't make difference of 2 undefineds: 'value' means
1816                    something different for N_UNDF. */
1817 #ifdef TC_I960
1818                 /* Makes no sense to use the difference of 2 arbitrary symbols
1819                    as the target of a call instruction.  */
1820                 if (fixP->fx_callj)
1821                   {
1822                     as_bad ("callj to difference of 2 symbols");
1823                   }
1824 #endif /* TC_I960 */
1825                 add_number += S_GET_VALUE (add_symbolP) -
1826                   S_GET_VALUE (sub_symbolP);
1827
1828                 add_symbolP = NULL;
1829                 fixP->fx_addsy = NULL;
1830               }
1831             else
1832               {
1833                 /* Different segments in subtraction. */
1834                 know (!(S_IS_EXTERNAL (sub_symbolP)
1835                         && (S_GET_SEGMENT (sub_symbolP) == absolute_section)));
1836
1837                 if ((S_GET_SEGMENT (sub_symbolP) == absolute_section))
1838                   {
1839                     add_number -= S_GET_VALUE (sub_symbolP);
1840                   }
1841                 else
1842                   {
1843                     char buf[50];
1844                     sprint_value (buf, fragP->fr_address + where);
1845                     as_bad ("Can't emit reloc {- %s-seg symbol \"%s\"} @ file address %s.",
1846                             segment_name (S_GET_SEGMENT (sub_symbolP)),
1847                             S_GET_NAME (sub_symbolP), buf);
1848                   }
1849               }
1850           }
1851
1852         if (add_symbolP)
1853           {
1854             if (add_symbol_segment == this_segment_type && pcrel)
1855               {
1856                 /*
1857                  * This fixup was made when the symbol's segment was
1858                  * SEG_UNKNOWN, but it is now in the local segment.
1859                  * So we know how to do the address without relocation.
1860                  */
1861 #ifdef TC_I960
1862                 /* reloc_callj() may replace a 'call' with a 'calls' or a
1863                    'bal', in which cases it modifies *fixP as appropriate.
1864                    In the case of a 'calls', no further work is required,
1865                    and *fixP has been set up to make the rest of the code
1866                    below a no-op. */
1867                 reloc_callj (fixP);
1868 #endif /* TC_I960 */
1869
1870                 add_number += S_GET_VALUE (add_symbolP);
1871                 add_number -= md_pcrel_from (fixP);
1872                 pcrel = 0;      /* Lie. Don't want further pcrel processing. */
1873                 fixP->fx_addsy = NULL;  /* No relocations please. */
1874               }
1875             else
1876               {
1877                 if (add_symbol_segment == absolute_section)
1878                   {
1879 #ifdef TC_I960
1880                     /* See comment about reloc_callj() above.  */
1881                     reloc_callj (fixP);
1882 #endif /* TC_I960 */
1883                     add_number += S_GET_VALUE (add_symbolP);
1884                     fixP->fx_addsy = NULL;
1885                     add_symbolP = NULL;
1886                   }
1887                 else if (add_symbol_segment == undefined_section
1888 #ifdef BFD_ASSEMBLER
1889                          || add_symbol_segment == &bfd_com_section
1890 #endif
1891                          )
1892                   {
1893 #ifdef TC_I960
1894                     if ((int) fixP->fx_bit_fixP == 13)
1895                       {
1896                         /* This is a COBR instruction.  They have only a
1897                          * 13-bit displacement and are only to be used
1898                          * for local branches: flag as error, don't generate
1899                          * relocation.
1900                          */
1901                         as_bad ("can't use COBR format with external label");
1902                         fixP->fx_addsy = NULL;  /* No relocations please. */
1903                         continue;
1904                       }         /* COBR */
1905 #endif /* TC_I960 */
1906
1907 #ifdef OBJ_COFF
1908 #ifdef TE_I386AIX
1909                     if (S_IS_COMMON (add_symbolP))
1910                       add_number += S_GET_VALUE (add_symbolP);
1911 #endif /* TE_I386AIX */
1912 #endif /* OBJ_COFF */
1913                     ++seg_reloc_count;
1914                   }
1915                 else
1916                   {
1917                     seg_reloc_count++;
1918                     add_number += S_GET_VALUE (add_symbolP);
1919                   }
1920               }                 /* if not in local seg */
1921           }                     /* if there was a + symbol */
1922
1923         if (pcrel)
1924           {
1925             add_number -= md_pcrel_from (fixP);
1926             if (add_symbolP == 0)
1927               {
1928                 fixP->fx_addsy = &abs_symbol;
1929                 ++seg_reloc_count;
1930               }                 /* if there's an add_symbol */
1931           }                     /* if pcrel */
1932
1933         if (!fixP->fx_bit_fixP)
1934           {
1935             if ((size == 1
1936                  && (add_number & ~0xFF)
1937                  && ((add_number & ~0xFF) != (-1 & ~0xFF)))
1938                 || (size == 2
1939                     && (add_number & ~0xFFFF)
1940                     && ((add_number & ~0xFFFF) != (-1 & ~0xFFFF)))
1941                 || (size == 4
1942                     && (add_number & ~(valueT)0xFFFFFFFF)
1943                     && ((add_number & ~(valueT)0xFFFFFFFF) != (-1 & ~(valueT)0xFFFFFFFF)))
1944                 )
1945               {
1946                 char buf[50];
1947                 sprint_value (buf, fragP->fr_address + where);
1948                 as_bad ("Value of %d too large for field of %d bytes at %s",
1949                         add_number, size, buf);
1950               }                 /* generic error checking */
1951 #ifdef WARN_SIGNED_OVERFLOW_WORD
1952             /* Warn if a .word value is too large when treated as a signed
1953                number.  We already know it is not too negative.  This is to
1954                catch over-large switches generated by gcc on the 68k.  */
1955             if (!flagseen['J']
1956                 && size == 2
1957                 && add_number > 0x7fff)
1958               as_bad ("Signed .word overflow; switch may be too large; %d at 0x%x",
1959                       add_number, fragP->fr_address + where);
1960 #endif
1961           }                     /* not a bit fix */
1962
1963 #ifdef BFD_ASSEMBLER
1964         md_apply_fix (fixP, &add_number);
1965 #else
1966         md_apply_fix (fixP, add_number);
1967 #endif
1968       }                         /* For each fixS in this segment. */
1969
1970 #ifdef OBJ_COFF
1971 #ifdef TC_I960
1972   {
1973     fixS *topP = fixP;
1974
1975     /* two relocs per callj under coff. */
1976     for (fixP = topP; fixP; fixP = fixP->fx_next)
1977       {
1978         if (fixP->fx_callj && fixP->fx_addsy != 0)
1979           {
1980             ++seg_reloc_count;
1981           }                     /* if callj and not already fixed. */
1982       }                         /* for each fix */
1983   }
1984 #endif /* TC_I960 */
1985
1986 #endif /* OBJ_COFF */
1987   return (seg_reloc_count);
1988 }
1989
1990 /* end of write.c */