gcc lint. See ChangeLog for details. Also:
[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 #ifdef BFD_ASSEMBLER
322 static void
323 cvt_frag_to_fill (sec, fragP)
324      segT sec;
325      fragS *fragP;
326 #else
327 static void
328 cvt_frag_to_fill (headers, fragP)
329      object_headers *headers;
330      fragS *fragP;
331 #endif
332 {
333   switch (fragP->fr_type)
334     {
335     case rs_align:
336     case rs_org:
337 #ifdef HANDLE_ALIGN
338       HANDLE_ALIGN (fragP);
339 #endif
340       fragP->fr_type = rs_fill;
341       know (fragP->fr_var == 1);
342       know (fragP->fr_next != NULL);
343
344       fragP->fr_offset = (fragP->fr_next->fr_address
345                           - fragP->fr_address
346                           - fragP->fr_fix);
347       break;
348
349     case rs_fill:
350       break;
351
352     case rs_machine_dependent:
353 #ifdef BFD_ASSEMBLER
354       md_convert_frag (stdoutput, sec, fragP);
355 #else
356       md_convert_frag (headers, fragP);
357 #endif
358
359       assert (fragP->fr_next == NULL || (fragP->fr_next->fr_address - fragP->fr_address == fragP->fr_fix));
360
361       /*
362        * After md_convert_frag, we make the frag into a ".space 0".
363        * Md_convert_frag() should set up any fixSs and constants
364        * required.
365        */
366       frag_wane (fragP);
367       break;
368
369 #ifndef WORKING_DOT_WORD
370     case rs_broken_word:
371       {
372         struct broken_word *lie;
373
374         if (fragP->fr_subtype)
375           {
376             fragP->fr_fix += md_short_jump_size;
377             for (lie = (struct broken_word *) (fragP->fr_symbol);
378                  lie && lie->dispfrag == fragP;
379                  lie = lie->next_broken_word)
380               if (lie->added == 1)
381                 fragP->fr_fix += md_long_jump_size;
382           }
383         frag_wane (fragP);
384       }
385       break;
386 #endif
387
388     default:
389       BAD_CASE (fragP->fr_type);
390       break;
391     }
392 }
393
394 #ifdef BFD_ASSEMBLER
395 static void
396 relax_and_size_seg (abfd, sec, xxx)
397      bfd *abfd;
398      asection *sec;
399      char *xxx;
400 {
401   flagword flags;
402   fragS *fragp;
403   segment_info_type *seginfo;
404   int x;
405   valueT size, newsize;
406
407   flags = bfd_get_section_flags (abfd, sec);
408
409   seginfo = (segment_info_type *) bfd_get_section_userdata (abfd, sec);
410   if (seginfo && seginfo->frchainP)
411     {
412       relax_segment (seginfo->frchainP->frch_root, sec);
413       for (fragp = seginfo->frchainP->frch_root; fragp; fragp = fragp->fr_next)
414         cvt_frag_to_fill (sec, fragp);
415       for (fragp = seginfo->frchainP->frch_root;
416            fragp->fr_next;
417            fragp = fragp->fr_next)
418         /* walk to last elt */;
419       size = fragp->fr_address + fragp->fr_fix;
420     }
421   else
422     size = 0;
423   if (size > 0)
424     {
425       flags |= SEC_HAS_CONTENTS;
426       /* @@ This is just an approximation.  */
427       if (seginfo->fix_root)
428         flags |= SEC_RELOC;
429       else
430         flags &= ~SEC_RELOC;
431       x = bfd_set_section_flags (abfd, sec, flags);
432       assert (x == true);
433     }
434   size = md_section_align (sec, size);
435   x = bfd_set_section_size (abfd, sec, size);
436   assert (x == true);
437
438   /* If the size had to be rounded up, add some padding in the last
439      non-empty frag.  */
440   newsize = bfd_get_section_size_before_reloc (sec);
441   assert (newsize >= size);
442   if (size != newsize)
443     {
444       fragS *last = seginfo->frchainP->frch_last;
445       fragp = seginfo->frchainP->frch_root;
446       while (fragp->fr_next != last)
447         fragp = fragp->fr_next;
448       last->fr_address = size;
449       fragp->fr_offset += newsize - size;
450     }
451
452 #ifdef tc_frob_section
453   tc_frob_section (sec);
454 #endif
455 #ifdef obj_frob_section
456   obj_frob_section (sec);
457 #endif
458 }
459
460 #ifdef DEBUG2
461 static void
462 dump_section_relocs (abfd, sec, stream_)
463      bfd *abfd;
464      asection *sec;
465      char *stream_;
466 {
467   FILE *stream = (FILE *) stream_;
468   segment_info_type *seginfo = seg_info (sec);
469   fixS *fixp = seginfo->fix_root;
470
471   if (!fixp)
472     return;
473
474   fprintf (stream, "sec %s relocs:\n", sec->name);
475   while (fixp)
476     {
477       symbolS *s = fixp->fx_addsy;
478       if (s)
479         fprintf (stream, "  %08x: %s(%s+%x)+%x\n", fixp,
480                  S_GET_NAME (s), s->bsym->section->name,
481                  S_GET_VALUE (s), fixp->fx_offset);
482       else
483         fprintf (stream, "  %08x: type %d no sym\n", fixp, fixp->fx_r_type);
484       fixp = fixp->fx_next;
485     }
486 }
487 #else
488 #define dump_section_relocs(ABFD,SEC,STREAM)    (void)(ABFD,SEC,STREAM)
489 #endif
490
491 static void
492 adjust_reloc_syms (abfd, sec, xxx)
493      bfd *abfd;
494      asection *sec;
495      char *xxx;
496 {
497   segment_info_type *seginfo = seg_info (sec);
498   fixS *fixp;
499
500   if (seginfo == NULL)
501     return;
502
503   dump_section_relocs (abfd, sec, stderr);
504
505   for (fixp = seginfo->fix_root; fixp; fixp = fixp->fx_next)
506     if (fixp->fx_addsy)
507       {
508         symbolS *sym = fixp->fx_addsy;
509         asection *symsec = sym->bsym->section;
510         segment_info_type *symseginfo = seg_info (symsec);
511
512         /* If it's one of these sections, assume the symbol is definitely
513            going to be output.  */
514         if (symsec == &bfd_und_section
515             || symsec == &bfd_abs_section
516             || bfd_is_com_section (symsec))
517           continue;
518
519         /* Since we're reducing to section symbols, don't attempt to reduce
520            anything that's already using one.  */
521         if (sym->bsym == symsec->symbol)
522           continue;
523
524         /* Is there some other reason we can't adjust this one?  (E.g.,
525            call/bal links in i960-bout symbols.)  */
526 #ifdef obj_fix_adjustable
527         if (! obj_fix_adjustable (fixp))
528           continue;
529 #endif
530         /* If the section symbol isn't going to be output, the relocs
531            at least should still work.  If not, figure out what to do
532            when we run into that case.  */
533         fixp->fx_offset += S_GET_VALUE (sym);
534         if (sym->sy_frag)
535           fixp->fx_offset += sym->sy_frag->fr_address;
536         if (symseginfo->sym)
537           fixp->fx_addsy = symseginfo->sym;
538         else
539           {
540             fixp->fx_addsy = symbol_find (symsec->name);
541             if (!fixp->fx_addsy)
542               {
543                 fixp->fx_addsy = symbol_make (symsec->name);
544                 fixp->fx_addsy->bsym = symsec->symbol;
545               }
546             symseginfo->sym = fixp->fx_addsy;
547           }
548       }
549
550   dump_section_relocs (abfd, sec, stderr);
551 }
552
553 static void
554 write_relocs (abfd, sec, xxx)
555      bfd *abfd;
556      asection *sec;
557      char *xxx;
558 {
559   segment_info_type *seginfo = seg_info (sec);
560   int i, n;
561   arelent **relocs;
562   fixS *fixp;
563
564   /* If seginfo is NULL, we did not create this section; don't do
565      anything with it.  */
566   if (seginfo == NULL)
567     return;
568
569   fixup_segment (seginfo->fix_root, sec);
570
571   n = 0;
572   for (fixp = seginfo->fix_root; fixp; fixp = fixp->fx_next)
573     n++;
574
575 #ifndef RELOC_EXPANSION_POSSIBLE
576   /* Set up reloc information as well.  */
577   relocs = (arelent **) bfd_alloc_by_size_t (stdoutput,
578                                              n * sizeof (arelent *));
579   memset ((char*)relocs, 0, n * sizeof (arelent*));
580
581   i = 0;
582   for (fixp = seginfo->fix_root; fixp != (fixS *) NULL; fixp = fixp->fx_next)
583     {
584       arelent *reloc;
585       extern arelent *tc_gen_reloc ();
586       char *data;
587       bfd_reloc_status_type s;
588
589       if (fixp->fx_addsy == 0)
590         {
591           /* @@ Need some other flag to indicate which have already
592              been performed...  */
593           n--;
594           continue;
595         }
596       reloc = tc_gen_reloc (sec, fixp);
597       if (!reloc)
598         {
599           n--;
600           continue;
601         }
602       data = fixp->fx_frag->fr_literal + fixp->fx_where;
603       /* @@ Assumes max size of reloc is 4. */
604       if (fixp->fx_where + 4
605           > fixp->fx_frag->fr_fix + fixp->fx_frag->fr_offset)
606         abort ();
607       /* Pass bogus address so that when bfd_perform_relocation adds
608          `address' back in, it'll come up with `data', which is where
609          we want it to operate.  */
610       s = bfd_perform_relocation (stdoutput, reloc, data - reloc->address,
611                                   sec, stdoutput);
612       switch (s)
613         {
614         case bfd_reloc_ok:
615           break;
616         default:
617           as_fatal ("bad return from bfd_perform_relocation");
618         }
619       relocs[i++] = reloc;
620     }
621 #else
622   n = n * MAX_RELOC_EXPANSION;
623   /* Set up reloc information as well.  */
624   relocs = (arelent **) bfd_alloc_by_size_t (stdoutput,
625                                              n * sizeof (arelent *));
626
627   i = 0;
628   for (fixp = seginfo->fix_root; fixp != (fixS *) NULL; fixp = fixp->fx_next)
629     {
630       arelent **reloc;
631       extern arelent **tc_gen_reloc ();
632       char *data;
633       bfd_reloc_status_type s;
634       int j;
635
636       if (fixp->fx_addsy == 0)
637         {
638           /* @@ Need some other flag to indicate which have already
639              been performed...  */
640           n--;
641           continue;
642         }
643       reloc = tc_gen_reloc (sec, fixp);
644
645       for (j = 0; reloc[j]; j++)
646         {
647           relocs[i++] = reloc[j];
648           assert(i <= n);
649         }
650       data = fixp->fx_frag->fr_literal + fixp->fx_where;
651       if (fixp->fx_where + 4
652           > fixp->fx_frag->fr_fix + fixp->fx_frag->fr_offset)
653         abort ();
654       for (j = 0; reloc[j]; j++)
655         {
656           s = bfd_perform_relocation (stdoutput, reloc[j], data - reloc[j]->address,
657                                       sec, stdoutput);
658           switch (s)
659             {
660               case bfd_reloc_ok:
661                 break;
662               default:
663                 as_fatal ("bad return from bfd_perform_relocation");
664             }
665         }
666     }
667   n = i;
668 #endif
669
670   if (n)
671     bfd_set_reloc (stdoutput, sec, relocs, n);
672   else
673     bfd_set_section_flags (abfd, sec,
674                            bfd_get_section_flags (abfd, sec) & ~SEC_RELOC);
675 #ifdef DEBUG2
676   {
677     int i;
678     arelent *r;
679     asymbol *s;
680     fprintf (stderr, "relocs for sec %s\n", sec->name);
681     for (i = 0; i < n; i++)
682       {
683         r = relocs[i];
684         s = *r->sym_ptr_ptr;
685         fprintf (stderr, "  reloc %2d @%08x off %4x : sym %-10s addend %x\n",
686                  i, r, r->address, s->name, r->addend);
687       }
688   }
689 #endif
690 }
691
692 static void
693 write_contents (abfd, sec, xxx)
694      bfd *abfd;
695      asection *sec;
696      char *xxx;
697 {
698   segment_info_type *seginfo = seg_info (sec);
699   unsigned long offset = 0;
700   fragS *frags;
701
702   /* Write out the frags.  */
703   if (! (bfd_get_section_flags (abfd, sec) & SEC_HAS_CONTENTS))
704     return;
705
706   for (frags = seginfo->frchainP->frch_root;
707        frags;
708        frags = frags->fr_next)
709     {
710       int x;
711       unsigned long fill_size;
712       char *fill_literal;
713       long count;
714
715       assert (frags->fr_type == rs_fill);
716       if (frags->fr_fix)
717         {
718           x = bfd_set_section_contents (stdoutput, sec,
719                                         frags->fr_literal, offset,
720                                         frags->fr_fix);
721           assert (x == true);
722           offset += frags->fr_fix;
723         }
724       fill_literal = frags->fr_literal + frags->fr_fix;
725       fill_size = frags->fr_var;
726       count = frags->fr_offset;
727       assert (count >= 0);
728       if (fill_size && count)
729         while (count--)
730           {
731             x = bfd_set_section_contents (stdoutput, sec,
732                                           fill_literal, offset,
733                                           (bfd_size_type) fill_size);
734             assert (x == true);
735             offset += fill_size;
736           }
737     }
738 }
739 #endif
740
741 #if defined(BFD_ASSEMBLER) || !defined (BFD)
742 static void
743 merge_data_into_text ()
744 {
745 #if defined(BFD_ASSEMBLER) || defined(MANY_SEGMENTS)
746   seg_info (text_section)->frchainP->frch_last->fr_next =
747     seg_info (data_section)->frchainP->frch_root;
748   seg_info (text_section)->frchainP->frch_last =
749     seg_info (data_section)->frchainP->frch_last;
750   seg_info (data_section)->frchainP = 0;
751 #else
752   fixS *tmp;
753
754   text_last_frag->fr_next = data_frag_root;
755   text_last_frag = data_last_frag;
756   data_last_frag = NULL;
757   data_frag_root = NULL;
758   if (text_fix_root)
759     {
760       for (tmp = text_fix_root; tmp->fx_next; tmp = tmp->fx_next);;
761       tmp->fx_next = data_fix_root;
762       text_fix_tail = data_fix_tail;
763     }
764   else
765     text_fix_root = data_fix_root;
766   data_fix_root = NULL;
767 #endif
768 }
769 #endif /* BFD_ASSEMBLER || ! BFD */
770
771 #if !defined (BFD_ASSEMBLER) && !defined (BFD)
772 static void
773 relax_and_size_all_segments ()
774 {
775   fragS *fragP;
776
777   relax_segment (text_frag_root, SEG_TEXT);
778   relax_segment (data_frag_root, SEG_DATA);
779   relax_segment (bss_frag_root, SEG_BSS);
780   /*
781    * Now the addresses of frags are correct within the segment.
782    */
783
784   know (text_last_frag->fr_type == rs_fill && text_last_frag->fr_offset == 0);
785   H_SET_TEXT_SIZE (&headers, text_last_frag->fr_address);
786   text_last_frag->fr_address = H_GET_TEXT_SIZE (&headers);
787
788   /*
789    * Join the 2 segments into 1 huge segment.
790    * To do this, re-compute every rn_address in the SEG_DATA frags.
791    * Then join the data frags after the text frags.
792    *
793    * Determine a_data [length of data segment].
794    */
795   if (data_frag_root)
796     {
797       register relax_addressT slide;
798
799       know ((text_last_frag->fr_type == rs_fill) && (text_last_frag->fr_offset == 0));
800
801       H_SET_DATA_SIZE (&headers, data_last_frag->fr_address);
802       data_last_frag->fr_address = H_GET_DATA_SIZE (&headers);
803       slide = H_GET_TEXT_SIZE (&headers);       /* & in file of the data segment. */
804 #ifdef OBJ_BOUT
805 #define RoundUp(N,S) (((N)+(S)-1)&-(S))
806       /* For b.out: If the data section has a strict alignment
807          requirement, its load address in the .o file will be
808          rounded up from the size of the text section.  These
809          two values are *not* the same!  Similarly for the bss
810          section....  */
811       slide = RoundUp (slide, 1 << section_alignment[SEG_DATA]);
812 #endif
813
814       for (fragP = data_frag_root; fragP; fragP = fragP->fr_next)
815         {
816           fragP->fr_address += slide;
817         }                       /* for each data frag */
818
819       know (text_last_frag != 0);
820       text_last_frag->fr_next = data_frag_root;
821     }
822   else
823     {
824       H_SET_DATA_SIZE (&headers, 0);
825     }
826
827 #ifdef OBJ_BOUT
828   /* See above comments on b.out data section address.  */
829   {
830     long bss_vma;
831     if (data_last_frag == 0)
832       bss_vma = H_GET_TEXT_SIZE (&headers);
833     else
834       bss_vma = data_last_frag->fr_address;
835     bss_vma = RoundUp (bss_vma, 1 << section_alignment[SEG_BSS]);
836     bss_address_frag.fr_address = bss_vma;
837   }
838 #else /* ! OBJ_BOUT */
839   bss_address_frag.fr_address = (H_GET_TEXT_SIZE (&headers) +
840                                  H_GET_DATA_SIZE (&headers));
841
842
843   /* Slide all the frags */
844   if (bss_frag_root)
845     {
846       relax_addressT slide = bss_address_frag.fr_address;
847
848       for (fragP = bss_frag_root; fragP; fragP = fragP->fr_next)
849         {
850           fragP->fr_address += slide;
851         }                       /* for each bss frag */
852     }
853
854 #endif /* ! OBJ_BOUT */
855
856   if (bss_last_frag)
857     H_SET_BSS_SIZE (&headers,
858                     bss_last_frag->fr_address - bss_frag_root->fr_address);
859   else
860     H_SET_BSS_SIZE (&headers, 0);
861 }
862 #endif /* ! BFD_ASSEMBLER && ! BFD */
863
864 #if defined (BFD_ASSEMBLER) || !defined (BFD)
865
866 void 
867 write_object_file ()
868 {
869   register struct frchain *frchainP;    /* Track along all frchains. */
870 #if ! defined (BFD_ASSEMBLER) || ! defined (WORKING_DOT_WORD)
871   register fragS *fragP;        /* Track along all frags. */
872 #endif
873 #if !defined (BFD_ASSEMBLER) && !defined (OBJ_VMS)
874   long object_file_size;
875 #endif
876
877   /* Do we really want to write it?  */
878   {
879     int n_warns, n_errs;
880     n_warns = had_warnings ();
881     n_errs = had_errors ();
882     /* The -Z flag indicates that an object file should be generated,
883        regardless of warnings and errors.  */
884     if (flagseen['Z'])
885       {
886         if (n_warns || n_errs)
887           as_warn ("%d error%s, %d warning%s, generating bad object file.\n",
888                    n_errs, n_errs == 1 ? "" : "s",
889                    n_warns, n_warns == 1 ? "" : "s");
890       }
891     else
892       {
893         if (n_errs)
894           as_fatal ("%d error%s, %d warning%s, no object file generated.\n",
895                     n_errs, n_errs == 1 ? "" : "s",
896                     n_warns, n_warns == 1 ? "" : "s");
897       }
898   }
899
900 #ifdef  OBJ_VMS
901   /*
902    *    Under VMS we try to be compatible with VAX-11 "C".  Thus, we
903    *    call a routine to check for the definition of the procedure
904    *    "_main", and if so -- fix it up so that it can be program
905    *    entry point.
906    */
907   VMS_Check_For_Main ();
908 #endif /* VMS */
909
910   /* After every sub-segment, we fake an ".align ...". This conforms to
911      BSD4.2 brane-damage. We then fake ".fill 0" because that is the kind of
912      frag that requires least thought. ".align" frags like to have a
913      following frag since that makes calculating their intended length
914      trivial.
915
916      @@ Is this really necessary??  */
917 #ifndef SUB_SEGMENT_ALIGN
918 #ifdef BFD_ASSEMBLER
919 #define SUB_SEGMENT_ALIGN(SEG) (0)
920 #else
921 #define SUB_SEGMENT_ALIGN(SEG) (2)
922 #endif
923 #endif
924   for (frchainP = frchain_root; frchainP; frchainP = frchainP->frch_next)
925     {
926 #ifdef BFD_ASSEMBLER
927       subseg_set (frchainP->frch_seg, frchainP->frch_subseg);
928 #else
929       subseg_new (frchainP->frch_seg, frchainP->frch_subseg);
930 #endif
931       frag_align (SUB_SEGMENT_ALIGN (now_seg), NOP_OPCODE);
932       /* frag_align will have left a new frag.
933          Use this last frag for an empty ".fill".
934
935          For this segment ...
936          Create a last frag. Do not leave a "being filled in frag".  */
937       frag_wane (frag_now);
938       frag_now->fr_fix = 0;
939       know (frag_now->fr_next == NULL);
940     }
941
942   /* From now on, we don't care about sub-segments.  Build one frag chain
943      for each segment. Linked thru fr_next.  */
944
945 #ifdef BFD_ASSEMBLER
946   /* Remove the sections created by gas for its own purposes.  */
947   {
948     asection **seclist, *sec;
949     seclist = &stdoutput->sections;
950     while (seclist && *seclist)
951       {
952         sec = *seclist;
953         while (sec == reg_section || sec == expr_section)
954           {
955             sec = sec->next;
956             *seclist = sec;
957             stdoutput->section_count--;
958             if (!sec)
959               break;
960           }
961         if (*seclist)
962           seclist = &(*seclist)->next;
963       }
964   }
965
966   bfd_map_over_sections (stdoutput, chain_frchains_together, (char *) 0);
967 #else
968   remove_subsegs (frchain_root, SEG_TEXT, &text_frag_root, &text_last_frag);
969   remove_subsegs (data0_frchainP, SEG_DATA, &data_frag_root, &data_last_frag);
970   remove_subsegs (bss0_frchainP, SEG_BSS, &bss_frag_root, &bss_last_frag);
971 #endif
972
973   /* We have two segments. If user gave -R flag, then we must put the
974      data frags into the text segment. Do this before relaxing so
975      we know to take advantage of -R and make shorter addresses.  */
976 #if !defined (OBJ_AOUT) || defined (BFD_ASSEMBLER)
977   if (flagseen['R'])
978     {
979       merge_data_into_text ();
980     }
981 #endif
982
983 #ifdef BFD_ASSEMBLER
984   bfd_map_over_sections (stdoutput, relax_and_size_seg, (char *) 0);
985 #else
986   relax_and_size_all_segments ();
987 #endif /* BFD_ASSEMBLER */
988
989 #ifndef BFD_ASSEMBLER
990   /*
991    *
992    * Crawl the symbol chain.
993    *
994    * For each symbol whose value depends on a frag, take the address of
995    * that frag and subsume it into the value of the symbol.
996    * After this, there is just one way to lookup a symbol value.
997    * Values are left in their final state for object file emission.
998    * We adjust the values of 'L' local symbols, even if we do
999    * not intend to emit them to the object file, because their values
1000    * are needed for fix-ups.
1001    *
1002    * Unless we saw a -L flag, remove all symbols that begin with 'L'
1003    * from the symbol chain.  (They are still pointed to by the fixes.)
1004    *
1005    * Count the remaining symbols.
1006    * Assign a symbol number to each symbol.
1007    * Count the number of string-table chars we will emit.
1008    * Put this info into the headers as appropriate.
1009    *
1010    */
1011   know (zero_address_frag.fr_address == 0);
1012   string_byte_count = sizeof (string_byte_count);
1013
1014   obj_crawl_symbol_chain (&headers);
1015
1016   if (string_byte_count == sizeof (string_byte_count))
1017     string_byte_count = 0;
1018
1019   H_SET_STRING_SIZE (&headers, string_byte_count);
1020
1021   /*
1022    * Addresses of frags now reflect addresses we use in the object file.
1023    * Symbol values are correct.
1024    * Scan the frags, converting any ".org"s and ".align"s to ".fill"s.
1025    * Also converting any machine-dependent frags using md_convert_frag();
1026    */
1027   subseg_change (SEG_TEXT, 0);
1028
1029   for (fragP = text_frag_root; fragP; fragP = fragP->fr_next)
1030     {
1031       cvt_frag_to_fill (&headers, fragP);
1032
1033       /* Some assert macros don't work with # directives mixed in.  */
1034 #ifndef NDEBUG
1035       if (!(fragP->fr_next == NULL
1036 #ifdef OBJ_BOUT
1037             || fragP->fr_next == data_frag_root
1038 #endif
1039             || ((fragP->fr_next->fr_address - fragP->fr_address)
1040                 == (fragP->fr_fix + fragP->fr_offset * fragP->fr_var))))
1041         abort ();
1042 #endif
1043     }
1044 #endif /* ! BFD_ASSEMBLER */
1045
1046 #ifndef WORKING_DOT_WORD
1047   {
1048     struct broken_word *lie;
1049     struct broken_word **prevP;
1050
1051     prevP = &broken_words;
1052     for (lie = broken_words; lie; lie = lie->next_broken_word)
1053       if (!lie->added)
1054         {
1055           expressionS exp;
1056
1057           exp.X_op = O_subtract;
1058           exp.X_add_symbol = lie->add;
1059           exp.X_op_symbol = lie->sub;
1060           exp.X_add_number = lie->addnum;
1061 #ifdef BFD_ASSEMBLER
1062           fix_new_exp (lie->frag,
1063                        lie->word_goes_here - lie->frag->fr_literal,
1064                        2, &exp, 0, BFD_RELOC_NONE);
1065 #else
1066 #if defined(TC_SPARC) || defined(TC_A29K) || defined(NEED_FX_R_TYPE)
1067           fix_new_exp (lie->frag,
1068                        lie->word_goes_here - lie->frag->fr_literal,
1069                        2, &exp, 0, NO_RELOC);
1070 #else
1071 #ifdef TC_NS32K
1072           fix_new_ns32k_exp (lie->frag,
1073                              lie->word_goes_here - lie->frag->fr_literal,
1074                              2, &exp, 0, 0, 2, 0, 0);
1075 #else
1076           fix_new_exp (lie->frag,
1077                        lie->word_goes_here - lie->frag->fr_literal,
1078                        2, &exp, 0, 0);
1079 #endif /* TC_NS32K */
1080 #endif /* TC_SPARC|TC_A29K|NEED_FX_R_TYPE */
1081 #endif /* BFD_ASSEMBLER */
1082           *prevP = lie->next_broken_word;
1083         }
1084       else
1085         prevP = &(lie->next_broken_word);
1086
1087     for (lie = broken_words; lie;)
1088       {
1089         struct broken_word *untruth;
1090         char *table_ptr;
1091         addressT table_addr;
1092         addressT from_addr, to_addr;
1093         int n, m;
1094
1095         fragP = lie->dispfrag;
1096
1097         /* Find out how many broken_words go here.  */
1098         n = 0;
1099         for (untruth = lie; untruth && untruth->dispfrag == fragP; untruth = untruth->next_broken_word)
1100           if (untruth->added == 1)
1101             n++;
1102
1103         table_ptr = lie->dispfrag->fr_opcode;
1104         table_addr = lie->dispfrag->fr_address + (table_ptr - lie->dispfrag->fr_literal);
1105         /* Create the jump around the long jumps.  This is a short
1106            jump from table_ptr+0 to table_ptr+n*long_jump_size.  */
1107         from_addr = table_addr;
1108         to_addr = table_addr + md_short_jump_size + n * md_long_jump_size;
1109         md_create_short_jump (table_ptr, from_addr, to_addr, lie->dispfrag, lie->add);
1110         table_ptr += md_short_jump_size;
1111         table_addr += md_short_jump_size;
1112
1113         for (m = 0; lie && lie->dispfrag == fragP; m++, lie = lie->next_broken_word)
1114           {
1115             if (lie->added == 2)
1116               continue;
1117             /* Patch the jump table */
1118             /* This is the offset from ??? to table_ptr+0 */
1119             to_addr = table_addr - S_GET_VALUE (lie->sub);
1120             md_number_to_chars (lie->word_goes_here, to_addr, 2);
1121             for (untruth = lie->next_broken_word; untruth && untruth->dispfrag == fragP; untruth = untruth->next_broken_word)
1122               {
1123                 if (untruth->use_jump == lie)
1124                   md_number_to_chars (untruth->word_goes_here, to_addr, 2);
1125               }
1126
1127             /* Install the long jump */
1128             /* this is a long jump from table_ptr+0 to the final target */
1129             from_addr = table_addr;
1130             to_addr = S_GET_VALUE (lie->add) + lie->addnum;
1131             md_create_long_jump (table_ptr, from_addr, to_addr, lie->dispfrag, lie->add);
1132             table_ptr += md_long_jump_size;
1133             table_addr += md_long_jump_size;
1134           }
1135       }
1136   }
1137 #endif /* not WORKING_DOT_WORD */
1138
1139 #ifndef BFD_ASSEMBLER
1140 #ifndef OBJ_VMS
1141   {                             /* not vms */
1142     /*
1143      * Scan every FixS performing fixups. We had to wait until now to do
1144      * this because md_convert_frag() may have made some fixSs.
1145      */
1146     int trsize, drsize;
1147
1148     subseg_change (SEG_TEXT, 0);
1149     trsize = md_reloc_size * fixup_segment (text_fix_root, SEG_TEXT);
1150     subseg_change (SEG_DATA, 0);
1151     drsize = md_reloc_size * fixup_segment (data_fix_root, SEG_DATA);
1152     H_SET_RELOCATION_SIZE (&headers, trsize, drsize);
1153
1154     /* FIXME move this stuff into the pre-write-hook */
1155     H_SET_MAGIC_NUMBER (&headers, magic_number_for_object_file);
1156     H_SET_ENTRY_POINT (&headers, 0);
1157
1158     obj_pre_write_hook (&headers);      /* extra coff stuff */
1159
1160     object_file_size = H_GET_FILE_SIZE (&headers);
1161     next_object_file_charP = the_object_file = xmalloc (object_file_size);
1162
1163     output_file_create (out_file_name);
1164
1165     obj_header_append (&next_object_file_charP, &headers);
1166
1167     know ((next_object_file_charP - the_object_file) == H_GET_HEADER_SIZE (&headers));
1168
1169     /*
1170      * Emit code.
1171      */
1172     for (fragP = text_frag_root; fragP; fragP = fragP->fr_next)
1173       {
1174         register long count;
1175         register char *fill_literal;
1176         register long fill_size;
1177
1178         know (fragP->fr_type == rs_fill);
1179         append (&next_object_file_charP, fragP->fr_literal, (unsigned long) fragP->fr_fix);
1180         fill_literal = fragP->fr_literal + fragP->fr_fix;
1181         fill_size = fragP->fr_var;
1182         know (fragP->fr_offset >= 0);
1183
1184         for (count = fragP->fr_offset; count; count--)
1185           {
1186             append (&next_object_file_charP, fill_literal, (unsigned long) fill_size);
1187           }                     /* for each  */
1188
1189       }                         /* for each code frag. */
1190
1191     know ((next_object_file_charP - the_object_file) == (H_GET_HEADER_SIZE (&headers) + H_GET_TEXT_SIZE (&headers) + H_GET_DATA_SIZE (&headers)));
1192
1193     /*
1194      * Emit relocations.
1195      */
1196     obj_emit_relocations (&next_object_file_charP, text_fix_root, (relax_addressT) 0);
1197     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)));
1198 #ifdef TC_I960
1199     /* Make addresses in data relocation directives relative to beginning of
1200      * first data fragment, not end of last text fragment:  alignment of the
1201      * start of the data segment may place a gap between the segments.
1202      */
1203     obj_emit_relocations (&next_object_file_charP, data_fix_root, data0_frchainP->frch_root->fr_address);
1204 #else /* TC_I960 */
1205     obj_emit_relocations (&next_object_file_charP, data_fix_root, text_last_frag->fr_address);
1206 #endif /* TC_I960 */
1207
1208     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)));
1209
1210     /*
1211      * Emit line number entries.
1212      */
1213     OBJ_EMIT_LINENO (&next_object_file_charP, lineno_rootP, the_object_file);
1214     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)));
1215
1216     /*
1217      * Emit symbols.
1218      */
1219     obj_emit_symbols (&next_object_file_charP, symbol_rootP);
1220     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)));
1221
1222     /*
1223      * Emit strings.
1224      */
1225
1226     if (string_byte_count > 0)
1227       {
1228         obj_emit_strings (&next_object_file_charP);
1229       }                         /* only if we have a string table */
1230
1231 #ifdef BFD_HEADERS
1232     bfd_seek (stdoutput, 0, 0);
1233     bfd_write (the_object_file, 1, object_file_size, stdoutput);
1234 #else
1235
1236     /* Write the data to the file */
1237     output_file_append (the_object_file, object_file_size, out_file_name);
1238 #endif
1239
1240     output_file_close (out_file_name);
1241   }                             /* non vms output */
1242 #else /* VMS */
1243   /*
1244    *    Now do the VMS-dependent part of writing the object file
1245    */
1246   VMS_write_object_file (H_GET_TEXT_SIZE (&headers),
1247                          H_GET_DATA_SIZE (&headers),
1248                          H_GET_BSS_SIZE (&headers),
1249                          text_frag_root, data_frag_root);
1250 #endif /* VMS */
1251 #else /* BFD_ASSEMBLER */
1252
1253 #ifdef obj_check_file_symbols
1254   obj_check_file_symbols ();
1255 #endif
1256
1257   bfd_map_over_sections (stdoutput, adjust_reloc_syms, (char *)0);
1258
1259   /* Set up symbol table, and write it out.  */
1260   if (symbol_rootP)
1261     {
1262       int i = 0, n;
1263       symbolS *symp;
1264
1265       for (symp = symbol_rootP; symp; symp = symbol_next (symp))
1266         {
1267           if (! symp->sy_resolved)
1268             {
1269               if (symp->sy_value.X_op == O_constant)
1270                 {
1271                   /* This is the normal case; skip the call.  */
1272                   S_SET_VALUE (symp,
1273                                (S_GET_VALUE (symp)
1274                                 + symp->sy_frag->fr_address));
1275                   symp->sy_resolved = 1;
1276                 }
1277               else
1278                 resolve_symbol_value (symp);
1279             }
1280
1281           /* So far, common symbols have been treated like undefined symbols.
1282              Put them in the common section now.  */
1283           if (S_IS_DEFINED (symp) == 0
1284               && S_GET_VALUE (symp) != 0)
1285             S_SET_SEGMENT (symp, &bfd_com_section);
1286 #if 0
1287           printf ("symbol `%s'\n\t@%x: value=%d flags=%x seg=%s\n",
1288                   S_GET_NAME (symp), symp,
1289                   S_GET_VALUE (symp),
1290                   symp->bsym->flags,
1291                   segment_name (symp->bsym->section));
1292 #endif
1293           {
1294 #ifdef obj_frob_symbol
1295             {
1296               int punt = 0;
1297               obj_frob_symbol (symp, punt);
1298               if (punt)
1299                 goto punt_it;
1300             }
1301 #endif
1302 #ifdef tc_frob_symbol
1303             {
1304               int punt = 0;
1305               tc_frob_symbol (symp, punt);
1306               if (punt)
1307                 goto punt_it;
1308             }
1309 #endif
1310           }
1311           /* If we don't want to keep this symbol, splice it out of the
1312              chain now.  */
1313           if (S_IS_LOCAL (symp))
1314             {
1315               symbolS *prev, *next;
1316 #if defined (obj_frob_symbol) || defined (tc_frob_symbol)
1317             punt_it:
1318 #endif
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   /* Well, strictly speaking that's not true -- we could do any that
1766      are PC-relative and don't cross regions that could change size.
1767      And for the i960 (the only machine for which we've got a relaxing
1768      linker right now), we might be able to turn callx/callj into bal
1769      in cases where we know the maximum displacement.  */
1770   if (linkrelax)
1771     for (; fixP; fixP = fixP->fx_next)
1772       seg_reloc_count++;
1773   else
1774     for (; fixP; fixP = fixP->fx_next)
1775       {
1776         fragP = fixP->fx_frag;
1777         know (fragP);
1778         where = fixP->fx_where;
1779         place = fragP->fr_literal + where;
1780         size = fixP->fx_size;
1781         add_symbolP = fixP->fx_addsy;
1782 #ifdef TC_I960
1783         if (fixP->fx_callj && TC_S_IS_CALLNAME (add_symbolP))
1784           {
1785             /* Relocation should be done via the associated 'bal'
1786                entry point symbol. */
1787
1788             if (!TC_S_IS_BALNAME (tc_get_bal_of_call (add_symbolP)))
1789               {
1790                 as_bad ("No 'bal' entry point for leafproc %s",
1791                         S_GET_NAME (add_symbolP));
1792                 continue;
1793               }
1794             fixP->fx_addsy = add_symbolP = tc_get_bal_of_call (add_symbolP);
1795           }
1796 #endif
1797         sub_symbolP = fixP->fx_subsy;
1798         add_number = fixP->fx_offset;
1799         pcrel = fixP->fx_pcrel;
1800
1801         if (add_symbolP)
1802           add_symbol_segment = S_GET_SEGMENT (add_symbolP);
1803
1804         if (sub_symbolP)
1805           {
1806             if (!add_symbolP)
1807               {
1808                 /* Its just -sym */
1809                 if (S_GET_SEGMENT (sub_symbolP) != absolute_section)
1810                   as_bad ("Negative of non-absolute symbol %s",
1811                           S_GET_NAME (sub_symbolP));
1812
1813                 add_number -= S_GET_VALUE (sub_symbolP);
1814               }
1815             else if ((S_GET_SEGMENT (sub_symbolP) == add_symbol_segment)
1816                      && (SEG_NORMAL (add_symbol_segment)
1817                          || (add_symbol_segment == absolute_section)))
1818               {
1819                 /* Difference of 2 symbols from same segment.
1820                    Can't make difference of 2 undefineds: 'value' means
1821                    something different for N_UNDF. */
1822 #ifdef TC_I960
1823                 /* Makes no sense to use the difference of 2 arbitrary symbols
1824                    as the target of a call instruction.  */
1825                 if (fixP->fx_callj)
1826                   {
1827                     as_bad ("callj to difference of 2 symbols");
1828                   }
1829 #endif /* TC_I960 */
1830                 add_number += S_GET_VALUE (add_symbolP) -
1831                   S_GET_VALUE (sub_symbolP);
1832
1833                 add_symbolP = NULL;
1834                 fixP->fx_addsy = NULL;
1835               }
1836             else
1837               {
1838                 /* Different segments in subtraction. */
1839                 know (!(S_IS_EXTERNAL (sub_symbolP)
1840                         && (S_GET_SEGMENT (sub_symbolP) == absolute_section)));
1841
1842                 if ((S_GET_SEGMENT (sub_symbolP) == absolute_section))
1843                   {
1844                     add_number -= S_GET_VALUE (sub_symbolP);
1845                   }
1846                 else
1847                   {
1848                     char buf[50];
1849                     sprint_value (buf, fragP->fr_address + where);
1850                     as_bad ("Can't emit reloc {- %s-seg symbol \"%s\"} @ file address %s.",
1851                             segment_name (S_GET_SEGMENT (sub_symbolP)),
1852                             S_GET_NAME (sub_symbolP), buf);
1853                   }
1854               }
1855           }
1856
1857         if (add_symbolP)
1858           {
1859             if (add_symbol_segment == this_segment_type && pcrel)
1860               {
1861                 /*
1862                  * This fixup was made when the symbol's segment was
1863                  * SEG_UNKNOWN, but it is now in the local segment.
1864                  * So we know how to do the address without relocation.
1865                  */
1866 #ifdef TC_I960
1867                 /* reloc_callj() may replace a 'call' with a 'calls' or a
1868                    'bal', in which cases it modifies *fixP as appropriate.
1869                    In the case of a 'calls', no further work is required,
1870                    and *fixP has been set up to make the rest of the code
1871                    below a no-op. */
1872                 reloc_callj (fixP);
1873 #endif /* TC_I960 */
1874
1875                 add_number += S_GET_VALUE (add_symbolP);
1876                 add_number -= md_pcrel_from (fixP);
1877                 pcrel = 0;      /* Lie. Don't want further pcrel processing. */
1878                 fixP->fx_addsy = NULL;  /* No relocations please. */
1879               }
1880             else
1881               {
1882                 if (add_symbol_segment == absolute_section)
1883                   {
1884 #ifdef TC_I960
1885                     /* See comment about reloc_callj() above.  */
1886                     reloc_callj (fixP);
1887 #endif /* TC_I960 */
1888                     add_number += S_GET_VALUE (add_symbolP);
1889                     fixP->fx_addsy = NULL;
1890                     add_symbolP = NULL;
1891                   }
1892                 else if (add_symbol_segment == undefined_section
1893 #ifdef BFD_ASSEMBLER
1894                          || bfd_is_com_section (add_symbol_segment)
1895 #endif
1896                          )
1897                   {
1898 #ifdef TC_I960
1899                     if ((int) fixP->fx_bit_fixP == 13)
1900                       {
1901                         /* This is a COBR instruction.  They have only a
1902                          * 13-bit displacement and are only to be used
1903                          * for local branches: flag as error, don't generate
1904                          * relocation.
1905                          */
1906                         as_bad ("can't use COBR format with external label");
1907                         fixP->fx_addsy = NULL;  /* No relocations please. */
1908                         continue;
1909                       }         /* COBR */
1910 #endif /* TC_I960 */
1911
1912 #ifdef OBJ_COFF
1913 #ifdef TE_I386AIX
1914                     if (S_IS_COMMON (add_symbolP))
1915                       add_number += S_GET_VALUE (add_symbolP);
1916 #endif /* TE_I386AIX */
1917 #endif /* OBJ_COFF */
1918                     ++seg_reloc_count;
1919                   }
1920                 else
1921                   {
1922                     seg_reloc_count++;
1923                     add_number += S_GET_VALUE (add_symbolP);
1924                   }
1925               }                 /* if not in local seg */
1926           }                     /* if there was a + symbol */
1927
1928         if (pcrel)
1929           {
1930             add_number -= md_pcrel_from (fixP);
1931             if (add_symbolP == 0)
1932               {
1933                 fixP->fx_addsy = &abs_symbol;
1934                 ++seg_reloc_count;
1935               }                 /* if there's an add_symbol */
1936           }                     /* if pcrel */
1937
1938         if (!fixP->fx_bit_fixP)
1939           {
1940             valueT mask = 0;
1941             /* set all bits to one */
1942             mask--;
1943             /* Technically speaking, combining these produces an
1944                undefined result if size is sizeof (valueT), though I
1945                think these two half-way operations should both be
1946                defined.  */
1947             mask <<= size * 4;
1948             mask <<= size * 4;
1949             if ((add_number & mask) != 0
1950                 && (add_number & mask) != mask)
1951               {
1952                 char buf[50];
1953                 sprint_value (buf, fragP->fr_address + where);
1954                 as_bad ("Value of %ld too large for field of %d bytes at %s",
1955                         (long) add_number, size, buf);
1956               }                 /* generic error checking */
1957 #ifdef WARN_SIGNED_OVERFLOW_WORD
1958             /* Warn if a .word value is too large when treated as a signed
1959                number.  We already know it is not too negative.  This is to
1960                catch over-large switches generated by gcc on the 68k.  */
1961             if (!flagseen['J']
1962                 && size == 2
1963                 && add_number > 0x7fff)
1964               as_bad ("Signed .word overflow; switch may be too large; %d at 0x%x",
1965                       add_number, fragP->fr_address + where);
1966 #endif
1967           }                     /* not a bit fix */
1968
1969 #ifdef BFD_ASSEMBLER
1970         md_apply_fix (fixP, &add_number);
1971 #else
1972         md_apply_fix (fixP, add_number);
1973 #endif
1974       }                         /* For each fixS in this segment. */
1975
1976 #if defined (OBJ_COFF) && defined (TC_I960)
1977   {
1978     fixS *topP = fixP;
1979
1980     /* two relocs per callj under coff. */
1981     for (fixP = topP; fixP; fixP = fixP->fx_next)
1982       if (fixP->fx_callj && fixP->fx_addsy != 0)
1983         ++seg_reloc_count;
1984   }
1985 #endif /* OBJ_COFF && TC_I960 */
1986
1987   return (seg_reloc_count);
1988 }
1989
1990 /* end of write.c */