1 /* coff object file format
2 Copyright (C) 1989, 1990, 1991, 1992, 1993, 1994
3 Free Software Foundation, Inc.
5 This file is part of GAS.
7 GAS is free software; you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
9 the Free Software Foundation; either version 2, or (at your option)
12 GAS is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 GNU General Public License for more details.
17 You should have received a copy of the GNU General Public License
18 along with GAS; see the file COPYING. If not, write to
19 the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */
25 /* I think this is probably always correct. */
26 #ifndef KEEP_RELOC_INFO
27 #define KEEP_RELOC_INFO
30 const char *s_get_name
PARAMS ((symbolS
* s
));
31 static symbolS
*def_symbol_in_progress
;
37 unsigned long chunk_size
;
38 unsigned long element_size
;
41 unsigned long pointer
;
46 stack_init (chunk_size
, element_size
)
47 unsigned long chunk_size
;
48 unsigned long element_size
;
52 st
= (stack
*) malloc (sizeof (stack
));
55 st
->data
= malloc (chunk_size
);
62 st
->size
= chunk_size
;
63 st
->chunk_size
= chunk_size
;
64 st
->element_size
= element_size
;
69 /* Not currently used. */
80 stack_push (st
, element
)
84 if (st
->pointer
+ st
->element_size
>= st
->size
)
86 st
->size
+= st
->chunk_size
;
87 if ((st
->data
= xrealloc (st
->data
, st
->size
)) == (char *) 0)
90 memcpy (st
->data
+ st
->pointer
, element
, st
->element_size
);
91 st
->pointer
+= st
->element_size
;
92 return st
->data
+ st
->pointer
;
99 if (st
->pointer
< st
->element_size
)
104 st
->pointer
-= st
->element_size
;
105 return st
->data
+ st
->pointer
;
109 * Maintain a list of the tagnames of the structres.
112 static struct hash_control
*tag_hash
;
117 tag_hash
= hash_new ();
121 tag_insert (name
, symbolP
)
125 const char *error_string
;
127 if ((error_string
= hash_jam (tag_hash
, name
, (char *) symbolP
)))
129 as_fatal ("Inserting \"%s\" into structure table failed: %s",
138 #ifdef STRIP_UNDERSCORE
141 #endif /* STRIP_UNDERSCORE */
142 return (symbolS
*) hash_find (tag_hash
, name
);
146 tag_find_or_make (name
)
151 if ((symbolP
= tag_find (name
)) == NULL
)
153 symbolP
= symbol_new (name
, undefined_section
,
154 0, &zero_address_frag
);
156 tag_insert (S_GET_NAME (symbolP
), symbolP
);
158 symbol_table_insert (symbolP
);
169 static void SA_SET_SYM_TAGNDX
PARAMS ((symbolS
*, symbolS
*));
171 #define GET_FILENAME_STRING(X) \
172 ((char*)(&((X)->sy_symbol.ost_auxent->x_file.x_n.x_offset))[1])
176 fetch_coff_debug_section ()
178 static segT debug_section
;
182 s
= bfd_make_debug_symbol (stdoutput
, (char *) 0, 0);
184 debug_section
= s
->section
;
186 return debug_section
;
190 SA_SET_SYM_ENDNDX (sym
, val
)
194 combined_entry_type
*entry
, *p
;
196 entry
= &coffsymbol (sym
->bsym
)->native
[1];
197 p
= coffsymbol (val
->bsym
)->native
;
198 entry
->u
.auxent
.x_sym
.x_fcnary
.x_fcn
.x_endndx
.p
= p
;
203 SA_SET_SYM_TAGNDX (sym
, val
)
207 combined_entry_type
*entry
, *p
;
209 entry
= &coffsymbol (sym
->bsym
)->native
[1];
210 p
= coffsymbol (val
->bsym
)->native
;
211 entry
->u
.auxent
.x_sym
.x_tagndx
.p
= p
;
216 S_GET_DATA_TYPE (sym
)
219 return coffsymbol (sym
->bsym
)->native
->u
.syment
.n_type
;
223 S_SET_DATA_TYPE (sym
, val
)
227 coffsymbol (sym
->bsym
)->native
->u
.syment
.n_type
= val
;
232 S_GET_STORAGE_CLASS (sym
)
235 return coffsymbol (sym
->bsym
)->native
->u
.syment
.n_sclass
;
239 S_SET_STORAGE_CLASS (sym
, val
)
243 coffsymbol (sym
->bsym
)->native
->u
.syment
.n_sclass
= val
;
247 /* Merge a debug symbol containing debug information into a normal symbol. */
250 c_symbol_merge (debug
, normal
)
254 S_SET_DATA_TYPE (normal
, S_GET_DATA_TYPE (debug
));
255 S_SET_STORAGE_CLASS (normal
, S_GET_STORAGE_CLASS (debug
));
257 if (S_GET_NUMBER_AUXILIARY (debug
) > S_GET_NUMBER_AUXILIARY (normal
))
258 /* take the most we have */
259 S_SET_NUMBER_AUXILIARY (normal
, S_GET_NUMBER_AUXILIARY (debug
));
261 if (S_GET_NUMBER_AUXILIARY (debug
) > 0)
263 /* Move all the auxiliary information. */
264 /* @@ How many fields do we want to preserve? Would it make more
265 sense to pick and choose those we want to copy? Should look
266 into this further.... [raeburn:19920512.2209EST] */
268 linenos
= coffsymbol (normal
->bsym
)->lineno
;
269 memcpy ((char *) &coffsymbol (normal
->bsym
)->native
,
270 (char *) &coffsymbol (debug
->bsym
)->native
,
271 S_GET_NUMBER_AUXILIARY(debug
) * AUXESZ
);
272 coffsymbol (normal
->bsym
)->lineno
= linenos
;
275 /* Move the debug flags. */
276 SF_SET_DEBUG_FIELD (normal
, SF_GET_DEBUG_FIELD (debug
));
279 static symbolS
*previous_file_symbol
;
281 c_dot_file_symbol (filename
)
286 symbolP
= symbol_new (filename
, bfd_abs_section_ptr
, 0, &zero_address_frag
);
288 S_SET_STORAGE_CLASS (symbolP
, C_FILE
);
289 S_SET_NUMBER_AUXILIARY (symbolP
, 1);
291 symbolP
->bsym
->flags
= BSF_DEBUGGING
;
298 listing_source_file (filename
);
303 S_SET_VALUE (symbolP
, (long) previous_file_symbol
);
305 previous_file_symbol
= symbolP
;
307 /* Make sure that the symbol is first on the symbol chain */
308 if (symbol_rootP
!= symbolP
)
310 if (symbolP
== symbol_lastP
)
312 symbol_lastP
= symbol_lastP
->sy_previous
;
313 } /* if it was the last thing on the list */
315 symbol_remove (symbolP
, &symbol_rootP
, &symbol_lastP
);
316 symbol_insert (symbolP
, symbol_rootP
, &symbol_rootP
, &symbol_lastP
);
317 symbol_rootP
= symbolP
;
318 } /* if not first on the list */
322 * Build a 'section static' symbol.
326 c_section_symbol (name
, value
, length
, nreloc
, nlnno
)
330 unsigned short nreloc
;
331 unsigned short nlnno
;
335 symbolP
= symbol_new (name
,
344 S_SET_STORAGE_CLASS (symbolP
, C_STAT
);
345 S_SET_NUMBER_AUXILIARY (symbolP
, 1);
347 SA_SET_SCN_SCNLEN (symbolP
, length
);
348 SA_SET_SCN_NRELOC (symbolP
, nreloc
);
349 SA_SET_SCN_NLINNO (symbolP
, nlnno
);
351 SF_SET_STATICS (symbolP
);
353 return (char *) symbolP
;
356 /* Line number handling */
359 struct line_no
*next
;
366 /* Symbol of last function, which we should hang line#s off of. */
367 static symbolS
*line_fsym
;
369 #define in_function() (line_fsym != 0)
370 #define clear_function() (line_fsym = 0)
371 #define set_function(F) (line_fsym = (F), coff_add_linesym (F))
375 obj_symbol_new_hook (symbolP
)
378 char underscore
= 0; /* Symbol has leading _ */
381 long sz
= (OBJ_COFF_MAX_AUXENTRIES
+ 1) * sizeof (combined_entry_type
);
382 char *s
= (char *) bfd_alloc_by_size_t (stdoutput
, sz
);
384 coffsymbol (symbolP
->bsym
)->native
= (combined_entry_type
*) s
;
386 S_SET_DATA_TYPE (symbolP
, T_NULL
);
387 S_SET_STORAGE_CLASS (symbolP
, 0);
388 S_SET_NUMBER_AUXILIARY (symbolP
, 0);
390 if (S_IS_STRING (symbolP
))
391 SF_SET_STRING (symbolP
);
392 if (!underscore
&& S_IS_LOCAL (symbolP
))
393 SF_SET_LOCAL (symbolP
);
398 * Handle .ln directives.
401 static symbolS
*current_lineno_sym
;
402 static struct line_no
*line_nos
;
403 /* @@ Blindly assume all .ln directives will be in the .text section... */
404 static int n_line_nos
;
407 add_lineno (frag
, offset
, num
)
412 struct line_no
*new_line
= (struct line_no
*) bfd_alloc_by_size_t (stdoutput
,
413 sizeof (struct line_no
));
414 if (!current_lineno_sym
)
418 new_line
->next
= line_nos
;
419 new_line
->frag
= frag
;
420 new_line
->l
.line_number
= num
;
421 new_line
->l
.u
.offset
= offset
;
427 coff_add_linesym (sym
)
432 coffsymbol (current_lineno_sym
->bsym
)->lineno
= (alent
*) line_nos
;
436 current_lineno_sym
= sym
;
440 obj_coff_ln (appline
)
445 if (! appline
&& def_symbol_in_progress
!= NULL
)
447 as_warn (".ln pseudo-op inside .def/.endef: ignored.");
448 demand_empty_rest_of_line ();
452 l
= get_absolute_expression ();
455 add_lineno (frag_now
, frag_now_fix (), l
);
465 l
+= coff_line_base
- 1;
466 listing_source_line (l
);
471 demand_empty_rest_of_line ();
477 * Handle .def directives.
479 * One might ask : why can't we symbol_new if the symbol does not
480 * already exist and fill it with debug information. Because of
481 * the C_EFCN special symbol. It would clobber the value of the
482 * function symbol before we have a chance to notice that it is
483 * a C_EFCN. And a second reason is that the code is more clear this
484 * way. (at least I think it is :-).
488 #define SKIP_SEMI_COLON() while (*input_line_pointer++ != ';')
489 #define SKIP_WHITESPACES() while (*input_line_pointer == ' ' || \
490 *input_line_pointer == '\t') \
491 input_line_pointer++;
497 char name_end
; /* Char after the end of name */
498 char *symbol_name
; /* Name of the debug symbol */
499 char *symbol_name_copy
; /* Temporary copy of the name */
500 unsigned int symbol_name_length
;
502 if (def_symbol_in_progress
!= NULL
)
504 as_warn (".def pseudo-op used inside of .def/.endef: ignored.");
505 demand_empty_rest_of_line ();
507 } /* if not inside .def/.endef */
511 symbol_name
= input_line_pointer
;
512 #ifdef STRIP_UNDERSCORE
513 if (symbol_name
[0] == '_' && symbol_name
[1] != 0)
515 #endif /* STRIP_UNDERSCORE */
517 name_end
= get_symbol_end ();
518 symbol_name_length
= strlen (symbol_name
);
519 symbol_name_copy
= xmalloc (symbol_name_length
+ 1);
520 strcpy (symbol_name_copy
, symbol_name
);
522 /* Initialize the new symbol */
523 def_symbol_in_progress
= symbol_make (symbol_name_copy
);
524 def_symbol_in_progress
->sy_frag
= &zero_address_frag
;
525 S_SET_VALUE (def_symbol_in_progress
, 0);
527 if (S_IS_STRING (def_symbol_in_progress
))
528 SF_SET_STRING (def_symbol_in_progress
);
530 *input_line_pointer
= name_end
;
532 demand_empty_rest_of_line ();
535 unsigned int dim_index
;
538 obj_coff_endef (ignore
)
542 /* DIM BUG FIX sac@cygnus.com */
544 if (def_symbol_in_progress
== NULL
)
546 as_warn (".endef pseudo-op used outside of .def/.endef: ignored.");
547 demand_empty_rest_of_line ();
549 } /* if not inside .def/.endef */
551 /* Set the section number according to storage class. */
552 switch (S_GET_STORAGE_CLASS (def_symbol_in_progress
))
557 SF_SET_TAG (def_symbol_in_progress
);
558 /* intentional fallthrough */
561 SF_SET_DEBUG (def_symbol_in_progress
);
562 S_SET_SEGMENT (def_symbol_in_progress
, fetch_coff_debug_section ());
566 SF_SET_LOCAL (def_symbol_in_progress
); /* Do not emit this symbol. */
567 /* intentional fallthrough */
569 SF_SET_PROCESS (def_symbol_in_progress
); /* Will need processing before writing */
570 /* intentional fallthrough */
574 S_SET_SEGMENT (def_symbol_in_progress
, text_section
);
576 name
= bfd_asymbol_name (def_symbol_in_progress
->bsym
);
577 if (name
[1] == 'b' && name
[2] == 'f')
579 if (! in_function ())
580 as_warn ("`%s' symbol without preceding function", name
);
581 /* SA_SET_SYM_LNNO (def_symbol_in_progress, 12345);*/
582 /* Will need relocating */
583 SF_SET_PROCESS (def_symbol_in_progress
);
591 #endif /* C_AUTOARG */
601 SF_SET_DEBUG (def_symbol_in_progress
);
602 S_SET_SEGMENT (def_symbol_in_progress
, absolute_section
);
608 /* Valid but set somewhere else (s_comm, s_lcomm, colon) */
614 as_warn ("unexpected storage class %d",
615 S_GET_STORAGE_CLASS (def_symbol_in_progress
));
617 } /* switch on storage class */
619 /* Now that we have built a debug symbol, try to find if we should
620 merge with an existing symbol or not. If a symbol is C_EFCN or
621 SEG_ABSOLUTE or untagged SEG_DEBUG it never merges. */
623 /* Two cases for functions. Either debug followed by definition or
624 definition followed by debug. For definition first, we will
625 merge the debug symbol into the definition. For debug first, the
626 lineno entry MUST point to the definition function or else it
627 will point off into space when obj_crawl_symbol_chain() merges
628 the debug symbol into the real symbol. Therefor, let's presume
629 the debug symbol is a real function reference. */
631 /* FIXME-SOON If for some reason the definition label/symbol is
632 never seen, this will probably leave an undefined symbol at link
635 if (S_GET_STORAGE_CLASS (def_symbol_in_progress
) == C_EFCN
636 || (!strcmp (bfd_get_section_name (stdoutput
,
637 S_GET_SEGMENT (def_symbol_in_progress
)),
639 && !SF_GET_TAG (def_symbol_in_progress
))
640 || S_GET_SEGMENT (def_symbol_in_progress
) == absolute_section
641 || (symbolP
= symbol_find_base (S_GET_NAME (def_symbol_in_progress
), DO_NOT_STRIP
)) == NULL
)
643 if (def_symbol_in_progress
!= symbol_lastP
)
644 symbol_append (def_symbol_in_progress
, symbol_lastP
, &symbol_rootP
,
649 /* This symbol already exists, merge the newly created symbol
650 into the old one. This is not mandatory. The linker can
651 handle duplicate symbols correctly. But I guess that it save
652 a *lot* of space if the assembly file defines a lot of
655 /* The debug entry (def_symbol_in_progress) is merged into the
656 previous definition. */
658 c_symbol_merge (def_symbol_in_progress
, symbolP
);
659 /* FIXME-SOON Should *def_symbol_in_progress be free'd? xoxorich. */
660 def_symbol_in_progress
= symbolP
;
662 if (SF_GET_FUNCTION (def_symbol_in_progress
)
663 || SF_GET_TAG (def_symbol_in_progress
))
665 /* For functions, and tags, the symbol *must* be where the
666 debug symbol appears. Move the existing symbol to the
668 /* If it already is at the end of the symbol list, do nothing */
669 if (def_symbol_in_progress
!= symbol_lastP
)
671 symbol_remove (def_symbol_in_progress
, &symbol_rootP
, &symbol_lastP
);
672 symbol_append (def_symbol_in_progress
, symbol_lastP
, &symbol_rootP
, &symbol_lastP
);
677 if (SF_GET_TAG (def_symbol_in_progress
)
678 && symbol_find_base (S_GET_NAME (def_symbol_in_progress
), DO_NOT_STRIP
) == NULL
)
680 tag_insert (S_GET_NAME (def_symbol_in_progress
), def_symbol_in_progress
);
683 if (SF_GET_FUNCTION (def_symbol_in_progress
))
685 know (sizeof (def_symbol_in_progress
) <= sizeof (long));
686 set_function (def_symbol_in_progress
);
687 SF_SET_PROCESS (def_symbol_in_progress
);
691 /* That is, if this is the first time we've seen the
693 symbol_table_insert (def_symbol_in_progress
);
694 } /* definition follows debug */
695 } /* Create the line number entry pointing to the function being defined */
697 def_symbol_in_progress
= NULL
;
698 demand_empty_rest_of_line ();
702 obj_coff_dim (ignore
)
707 if (def_symbol_in_progress
== NULL
)
709 as_warn (".dim pseudo-op used outside of .def/.endef: ignored.");
710 demand_empty_rest_of_line ();
712 } /* if not inside .def/.endef */
714 S_SET_NUMBER_AUXILIARY (def_symbol_in_progress
, 1);
716 for (dim_index
= 0; dim_index
< DIMNUM
; dim_index
++)
719 SA_SET_SYM_DIMEN (def_symbol_in_progress
, dim_index
,
720 get_absolute_expression ());
722 switch (*input_line_pointer
)
725 input_line_pointer
++;
729 as_warn ("badly formed .dim directive ignored");
730 /* intentional fallthrough */
738 demand_empty_rest_of_line ();
742 obj_coff_line (ignore
)
747 if (def_symbol_in_progress
== NULL
)
749 /* Probably stabs-style line? */
754 this_base
= get_absolute_expression ();
755 if (!strcmp (".bf", S_GET_NAME (def_symbol_in_progress
)))
756 coff_line_base
= this_base
;
758 S_SET_NUMBER_AUXILIARY (def_symbol_in_progress
, 1);
759 SA_SET_SYM_LNNO (def_symbol_in_progress
, coff_line_base
);
761 demand_empty_rest_of_line ();
765 obj_coff_size (ignore
)
768 if (def_symbol_in_progress
== NULL
)
770 as_warn (".size pseudo-op used outside of .def/.endef ignored.");
771 demand_empty_rest_of_line ();
773 } /* if not inside .def/.endef */
775 S_SET_NUMBER_AUXILIARY (def_symbol_in_progress
, 1);
776 SA_SET_SYM_SIZE (def_symbol_in_progress
, get_absolute_expression ());
777 demand_empty_rest_of_line ();
781 obj_coff_scl (ignore
)
784 if (def_symbol_in_progress
== NULL
)
786 as_warn (".scl pseudo-op used outside of .def/.endef ignored.");
787 demand_empty_rest_of_line ();
789 } /* if not inside .def/.endef */
791 S_SET_STORAGE_CLASS (def_symbol_in_progress
, get_absolute_expression ());
792 demand_empty_rest_of_line ();
796 obj_coff_tag (ignore
)
802 if (def_symbol_in_progress
== NULL
)
804 as_warn (".tag pseudo-op used outside of .def/.endef ignored.");
805 demand_empty_rest_of_line ();
809 S_SET_NUMBER_AUXILIARY (def_symbol_in_progress
, 1);
810 symbol_name
= input_line_pointer
;
811 name_end
= get_symbol_end ();
813 /* Assume that the symbol referred to by .tag is always defined.
814 This was a bad assumption. I've added find_or_make. xoxorich. */
815 SA_SET_SYM_TAGNDX (def_symbol_in_progress
,
816 tag_find_or_make (symbol_name
));
817 if (SA_GET_SYM_TAGNDX (def_symbol_in_progress
) == 0L)
819 as_warn ("tag not found for .tag %s", symbol_name
);
822 SF_SET_TAGGED (def_symbol_in_progress
);
823 *input_line_pointer
= name_end
;
825 demand_empty_rest_of_line ();
829 obj_coff_type (ignore
)
832 if (def_symbol_in_progress
== NULL
)
834 as_warn (".type pseudo-op used outside of .def/.endef ignored.");
835 demand_empty_rest_of_line ();
837 } /* if not inside .def/.endef */
839 S_SET_DATA_TYPE (def_symbol_in_progress
, get_absolute_expression ());
841 if (ISFCN (S_GET_DATA_TYPE (def_symbol_in_progress
)) &&
842 S_GET_STORAGE_CLASS (def_symbol_in_progress
) != C_TPDEF
)
844 SF_SET_FUNCTION (def_symbol_in_progress
);
845 } /* is a function */
847 demand_empty_rest_of_line ();
851 obj_coff_val (ignore
)
854 if (def_symbol_in_progress
== NULL
)
856 as_warn (".val pseudo-op used outside of .def/.endef ignored.");
857 demand_empty_rest_of_line ();
859 } /* if not inside .def/.endef */
861 if (is_name_beginner (*input_line_pointer
))
863 char *symbol_name
= input_line_pointer
;
864 char name_end
= get_symbol_end ();
866 if (!strcmp (symbol_name
, "."))
868 def_symbol_in_progress
->sy_frag
= frag_now
;
869 S_SET_VALUE (def_symbol_in_progress
, (valueT
) frag_now_fix ());
870 /* If the .val is != from the .def (e.g. statics) */
872 else if (strcmp (S_GET_NAME (def_symbol_in_progress
), symbol_name
))
874 def_symbol_in_progress
->sy_value
.X_op
= O_symbol
;
875 def_symbol_in_progress
->sy_value
.X_add_symbol
=
876 symbol_find_or_make (symbol_name
);
877 def_symbol_in_progress
->sy_value
.X_op_symbol
= NULL
;
878 def_symbol_in_progress
->sy_value
.X_add_number
= 0;
880 /* If the segment is undefined when the forward reference is
881 resolved, then copy the segment id from the forward
883 SF_SET_GET_SEGMENT (def_symbol_in_progress
);
885 /* Otherwise, it is the name of a non debug symbol and its value will be calculated later. */
886 *input_line_pointer
= name_end
;
890 S_SET_VALUE (def_symbol_in_progress
, get_absolute_expression ());
891 } /* if symbol based */
893 demand_empty_rest_of_line ();
897 obj_read_begin_hook ()
899 /* These had better be the same. Usually 18 bytes. */
901 know (sizeof (SYMENT
) == sizeof (AUXENT
));
902 know (SYMESZ
== AUXESZ
);
908 symbolS
*coff_last_function
;
911 coff_frob_symbol (symp
, punt
)
915 static symbolS
*last_tagP
;
916 static stack
*block_stack
;
917 static symbolS
*set_end
;
919 if (symp
== &abs_symbol
)
925 if (current_lineno_sym
)
926 coff_add_linesym ((symbolS
*) 0);
929 block_stack
= stack_init (512, sizeof (symbolS
*));
931 if (!S_IS_DEFINED (symp
) && S_GET_STORAGE_CLASS (symp
) != C_STAT
)
932 S_SET_STORAGE_CLASS (symp
, C_EXT
);
934 if (!SF_GET_DEBUG (symp
))
937 if (!SF_GET_LOCAL (symp
)
938 && (real
= symbol_find_base (S_GET_NAME (symp
), DO_NOT_STRIP
))
941 c_symbol_merge (symp
, real
);
944 if (!S_IS_DEFINED (symp
) && !SF_GET_LOCAL (symp
))
946 assert (S_GET_VALUE (symp
) == 0);
947 S_SET_EXTERNAL (symp
);
949 else if (S_GET_STORAGE_CLASS (symp
) == C_NULL
)
951 if (S_GET_SEGMENT (symp
) == text_section
952 && symp
!= seg_info (text_section
)->sym
)
953 S_SET_STORAGE_CLASS (symp
, C_LABEL
);
955 S_SET_STORAGE_CLASS (symp
, C_STAT
);
957 if (SF_GET_PROCESS (symp
))
959 if (S_GET_STORAGE_CLASS (symp
) == C_BLOCK
)
961 if (!strcmp (S_GET_NAME (symp
), ".bb"))
962 stack_push (block_stack
, (char *) &symp
);
966 begin
= *(symbolS
**) stack_pop (block_stack
);
968 as_warn ("mismatched .eb");
973 if (coff_last_function
== 0 && SF_GET_FUNCTION (symp
))
975 union internal_auxent
*auxp
;
976 coff_last_function
= symp
;
977 if (S_GET_NUMBER_AUXILIARY (symp
) < 1)
978 S_SET_NUMBER_AUXILIARY (symp
, 1);
979 auxp
= &coffsymbol (symp
->bsym
)->native
[1].u
.auxent
;
980 memset (auxp
->x_sym
.x_fcnary
.x_ary
.x_dimen
, 0,
981 sizeof (auxp
->x_sym
.x_fcnary
.x_ary
.x_dimen
));
983 if (S_GET_STORAGE_CLASS (symp
) == C_EFCN
)
985 if (coff_last_function
== 0)
986 as_fatal ("C_EFCN symbol out of scope");
987 SA_SET_SYM_FSIZE (coff_last_function
,
988 (long) (S_GET_VALUE (symp
)
989 - S_GET_VALUE (coff_last_function
)));
990 set_end
= coff_last_function
;
991 coff_last_function
= 0;
994 else if (SF_GET_TAG (symp
))
996 else if (S_GET_STORAGE_CLASS (symp
) == C_EOS
)
998 else if (S_GET_STORAGE_CLASS (symp
) == C_FILE
)
1000 if (S_GET_VALUE (symp
))
1002 S_SET_VALUE ((symbolS
*) S_GET_VALUE (symp
), 0xdeadbeef);
1003 S_SET_VALUE (symp
, 0);
1006 if (S_IS_EXTERNAL (symp
))
1007 S_SET_STORAGE_CLASS (symp
, C_EXT
);
1008 else if (SF_GET_LOCAL (symp
))
1013 if (set_end
!= (symbolS
*) NULL
1016 SA_SET_SYM_ENDNDX (set_end
, symp
);
1020 if (coffsymbol (symp
->bsym
)->lineno
)
1023 struct line_no
*lptr
;
1026 lptr
= (struct line_no
*) coffsymbol (symp
->bsym
)->lineno
;
1027 for (i
= 0; lptr
; lptr
= lptr
->next
)
1029 lptr
= (struct line_no
*) coffsymbol (symp
->bsym
)->lineno
;
1031 /* We need i entries for line numbers, plus 1 for the first
1032 entry which BFD will override, plus 1 for the last zero
1033 entry (a marker for BFD). */
1034 l
= (alent
*) bfd_alloc_by_size_t (stdoutput
, (i
+ 2) * sizeof (alent
));
1035 coffsymbol (symp
->bsym
)->lineno
= l
;
1036 l
[i
+ 1].line_number
= 0;
1037 l
[i
+ 1].u
.sym
= NULL
;
1041 lptr
->l
.u
.offset
+= lptr
->frag
->fr_address
;
1049 coff_adjust_section_syms (abfd
, sec
, x
)
1055 segment_info_type
*seginfo
= seg_info (sec
);
1056 int nlnno
, nrelocs
= 0;
1058 /* RS/6000 gas creates a .debug section manually in ppc_frob_file in
1059 tc-ppc.c. Do not get confused by it. */
1060 if (seginfo
== NULL
)
1063 if (!strcmp (sec
->name
, ".text"))
1068 /* @@ Hope that none of the fixups expand to more than one reloc
1070 fixS
*fixp
= seginfo
->fix_root
;
1073 fixp
= fixp
->fx_next
;
1077 if (bfd_get_section_size_before_reloc (sec
) == 0
1078 && nrelocs
== 0 && nlnno
== 0)
1080 secsym
= section_symbol (sec
);
1081 SA_SET_SCN_NRELOC (secsym
, nrelocs
);
1082 SA_SET_SCN_NLINNO (secsym
, nlnno
);
1088 bfd_map_over_sections (stdoutput
, coff_adjust_section_syms
, (char*) 0);
1092 * implement the .section pseudo op:
1093 * .section name {, "flags"}
1095 * | +--- optional flags: 'b' for bss
1097 * +-- section name 'l' for lib
1101 * 'd' (apparently m88k for data)
1103 * But if the argument is not a quoted string, treat it as a
1104 * subsegment number.
1108 obj_coff_section (ignore
)
1111 /* Strip out the section name */
1119 section_name
= input_line_pointer
;
1120 c
= get_symbol_end ();
1122 name
= xmalloc (input_line_pointer
- section_name
+ 1);
1123 strcpy (name
, section_name
);
1125 *input_line_pointer
= c
;
1130 flags
= SEC_NO_FLAGS
;
1132 if (*input_line_pointer
== ',')
1134 ++input_line_pointer
;
1136 if (*input_line_pointer
!= '"')
1137 exp
= get_absolute_expression ();
1140 ++input_line_pointer
;
1141 while (*input_line_pointer
!= '"'
1142 && ! is_end_of_line
[(unsigned char) *input_line_pointer
])
1144 switch (*input_line_pointer
)
1146 case 'b': flags
|= SEC_ALLOC
; flags
&=~ SEC_LOAD
; break;
1147 case 'n': flags
&=~ SEC_LOAD
; break;
1149 case 'w': flags
&=~ SEC_READONLY
; break;
1150 case 'x': flags
|= SEC_CODE
; break;
1152 case 'i': /* STYP_INFO */
1153 case 'l': /* STYP_LIB */
1154 case 'o': /* STYP_OVER */
1155 as_warn ("unsupported section attribute '%c'",
1156 *input_line_pointer
);
1160 as_warn("unknown section attribute '%c'",
1161 *input_line_pointer
);
1164 ++input_line_pointer
;
1166 if (*input_line_pointer
== '"')
1167 ++input_line_pointer
;
1171 sec
= subseg_new (name
, (subsegT
) exp
);
1173 if (flags
!= SEC_NO_FLAGS
)
1175 if (! bfd_set_section_flags (stdoutput
, sec
, flags
))
1176 as_warn ("error setting flags for \"%s\": %s",
1177 bfd_section_name (stdoutput
, sec
),
1178 bfd_errmsg (bfd_get_error ()));
1183 coff_adjust_symtab ()
1185 if (symbol_rootP
== NULL
1186 || S_GET_STORAGE_CLASS (symbol_rootP
) != C_FILE
)
1188 assert (previous_file_symbol
== 0);
1189 c_dot_file_symbol ("fake");
1194 coff_frob_section (sec
)
1200 bfd_vma size
, n_entries
, mask
;
1202 /* The COFF back end in BFD requires that all section sizes be
1203 rounded up to multiples of the corresponding section alignments.
1204 Seems kinda silly to me, but that's the way it is. */
1205 size
= bfd_get_section_size_before_reloc (sec
);
1206 mask
= ((bfd_vma
) 1 << (bfd_vma
) sec
->alignment_power
) - 1;
1209 size
= (size
+ mask
) & ~mask
;
1210 bfd_set_section_size (stdoutput
, sec
, size
);
1213 /* If the section size is non-zero, the section symbol needs an aux
1214 entry associated with it, indicating the size. We don't know
1215 all the values yet; coff_frob_symbol will fill them in later. */
1218 symbolS
*secsym
= section_symbol (sec
);
1220 S_SET_STORAGE_CLASS (secsym
, C_STAT
);
1221 S_SET_NUMBER_AUXILIARY (secsym
, 1);
1222 SF_SET_STATICS (secsym
);
1223 SA_SET_SCN_SCNLEN (secsym
, size
);
1226 /* @@ these should be in a "stabs.h" file, or maybe as.h */
1227 #ifndef STAB_SECTION_NAME
1228 #define STAB_SECTION_NAME ".stab"
1230 #ifndef STAB_STRING_SECTION_NAME
1231 #define STAB_STRING_SECTION_NAME ".stabstr"
1233 if (strcmp (STAB_STRING_SECTION_NAME
, sec
->name
))
1237 sec
= subseg_get (STAB_SECTION_NAME
, 0);
1238 /* size is already rounded up, since other section will be listed first */
1239 size
= bfd_get_section_size_before_reloc (strsec
);
1241 n_entries
= bfd_get_section_size_before_reloc (sec
) / 12 - 1;
1243 /* Find first non-empty frag. It should be large enough. */
1244 fragp
= seg_info (sec
)->frchainP
->frch_root
;
1245 while (fragp
&& fragp
->fr_fix
== 0)
1246 fragp
= fragp
->fr_next
;
1247 assert (fragp
!= 0 && fragp
->fr_fix
>= 12);
1249 /* Store the values. */
1250 p
= fragp
->fr_literal
;
1251 bfd_h_put_16 (stdoutput
, n_entries
, (bfd_byte
*) p
+ 6);
1252 bfd_h_put_32 (stdoutput
, size
, (bfd_byte
*) p
+ 8);
1256 obj_coff_init_stab_section (seg
)
1262 unsigned int stroff
;
1264 /* Make space for this first symbol. */
1268 as_where (&file
, (unsigned int *) NULL
);
1269 stabstr_name
= (char *) alloca (strlen (seg
->name
) + 4);
1270 strcpy (stabstr_name
, seg
->name
);
1271 strcat (stabstr_name
, "str");
1272 stroff
= get_stab_string_offset (file
, stabstr_name
);
1274 md_number_to_chars (p
, stroff
, 4);
1283 return ((s
== NULL
) ? "(NULL)" : S_GET_NAME (s
));
1291 for (symbolP
= symbol_rootP
; symbolP
; symbolP
= symbol_next (symbolP
))
1293 printf("0x%lx: \"%s\" type = %ld, class = %d, segment = %d\n",
1294 (unsigned long) symbolP
,
1295 S_GET_NAME(symbolP
),
1296 (long) S_GET_DATA_TYPE(symbolP
),
1297 S_GET_STORAGE_CLASS(symbolP
),
1298 (int) S_GET_SEGMENT(symbolP
));
1304 #else /* not BFD_ASSEMBLER */
1307 /* This is needed because we include internal bfd things. */
1309 #include "bfd/libbfd.h"
1310 #include "bfd/libcoff.h"
1312 /* The NOP_OPCODE is for the alignment fill value. Fill with nop so
1313 that we can stick sections together without causing trouble. */
1315 #define NOP_OPCODE 0x00
1318 /* The zeroes if symbol name is longer than 8 chars */
1319 #define S_SET_ZEROES(s,v) ((s)->sy_symbol.ost_entry.n_zeroes = (v))
1321 #define MIN(a,b) ((a) < (b)? (a) : (b))
1322 /* This vector is used to turn an internal segment into a section #
1323 suitable for insertion into a coff symbol table
1326 const short seg_N_TYPE
[] =
1327 { /* in: segT out: N_TYPE bits */
1339 C_UNDEF_SECTION
, /* SEG_UNKNOWN */
1340 C_UNDEF_SECTION
, /* SEG_GOOF */
1341 C_UNDEF_SECTION
, /* SEG_EXPR */
1342 C_DEBUG_SECTION
, /* SEG_DEBUG */
1343 C_NTV_SECTION
, /* SEG_NTV */
1344 C_PTV_SECTION
, /* SEG_PTV */
1345 C_REGISTER_SECTION
, /* SEG_REGISTER */
1348 int function_lineoff
= -1; /* Offset in line#s where the last function
1349 started (the odd entry for line #0) */
1351 static symbolS
*last_line_symbol
;
1353 /* Add 4 to the real value to get the index and compensate the
1354 negatives. This vector is used by S_GET_SEGMENT to turn a coff
1355 section number into a segment number
1357 static symbolS
*previous_file_symbol
;
1358 void c_symbol_merge ();
1359 static int line_base
;
1361 symbolS
*c_section_symbol ();
1364 static void fixup_segment
PARAMS ((segment_info_type
*segP
,
1365 segT this_segment_type
));
1368 static void fixup_mdeps
PARAMS ((fragS
*,
1373 static void fill_section
PARAMS ((bfd
* abfd
,
1378 static int c_line_new
PARAMS ((symbolS
* symbol
, long paddr
,
1383 static void w_symbols
PARAMS ((bfd
* abfd
, char *where
,
1384 symbolS
* symbol_rootP
));
1386 static void adjust_stab_section
PARAMS ((bfd
*abfd
, segT seg
));
1388 static void obj_coff_lcomm
PARAMS ((int));
1389 static void obj_coff_text
PARAMS ((int));
1390 static void obj_coff_data
PARAMS ((int));
1391 static void obj_coff_bss
PARAMS ((int));
1392 static void obj_coff_ident
PARAMS ((int));
1393 void obj_coff_section
PARAMS ((int));
1397 We allow more than just the standard 3 sections, infact, we allow
1398 10 sections, (though the usual three have to be there).
1400 This structure performs the mappings for us:
1411 static const seg_info_type seg_info_off_by_4
[N_SEG
] =
1442 #define SEG_INFO_FROM_SECTION_NUMBER(x) (seg_info_off_by_4[(x)+4])
1444 static relax_addressT
1445 relax_align (address
, alignment
)
1446 relax_addressT address
;
1449 relax_addressT mask
;
1450 relax_addressT new_address
;
1452 mask
= ~((~0) << alignment
);
1453 new_address
= (address
+ mask
) & (~mask
);
1454 return (new_address
- address
);
1462 return SEG_INFO_FROM_SECTION_NUMBER (x
->sy_symbol
.ost_entry
.n_scnum
).seg_t
;
1467 /* calculate the size of the frag chain and fill in the section header
1468 to contain all of it, also fill in the addr of the sections */
1470 size_section (abfd
, idx
)
1475 unsigned int size
= 0;
1476 fragS
*frag
= segment_info
[idx
].frchainP
->frch_root
;
1479 size
= frag
->fr_address
;
1480 if (frag
->fr_address
!= size
)
1482 fprintf (stderr
, "Out of step\n");
1483 size
= frag
->fr_address
;
1486 switch (frag
->fr_type
)
1488 #ifdef TC_COFF_SIZEMACHDEP
1489 case rs_machine_dependent
:
1490 size
+= TC_COFF_SIZEMACHDEP (frag
);
1494 assert (frag
->fr_symbol
== 0);
1497 size
+= frag
->fr_fix
;
1498 size
+= frag
->fr_offset
* frag
->fr_var
;
1501 size
+= frag
->fr_fix
;
1502 size
+= relax_align (size
, frag
->fr_offset
);
1505 BAD_CASE (frag
->fr_type
);
1508 frag
= frag
->fr_next
;
1510 segment_info
[idx
].scnhdr
.s_size
= size
;
1516 count_entries_in_chain (idx
)
1519 unsigned int nrelocs
;
1522 /* Count the relocations */
1523 fixup_ptr
= segment_info
[idx
].fix_root
;
1525 while (fixup_ptr
!= (fixS
*) NULL
)
1527 if (TC_COUNT_RELOC (fixup_ptr
))
1530 if (fixup_ptr
->fx_r_type
== RELOC_CONSTH
)
1539 fixup_ptr
= fixup_ptr
->fx_next
;
1544 /* output all the relocations for a section */
1546 do_relocs_for (abfd
, h
, file_cursor
)
1549 unsigned long *file_cursor
;
1551 unsigned int nrelocs
;
1553 unsigned long reloc_start
= *file_cursor
;
1555 for (idx
= SEG_E0
; idx
< SEG_E9
; idx
++)
1557 if (segment_info
[idx
].scnhdr
.s_name
[0])
1559 struct external_reloc
*ext_ptr
;
1560 struct external_reloc
*external_reloc_vec
;
1561 unsigned int external_reloc_size
;
1562 unsigned int base
= segment_info
[idx
].scnhdr
.s_paddr
;
1563 fixS
*fix_ptr
= segment_info
[idx
].fix_root
;
1564 nrelocs
= count_entries_in_chain (idx
);
1567 /* Bypass this stuff if no relocs. This also incidentally
1568 avoids a SCO bug, where free(malloc(0)) tends to crash. */
1570 external_reloc_size
= nrelocs
* RELSZ
;
1571 external_reloc_vec
=
1572 (struct external_reloc
*) malloc (external_reloc_size
);
1574 ext_ptr
= external_reloc_vec
;
1576 /* Fill in the internal coff style reloc struct from the
1577 internal fix list. */
1580 struct internal_reloc intr
;
1582 /* Only output some of the relocations */
1583 if (TC_COUNT_RELOC (fix_ptr
))
1585 #ifdef TC_RELOC_MANGLE
1586 TC_RELOC_MANGLE (fix_ptr
, &intr
, base
);
1590 symbolS
*symbol_ptr
= fix_ptr
->fx_addsy
;
1592 intr
.r_type
= TC_COFF_FIX2RTYPE (fix_ptr
);
1594 base
+ fix_ptr
->fx_frag
->fr_address
+ fix_ptr
->fx_where
;
1596 #ifdef TC_KEEP_FX_OFFSET
1597 intr
.r_offset
= fix_ptr
->fx_offset
;
1602 /* Turn the segment of the symbol into an offset. */
1605 dot
= segment_info
[S_GET_SEGMENT (symbol_ptr
)].dot
;
1608 intr
.r_symndx
= dot
->sy_number
;
1612 intr
.r_symndx
= symbol_ptr
->sy_number
;
1622 (void) bfd_coff_swap_reloc_out (abfd
, &intr
, ext_ptr
);
1625 #if defined(TC_A29K)
1627 /* The 29k has a special kludge for the high 16 bit
1628 reloc. Two relocations are emited, R_IHIHALF,
1629 and R_IHCONST. The second one doesn't contain a
1630 symbol, but uses the value for offset. */
1632 if (intr
.r_type
== R_IHIHALF
)
1634 /* now emit the second bit */
1635 intr
.r_type
= R_IHCONST
;
1636 intr
.r_symndx
= fix_ptr
->fx_addnumber
;
1637 (void) bfd_coff_swap_reloc_out (abfd
, &intr
, ext_ptr
);
1643 fix_ptr
= fix_ptr
->fx_next
;
1646 /* Write out the reloc table */
1647 bfd_write ((PTR
) external_reloc_vec
, 1, external_reloc_size
,
1649 free (external_reloc_vec
);
1651 /* Fill in section header info. */
1652 segment_info
[idx
].scnhdr
.s_relptr
= *file_cursor
;
1653 *file_cursor
+= external_reloc_size
;
1654 segment_info
[idx
].scnhdr
.s_nreloc
= nrelocs
;
1659 segment_info
[idx
].scnhdr
.s_relptr
= 0;
1663 /* Set relocation_size field in file headers */
1664 H_SET_RELOCATION_SIZE (h
, *file_cursor
- reloc_start
, 0);
1668 /* run through a frag chain and write out the data to go with it, fill
1669 in the scnhdrs with the info on the file postions
1672 fill_section (abfd
, h
, file_cursor
)
1675 unsigned long *file_cursor
;
1679 unsigned int paddr
= 0;
1681 for (i
= SEG_E0
; i
< SEG_UNKNOWN
; i
++)
1683 unsigned int offset
= 0;
1685 struct internal_scnhdr
*s
= &(segment_info
[i
].scnhdr
);
1689 fragS
*frag
= segment_info
[i
].frchainP
->frch_root
;
1696 buffer
= xmalloc (s
->s_size
);
1697 s
->s_scnptr
= *file_cursor
;
1699 know (s
->s_paddr
== paddr
);
1701 if (strcmp (s
->s_name
, ".text") == 0)
1702 s
->s_flags
|= STYP_TEXT
;
1703 else if (strcmp (s
->s_name
, ".data") == 0)
1704 s
->s_flags
|= STYP_DATA
;
1705 else if (strcmp (s
->s_name
, ".bss") == 0)
1708 s
->s_flags
|= STYP_BSS
;
1710 /* @@ Should make the i386 and a29k coff targets define
1711 COFF_NOLOAD_PROBLEM, and have only one test here. */
1714 #ifndef COFF_NOLOAD_PROBLEM
1715 /* Apparently the SVR3 linker (and exec syscall) and UDI
1716 mondfe progrem are confused by noload sections. */
1717 s
->s_flags
|= STYP_NOLOAD
;
1722 else if (strcmp (s
->s_name
, ".lit") == 0)
1723 s
->s_flags
= STYP_LIT
| STYP_TEXT
;
1724 else if (strcmp (s
->s_name
, ".init") == 0)
1725 s
->s_flags
|= STYP_TEXT
;
1726 else if (strcmp (s
->s_name
, ".fini") == 0)
1727 s
->s_flags
|= STYP_TEXT
;
1728 else if (strncmp (s
->s_name
, ".comment", 8) == 0)
1729 s
->s_flags
|= STYP_INFO
;
1733 unsigned int fill_size
;
1734 switch (frag
->fr_type
)
1736 case rs_machine_dependent
:
1739 memcpy (buffer
+ frag
->fr_address
,
1741 (unsigned int) frag
->fr_fix
);
1742 offset
+= frag
->fr_fix
;
1747 assert (frag
->fr_symbol
== 0);
1753 memcpy (buffer
+ frag
->fr_address
,
1755 (unsigned int) frag
->fr_fix
);
1756 offset
+= frag
->fr_fix
;
1759 fill_size
= frag
->fr_var
;
1760 if (fill_size
&& frag
->fr_offset
> 0)
1763 unsigned int off
= frag
->fr_fix
;
1764 for (count
= frag
->fr_offset
; count
; count
--)
1766 if (fill_size
+ frag
->fr_address
+ off
<= s
->s_size
)
1768 memcpy (buffer
+ frag
->fr_address
+ off
,
1769 frag
->fr_literal
+ frag
->fr_fix
,
1772 offset
+= fill_size
;
1777 case rs_broken_word
:
1782 frag
= frag
->fr_next
;
1787 if (s
->s_scnptr
!= 0)
1789 bfd_write (buffer
, s
->s_size
, 1, abfd
);
1790 *file_cursor
+= s
->s_size
;
1799 /* Coff file generation & utilities */
1802 coff_header_append (abfd
, h
)
1810 bfd_seek (abfd
, 0, 0);
1812 #ifndef OBJ_COFF_OMIT_OPTIONAL_HEADER
1813 H_SET_MAGIC_NUMBER (h
, COFF_MAGIC
);
1814 H_SET_VERSION_STAMP (h
, 0);
1815 H_SET_ENTRY_POINT (h
, 0);
1816 H_SET_TEXT_START (h
, segment_info
[SEG_E0
].frchainP
->frch_root
->fr_address
);
1817 H_SET_DATA_START (h
, segment_info
[SEG_E1
].frchainP
->frch_root
->fr_address
);
1818 H_SET_SIZEOF_OPTIONAL_HEADER (h
, bfd_coff_swap_aouthdr_out(abfd
, &h
->aouthdr
,
1820 #else /* defined (OBJ_COFF_OMIT_OPTIONAL_HEADER) */
1821 H_SET_SIZEOF_OPTIONAL_HEADER (h
, 0);
1822 #endif /* defined (OBJ_COFF_OMIT_OPTIONAL_HEADER) */
1824 i
= bfd_coff_swap_filehdr_out (abfd
, &h
->filehdr
, buffer
);
1826 bfd_write (buffer
, i
, 1, abfd
);
1827 bfd_write (buffero
, H_GET_SIZEOF_OPTIONAL_HEADER (h
), 1, abfd
);
1829 for (i
= SEG_E0
; i
< SEG_E9
; i
++)
1831 if (segment_info
[i
].scnhdr
.s_name
[0])
1834 bfd_coff_swap_scnhdr_out (abfd
,
1835 &(segment_info
[i
].scnhdr
),
1837 bfd_write (buffer
, size
, 1, abfd
);
1844 symbol_to_chars (abfd
, where
, symbolP
)
1849 unsigned int numaux
= symbolP
->sy_symbol
.ost_entry
.n_numaux
;
1853 /* Turn any symbols with register attributes into abs symbols */
1854 if (S_GET_SEGMENT (symbolP
) == reg_section
)
1856 S_SET_SEGMENT (symbolP
, absolute_section
);
1858 /* At the same time, relocate all symbols to their output value */
1860 val
= (segment_info
[S_GET_SEGMENT (symbolP
)].scnhdr
.s_paddr
1861 + S_GET_VALUE (symbolP
));
1863 S_SET_VALUE (symbolP
, val
);
1865 symbolP
->sy_symbol
.ost_entry
.n_value
= val
;
1867 where
+= bfd_coff_swap_sym_out (abfd
, &symbolP
->sy_symbol
.ost_entry
,
1870 for (i
= 0; i
< numaux
; i
++)
1872 where
+= bfd_coff_swap_aux_out (abfd
,
1873 &symbolP
->sy_symbol
.ost_auxent
[i
],
1874 S_GET_DATA_TYPE (symbolP
),
1875 S_GET_STORAGE_CLASS (symbolP
),
1883 obj_symbol_new_hook (symbolP
)
1886 char underscore
= 0; /* Symbol has leading _ */
1888 /* Effective symbol */
1889 /* Store the pointer in the offset. */
1890 S_SET_ZEROES (symbolP
, 0L);
1891 S_SET_DATA_TYPE (symbolP
, T_NULL
);
1892 S_SET_STORAGE_CLASS (symbolP
, 0);
1893 S_SET_NUMBER_AUXILIARY (symbolP
, 0);
1894 /* Additional information */
1895 symbolP
->sy_symbol
.ost_flags
= 0;
1896 /* Auxiliary entries */
1897 memset ((char *) &symbolP
->sy_symbol
.ost_auxent
[0], 0, AUXESZ
);
1899 if (S_IS_STRING (symbolP
))
1900 SF_SET_STRING (symbolP
);
1901 if (!underscore
&& S_IS_LOCAL (symbolP
))
1902 SF_SET_LOCAL (symbolP
);
1906 * Handle .ln directives.
1910 obj_coff_ln (appline
)
1915 if (! appline
&& def_symbol_in_progress
!= NULL
)
1917 as_warn (".ln pseudo-op inside .def/.endef: ignored.");
1918 demand_empty_rest_of_line ();
1920 } /* wrong context */
1922 l
= get_absolute_expression ();
1923 c_line_new (0, frag_now_fix (), l
, frag_now
);
1932 listing_source_line ((unsigned int) l
);
1937 demand_empty_rest_of_line ();
1943 * Handle .def directives.
1945 * One might ask : why can't we symbol_new if the symbol does not
1946 * already exist and fill it with debug information. Because of
1947 * the C_EFCN special symbol. It would clobber the value of the
1948 * function symbol before we have a chance to notice that it is
1949 * a C_EFCN. And a second reason is that the code is more clear this
1950 * way. (at least I think it is :-).
1954 #define SKIP_SEMI_COLON() while (*input_line_pointer++ != ';')
1955 #define SKIP_WHITESPACES() while (*input_line_pointer == ' ' || \
1956 *input_line_pointer == '\t') \
1957 input_line_pointer++;
1963 char name_end
; /* Char after the end of name */
1964 char *symbol_name
; /* Name of the debug symbol */
1965 char *symbol_name_copy
; /* Temporary copy of the name */
1966 unsigned int symbol_name_length
;
1968 if (def_symbol_in_progress
!= NULL
)
1970 as_warn (".def pseudo-op used inside of .def/.endef: ignored.");
1971 demand_empty_rest_of_line ();
1973 } /* if not inside .def/.endef */
1975 SKIP_WHITESPACES ();
1977 def_symbol_in_progress
= (symbolS
*) obstack_alloc (¬es
, sizeof (*def_symbol_in_progress
));
1978 memset (def_symbol_in_progress
, 0, sizeof (*def_symbol_in_progress
));
1980 symbol_name
= input_line_pointer
;
1981 name_end
= get_symbol_end ();
1982 symbol_name_length
= strlen (symbol_name
);
1983 symbol_name_copy
= xmalloc (symbol_name_length
+ 1);
1984 strcpy (symbol_name_copy
, symbol_name
);
1986 /* Initialize the new symbol */
1987 #ifdef STRIP_UNDERSCORE
1988 S_SET_NAME (def_symbol_in_progress
, (*symbol_name_copy
== '_'
1989 ? symbol_name_copy
+ 1
1990 : symbol_name_copy
));
1991 #else /* STRIP_UNDERSCORE */
1992 S_SET_NAME (def_symbol_in_progress
, symbol_name_copy
);
1993 #endif /* STRIP_UNDERSCORE */
1994 /* free(symbol_name_copy); */
1995 def_symbol_in_progress
->sy_name_offset
= (unsigned long) ~0;
1996 def_symbol_in_progress
->sy_number
= ~0;
1997 def_symbol_in_progress
->sy_frag
= &zero_address_frag
;
1998 S_SET_VALUE (def_symbol_in_progress
, 0);
2000 if (S_IS_STRING (def_symbol_in_progress
))
2001 SF_SET_STRING (def_symbol_in_progress
);
2003 *input_line_pointer
= name_end
;
2005 demand_empty_rest_of_line ();
2008 unsigned int dim_index
;
2012 obj_coff_endef (ignore
)
2015 symbolS
*symbolP
= 0;
2016 /* DIM BUG FIX sac@cygnus.com */
2018 if (def_symbol_in_progress
== NULL
)
2020 as_warn (".endef pseudo-op used outside of .def/.endef: ignored.");
2021 demand_empty_rest_of_line ();
2023 } /* if not inside .def/.endef */
2025 /* Set the section number according to storage class. */
2026 switch (S_GET_STORAGE_CLASS (def_symbol_in_progress
))
2031 SF_SET_TAG (def_symbol_in_progress
);
2032 /* intentional fallthrough */
2035 SF_SET_DEBUG (def_symbol_in_progress
);
2036 S_SET_SEGMENT (def_symbol_in_progress
, SEG_DEBUG
);
2040 SF_SET_LOCAL (def_symbol_in_progress
); /* Do not emit this symbol. */
2041 /* intentional fallthrough */
2043 SF_SET_PROCESS (def_symbol_in_progress
); /* Will need processing before writing */
2044 /* intentional fallthrough */
2046 S_SET_SEGMENT (def_symbol_in_progress
, SEG_E0
);
2048 if (strcmp (S_GET_NAME (def_symbol_in_progress
), ".bf") == 0)
2050 if (function_lineoff
< 0)
2052 fprintf (stderr
, "`.bf' symbol without preceding function\n");
2053 } /* missing function symbol */
2054 SA_GET_SYM_LNNOPTR (last_line_symbol
) = function_lineoff
;
2056 SF_SET_PROCESS (last_line_symbol
);
2057 function_lineoff
= -1;
2059 /* Value is always set to . */
2060 def_symbol_in_progress
->sy_frag
= frag_now
;
2061 S_SET_VALUE (def_symbol_in_progress
, (valueT
) frag_now_fix ());
2066 #endif /* C_AUTOARG */
2076 SF_SET_DEBUG (def_symbol_in_progress
);
2077 S_SET_SEGMENT (def_symbol_in_progress
, absolute_section
);
2083 /* Valid but set somewhere else (s_comm, s_lcomm, colon) */
2089 as_warn ("unexpected storage class %d", S_GET_STORAGE_CLASS (def_symbol_in_progress
));
2091 } /* switch on storage class */
2093 /* Now that we have built a debug symbol, try to find if we should
2094 merge with an existing symbol or not. If a symbol is C_EFCN or
2095 absolute_section or untagged SEG_DEBUG it never merges. We also
2096 don't merge labels, which are in a different namespace, nor
2097 symbols which have not yet been defined since they are typically
2098 unique, nor do we merge tags with non-tags. */
2100 /* Two cases for functions. Either debug followed by definition or
2101 definition followed by debug. For definition first, we will
2102 merge the debug symbol into the definition. For debug first, the
2103 lineno entry MUST point to the definition function or else it
2104 will point off into space when crawl_symbols() merges the debug
2105 symbol into the real symbol. Therefor, let's presume the debug
2106 symbol is a real function reference. */
2108 /* FIXME-SOON If for some reason the definition label/symbol is
2109 never seen, this will probably leave an undefined symbol at link
2112 if (S_GET_STORAGE_CLASS (def_symbol_in_progress
) == C_EFCN
2113 || S_GET_STORAGE_CLASS (def_symbol_in_progress
) == C_LABEL
2114 || (S_GET_SEGMENT (def_symbol_in_progress
) == SEG_DEBUG
2115 && !SF_GET_TAG (def_symbol_in_progress
))
2116 || S_GET_SEGMENT (def_symbol_in_progress
) == absolute_section
2117 || def_symbol_in_progress
->sy_value
.X_op
!= O_constant
2118 || (symbolP
= symbol_find_base (S_GET_NAME (def_symbol_in_progress
), DO_NOT_STRIP
)) == NULL
2119 || (SF_GET_TAG (def_symbol_in_progress
) != SF_GET_TAG (symbolP
)))
2121 symbol_append (def_symbol_in_progress
, symbol_lastP
, &symbol_rootP
,
2126 /* This symbol already exists, merge the newly created symbol
2127 into the old one. This is not mandatory. The linker can
2128 handle duplicate symbols correctly. But I guess that it save
2129 a *lot* of space if the assembly file defines a lot of
2132 /* The debug entry (def_symbol_in_progress) is merged into the
2133 previous definition. */
2135 c_symbol_merge (def_symbol_in_progress
, symbolP
);
2136 /* FIXME-SOON Should *def_symbol_in_progress be free'd? xoxorich. */
2137 def_symbol_in_progress
= symbolP
;
2139 if (SF_GET_FUNCTION (def_symbol_in_progress
)
2140 || SF_GET_TAG (def_symbol_in_progress
))
2142 /* For functions, and tags, the symbol *must* be where the
2143 debug symbol appears. Move the existing symbol to the
2145 /* If it already is at the end of the symbol list, do nothing */
2146 if (def_symbol_in_progress
!= symbol_lastP
)
2148 symbol_remove (def_symbol_in_progress
, &symbol_rootP
,
2150 symbol_append (def_symbol_in_progress
, symbol_lastP
,
2151 &symbol_rootP
, &symbol_lastP
);
2152 } /* if not already in place */
2154 } /* normal or mergable */
2156 if (SF_GET_TAG (def_symbol_in_progress
)
2157 && symbol_find_base (S_GET_NAME (def_symbol_in_progress
), DO_NOT_STRIP
) == NULL
)
2159 tag_insert (S_GET_NAME (def_symbol_in_progress
), def_symbol_in_progress
);
2162 if (SF_GET_FUNCTION (def_symbol_in_progress
))
2164 know (sizeof (def_symbol_in_progress
) <= sizeof (long));
2166 = c_line_new (def_symbol_in_progress
, 0, 0, &zero_address_frag
);
2168 SF_SET_PROCESS (def_symbol_in_progress
);
2170 if (symbolP
== NULL
)
2172 /* That is, if this is the first time we've seen the
2174 symbol_table_insert (def_symbol_in_progress
);
2175 } /* definition follows debug */
2176 } /* Create the line number entry pointing to the function being defined */
2178 def_symbol_in_progress
= NULL
;
2179 demand_empty_rest_of_line ();
2183 obj_coff_dim (ignore
)
2188 if (def_symbol_in_progress
== NULL
)
2190 as_warn (".dim pseudo-op used outside of .def/.endef: ignored.");
2191 demand_empty_rest_of_line ();
2193 } /* if not inside .def/.endef */
2195 S_SET_NUMBER_AUXILIARY (def_symbol_in_progress
, 1);
2197 for (dim_index
= 0; dim_index
< DIMNUM
; dim_index
++)
2199 SKIP_WHITESPACES ();
2200 SA_SET_SYM_DIMEN (def_symbol_in_progress
, dim_index
,
2201 get_absolute_expression ());
2203 switch (*input_line_pointer
)
2206 input_line_pointer
++;
2210 as_warn ("badly formed .dim directive ignored");
2211 /* intentional fallthrough */
2219 demand_empty_rest_of_line ();
2223 obj_coff_line (ignore
)
2229 if (def_symbol_in_progress
== NULL
)
2235 name
= S_GET_NAME (def_symbol_in_progress
);
2236 this_base
= get_absolute_expression ();
2238 /* Only .bf symbols indicate the use of a new base line number; the
2239 line numbers associated with .ef, .bb, .eb are relative to the
2240 start of the containing function. */
2241 if (!strcmp (".bf", name
))
2243 #if 0 /* XXX Can we ever have line numbers going backwards? */
2244 if (this_base
> line_base
)
2247 line_base
= this_base
;
2255 listing_source_line ((unsigned int) line_base
);
2261 S_SET_NUMBER_AUXILIARY (def_symbol_in_progress
, 1);
2262 SA_SET_SYM_LNNO (def_symbol_in_progress
, this_base
);
2264 demand_empty_rest_of_line ();
2268 obj_coff_size (ignore
)
2271 if (def_symbol_in_progress
== NULL
)
2273 as_warn (".size pseudo-op used outside of .def/.endef ignored.");
2274 demand_empty_rest_of_line ();
2276 } /* if not inside .def/.endef */
2278 S_SET_NUMBER_AUXILIARY (def_symbol_in_progress
, 1);
2279 SA_SET_SYM_SIZE (def_symbol_in_progress
, get_absolute_expression ());
2280 demand_empty_rest_of_line ();
2284 obj_coff_scl (ignore
)
2287 if (def_symbol_in_progress
== NULL
)
2289 as_warn (".scl pseudo-op used outside of .def/.endef ignored.");
2290 demand_empty_rest_of_line ();
2292 } /* if not inside .def/.endef */
2294 S_SET_STORAGE_CLASS (def_symbol_in_progress
, get_absolute_expression ());
2295 demand_empty_rest_of_line ();
2299 obj_coff_tag (ignore
)
2305 if (def_symbol_in_progress
== NULL
)
2307 as_warn (".tag pseudo-op used outside of .def/.endef ignored.");
2308 demand_empty_rest_of_line ();
2312 S_SET_NUMBER_AUXILIARY (def_symbol_in_progress
, 1);
2313 symbol_name
= input_line_pointer
;
2314 name_end
= get_symbol_end ();
2316 /* Assume that the symbol referred to by .tag is always defined.
2317 This was a bad assumption. I've added find_or_make. xoxorich. */
2318 SA_SET_SYM_TAGNDX (def_symbol_in_progress
,
2319 (long) tag_find_or_make (symbol_name
));
2320 if (SA_GET_SYM_TAGNDX (def_symbol_in_progress
) == 0L)
2322 as_warn ("tag not found for .tag %s", symbol_name
);
2325 SF_SET_TAGGED (def_symbol_in_progress
);
2326 *input_line_pointer
= name_end
;
2328 demand_empty_rest_of_line ();
2332 obj_coff_type (ignore
)
2335 if (def_symbol_in_progress
== NULL
)
2337 as_warn (".type pseudo-op used outside of .def/.endef ignored.");
2338 demand_empty_rest_of_line ();
2340 } /* if not inside .def/.endef */
2342 S_SET_DATA_TYPE (def_symbol_in_progress
, get_absolute_expression ());
2344 if (ISFCN (S_GET_DATA_TYPE (def_symbol_in_progress
)) &&
2345 S_GET_STORAGE_CLASS (def_symbol_in_progress
) != C_TPDEF
)
2347 SF_SET_FUNCTION (def_symbol_in_progress
);
2348 } /* is a function */
2350 demand_empty_rest_of_line ();
2354 obj_coff_val (ignore
)
2357 if (def_symbol_in_progress
== NULL
)
2359 as_warn (".val pseudo-op used outside of .def/.endef ignored.");
2360 demand_empty_rest_of_line ();
2362 } /* if not inside .def/.endef */
2364 if (is_name_beginner (*input_line_pointer
))
2366 char *symbol_name
= input_line_pointer
;
2367 char name_end
= get_symbol_end ();
2369 if (!strcmp (symbol_name
, "."))
2371 def_symbol_in_progress
->sy_frag
= frag_now
;
2372 S_SET_VALUE (def_symbol_in_progress
, (valueT
) frag_now_fix ());
2373 /* If the .val is != from the .def (e.g. statics) */
2375 else if (strcmp (S_GET_NAME (def_symbol_in_progress
), symbol_name
))
2377 def_symbol_in_progress
->sy_value
.X_op
= O_symbol
;
2378 def_symbol_in_progress
->sy_value
.X_add_symbol
=
2379 symbol_find_or_make (symbol_name
);
2380 def_symbol_in_progress
->sy_value
.X_op_symbol
= NULL
;
2381 def_symbol_in_progress
->sy_value
.X_add_number
= 0;
2383 /* If the segment is undefined when the forward reference is
2384 resolved, then copy the segment id from the forward
2386 SF_SET_GET_SEGMENT (def_symbol_in_progress
);
2388 /* FIXME: gcc can generate address expressions
2389 here in unusual cases (search for "obscure"
2390 in sdbout.c). We just ignore the offset
2391 here, thus generating incorrect debugging
2392 information. We ignore the rest of the
2395 /* Otherwise, it is the name of a non debug symbol and
2396 its value will be calculated later. */
2397 *input_line_pointer
= name_end
;
2399 /* FIXME: this is to avoid an error message in the
2400 FIXME case mentioned just above. */
2401 while (! is_end_of_line
[(unsigned char) *input_line_pointer
])
2402 ++input_line_pointer
;
2406 S_SET_VALUE (def_symbol_in_progress
,
2407 (valueT
) get_absolute_expression ());
2408 } /* if symbol based */
2410 demand_empty_rest_of_line ();
2414 obj_read_begin_hook ()
2416 /* These had better be the same. Usually 18 bytes. */
2418 know (sizeof (SYMENT
) == sizeof (AUXENT
));
2419 know (SYMESZ
== AUXESZ
);
2424 /* This function runs through the symbol table and puts all the
2425 externals onto another chain */
2427 /* The chain of externals */
2428 symbolS
*symbol_externP
;
2429 symbolS
*symbol_extern_lastP
;
2432 symbolS
*last_functionP
;
2439 unsigned int symbol_number
= 0;
2440 unsigned int last_file_symno
= 0;
2442 for (symbolP
= symbol_rootP
;
2444 symbolP
= symbolP
? symbol_next (symbolP
) : symbol_rootP
)
2446 if (!SF_GET_DEBUG (symbolP
))
2448 /* Debug symbols do not need all this rubbish */
2449 symbolS
*real_symbolP
;
2451 /* L* and C_EFCN symbols never merge. */
2452 if (!SF_GET_LOCAL (symbolP
)
2453 && S_GET_STORAGE_CLASS (symbolP
) != C_LABEL
2454 && symbolP
->sy_value
.X_op
== O_constant
2455 && (real_symbolP
= symbol_find_base (S_GET_NAME (symbolP
), DO_NOT_STRIP
))
2456 && real_symbolP
!= symbolP
)
2458 /* FIXME-SOON: where do dups come from?
2459 Maybe tag references before definitions? xoxorich. */
2460 /* Move the debug data from the debug symbol to the
2461 real symbol. Do NOT do the oposite (i.e. move from
2462 real symbol to debug symbol and remove real symbol from the
2463 list.) Because some pointers refer to the real symbol
2464 whereas no pointers refer to the debug symbol. */
2465 c_symbol_merge (symbolP
, real_symbolP
);
2466 /* Replace the current symbol by the real one */
2467 /* The symbols will never be the last or the first
2468 because : 1st symbol is .file and 3 last symbols are
2469 .text, .data, .bss */
2470 symbol_remove (real_symbolP
, &symbol_rootP
, &symbol_lastP
);
2471 symbol_insert (real_symbolP
, symbolP
, &symbol_rootP
, &symbol_lastP
);
2472 symbol_remove (symbolP
, &symbol_rootP
, &symbol_lastP
);
2473 symbolP
= real_symbolP
;
2474 } /* if not local but dup'd */
2476 if (flag_readonly_data_in_text
&& (S_GET_SEGMENT (symbolP
) == SEG_E1
))
2478 S_SET_SEGMENT (symbolP
, SEG_E0
);
2479 } /* push data into text */
2481 resolve_symbol_value (symbolP
);
2483 if (S_GET_STORAGE_CLASS (symbolP
) == C_NULL
)
2485 if (!S_IS_DEFINED (symbolP
) && !SF_GET_LOCAL (symbolP
))
2487 S_SET_EXTERNAL (symbolP
);
2489 else if (S_GET_SEGMENT (symbolP
) == SEG_E0
)
2491 S_SET_STORAGE_CLASS (symbolP
, C_LABEL
);
2495 S_SET_STORAGE_CLASS (symbolP
, C_STAT
);
2499 /* Mainly to speed up if not -g */
2500 if (SF_GET_PROCESS (symbolP
))
2502 /* Handle the nested blocks auxiliary info. */
2503 if (S_GET_STORAGE_CLASS (symbolP
) == C_BLOCK
)
2505 if (!strcmp (S_GET_NAME (symbolP
), ".bb"))
2506 stack_push (block_stack
, (char *) &symbolP
);
2509 register symbolS
*begin_symbolP
;
2510 begin_symbolP
= *(symbolS
**) stack_pop (block_stack
);
2511 if (begin_symbolP
== (symbolS
*) 0)
2512 as_warn ("mismatched .eb");
2514 SA_SET_SYM_ENDNDX (begin_symbolP
, symbol_number
+ 2);
2517 /* If we are able to identify the type of a function, and we
2518 are out of a function (last_functionP == 0) then, the
2519 function symbol will be associated with an auxiliary
2521 if (last_functionP
== (symbolS
*) 0 &&
2522 SF_GET_FUNCTION (symbolP
))
2524 last_functionP
= symbolP
;
2526 if (S_GET_NUMBER_AUXILIARY (symbolP
) < 1)
2528 S_SET_NUMBER_AUXILIARY (symbolP
, 1);
2529 } /* make it at least 1 */
2531 /* Clobber possible stale .dim information. */
2533 /* Iffed out by steve - this fries the lnnoptr info too */
2534 bzero (symbolP
->sy_symbol
.ost_auxent
[0].x_sym
.x_fcnary
.x_ary
.x_dimen
,
2535 sizeof (symbolP
->sy_symbol
.ost_auxent
[0].x_sym
.x_fcnary
.x_ary
.x_dimen
));
2538 /* The C_FCN doesn't need any additional information. I
2539 don't even know if this is needed for sdb. But the
2540 standard assembler generates it, so... */
2541 if (S_GET_STORAGE_CLASS (symbolP
) == C_EFCN
)
2543 if (last_functionP
== (symbolS
*) 0)
2544 as_fatal ("C_EFCN symbol out of scope");
2545 SA_SET_SYM_FSIZE (last_functionP
,
2546 (long) (S_GET_VALUE (symbolP
) -
2547 S_GET_VALUE (last_functionP
)));
2548 SA_SET_SYM_ENDNDX (last_functionP
, symbol_number
);
2549 last_functionP
= (symbolS
*) 0;
2553 else if (SF_GET_TAG (symbolP
))
2555 /* First descriptor of a structure must point to
2556 the first slot after the structure description. */
2557 last_tagP
= symbolP
;
2560 else if (S_GET_STORAGE_CLASS (symbolP
) == C_EOS
)
2562 /* +2 take in account the current symbol */
2563 SA_SET_SYM_ENDNDX (last_tagP
, symbol_number
+ 2);
2565 else if (S_GET_STORAGE_CLASS (symbolP
) == C_FILE
)
2567 if (S_GET_VALUE (symbolP
))
2569 S_SET_VALUE (symbolP
, last_file_symno
);
2570 last_file_symno
= symbol_number
;
2571 } /* no one points at the first .file symbol */
2572 } /* if debug or tag or eos or file */
2574 /* We must put the external symbols apart. The loader
2575 does not bomb if we do not. But the references in
2576 the endndx field for a .bb symbol are not corrected
2577 if an external symbol is removed between .bb and .be.
2578 I.e in the following case :
2579 [20] .bb endndx = 22
2582 ld will move the symbol 21 to the end of the list but
2583 endndx will still be 22 instead of 21. */
2586 if (SF_GET_LOCAL (symbolP
))
2588 /* remove C_EFCN and LOCAL (L...) symbols */
2589 /* next pointer remains valid */
2590 symbol_remove (symbolP
, &symbol_rootP
, &symbol_lastP
);
2593 else if (!S_IS_DEFINED (symbolP
)
2594 && !S_IS_DEBUG (symbolP
)
2595 && !SF_GET_STATICS (symbolP
) &&
2596 S_GET_STORAGE_CLASS (symbolP
) == C_EXT
)
2597 { /* C_EXT && !SF_GET_FUNCTION(symbolP)) */
2598 /* if external, Remove from the list */
2599 symbolS
*hold
= symbol_previous (symbolP
);
2601 symbol_remove (symbolP
, &symbol_rootP
, &symbol_lastP
);
2602 symbol_clear_list_pointers (symbolP
);
2603 symbol_append (symbolP
, symbol_extern_lastP
, &symbol_externP
, &symbol_extern_lastP
);
2608 if (SF_GET_STRING (symbolP
))
2610 symbolP
->sy_name_offset
= string_byte_count
;
2611 string_byte_count
+= strlen (S_GET_NAME (symbolP
)) + 1;
2615 symbolP
->sy_name_offset
= 0;
2616 } /* fix "long" names */
2618 symbolP
->sy_number
= symbol_number
;
2619 symbol_number
+= 1 + S_GET_NUMBER_AUXILIARY (symbolP
);
2620 } /* if local symbol */
2621 } /* traverse the symbol list */
2622 return symbol_number
;
2630 unsigned int symbol_number
= 0;
2632 for (symbolP
= symbol_externP
; symbol_externP
;)
2634 symbolS
*tmp
= symbol_externP
;
2637 symbol_remove (tmp
, &symbol_externP
, &symbol_extern_lastP
);
2638 symbol_append (tmp
, symbol_lastP
, &symbol_rootP
, &symbol_lastP
);
2641 if (SF_GET_STRING (tmp
))
2643 tmp
->sy_name_offset
= string_byte_count
;
2644 string_byte_count
+= strlen (S_GET_NAME (tmp
)) + 1;
2648 tmp
->sy_name_offset
= 0;
2649 } /* fix "long" names */
2651 tmp
->sy_number
= symbol_number
;
2652 symbol_number
+= 1 + S_GET_NUMBER_AUXILIARY (tmp
);
2653 } /* append the entire extern chain */
2654 return symbol_number
;
2661 unsigned int symbol_number
= 0;
2664 for (symbolP
= symbol_rootP
; symbolP
; symbolP
=
2665 symbol_next (symbolP
))
2667 symbolP
->sy_number
= symbol_number
;
2671 if (SF_GET_TAGGED (symbolP
))
2675 ((symbolS
*) SA_GET_SYM_TAGNDX (symbolP
))->sy_number
);
2678 symbol_number
+= 1 + S_GET_NUMBER_AUXILIARY (symbolP
);
2680 return symbol_number
;
2685 crawl_symbols (h
, abfd
)
2691 /* Initialize the stack used to keep track of the matching .bb .be */
2693 block_stack
= stack_init (512, sizeof (symbolS
*));
2695 /* The symbol list should be ordered according to the following sequence
2698 * . debug entries for functions
2699 * . fake symbols for the sections, including.text .data and .bss
2701 * . undefined symbols
2702 * But this is not mandatory. The only important point is to put the
2703 * undefined symbols at the end of the list.
2706 if (symbol_rootP
== NULL
2707 || S_GET_STORAGE_CLASS (symbol_rootP
) != C_FILE
)
2709 c_dot_file_symbol ("fake");
2711 /* Is there a .file symbol ? If not insert one at the beginning. */
2714 * Build up static symbols for the sections, they are filled in later
2718 for (i
= SEG_E0
; i
< SEG_E9
; i
++)
2720 if (segment_info
[i
].scnhdr
.s_name
[0])
2724 strncpy (name
, segment_info
[i
].scnhdr
.s_name
, 8);
2726 segment_info
[i
].dot
= c_section_symbol (name
, i
- SEG_E0
+ 1);
2731 /* Take all the externals out and put them into another chain */
2732 H_SET_SYMBOL_TABLE_SIZE (h
, yank_symbols ());
2733 /* Take the externals and glue them onto the end.*/
2734 H_SET_SYMBOL_TABLE_SIZE (h
, H_GET_SYMBOL_COUNT (h
) + glue_symbols ());
2736 H_SET_SYMBOL_TABLE_SIZE (h
, tie_tags ());
2737 know (symbol_externP
== NULL
);
2738 know (symbol_extern_lastP
== NULL
);
2742 * Find strings by crawling along symbol table chain.
2751 /* Gotta do md_ byte-ordering stuff for string_byte_count first - KWK */
2752 md_number_to_chars (where
, (valueT
) string_byte_count
, 4);
2754 for (symbolP
= symbol_rootP
;
2756 symbolP
= symbol_next (symbolP
))
2760 if (SF_GET_STRING (symbolP
))
2762 size
= strlen (S_GET_NAME (symbolP
)) + 1;
2764 memcpy (where
, S_GET_NAME (symbolP
), size
);
2772 do_linenos_for (abfd
, h
, file_cursor
)
2775 unsigned long *file_cursor
;
2778 unsigned long start
= *file_cursor
;
2780 for (idx
= SEG_E0
; idx
< SEG_E9
; idx
++)
2782 segment_info_type
*s
= segment_info
+ idx
;
2785 if (s
->scnhdr
.s_nlnno
!= 0)
2787 struct lineno_list
*line_ptr
;
2789 struct external_lineno
*buffer
=
2790 (struct external_lineno
*) xmalloc (s
->scnhdr
.s_nlnno
* LINESZ
);
2792 struct external_lineno
*dst
= buffer
;
2794 /* Run through the table we've built and turn it into its external
2795 form, take this chance to remove duplicates */
2797 for (line_ptr
= s
->lineno_list_head
;
2798 line_ptr
!= (struct lineno_list
*) NULL
;
2799 line_ptr
= line_ptr
->next
)
2802 if (line_ptr
->line
.l_lnno
== 0)
2804 /* Turn a pointer to a symbol into the symbols' index */
2805 line_ptr
->line
.l_addr
.l_symndx
=
2806 ((symbolS
*) line_ptr
->line
.l_addr
.l_symndx
)->sy_number
;
2810 line_ptr
->line
.l_addr
.l_paddr
+= ((struct frag
*) (line_ptr
->frag
))->fr_address
;
2814 (void) bfd_coff_swap_lineno_out (abfd
, &(line_ptr
->line
), dst
);
2819 s
->scnhdr
.s_lnnoptr
= *file_cursor
;
2821 bfd_write (buffer
, 1, s
->scnhdr
.s_nlnno
* LINESZ
, abfd
);
2824 *file_cursor
+= s
->scnhdr
.s_nlnno
* LINESZ
;
2827 H_SET_LINENO_SIZE (h
, *file_cursor
- start
);
2831 /* Now we run through the list of frag chains in a segment and
2832 make all the subsegment frags appear at the end of the
2833 list, as if the seg 0 was extra long */
2840 for (i
= SEG_E0
; i
< SEG_UNKNOWN
; i
++)
2842 frchainS
*head
= segment_info
[i
].frchainP
;
2844 fragS
*prev_frag
= &dummy
;
2846 while (head
&& head
->frch_seg
== i
)
2848 prev_frag
->fr_next
= head
->frch_root
;
2849 prev_frag
= head
->frch_last
;
2850 head
= head
->frch_next
;
2852 prev_frag
->fr_next
= 0;
2856 unsigned long machine
;
2859 write_object_file ()
2863 struct frchain
*frchain_ptr
;
2865 object_headers headers
;
2866 unsigned long file_cursor
;
2869 abfd
= bfd_openw (out_file_name
, TARGET_FORMAT
);
2874 as_perror ("FATAL: Can't create %s", out_file_name
);
2875 exit (EXIT_FAILURE
);
2877 bfd_set_format (abfd
, bfd_object
);
2878 bfd_set_arch_mach (abfd
, BFD_ARCH
, machine
);
2880 string_byte_count
= 4;
2882 for (frchain_ptr
= frchain_root
;
2883 frchain_ptr
!= (struct frchain
*) NULL
;
2884 frchain_ptr
= frchain_ptr
->frch_next
)
2886 /* Run through all the sub-segments and align them up. Also
2887 close any open frags. We tack a .fill onto the end of the
2888 frag chain so that any .align's size can be worked by looking
2889 at the next frag. */
2891 subseg_set (frchain_ptr
->frch_seg
, frchain_ptr
->frch_subseg
);
2892 #ifndef SUB_SEGMENT_ALIGN
2893 #define SUB_SEGMENT_ALIGN(SEG) 1
2895 frag_align (SUB_SEGMENT_ALIGN (now_seg
), NOP_OPCODE
);
2896 frag_wane (frag_now
);
2897 frag_now
->fr_fix
= 0;
2898 know (frag_now
->fr_next
== NULL
);
2905 for (i
= SEG_E0
; i
< SEG_UNKNOWN
; i
++)
2907 relax_segment (segment_info
[i
].frchainP
->frch_root
, i
);
2910 H_SET_NUMBER_OF_SECTIONS (&headers
, 0);
2912 /* Find out how big the sections are, and set the addresses. */
2914 for (i
= SEG_E0
; i
< SEG_UNKNOWN
; i
++)
2918 segment_info
[i
].scnhdr
.s_paddr
= addr
;
2919 segment_info
[i
].scnhdr
.s_vaddr
= addr
;
2921 if (segment_info
[i
].scnhdr
.s_name
[0])
2923 H_SET_NUMBER_OF_SECTIONS (&headers
,
2924 H_GET_NUMBER_OF_SECTIONS (&headers
) + 1);
2927 size
= size_section (abfd
, (unsigned int) i
);
2930 /* I think the section alignment is only used on the i960; the
2931 i960 needs it, and it should do no harm on other targets. */
2932 segment_info
[i
].scnhdr
.s_align
= section_alignment
[i
];
2935 H_SET_TEXT_SIZE (&headers
, size
);
2936 else if (i
== SEG_E1
)
2937 H_SET_DATA_SIZE (&headers
, size
);
2938 else if (i
== SEG_E2
)
2939 H_SET_BSS_SIZE (&headers
, size
);
2942 /* Turn the gas native symbol table shape into a coff symbol table */
2943 crawl_symbols (&headers
, abfd
);
2945 if (string_byte_count
== 4)
2946 string_byte_count
= 0;
2948 H_SET_STRING_SIZE (&headers
, string_byte_count
);
2950 /* @@ Try this unconditionally for now. Let me know if you encounter
2951 cases that don't work. -- Ken */
2952 #if 1 /* !defined(TC_H8300) && !defined(TC_Z8K) */
2953 for (i
= SEG_E0
; i
< SEG_UNKNOWN
; i
++)
2955 fixup_mdeps (segment_info
[i
].frchainP
->frch_root
, &headers
, i
);
2956 fixup_segment (&segment_info
[i
], i
);
2960 /* Look for ".stab" segments and fill in their initial symbols
2962 for (i
= SEG_E0
; i
< SEG_UNKNOWN
; i
++)
2964 name
= segment_info
[i
].scnhdr
.s_name
;
2967 && strncmp (".stab", name
, 5) == 0
2968 && strncmp (".stabstr", name
, 8) != 0)
2969 adjust_stab_section (abfd
, i
);
2972 file_cursor
= H_GET_TEXT_FILE_OFFSET (&headers
);
2974 bfd_seek (abfd
, (file_ptr
) file_cursor
, 0);
2976 /* Plant the data */
2978 fill_section (abfd
, &headers
, &file_cursor
);
2980 do_relocs_for (abfd
, &headers
, &file_cursor
);
2982 do_linenos_for (abfd
, &headers
, &file_cursor
);
2984 H_SET_FILE_MAGIC_NUMBER (&headers
, COFF_MAGIC
);
2985 #ifndef OBJ_COFF_OMIT_TIMESTAMP
2986 H_SET_TIME_STAMP (&headers
, (long)time((long*)0));
2988 H_SET_TIME_STAMP (&headers
, 0);
2990 #ifdef TC_COFF_SET_MACHINE
2991 TC_COFF_SET_MACHINE (&headers
);
2994 #ifdef KEEP_RELOC_INFO
2995 H_SET_FLAGS (&headers
, ((H_GET_LINENO_SIZE(&headers
) ? 0 : F_LNNO
) |
2996 COFF_FLAGS
| coff_flags
));
2998 H_SET_FLAGS (&headers
, ((H_GET_LINENO_SIZE(&headers
) ? 0 : F_LNNO
) |
2999 (H_GET_RELOCATION_SIZE(&headers
) ? 0 : F_RELFLG
) |
3000 COFF_FLAGS
| coff_flags
));
3004 unsigned int symtable_size
= H_GET_SYMBOL_TABLE_SIZE (&headers
);
3005 char *buffer1
= xmalloc (symtable_size
+ string_byte_count
+ 1);
3007 H_SET_SYMBOL_TABLE_POINTER (&headers
, bfd_tell (abfd
));
3008 w_symbols (abfd
, buffer1
, symbol_rootP
);
3009 if (string_byte_count
> 0)
3010 w_strings (buffer1
+ symtable_size
);
3011 bfd_write (buffer1
, 1, symtable_size
+ string_byte_count
, abfd
);
3015 coff_header_append (abfd
, &headers
);
3017 /* Recent changes to write need this, but where it should
3018 go is up to Ken.. */
3019 if (bfd_close_all_done (abfd
) == false)
3020 as_fatal ("Can't close %s: %s", out_file_name
,
3021 bfd_errmsg (bfd_get_error ()));
3024 extern bfd
*stdoutput
;
3031 /* Add a new segment. This is called from subseg_new via the
3032 obj_new_segment macro. */
3035 obj_coff_add_segment (name
)
3041 /* Find out if we've already got a section of this name. */
3042 len
= strlen (name
);
3043 if (len
< sizeof (segment_info
[i
].scnhdr
.s_name
))
3046 len
= sizeof (segment_info
[i
].scnhdr
.s_name
);
3047 for (i
= SEG_E0
; i
< SEG_E9
&& segment_info
[i
].scnhdr
.s_name
[0]; i
++)
3048 if (strncmp (segment_info
[i
].scnhdr
.s_name
, name
, len
) == 0
3049 && (len
== sizeof (segment_info
[i
].scnhdr
.s_name
)
3050 || segment_info
[i
].scnhdr
.s_name
[len
] == '\0'))
3055 as_bad ("Too many new sections; can't add \"%s\"", name
);
3059 /* Add a new section. */
3060 strncpy (segment_info
[i
].scnhdr
.s_name
, name
,
3061 sizeof (segment_info
[i
].scnhdr
.s_name
));
3062 segment_info
[i
].scnhdr
.s_flags
= STYP_REG
;
3068 * implement the .section pseudo op:
3069 * .section name {, "flags"}
3071 * | +--- optional flags: 'b' for bss
3073 * +-- section name 'l' for lib
3077 * 'd' (apparently m88k for data)
3079 * But if the argument is not a quoted string, treat it as a
3080 * subsegment number.
3084 obj_coff_section (ignore
)
3087 /* Strip out the section name */
3089 char *section_name_end
;
3096 section_name
= input_line_pointer
;
3097 c
= get_symbol_end ();
3098 section_name_end
= input_line_pointer
;
3100 len
= section_name_end
- section_name
;
3101 input_line_pointer
++;
3107 else if (*input_line_pointer
== ',')
3110 ++input_line_pointer
;
3118 if (*input_line_pointer
!= '"')
3119 exp
= get_absolute_expression ();
3122 ++input_line_pointer
;
3123 while (*input_line_pointer
!= '"'
3124 && ! is_end_of_line
[(unsigned char) *input_line_pointer
])
3126 switch (*input_line_pointer
)
3128 case 'b': flags
|= STYP_BSS
; break;
3129 case 'i': flags
|= STYP_INFO
; break;
3130 case 'l': flags
|= STYP_LIB
; break;
3131 case 'n': flags
|= STYP_NOLOAD
; break;
3132 case 'o': flags
|= STYP_OVER
; break;
3134 case 'w': flags
|= STYP_DATA
; break;
3135 case 'x': flags
|= STYP_TEXT
; break;
3137 as_warn("unknown section attribute '%c'",
3138 *input_line_pointer
);
3141 ++input_line_pointer
;
3143 if (*input_line_pointer
== '"')
3144 ++input_line_pointer
;
3148 subseg_new (section_name
, (subsegT
) exp
);
3150 segment_info
[now_seg
].scnhdr
.s_flags
|= flags
;
3152 *section_name_end
= c
;
3157 obj_coff_text (ignore
)
3160 subseg_new (".text", get_absolute_expression ());
3165 obj_coff_data (ignore
)
3168 if (flag_readonly_data_in_text
)
3169 subseg_new (".text", get_absolute_expression () + 1000);
3171 subseg_new (".data", get_absolute_expression ());
3175 obj_coff_bss (ignore
)
3178 if (*input_line_pointer
== '\n') /* .bss */
3179 subseg_new(".bss", get_absolute_expression());
3180 else /* .bss id,expr */
3185 obj_coff_ident (ignore
)
3188 segT current_seg
= now_seg
; /* save current seg */
3189 subsegT current_subseg
= now_subseg
;
3190 subseg_new (".comment", 0); /* .comment seg */
3191 stringer (1); /* read string */
3192 subseg_set (current_seg
, current_subseg
); /* restore current seg */
3196 c_symbol_merge (debug
, normal
)
3200 S_SET_DATA_TYPE (normal
, S_GET_DATA_TYPE (debug
));
3201 S_SET_STORAGE_CLASS (normal
, S_GET_STORAGE_CLASS (debug
));
3203 if (S_GET_NUMBER_AUXILIARY (debug
) > S_GET_NUMBER_AUXILIARY (normal
))
3205 S_SET_NUMBER_AUXILIARY (normal
, S_GET_NUMBER_AUXILIARY (debug
));
3206 } /* take the most we have */
3208 if (S_GET_NUMBER_AUXILIARY (debug
) > 0)
3210 memcpy ((char *) &normal
->sy_symbol
.ost_auxent
[0],
3211 (char *) &debug
->sy_symbol
.ost_auxent
[0],
3212 (unsigned int) (S_GET_NUMBER_AUXILIARY (debug
) * AUXESZ
));
3213 } /* Move all the auxiliary information */
3215 /* Move the debug flags. */
3216 SF_SET_DEBUG_FIELD (normal
, SF_GET_DEBUG_FIELD (debug
));
3217 } /* c_symbol_merge() */
3220 c_line_new (symbol
, paddr
, line_number
, frag
)
3226 struct lineno_list
*new_line
=
3227 (struct lineno_list
*) xmalloc (sizeof (struct lineno_list
));
3229 segment_info_type
*s
= segment_info
+ now_seg
;
3230 new_line
->line
.l_lnno
= line_number
;
3232 if (line_number
== 0)
3234 last_line_symbol
= symbol
;
3235 new_line
->line
.l_addr
.l_symndx
= (long) symbol
;
3239 new_line
->line
.l_addr
.l_paddr
= paddr
;
3242 new_line
->frag
= (char *) frag
;
3243 new_line
->next
= (struct lineno_list
*) NULL
;
3246 if (s
->lineno_list_head
== (struct lineno_list
*) NULL
)
3248 s
->lineno_list_head
= new_line
;
3252 s
->lineno_list_tail
->next
= new_line
;
3254 s
->lineno_list_tail
= new_line
;
3255 return LINESZ
* s
->scnhdr
.s_nlnno
++;
3259 c_dot_file_symbol (filename
)
3264 symbolP
= symbol_new (".file",
3267 &zero_address_frag
);
3269 S_SET_STORAGE_CLASS (symbolP
, C_FILE
);
3270 S_SET_NUMBER_AUXILIARY (symbolP
, 1);
3271 SA_SET_FILE_FNAME (symbolP
, filename
);
3277 listing_source_file (filename
);
3283 SF_SET_DEBUG (symbolP
);
3284 S_SET_VALUE (symbolP
, (valueT
) previous_file_symbol
);
3286 previous_file_symbol
= symbolP
;
3288 /* Make sure that the symbol is first on the symbol chain */
3289 if (symbol_rootP
!= symbolP
)
3291 if (symbolP
== symbol_lastP
)
3293 symbol_lastP
= symbol_lastP
->sy_previous
;
3294 } /* if it was the last thing on the list */
3296 symbol_remove (symbolP
, &symbol_rootP
, &symbol_lastP
);
3297 symbol_insert (symbolP
, symbol_rootP
, &symbol_rootP
, &symbol_lastP
);
3298 symbol_rootP
= symbolP
;
3299 } /* if not first on the list */
3301 } /* c_dot_file_symbol() */
3304 * Build a 'section static' symbol.
3308 c_section_symbol (name
, idx
)
3314 symbolP
= symbol_new (name
, idx
,
3316 &zero_address_frag
);
3318 S_SET_STORAGE_CLASS (symbolP
, C_STAT
);
3319 S_SET_NUMBER_AUXILIARY (symbolP
, 1);
3321 SF_SET_STATICS (symbolP
);
3324 } /* c_section_symbol() */
3327 w_symbols (abfd
, where
, symbol_rootP
)
3330 symbolS
* symbol_rootP
;
3335 /* First fill in those values we have only just worked out */
3336 for (i
= SEG_E0
; i
< SEG_E9
; i
++)
3338 symbolP
= segment_info
[i
].dot
;
3341 SA_SET_SCN_SCNLEN (symbolP
, segment_info
[i
].scnhdr
.s_size
);
3342 SA_SET_SCN_NRELOC (symbolP
, segment_info
[i
].scnhdr
.s_nreloc
);
3343 SA_SET_SCN_NLINNO (symbolP
, segment_info
[i
].scnhdr
.s_nlnno
);
3348 * Emit all symbols left in the symbol chain.
3350 for (symbolP
= symbol_rootP
; symbolP
; symbolP
= symbol_next (symbolP
))
3352 /* Used to save the offset of the name. It is used to point
3353 to the string in memory but must be a file offset. */
3354 register char *temp
;
3356 tc_coff_symbol_emit_hook (symbolP
);
3358 temp
= S_GET_NAME (symbolP
);
3359 if (SF_GET_STRING (symbolP
))
3361 S_SET_OFFSET (symbolP
, symbolP
->sy_name_offset
);
3362 S_SET_ZEROES (symbolP
, 0);
3366 memset (symbolP
->sy_symbol
.ost_entry
.n_name
, 0, SYMNMLEN
);
3367 strncpy (symbolP
->sy_symbol
.ost_entry
.n_name
, temp
, SYMNMLEN
);
3369 where
= symbol_to_chars (abfd
, where
, symbolP
);
3370 S_SET_NAME (symbolP
, temp
);
3376 obj_coff_lcomm (ignore
)
3389 name
= input_line_pointer
;
3391 c
= get_symbol_end ();
3392 p
= input_line_pointer
;
3395 if (*input_line_pointer
!= ',')
3397 as_bad ("Expected comma after name");
3398 ignore_rest_of_line ();
3401 if (*input_line_pointer
== '\n')
3403 as_bad ("Missing size expression");
3406 input_line_pointer
++;
3407 if ((temp
= get_absolute_expression ()) < 0)
3409 as_warn ("lcomm length (%d.) <0! Ignored.", temp
);
3410 ignore_rest_of_line ();
3415 symbolP
= symbol_find_or_make(name
);
3417 if (S_GET_SEGMENT(symbolP
) == SEG_UNKNOWN
&&
3418 S_GET_VALUE(symbolP
) == 0)
3423 segT current_seg
= now_seg
; /* save current seg */
3424 subsegT current_subseg
= now_subseg
;
3426 subseg_set (SEG_E2
, 1);
3427 symbolP
->sy_frag
= frag_now
;
3428 p
= frag_var(rs_org
, 1, 1, (relax_substateT
)0, symbolP
,
3431 subseg_set (current_seg
, current_subseg
); /* restore current seg */
3432 S_SET_SEGMENT(symbolP
, SEG_E2
);
3433 S_SET_STORAGE_CLASS(symbolP
, C_STAT
);
3437 as_bad("Symbol %s already defined", name
);
3439 demand_empty_rest_of_line();
3444 fixup_mdeps (frags
, h
, this_segment
)
3449 subseg_change (this_segment
, 0);
3452 switch (frags
->fr_type
)
3456 frags
->fr_type
= rs_fill
;
3458 (frags
->fr_next
->fr_address
- frags
->fr_address
- frags
->fr_fix
);
3460 case rs_machine_dependent
:
3461 md_convert_frag (h
, frags
);
3467 frags
= frags
->fr_next
;
3473 fixup_segment (segP
, this_segment_type
)
3474 segment_info_type
* segP
;
3475 segT this_segment_type
;
3477 register fixS
* fixP
;
3478 register symbolS
*add_symbolP
;
3479 register symbolS
*sub_symbolP
;
3480 register long add_number
;
3482 register char *place
;
3483 register long where
;
3484 register char pcrel
;
3485 register fragS
*fragP
;
3486 register segT add_symbol_segment
= absolute_section
;
3489 for (fixP
= segP
->fix_root
; fixP
; fixP
= fixP
->fx_next
)
3491 fragP
= fixP
->fx_frag
;
3493 where
= fixP
->fx_where
;
3494 place
= fragP
->fr_literal
+ where
;
3495 size
= fixP
->fx_size
;
3496 add_symbolP
= fixP
->fx_addsy
;
3498 if (fixP
->fx_tcbit
&& SF_GET_CALLNAME (add_symbolP
))
3500 /* Relocation should be done via the associated 'bal' entry
3503 if (!SF_GET_BALNAME (tc_get_bal_of_call (add_symbolP
)))
3505 as_bad_where (fixP
->fx_file
, fixP
->fx_line
,
3506 "No 'bal' entry point for leafproc %s",
3507 S_GET_NAME (add_symbolP
));
3510 fixP
->fx_addsy
= add_symbolP
= tc_get_bal_of_call (add_symbolP
);
3513 sub_symbolP
= fixP
->fx_subsy
;
3514 add_number
= fixP
->fx_offset
;
3515 pcrel
= fixP
->fx_pcrel
;
3519 add_symbol_segment
= S_GET_SEGMENT (add_symbolP
);
3520 } /* if there is an addend */
3527 if (S_GET_SEGMENT (sub_symbolP
) != absolute_section
)
3529 as_bad_where (fixP
->fx_file
, fixP
->fx_line
,
3530 "Negative of non-absolute symbol %s",
3531 S_GET_NAME (sub_symbolP
));
3532 } /* not absolute */
3534 add_number
-= S_GET_VALUE (sub_symbolP
);
3537 /* if sub_symbol is in the same segment that add_symbol
3538 and add_symbol is either in DATA, TEXT, BSS or ABSOLUTE */
3540 else if ((S_GET_SEGMENT (sub_symbolP
) == add_symbol_segment
)
3541 && (SEG_NORMAL (add_symbol_segment
)
3542 || (add_symbol_segment
== absolute_section
)))
3544 /* Difference of 2 symbols from same segment. Can't
3545 make difference of 2 undefineds: 'value' means
3546 something different for N_UNDF. */
3548 /* Makes no sense to use the difference of 2 arbitrary symbols
3549 as the target of a call instruction. */
3552 as_bad_where (fixP
->fx_file
, fixP
->fx_line
,
3553 "callj to difference of 2 symbols");
3555 #endif /* TC_I960 */
3556 add_number
+= S_GET_VALUE (add_symbolP
) -
3557 S_GET_VALUE (sub_symbolP
);
3560 fixP
->fx_addsy
= NULL
;
3561 fixP
->fx_subsy
= NULL
;
3566 /* Different segments in subtraction. */
3567 know (!(S_IS_EXTERNAL (sub_symbolP
) && (S_GET_SEGMENT (sub_symbolP
) == absolute_section
)));
3569 if ((S_GET_SEGMENT (sub_symbolP
) == absolute_section
))
3571 add_number
-= S_GET_VALUE (sub_symbolP
);
3574 else if (S_GET_SEGMENT (sub_symbolP
) == this_segment_type
3575 #if 0 /* Okay for 68k, at least... */
3580 /* Make it pc-relative. */
3581 add_number
+= (md_pcrel_from (fixP
)
3582 - S_GET_VALUE (sub_symbolP
));
3591 as_bad_where (fixP
->fx_file
, fixP
->fx_line
,
3592 "Can't emit reloc {- %s-seg symbol \"%s\"} @ file address %ld.",
3593 segment_name (S_GET_SEGMENT (sub_symbolP
)),
3594 S_GET_NAME (sub_symbolP
),
3595 (long) (fragP
->fr_address
+ where
));
3598 } /* if sub_symbolP */
3602 if (add_symbol_segment
== this_segment_type
&& pcrel
)
3605 * This fixup was made when the symbol's segment was
3606 * SEG_UNKNOWN, but it is now in the local segment.
3607 * So we know how to do the address without relocation.
3610 /* reloc_callj() may replace a 'call' with a 'calls' or a 'bal',
3611 * in which cases it modifies *fixP as appropriate. In the case
3612 * of a 'calls', no further work is required, and *fixP has been
3613 * set up to make the rest of the code below a no-op.
3616 #endif /* TC_I960 */
3618 add_number
+= S_GET_VALUE (add_symbolP
);
3619 add_number
-= md_pcrel_from (fixP
);
3620 #if defined (TC_I386) || defined (TE_LYNX)
3621 /* On the 386 we must adjust by the segment
3622 vaddr as well. Ian Taylor. */
3623 add_number
-= segP
->scnhdr
.s_vaddr
;
3625 pcrel
= 0; /* Lie. Don't want further pcrel processing. */
3626 fixP
->fx_addsy
= NULL
;
3631 switch (add_symbol_segment
)
3633 case absolute_section
:
3635 reloc_callj (fixP
); /* See comment about reloc_callj() above*/
3636 #endif /* TC_I960 */
3637 add_number
+= S_GET_VALUE (add_symbolP
);
3638 fixP
->fx_addsy
= NULL
;
3645 /* This really should be handled in the linker, but
3646 backward compatibility forbids. */
3647 add_number
+= S_GET_VALUE (add_symbolP
);
3649 add_number
+= S_GET_VALUE (add_symbolP
) +
3650 segment_info
[S_GET_SEGMENT (add_symbolP
)].scnhdr
.s_paddr
;
3656 if ((int) fixP
->fx_bit_fixP
== 13)
3658 /* This is a COBR instruction. They have only a
3659 * 13-bit displacement and are only to be used
3660 * for local branches: flag as error, don't generate
3663 as_bad_where (fixP
->fx_file
, fixP
->fx_line
,
3664 "can't use COBR format with external label");
3665 fixP
->fx_addsy
= NULL
;
3669 #endif /* TC_I960 */
3670 #if defined (TC_I386) || defined (TE_LYNX)
3671 /* 386 COFF uses a peculiar format in
3672 which the value of a common symbol is
3673 stored in the .text segment (I've
3674 checked this on SVR3.2 and SCO 3.2.2)
3675 Ian Taylor <ian@cygnus.com>. */
3676 if (S_IS_COMMON (add_symbolP
))
3677 add_number
+= S_GET_VALUE (add_symbolP
);
3682 } /* switch on symbol seg */
3683 } /* if not in local seg */
3684 } /* if there was a + symbol */
3689 /* This adjustment is not correct on the m88k, for which the
3690 linker does all the computation. */
3691 add_number
-= md_pcrel_from (fixP
);
3693 if (add_symbolP
== 0)
3695 fixP
->fx_addsy
= &abs_symbol
;
3696 } /* if there's an add_symbol */
3697 #if defined (TC_I386) || defined (TE_LYNX)
3698 /* On the 386 we must adjust by the segment vaddr
3699 as well. Ian Taylor. */
3700 add_number
-= segP
->scnhdr
.s_vaddr
;
3704 if (!fixP
->fx_bit_fixP
)
3707 /* The m88k uses the offset field of the reloc to get around
3710 && (add_number
& ~0xFF)
3711 && ((add_number
& ~0xFF) != (-1 & ~0xFF)))
3713 && (add_number
& ~0xFFFF)
3714 && ((add_number
& ~0xFFFF) != (-1 & ~0xFFFF))))
3716 as_bad_where (fixP
->fx_file
, fixP
->fx_line
,
3717 "Value of %ld too large for field of %d bytes at 0x%lx",
3718 (long) add_number
, size
,
3719 (unsigned long) (fragP
->fr_address
+ where
));
3722 #ifdef WARN_SIGNED_OVERFLOW_WORD
3723 /* Warn if a .word value is too large when treated as
3724 a signed number. We already know it is not too
3725 negative. This is to catch over-large switches
3726 generated by gcc on the 68k. */
3727 if (!flag_signed_overflow_ok
3729 && add_number
> 0x7fff)
3730 as_bad_where (fixP
->fx_file
, fixP
->fx_line
,
3731 "Signed .word overflow; switch may be too large; %ld at 0x%lx",
3733 (unsigned long) (fragP
->fr_address
+ where
));
3735 } /* not a bit fix */
3736 /* once this fix has been applied, we don't have to output anything
3737 nothing more need be done -*/
3738 md_apply_fix (fixP
, add_number
);
3739 } /* For each fixS in this segment. */
3740 } /* fixup_segment() */
3744 /* The first entry in a .stab section is special. */
3747 obj_coff_init_stab_section (seg
)
3753 unsigned int stroff
;
3755 /* Make space for this first symbol. */
3759 as_where (&file
, (unsigned int *) NULL
);
3760 stabstr_name
= (char *) alloca (strlen (segment_info
[seg
].scnhdr
.s_name
) + 4);
3761 strcpy (stabstr_name
, segment_info
[seg
].scnhdr
.s_name
);
3762 strcat (stabstr_name
, "str");
3763 stroff
= get_stab_string_offset (file
, stabstr_name
);
3765 md_number_to_chars (p
, stroff
, 4);
3768 /* Fill in the counts in the first entry in a .stab section. */
3771 adjust_stab_section(abfd
, seg
)
3775 segT stabstrseg
= SEG_UNKNOWN
;
3776 char *secname
, *name
, *name2
;
3778 int i
, strsz
= 0, nsyms
;
3779 fragS
*frag
= segment_info
[seg
].frchainP
->frch_root
;
3781 /* Look for the associated string table section. */
3783 secname
= segment_info
[seg
].scnhdr
.s_name
;
3784 name
= (char *) alloca (strlen (secname
) + 4);
3785 strcpy (name
, secname
);
3786 strcat (name
, "str");
3788 for (i
= SEG_E0
; i
< SEG_UNKNOWN
; i
++)
3790 name2
= segment_info
[i
].scnhdr
.s_name
;
3791 if (name2
!= NULL
&& strncmp(name2
, name
, 8) == 0)
3798 /* If we found the section, get its size. */
3799 if (stabstrseg
!= SEG_UNKNOWN
)
3800 strsz
= size_section (abfd
, stabstrseg
);
3802 nsyms
= size_section (abfd
, seg
) / 12 - 1;
3804 /* Look for the first frag of sufficient size for the initial stab
3805 symbol, and collect a pointer to it. */
3806 while (frag
&& frag
->fr_fix
< 12)
3807 frag
= frag
->fr_next
;
3809 p
= frag
->fr_literal
;
3812 /* Write in the number of stab symbols and the size of the string
3814 bfd_h_put_16 (abfd
, (bfd_vma
) nsyms
, (bfd_byte
*) p
+ 6);
3815 bfd_h_put_32 (abfd
, (bfd_vma
) strsz
, (bfd_byte
*) p
+ 8);
3818 #endif /* not BFD_ASSEMBLER */
3820 const pseudo_typeS obj_pseudo_table
[] =
3822 {"def", obj_coff_def
, 0},
3823 {"dim", obj_coff_dim
, 0},
3824 {"endef", obj_coff_endef
, 0},
3825 {"line", obj_coff_line
, 0},
3826 {"ln", obj_coff_ln
, 0},
3827 {"appline", obj_coff_ln
, 1},
3828 {"scl", obj_coff_scl
, 0},
3829 {"size", obj_coff_size
, 0},
3830 {"tag", obj_coff_tag
, 0},
3831 {"type", obj_coff_type
, 0},
3832 {"val", obj_coff_val
, 0},
3833 {"section", obj_coff_section
, 0},
3834 #ifndef BFD_ASSEMBLER
3835 {"use", obj_coff_section
, 0},
3836 {"sect", obj_coff_section
, 0},
3837 {"text", obj_coff_text
, 0},
3838 {"data", obj_coff_data
, 0},
3839 {"bss", obj_coff_bss
, 0},
3840 {"lcomm", obj_coff_lcomm
, 0},
3841 {"ident", obj_coff_ident
, 0},
3843 {"optim", s_ignore
, 0}, /* For sun386i cc (?) */
3844 {"ident", s_ignore
, 0}, /* we don't yet handle this. */
3846 {"ABORT", s_abort
, 0},
3848 /* The m88k uses sdef instead of def. */
3849 {"sdef", obj_coff_def
, 0},
3851 {NULL
} /* end sentinel */
3852 }; /* obj_pseudo_table */