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 const char *s_get_name
PARAMS ((symbolS
* s
));
26 static symbolS
*def_symbol_in_progress
;
32 unsigned long chunk_size
;
33 unsigned long element_size
;
36 unsigned long pointer
;
41 stack_init (chunk_size
, element_size
)
42 unsigned long chunk_size
;
43 unsigned long element_size
;
47 st
= (stack
*) malloc (sizeof (stack
));
50 st
->data
= malloc (chunk_size
);
57 st
->size
= chunk_size
;
58 st
->chunk_size
= chunk_size
;
59 st
->element_size
= element_size
;
64 /* Not currently used. */
75 stack_push (st
, element
)
79 if (st
->pointer
+ st
->element_size
>= st
->size
)
81 st
->size
+= st
->chunk_size
;
82 if ((st
->data
= xrealloc (st
->data
, st
->size
)) == (char *) 0)
85 memcpy (st
->data
+ st
->pointer
, element
, st
->element_size
);
86 st
->pointer
+= st
->element_size
;
87 return st
->data
+ st
->pointer
;
94 if (st
->pointer
< st
->element_size
)
99 st
->pointer
-= st
->element_size
;
100 return st
->data
+ st
->pointer
;
104 * Maintain a list of the tagnames of the structres.
107 static struct hash_control
*tag_hash
;
112 tag_hash
= hash_new ();
116 tag_insert (name
, symbolP
)
120 const char *error_string
;
122 if ((error_string
= hash_jam (tag_hash
, name
, (char *) symbolP
)))
124 as_fatal ("Inserting \"%s\" into structure table failed: %s",
133 #ifdef STRIP_UNDERSCORE
136 #endif /* STRIP_UNDERSCORE */
137 return (symbolS
*) hash_find (tag_hash
, name
);
141 tag_find_or_make (name
)
146 if ((symbolP
= tag_find (name
)) == NULL
)
148 symbolP
= symbol_new (name
, undefined_section
,
149 0, &zero_address_frag
);
151 tag_insert (S_GET_NAME (symbolP
), symbolP
);
153 symbol_table_insert (symbolP
);
164 static void SA_SET_SYM_TAGNDX
PARAMS ((symbolS
*, symbolS
*));
166 #define GET_FILENAME_STRING(X) \
167 ((char*)(&((X)->sy_symbol.ost_auxent->x_file.x_n.x_offset))[1])
171 fetch_coff_debug_section ()
173 static segT debug_section
;
177 s
= bfd_make_debug_symbol (stdoutput
, (char *) 0, 0);
179 debug_section
= s
->section
;
181 return debug_section
;
185 SA_SET_SYM_ENDNDX (sym
, val
)
189 combined_entry_type
*entry
, *p
;
191 entry
= &coffsymbol (sym
->bsym
)->native
[1];
192 p
= coffsymbol (val
->bsym
)->native
;
193 entry
->u
.auxent
.x_sym
.x_fcnary
.x_fcn
.x_endndx
.p
= p
;
198 SA_SET_SYM_TAGNDX (sym
, val
)
202 combined_entry_type
*entry
, *p
;
204 entry
= &coffsymbol (sym
->bsym
)->native
[1];
205 p
= coffsymbol (val
->bsym
)->native
;
206 entry
->u
.auxent
.x_sym
.x_tagndx
.p
= p
;
211 S_GET_DATA_TYPE (sym
)
214 return coffsymbol (sym
->bsym
)->native
->u
.syment
.n_type
;
218 S_SET_DATA_TYPE (sym
, val
)
222 coffsymbol (sym
->bsym
)->native
->u
.syment
.n_type
= val
;
227 S_GET_STORAGE_CLASS (sym
)
230 return coffsymbol (sym
->bsym
)->native
->u
.syment
.n_sclass
;
234 S_SET_STORAGE_CLASS (sym
, val
)
238 coffsymbol (sym
->bsym
)->native
->u
.syment
.n_sclass
= val
;
242 /* Merge a debug symbol containing debug information into a normal symbol. */
245 c_symbol_merge (debug
, normal
)
249 S_SET_DATA_TYPE (normal
, S_GET_DATA_TYPE (debug
));
250 S_SET_STORAGE_CLASS (normal
, S_GET_STORAGE_CLASS (debug
));
252 if (S_GET_NUMBER_AUXILIARY (debug
) > S_GET_NUMBER_AUXILIARY (normal
))
253 /* take the most we have */
254 S_SET_NUMBER_AUXILIARY (normal
, S_GET_NUMBER_AUXILIARY (debug
));
256 if (S_GET_NUMBER_AUXILIARY (debug
) > 0)
258 /* Move all the auxiliary information. */
259 /* @@ How many fields do we want to preserve? Would it make more
260 sense to pick and choose those we want to copy? Should look
261 into this further.... [raeburn:19920512.2209EST] */
263 linenos
= coffsymbol (normal
->bsym
)->lineno
;
264 memcpy ((char *) &coffsymbol (normal
->bsym
)->native
,
265 (char *) &coffsymbol (debug
->bsym
)->native
,
266 S_GET_NUMBER_AUXILIARY(debug
) * AUXESZ
);
267 coffsymbol (normal
->bsym
)->lineno
= linenos
;
270 /* Move the debug flags. */
271 SF_SET_DEBUG_FIELD (normal
, SF_GET_DEBUG_FIELD (debug
));
274 static symbolS
*previous_file_symbol
;
276 c_dot_file_symbol (filename
)
281 symbolP
= symbol_new (filename
, bfd_abs_section_ptr
, 0, &zero_address_frag
);
283 S_SET_STORAGE_CLASS (symbolP
, C_FILE
);
284 S_SET_NUMBER_AUXILIARY (symbolP
, 1);
286 symbolP
->bsym
->flags
= BSF_DEBUGGING
;
293 listing_source_file (filename
);
298 S_SET_VALUE (symbolP
, (long) previous_file_symbol
);
300 previous_file_symbol
= symbolP
;
302 /* Make sure that the symbol is first on the symbol chain */
303 if (symbol_rootP
!= symbolP
)
305 if (symbolP
== symbol_lastP
)
307 symbol_lastP
= symbol_lastP
->sy_previous
;
308 } /* if it was the last thing on the list */
310 symbol_remove (symbolP
, &symbol_rootP
, &symbol_lastP
);
311 symbol_insert (symbolP
, symbol_rootP
, &symbol_rootP
, &symbol_lastP
);
312 symbol_rootP
= symbolP
;
313 } /* if not first on the list */
317 * Build a 'section static' symbol.
321 c_section_symbol (name
, value
, length
, nreloc
, nlnno
)
325 unsigned short nreloc
;
326 unsigned short nlnno
;
330 symbolP
= symbol_new (name
,
339 S_SET_STORAGE_CLASS (symbolP
, C_STAT
);
340 S_SET_NUMBER_AUXILIARY (symbolP
, 1);
342 SA_SET_SCN_SCNLEN (symbolP
, length
);
343 SA_SET_SCN_NRELOC (symbolP
, nreloc
);
344 SA_SET_SCN_NLINNO (symbolP
, nlnno
);
346 SF_SET_STATICS (symbolP
);
348 return (char *) symbolP
;
351 /* Line number handling */
354 struct line_no
*next
;
361 /* Symbol of last function, which we should hang line#s off of. */
362 static symbolS
*line_fsym
;
364 #define in_function() (line_fsym != 0)
365 #define clear_function() (line_fsym = 0)
366 #define set_function(F) (line_fsym = (F), coff_add_linesym (F))
370 obj_symbol_new_hook (symbolP
)
373 char underscore
= 0; /* Symbol has leading _ */
376 long sz
= (OBJ_COFF_MAX_AUXENTRIES
+ 1) * sizeof (combined_entry_type
);
377 char *s
= (char *) bfd_alloc_by_size_t (stdoutput
, sz
);
379 coffsymbol (symbolP
->bsym
)->native
= (combined_entry_type
*) s
;
381 S_SET_DATA_TYPE (symbolP
, T_NULL
);
382 S_SET_STORAGE_CLASS (symbolP
, 0);
383 S_SET_NUMBER_AUXILIARY (symbolP
, 0);
385 if (S_IS_STRING (symbolP
))
386 SF_SET_STRING (symbolP
);
387 if (!underscore
&& S_IS_LOCAL (symbolP
))
388 SF_SET_LOCAL (symbolP
);
393 * Handle .ln directives.
396 static symbolS
*current_lineno_sym
;
397 static struct line_no
*line_nos
;
398 /* @@ Blindly assume all .ln directives will be in the .text section... */
399 static int n_line_nos
;
402 add_lineno (frag
, offset
, num
)
407 struct line_no
*new_line
= (struct line_no
*) bfd_alloc_by_size_t (stdoutput
,
408 sizeof (struct line_no
));
409 if (!current_lineno_sym
)
413 new_line
->next
= line_nos
;
414 new_line
->frag
= frag
;
415 new_line
->l
.line_number
= num
;
416 new_line
->l
.u
.offset
= offset
;
422 coff_add_linesym (sym
)
427 coffsymbol (current_lineno_sym
->bsym
)->lineno
= (alent
*) line_nos
;
431 current_lineno_sym
= sym
;
435 obj_coff_ln (appline
)
440 if (! appline
&& def_symbol_in_progress
!= NULL
)
442 as_warn (".ln pseudo-op inside .def/.endef: ignored.");
443 demand_empty_rest_of_line ();
447 l
= get_absolute_expression ();
450 add_lineno (frag_now
, frag_now_fix (), l
);
460 l
+= coff_line_base
- 1;
461 listing_source_line (l
);
466 demand_empty_rest_of_line ();
472 * Handle .def directives.
474 * One might ask : why can't we symbol_new if the symbol does not
475 * already exist and fill it with debug information. Because of
476 * the C_EFCN special symbol. It would clobber the value of the
477 * function symbol before we have a chance to notice that it is
478 * a C_EFCN. And a second reason is that the code is more clear this
479 * way. (at least I think it is :-).
483 #define SKIP_SEMI_COLON() while (*input_line_pointer++ != ';')
484 #define SKIP_WHITESPACES() while (*input_line_pointer == ' ' || \
485 *input_line_pointer == '\t') \
486 input_line_pointer++;
492 char name_end
; /* Char after the end of name */
493 char *symbol_name
; /* Name of the debug symbol */
494 char *symbol_name_copy
; /* Temporary copy of the name */
495 unsigned int symbol_name_length
;
497 if (def_symbol_in_progress
!= NULL
)
499 as_warn (".def pseudo-op used inside of .def/.endef: ignored.");
500 demand_empty_rest_of_line ();
502 } /* if not inside .def/.endef */
506 symbol_name
= input_line_pointer
;
507 #ifdef STRIP_UNDERSCORE
508 if (symbol_name
[0] == '_' && symbol_name
[1] != 0)
510 #endif /* STRIP_UNDERSCORE */
512 name_end
= get_symbol_end ();
513 symbol_name_length
= strlen (symbol_name
);
514 symbol_name_copy
= xmalloc (symbol_name_length
+ 1);
515 strcpy (symbol_name_copy
, symbol_name
);
517 /* Initialize the new symbol */
518 def_symbol_in_progress
= symbol_make (symbol_name_copy
);
519 def_symbol_in_progress
->sy_frag
= &zero_address_frag
;
520 S_SET_VALUE (def_symbol_in_progress
, 0);
522 if (S_IS_STRING (def_symbol_in_progress
))
523 SF_SET_STRING (def_symbol_in_progress
);
525 *input_line_pointer
= name_end
;
527 demand_empty_rest_of_line ();
530 unsigned int dim_index
;
533 obj_coff_endef (ignore
)
537 /* DIM BUG FIX sac@cygnus.com */
539 if (def_symbol_in_progress
== NULL
)
541 as_warn (".endef pseudo-op used outside of .def/.endef: ignored.");
542 demand_empty_rest_of_line ();
544 } /* if not inside .def/.endef */
546 /* Set the section number according to storage class. */
547 switch (S_GET_STORAGE_CLASS (def_symbol_in_progress
))
552 SF_SET_TAG (def_symbol_in_progress
);
553 /* intentional fallthrough */
556 SF_SET_DEBUG (def_symbol_in_progress
);
557 S_SET_SEGMENT (def_symbol_in_progress
, fetch_coff_debug_section ());
561 SF_SET_LOCAL (def_symbol_in_progress
); /* Do not emit this symbol. */
562 /* intentional fallthrough */
564 SF_SET_PROCESS (def_symbol_in_progress
); /* Will need processing before writing */
565 /* intentional fallthrough */
569 S_SET_SEGMENT (def_symbol_in_progress
, text_section
);
571 name
= bfd_asymbol_name (def_symbol_in_progress
->bsym
);
572 if (name
[1] == 'b' && name
[2] == 'f')
574 if (! in_function ())
575 as_warn ("`%s' symbol without preceding function", name
);
576 /* SA_SET_SYM_LNNO (def_symbol_in_progress, 12345);*/
577 /* Will need relocating */
578 SF_SET_PROCESS (def_symbol_in_progress
);
586 #endif /* C_AUTOARG */
596 SF_SET_DEBUG (def_symbol_in_progress
);
597 S_SET_SEGMENT (def_symbol_in_progress
, absolute_section
);
603 /* Valid but set somewhere else (s_comm, s_lcomm, colon) */
609 as_warn ("unexpected storage class %d",
610 S_GET_STORAGE_CLASS (def_symbol_in_progress
));
612 } /* switch on storage class */
614 /* Now that we have built a debug symbol, try to find if we should
615 merge with an existing symbol or not. If a symbol is C_EFCN or
616 SEG_ABSOLUTE or untagged SEG_DEBUG it never merges. */
618 /* Two cases for functions. Either debug followed by definition or
619 definition followed by debug. For definition first, we will
620 merge the debug symbol into the definition. For debug first, the
621 lineno entry MUST point to the definition function or else it
622 will point off into space when obj_crawl_symbol_chain() merges
623 the debug symbol into the real symbol. Therefor, let's presume
624 the debug symbol is a real function reference. */
626 /* FIXME-SOON If for some reason the definition label/symbol is
627 never seen, this will probably leave an undefined symbol at link
630 if (S_GET_STORAGE_CLASS (def_symbol_in_progress
) == C_EFCN
631 || (!strcmp (bfd_get_section_name (stdoutput
,
632 S_GET_SEGMENT (def_symbol_in_progress
)),
634 && !SF_GET_TAG (def_symbol_in_progress
))
635 || S_GET_SEGMENT (def_symbol_in_progress
) == absolute_section
636 || (symbolP
= symbol_find_base (S_GET_NAME (def_symbol_in_progress
), DO_NOT_STRIP
)) == NULL
)
638 if (def_symbol_in_progress
!= symbol_lastP
)
639 symbol_append (def_symbol_in_progress
, symbol_lastP
, &symbol_rootP
,
644 /* This symbol already exists, merge the newly created symbol
645 into the old one. This is not mandatory. The linker can
646 handle duplicate symbols correctly. But I guess that it save
647 a *lot* of space if the assembly file defines a lot of
650 /* The debug entry (def_symbol_in_progress) is merged into the
651 previous definition. */
653 c_symbol_merge (def_symbol_in_progress
, symbolP
);
654 /* FIXME-SOON Should *def_symbol_in_progress be free'd? xoxorich. */
655 def_symbol_in_progress
= symbolP
;
657 if (SF_GET_FUNCTION (def_symbol_in_progress
)
658 || SF_GET_TAG (def_symbol_in_progress
))
660 /* For functions, and tags, the symbol *must* be where the
661 debug symbol appears. Move the existing symbol to the
663 /* If it already is at the end of the symbol list, do nothing */
664 if (def_symbol_in_progress
!= symbol_lastP
)
666 symbol_remove (def_symbol_in_progress
, &symbol_rootP
, &symbol_lastP
);
667 symbol_append (def_symbol_in_progress
, symbol_lastP
, &symbol_rootP
, &symbol_lastP
);
672 if (SF_GET_TAG (def_symbol_in_progress
)
673 && symbol_find_base (S_GET_NAME (def_symbol_in_progress
), DO_NOT_STRIP
) == NULL
)
675 tag_insert (S_GET_NAME (def_symbol_in_progress
), def_symbol_in_progress
);
678 if (SF_GET_FUNCTION (def_symbol_in_progress
))
680 know (sizeof (def_symbol_in_progress
) <= sizeof (long));
681 set_function (def_symbol_in_progress
);
682 SF_SET_PROCESS (def_symbol_in_progress
);
686 /* That is, if this is the first time we've seen the
688 symbol_table_insert (def_symbol_in_progress
);
689 } /* definition follows debug */
690 } /* Create the line number entry pointing to the function being defined */
692 def_symbol_in_progress
= NULL
;
693 demand_empty_rest_of_line ();
697 obj_coff_dim (ignore
)
702 if (def_symbol_in_progress
== NULL
)
704 as_warn (".dim pseudo-op used outside of .def/.endef: ignored.");
705 demand_empty_rest_of_line ();
707 } /* if not inside .def/.endef */
709 S_SET_NUMBER_AUXILIARY (def_symbol_in_progress
, 1);
711 for (dim_index
= 0; dim_index
< DIMNUM
; dim_index
++)
714 SA_SET_SYM_DIMEN (def_symbol_in_progress
, dim_index
,
715 get_absolute_expression ());
717 switch (*input_line_pointer
)
720 input_line_pointer
++;
724 as_warn ("badly formed .dim directive ignored");
725 /* intentional fallthrough */
733 demand_empty_rest_of_line ();
737 obj_coff_line (ignore
)
742 if (def_symbol_in_progress
== NULL
)
744 /* Probably stabs-style line? */
749 this_base
= get_absolute_expression ();
750 if (!strcmp (".bf", S_GET_NAME (def_symbol_in_progress
)))
751 coff_line_base
= this_base
;
753 S_SET_NUMBER_AUXILIARY (def_symbol_in_progress
, 1);
754 SA_SET_SYM_LNNO (def_symbol_in_progress
, coff_line_base
);
756 demand_empty_rest_of_line ();
760 obj_coff_size (ignore
)
763 if (def_symbol_in_progress
== NULL
)
765 as_warn (".size pseudo-op used outside of .def/.endef ignored.");
766 demand_empty_rest_of_line ();
768 } /* if not inside .def/.endef */
770 S_SET_NUMBER_AUXILIARY (def_symbol_in_progress
, 1);
771 SA_SET_SYM_SIZE (def_symbol_in_progress
, get_absolute_expression ());
772 demand_empty_rest_of_line ();
776 obj_coff_scl (ignore
)
779 if (def_symbol_in_progress
== NULL
)
781 as_warn (".scl pseudo-op used outside of .def/.endef ignored.");
782 demand_empty_rest_of_line ();
784 } /* if not inside .def/.endef */
786 S_SET_STORAGE_CLASS (def_symbol_in_progress
, get_absolute_expression ());
787 demand_empty_rest_of_line ();
791 obj_coff_tag (ignore
)
797 if (def_symbol_in_progress
== NULL
)
799 as_warn (".tag pseudo-op used outside of .def/.endef ignored.");
800 demand_empty_rest_of_line ();
804 S_SET_NUMBER_AUXILIARY (def_symbol_in_progress
, 1);
805 symbol_name
= input_line_pointer
;
806 name_end
= get_symbol_end ();
808 /* Assume that the symbol referred to by .tag is always defined.
809 This was a bad assumption. I've added find_or_make. xoxorich. */
810 SA_SET_SYM_TAGNDX (def_symbol_in_progress
,
811 tag_find_or_make (symbol_name
));
812 if (SA_GET_SYM_TAGNDX (def_symbol_in_progress
) == 0L)
814 as_warn ("tag not found for .tag %s", symbol_name
);
817 SF_SET_TAGGED (def_symbol_in_progress
);
818 *input_line_pointer
= name_end
;
820 demand_empty_rest_of_line ();
824 obj_coff_type (ignore
)
827 if (def_symbol_in_progress
== NULL
)
829 as_warn (".type pseudo-op used outside of .def/.endef ignored.");
830 demand_empty_rest_of_line ();
832 } /* if not inside .def/.endef */
834 S_SET_DATA_TYPE (def_symbol_in_progress
, get_absolute_expression ());
836 if (ISFCN (S_GET_DATA_TYPE (def_symbol_in_progress
)) &&
837 S_GET_STORAGE_CLASS (def_symbol_in_progress
) != C_TPDEF
)
839 SF_SET_FUNCTION (def_symbol_in_progress
);
840 } /* is a function */
842 demand_empty_rest_of_line ();
846 obj_coff_val (ignore
)
849 if (def_symbol_in_progress
== NULL
)
851 as_warn (".val pseudo-op used outside of .def/.endef ignored.");
852 demand_empty_rest_of_line ();
854 } /* if not inside .def/.endef */
856 if (is_name_beginner (*input_line_pointer
))
858 char *symbol_name
= input_line_pointer
;
859 char name_end
= get_symbol_end ();
861 if (!strcmp (symbol_name
, "."))
863 def_symbol_in_progress
->sy_frag
= frag_now
;
864 S_SET_VALUE (def_symbol_in_progress
, (valueT
) frag_now_fix ());
865 /* If the .val is != from the .def (e.g. statics) */
867 else if (strcmp (S_GET_NAME (def_symbol_in_progress
), symbol_name
))
869 def_symbol_in_progress
->sy_value
.X_op
= O_symbol
;
870 def_symbol_in_progress
->sy_value
.X_add_symbol
=
871 symbol_find_or_make (symbol_name
);
872 def_symbol_in_progress
->sy_value
.X_op_symbol
= NULL
;
873 def_symbol_in_progress
->sy_value
.X_add_number
= 0;
875 /* If the segment is undefined when the forward reference is
876 resolved, then copy the segment id from the forward
878 SF_SET_GET_SEGMENT (def_symbol_in_progress
);
880 /* Otherwise, it is the name of a non debug symbol and its value will be calculated later. */
881 *input_line_pointer
= name_end
;
885 S_SET_VALUE (def_symbol_in_progress
, get_absolute_expression ());
886 } /* if symbol based */
888 demand_empty_rest_of_line ();
892 obj_read_begin_hook ()
894 /* These had better be the same. Usually 18 bytes. */
896 know (sizeof (SYMENT
) == sizeof (AUXENT
));
897 know (SYMESZ
== AUXESZ
);
903 symbolS
*coff_last_function
;
906 coff_frob_symbol (symp
, punt
)
910 static symbolS
*last_tagP
;
911 static stack
*block_stack
;
912 static symbolS
*set_end
;
914 if (symp
== &abs_symbol
)
920 if (current_lineno_sym
)
921 coff_add_linesym ((symbolS
*) 0);
924 block_stack
= stack_init (512, sizeof (symbolS
*));
926 if (!S_IS_DEFINED (symp
) && S_GET_STORAGE_CLASS (symp
) != C_STAT
)
927 S_SET_STORAGE_CLASS (symp
, C_EXT
);
929 if (!SF_GET_DEBUG (symp
))
932 if (!SF_GET_LOCAL (symp
)
933 && (real
= symbol_find_base (S_GET_NAME (symp
), DO_NOT_STRIP
))
936 c_symbol_merge (symp
, real
);
939 if (!S_IS_DEFINED (symp
) && !SF_GET_LOCAL (symp
))
941 assert (S_GET_VALUE (symp
) == 0);
942 S_SET_EXTERNAL (symp
);
944 else if (S_GET_STORAGE_CLASS (symp
) == C_NULL
)
946 if (S_GET_SEGMENT (symp
) == text_section
947 && symp
!= seg_info (text_section
)->sym
)
948 S_SET_STORAGE_CLASS (symp
, C_LABEL
);
950 S_SET_STORAGE_CLASS (symp
, C_STAT
);
952 if (SF_GET_PROCESS (symp
))
954 if (S_GET_STORAGE_CLASS (symp
) == C_BLOCK
)
956 if (!strcmp (S_GET_NAME (symp
), ".bb"))
957 stack_push (block_stack
, (char *) &symp
);
961 begin
= *(symbolS
**) stack_pop (block_stack
);
963 as_warn ("mismatched .eb");
968 if (coff_last_function
== 0 && SF_GET_FUNCTION (symp
))
970 union internal_auxent
*auxp
;
971 coff_last_function
= symp
;
972 if (S_GET_NUMBER_AUXILIARY (symp
) < 1)
973 S_SET_NUMBER_AUXILIARY (symp
, 1);
974 auxp
= &coffsymbol (symp
->bsym
)->native
[1].u
.auxent
;
975 memset (auxp
->x_sym
.x_fcnary
.x_ary
.x_dimen
, 0,
976 sizeof (auxp
->x_sym
.x_fcnary
.x_ary
.x_dimen
));
978 if (S_GET_STORAGE_CLASS (symp
) == C_EFCN
)
980 if (coff_last_function
== 0)
981 as_fatal ("C_EFCN symbol out of scope");
982 SA_SET_SYM_FSIZE (coff_last_function
,
983 (long) (S_GET_VALUE (symp
)
984 - S_GET_VALUE (coff_last_function
)));
985 set_end
= coff_last_function
;
986 coff_last_function
= 0;
989 else if (SF_GET_TAG (symp
))
991 else if (S_GET_STORAGE_CLASS (symp
) == C_EOS
)
993 else if (S_GET_STORAGE_CLASS (symp
) == C_FILE
)
995 if (S_GET_VALUE (symp
))
997 S_SET_VALUE ((symbolS
*) S_GET_VALUE (symp
), 0xdeadbeef);
998 S_SET_VALUE (symp
, 0);
1001 if (S_IS_EXTERNAL (symp
))
1002 S_SET_STORAGE_CLASS (symp
, C_EXT
);
1003 else if (SF_GET_LOCAL (symp
))
1008 if (set_end
!= (symbolS
*) NULL
1011 SA_SET_SYM_ENDNDX (set_end
, symp
);
1015 if (coffsymbol (symp
->bsym
)->lineno
)
1018 struct line_no
*lptr
;
1021 lptr
= (struct line_no
*) coffsymbol (symp
->bsym
)->lineno
;
1022 for (i
= 0; lptr
; lptr
= lptr
->next
)
1024 lptr
= (struct line_no
*) coffsymbol (symp
->bsym
)->lineno
;
1026 /* We need i entries for line numbers, plus 1 for the first
1027 entry which BFD will override, plus 1 for the last zero
1028 entry (a marker for BFD). */
1029 l
= (alent
*) bfd_alloc_by_size_t (stdoutput
, (i
+ 2) * sizeof (alent
));
1030 coffsymbol (symp
->bsym
)->lineno
= l
;
1031 l
[i
+ 1].line_number
= 0;
1032 l
[i
+ 1].u
.sym
= NULL
;
1036 lptr
->l
.u
.offset
+= lptr
->frag
->fr_address
;
1044 coff_adjust_section_syms (abfd
, sec
, x
)
1050 segment_info_type
*seginfo
= seg_info (sec
);
1051 int nlnno
, nrelocs
= 0;
1053 /* RS/6000 gas creates a .debug section manually in ppc_frob_file in
1054 tc-ppc.c. Do not get confused by it. */
1055 if (seginfo
== NULL
)
1058 if (!strcmp (sec
->name
, ".text"))
1063 /* @@ Hope that none of the fixups expand to more than one reloc
1065 fixS
*fixp
= seginfo
->fix_root
;
1068 fixp
= fixp
->fx_next
;
1072 if (bfd_get_section_size_before_reloc (sec
) == 0
1073 && nrelocs
== 0 && nlnno
== 0)
1075 secsym
= section_symbol (sec
);
1076 SA_SET_SCN_NRELOC (secsym
, nrelocs
);
1077 SA_SET_SCN_NLINNO (secsym
, nlnno
);
1083 bfd_map_over_sections (stdoutput
, coff_adjust_section_syms
, (char*) 0);
1087 * implement the .section pseudo op:
1088 * .section name {, "flags"}
1090 * | +--- optional flags: 'b' for bss
1092 * +-- section name 'l' for lib
1096 * 'd' (apparently m88k for data)
1098 * But if the argument is not a quoted string, treat it as a
1099 * subsegment number.
1103 obj_coff_section (ignore
)
1106 /* Strip out the section name */
1114 section_name
= input_line_pointer
;
1115 c
= get_symbol_end ();
1117 name
= xmalloc (input_line_pointer
- section_name
+ 1);
1118 strcpy (name
, section_name
);
1120 *input_line_pointer
= c
;
1125 flags
= SEC_NO_FLAGS
;
1127 if (*input_line_pointer
== ',')
1129 ++input_line_pointer
;
1131 if (*input_line_pointer
!= '"')
1132 exp
= get_absolute_expression ();
1135 ++input_line_pointer
;
1136 while (*input_line_pointer
!= '"'
1137 && ! is_end_of_line
[(unsigned char) *input_line_pointer
])
1139 switch (*input_line_pointer
)
1141 case 'b': flags
|= SEC_ALLOC
; flags
&=~ SEC_LOAD
; break;
1142 case 'n': flags
&=~ SEC_LOAD
; break;
1144 case 'w': flags
&=~ SEC_READONLY
; break;
1145 case 'x': flags
|= SEC_CODE
; break;
1147 case 'i': /* STYP_INFO */
1148 case 'l': /* STYP_LIB */
1149 case 'o': /* STYP_OVER */
1150 as_warn ("unsupported section attribute '%c'",
1151 *input_line_pointer
);
1155 as_warn("unknown section attribute '%c'",
1156 *input_line_pointer
);
1159 ++input_line_pointer
;
1161 if (*input_line_pointer
== '"')
1162 ++input_line_pointer
;
1166 sec
= subseg_new (name
, (subsegT
) exp
);
1168 if (flags
!= SEC_NO_FLAGS
)
1170 if (! bfd_set_section_flags (stdoutput
, sec
, flags
))
1171 as_warn ("error setting flags for \"%s\": %s",
1172 bfd_section_name (stdoutput
, sec
),
1173 bfd_errmsg (bfd_get_error ()));
1178 coff_adjust_symtab ()
1180 if (symbol_rootP
== NULL
1181 || S_GET_STORAGE_CLASS (symbol_rootP
) != C_FILE
)
1183 assert (previous_file_symbol
== 0);
1184 c_dot_file_symbol ("fake");
1189 coff_frob_section (sec
)
1195 bfd_vma size
, n_entries
, mask
;
1197 /* The COFF back end in BFD requires that all section sizes be
1198 rounded up to multiples of the corresponding section alignments.
1199 Seems kinda silly to me, but that's the way it is. */
1200 size
= bfd_get_section_size_before_reloc (sec
);
1201 mask
= ((bfd_vma
) 1 << (bfd_vma
) sec
->alignment_power
) - 1;
1204 size
= (size
+ mask
) & ~mask
;
1205 bfd_set_section_size (stdoutput
, sec
, size
);
1208 /* If the section size is non-zero, the section symbol needs an aux
1209 entry associated with it, indicating the size. We don't know
1210 all the values yet; coff_frob_symbol will fill them in later. */
1213 symbolS
*secsym
= section_symbol (sec
);
1215 S_SET_STORAGE_CLASS (secsym
, C_STAT
);
1216 S_SET_NUMBER_AUXILIARY (secsym
, 1);
1217 SF_SET_STATICS (secsym
);
1218 SA_SET_SCN_SCNLEN (secsym
, size
);
1221 /* @@ these should be in a "stabs.h" file, or maybe as.h */
1222 #ifndef STAB_SECTION_NAME
1223 #define STAB_SECTION_NAME ".stab"
1225 #ifndef STAB_STRING_SECTION_NAME
1226 #define STAB_STRING_SECTION_NAME ".stabstr"
1228 if (strcmp (STAB_STRING_SECTION_NAME
, sec
->name
))
1232 sec
= subseg_get (STAB_SECTION_NAME
, 0);
1233 /* size is already rounded up, since other section will be listed first */
1234 size
= bfd_get_section_size_before_reloc (strsec
);
1236 n_entries
= bfd_get_section_size_before_reloc (sec
) / 12 - 1;
1238 /* Find first non-empty frag. It should be large enough. */
1239 fragp
= seg_info (sec
)->frchainP
->frch_root
;
1240 while (fragp
&& fragp
->fr_fix
== 0)
1241 fragp
= fragp
->fr_next
;
1242 assert (fragp
!= 0 && fragp
->fr_fix
>= 12);
1244 /* Store the values. */
1245 p
= fragp
->fr_literal
;
1246 bfd_h_put_16 (stdoutput
, n_entries
, (bfd_byte
*) p
+ 6);
1247 bfd_h_put_32 (stdoutput
, size
, (bfd_byte
*) p
+ 8);
1251 obj_coff_init_stab_section (seg
)
1257 unsigned int stroff
;
1259 /* Make space for this first symbol. */
1263 as_where (&file
, (unsigned int *) NULL
);
1264 stabstr_name
= (char *) alloca (strlen (seg
->name
) + 4);
1265 strcpy (stabstr_name
, seg
->name
);
1266 strcat (stabstr_name
, "str");
1267 stroff
= get_stab_string_offset (file
, stabstr_name
);
1269 md_number_to_chars (p
, stroff
, 4);
1278 return ((s
== NULL
) ? "(NULL)" : S_GET_NAME (s
));
1286 for (symbolP
= symbol_rootP
; symbolP
; symbolP
= symbol_next (symbolP
))
1288 printf("0x%lx: \"%s\" type = %ld, class = %d, segment = %d\n",
1289 (unsigned long) symbolP
,
1290 S_GET_NAME(symbolP
),
1291 (long) S_GET_DATA_TYPE(symbolP
),
1292 S_GET_STORAGE_CLASS(symbolP
),
1293 (int) S_GET_SEGMENT(symbolP
));
1299 #else /* not BFD_ASSEMBLER */
1302 /* This is needed because we include internal bfd things. */
1304 #include "bfd/libbfd.h"
1305 #include "bfd/libcoff.h"
1307 /* The NOP_OPCODE is for the alignment fill value. Fill with nop so
1308 that we can stick sections together without causing trouble. */
1310 #define NOP_OPCODE 0x00
1313 /* The zeroes if symbol name is longer than 8 chars */
1314 #define S_SET_ZEROES(s,v) ((s)->sy_symbol.ost_entry.n_zeroes = (v))
1316 #define MIN(a,b) ((a) < (b)? (a) : (b))
1317 /* This vector is used to turn an internal segment into a section #
1318 suitable for insertion into a coff symbol table
1321 const short seg_N_TYPE
[] =
1322 { /* in: segT out: N_TYPE bits */
1334 C_UNDEF_SECTION
, /* SEG_UNKNOWN */
1335 C_UNDEF_SECTION
, /* SEG_GOOF */
1336 C_UNDEF_SECTION
, /* SEG_EXPR */
1337 C_DEBUG_SECTION
, /* SEG_DEBUG */
1338 C_NTV_SECTION
, /* SEG_NTV */
1339 C_PTV_SECTION
, /* SEG_PTV */
1340 C_REGISTER_SECTION
, /* SEG_REGISTER */
1343 int function_lineoff
= -1; /* Offset in line#s where the last function
1344 started (the odd entry for line #0) */
1346 static symbolS
*last_line_symbol
;
1348 /* Add 4 to the real value to get the index and compensate the
1349 negatives. This vector is used by S_GET_SEGMENT to turn a coff
1350 section number into a segment number
1352 static symbolS
*previous_file_symbol
;
1353 void c_symbol_merge ();
1354 static int line_base
;
1356 symbolS
*c_section_symbol ();
1359 static void fixup_segment
PARAMS ((segment_info_type
*segP
,
1360 segT this_segment_type
));
1363 static void fixup_mdeps
PARAMS ((fragS
*,
1368 static void fill_section
PARAMS ((bfd
* abfd
,
1373 static int c_line_new
PARAMS ((symbolS
* symbol
, long paddr
,
1378 static void w_symbols
PARAMS ((bfd
* abfd
, char *where
,
1379 symbolS
* symbol_rootP
));
1381 static void adjust_stab_section
PARAMS ((bfd
*abfd
, segT seg
));
1383 static void obj_coff_lcomm
PARAMS ((int));
1384 static void obj_coff_text
PARAMS ((int));
1385 static void obj_coff_data
PARAMS ((int));
1386 static void obj_coff_bss
PARAMS ((int));
1387 static void obj_coff_ident
PARAMS ((int));
1388 void obj_coff_section
PARAMS ((int));
1392 We allow more than just the standard 3 sections, infact, we allow
1393 10 sections, (though the usual three have to be there).
1395 This structure performs the mappings for us:
1406 static const seg_info_type seg_info_off_by_4
[N_SEG
] =
1437 #define SEG_INFO_FROM_SECTION_NUMBER(x) (seg_info_off_by_4[(x)+4])
1439 static relax_addressT
1440 relax_align (address
, alignment
)
1441 relax_addressT address
;
1444 relax_addressT mask
;
1445 relax_addressT new_address
;
1447 mask
= ~((~0) << alignment
);
1448 new_address
= (address
+ mask
) & (~mask
);
1449 return (new_address
- address
);
1457 return SEG_INFO_FROM_SECTION_NUMBER (x
->sy_symbol
.ost_entry
.n_scnum
).seg_t
;
1462 /* calculate the size of the frag chain and fill in the section header
1463 to contain all of it, also fill in the addr of the sections */
1465 size_section (abfd
, idx
)
1470 unsigned int size
= 0;
1471 fragS
*frag
= segment_info
[idx
].frchainP
->frch_root
;
1474 size
= frag
->fr_address
;
1475 if (frag
->fr_address
!= size
)
1477 fprintf (stderr
, "Out of step\n");
1478 size
= frag
->fr_address
;
1481 switch (frag
->fr_type
)
1483 #ifdef TC_COFF_SIZEMACHDEP
1484 case rs_machine_dependent
:
1485 size
+= TC_COFF_SIZEMACHDEP (frag
);
1490 size
+= frag
->fr_fix
;
1491 size
+= frag
->fr_offset
* frag
->fr_var
;
1494 size
+= frag
->fr_fix
;
1495 size
+= relax_align (size
, frag
->fr_offset
);
1498 BAD_CASE (frag
->fr_type
);
1501 frag
= frag
->fr_next
;
1503 segment_info
[idx
].scnhdr
.s_size
= size
;
1509 count_entries_in_chain (idx
)
1512 unsigned int nrelocs
;
1515 /* Count the relocations */
1516 fixup_ptr
= segment_info
[idx
].fix_root
;
1518 while (fixup_ptr
!= (fixS
*) NULL
)
1520 if (TC_COUNT_RELOC (fixup_ptr
))
1523 if (fixup_ptr
->fx_r_type
== RELOC_CONSTH
)
1532 fixup_ptr
= fixup_ptr
->fx_next
;
1537 /* output all the relocations for a section */
1539 do_relocs_for (abfd
, h
, file_cursor
)
1542 unsigned long *file_cursor
;
1544 unsigned int nrelocs
;
1546 unsigned long reloc_start
= *file_cursor
;
1548 for (idx
= SEG_E0
; idx
< SEG_E9
; idx
++)
1550 if (segment_info
[idx
].scnhdr
.s_name
[0])
1552 struct external_reloc
*ext_ptr
;
1553 struct external_reloc
*external_reloc_vec
;
1554 unsigned int external_reloc_size
;
1555 unsigned int base
= segment_info
[idx
].scnhdr
.s_paddr
;
1556 fixS
*fix_ptr
= segment_info
[idx
].fix_root
;
1557 nrelocs
= count_entries_in_chain (idx
);
1560 /* Bypass this stuff if no relocs. This also incidentally
1561 avoids a SCO bug, where free(malloc(0)) tends to crash. */
1563 external_reloc_size
= nrelocs
* RELSZ
;
1564 external_reloc_vec
=
1565 (struct external_reloc
*) malloc (external_reloc_size
);
1567 ext_ptr
= external_reloc_vec
;
1569 /* Fill in the internal coff style reloc struct from the
1570 internal fix list. */
1573 symbolS
*symbol_ptr
;
1574 struct internal_reloc intr
;
1576 /* Only output some of the relocations */
1577 if (TC_COUNT_RELOC (fix_ptr
))
1579 #ifdef TC_RELOC_MANGLE
1580 TC_RELOC_MANGLE (fix_ptr
, &intr
, base
);
1584 symbol_ptr
= fix_ptr
->fx_addsy
;
1586 intr
.r_type
= TC_COFF_FIX2RTYPE (fix_ptr
);
1588 base
+ fix_ptr
->fx_frag
->fr_address
+ fix_ptr
->fx_where
;
1590 #ifdef TC_KEEP_FX_OFFSET
1591 intr
.r_offset
= fix_ptr
->fx_offset
;
1596 /* Turn the segment of the symbol into an offset. */
1599 dot
= segment_info
[S_GET_SEGMENT (symbol_ptr
)].dot
;
1602 intr
.r_symndx
= dot
->sy_number
;
1606 intr
.r_symndx
= symbol_ptr
->sy_number
;
1616 (void) bfd_coff_swap_reloc_out (abfd
, &intr
, ext_ptr
);
1619 #if defined(TC_A29K)
1621 /* The 29k has a special kludge for the high 16 bit
1622 reloc. Two relocations are emited, R_IHIHALF,
1623 and R_IHCONST. The second one doesn't contain a
1624 symbol, but uses the value for offset. */
1626 if (intr
.r_type
== R_IHIHALF
)
1628 /* now emit the second bit */
1629 intr
.r_type
= R_IHCONST
;
1630 intr
.r_symndx
= fix_ptr
->fx_addnumber
;
1631 (void) bfd_coff_swap_reloc_out (abfd
, &intr
, ext_ptr
);
1637 fix_ptr
= fix_ptr
->fx_next
;
1640 /* Write out the reloc table */
1641 bfd_write ((PTR
) external_reloc_vec
, 1, external_reloc_size
,
1643 free (external_reloc_vec
);
1645 /* Fill in section header info. */
1646 segment_info
[idx
].scnhdr
.s_relptr
= *file_cursor
;
1647 *file_cursor
+= external_reloc_size
;
1648 segment_info
[idx
].scnhdr
.s_nreloc
= nrelocs
;
1653 segment_info
[idx
].scnhdr
.s_relptr
= 0;
1657 /* Set relocation_size field in file headers */
1658 H_SET_RELOCATION_SIZE (h
, *file_cursor
- reloc_start
, 0);
1662 /* run through a frag chain and write out the data to go with it, fill
1663 in the scnhdrs with the info on the file postions
1666 fill_section (abfd
, h
, file_cursor
)
1669 unsigned long *file_cursor
;
1673 unsigned int paddr
= 0;
1675 for (i
= SEG_E0
; i
< SEG_UNKNOWN
; i
++)
1677 unsigned int offset
= 0;
1679 struct internal_scnhdr
*s
= &(segment_info
[i
].scnhdr
);
1683 fragS
*frag
= segment_info
[i
].frchainP
->frch_root
;
1690 buffer
= xmalloc (s
->s_size
);
1691 s
->s_scnptr
= *file_cursor
;
1693 know (s
->s_paddr
== paddr
);
1695 if (strcmp (s
->s_name
, ".text") == 0)
1696 s
->s_flags
|= STYP_TEXT
;
1697 else if (strcmp (s
->s_name
, ".data") == 0)
1698 s
->s_flags
|= STYP_DATA
;
1699 else if (strcmp (s
->s_name
, ".bss") == 0)
1702 s
->s_flags
|= STYP_BSS
;
1704 /* @@ Should make the i386 and a29k coff targets define
1705 COFF_NOLOAD_PROBLEM, and have only one test here. */
1708 #ifndef COFF_NOLOAD_PROBLEM
1709 /* Apparently the SVR3 linker (and exec syscall) and UDI
1710 mondfe progrem are confused by noload sections. */
1711 s
->s_flags
|= STYP_NOLOAD
;
1716 else if (strcmp (s
->s_name
, ".lit") == 0)
1717 s
->s_flags
= STYP_LIT
| STYP_TEXT
;
1718 else if (strcmp (s
->s_name
, ".init") == 0)
1719 s
->s_flags
|= STYP_TEXT
;
1720 else if (strcmp (s
->s_name
, ".fini") == 0)
1721 s
->s_flags
|= STYP_TEXT
;
1722 else if (strncmp (s
->s_name
, ".comment", 8) == 0)
1723 s
->s_flags
|= STYP_INFO
;
1727 unsigned int fill_size
;
1728 switch (frag
->fr_type
)
1730 case rs_machine_dependent
:
1733 memcpy (buffer
+ frag
->fr_address
,
1735 (unsigned int) frag
->fr_fix
);
1736 offset
+= frag
->fr_fix
;
1745 memcpy (buffer
+ frag
->fr_address
,
1747 (unsigned int) frag
->fr_fix
);
1748 offset
+= frag
->fr_fix
;
1751 fill_size
= frag
->fr_var
;
1752 if (fill_size
&& frag
->fr_offset
> 0)
1755 unsigned int off
= frag
->fr_fix
;
1756 for (count
= frag
->fr_offset
; count
; count
--)
1758 if (fill_size
+ frag
->fr_address
+ off
<= s
->s_size
)
1760 memcpy (buffer
+ frag
->fr_address
+ off
,
1761 frag
->fr_literal
+ frag
->fr_fix
,
1764 offset
+= fill_size
;
1769 case rs_broken_word
:
1774 frag
= frag
->fr_next
;
1779 if (s
->s_scnptr
!= 0)
1781 bfd_write (buffer
, s
->s_size
, 1, abfd
);
1782 *file_cursor
+= s
->s_size
;
1791 /* Coff file generation & utilities */
1794 coff_header_append (abfd
, h
)
1802 bfd_seek (abfd
, 0, 0);
1804 #ifndef OBJ_COFF_OMIT_OPTIONAL_HEADER
1805 H_SET_MAGIC_NUMBER (h
, COFF_MAGIC
);
1806 H_SET_VERSION_STAMP (h
, 0);
1807 H_SET_ENTRY_POINT (h
, 0);
1808 H_SET_TEXT_START (h
, segment_info
[SEG_E0
].frchainP
->frch_root
->fr_address
);
1809 H_SET_DATA_START (h
, segment_info
[SEG_E1
].frchainP
->frch_root
->fr_address
);
1810 H_SET_SIZEOF_OPTIONAL_HEADER (h
, bfd_coff_swap_aouthdr_out(abfd
, &h
->aouthdr
,
1812 #else /* defined (OBJ_COFF_OMIT_OPTIONAL_HEADER) */
1813 H_SET_SIZEOF_OPTIONAL_HEADER (h
, 0);
1814 #endif /* defined (OBJ_COFF_OMIT_OPTIONAL_HEADER) */
1816 i
= bfd_coff_swap_filehdr_out (abfd
, &h
->filehdr
, buffer
);
1818 bfd_write (buffer
, i
, 1, abfd
);
1819 bfd_write (buffero
, H_GET_SIZEOF_OPTIONAL_HEADER (h
), 1, abfd
);
1821 for (i
= SEG_E0
; i
< SEG_E9
; i
++)
1823 if (segment_info
[i
].scnhdr
.s_name
[0])
1826 bfd_coff_swap_scnhdr_out (abfd
,
1827 &(segment_info
[i
].scnhdr
),
1829 bfd_write (buffer
, size
, 1, abfd
);
1836 symbol_to_chars (abfd
, where
, symbolP
)
1841 unsigned int numaux
= symbolP
->sy_symbol
.ost_entry
.n_numaux
;
1845 /* Turn any symbols with register attributes into abs symbols */
1846 if (S_GET_SEGMENT (symbolP
) == reg_section
)
1848 S_SET_SEGMENT (symbolP
, absolute_section
);
1850 /* At the same time, relocate all symbols to their output value */
1852 val
= (segment_info
[S_GET_SEGMENT (symbolP
)].scnhdr
.s_paddr
1853 + S_GET_VALUE (symbolP
));
1855 S_SET_VALUE (symbolP
, val
);
1857 symbolP
->sy_symbol
.ost_entry
.n_value
= val
;
1859 where
+= bfd_coff_swap_sym_out (abfd
, &symbolP
->sy_symbol
.ost_entry
,
1862 for (i
= 0; i
< numaux
; i
++)
1864 where
+= bfd_coff_swap_aux_out (abfd
,
1865 &symbolP
->sy_symbol
.ost_auxent
[i
],
1866 S_GET_DATA_TYPE (symbolP
),
1867 S_GET_STORAGE_CLASS (symbolP
),
1875 obj_symbol_new_hook (symbolP
)
1878 char underscore
= 0; /* Symbol has leading _ */
1880 /* Effective symbol */
1881 /* Store the pointer in the offset. */
1882 S_SET_ZEROES (symbolP
, 0L);
1883 S_SET_DATA_TYPE (symbolP
, T_NULL
);
1884 S_SET_STORAGE_CLASS (symbolP
, 0);
1885 S_SET_NUMBER_AUXILIARY (symbolP
, 0);
1886 /* Additional information */
1887 symbolP
->sy_symbol
.ost_flags
= 0;
1888 /* Auxiliary entries */
1889 memset ((char *) &symbolP
->sy_symbol
.ost_auxent
[0], 0, AUXESZ
);
1891 if (S_IS_STRING (symbolP
))
1892 SF_SET_STRING (symbolP
);
1893 if (!underscore
&& S_IS_LOCAL (symbolP
))
1894 SF_SET_LOCAL (symbolP
);
1898 * Handle .ln directives.
1902 obj_coff_ln (appline
)
1907 if (! appline
&& def_symbol_in_progress
!= NULL
)
1909 as_warn (".ln pseudo-op inside .def/.endef: ignored.");
1910 demand_empty_rest_of_line ();
1912 } /* wrong context */
1914 l
= get_absolute_expression ();
1915 c_line_new (0, obstack_next_free (&frags
) - frag_now
->fr_literal
, l
,
1925 listing_source_line ((unsigned int) l
);
1930 demand_empty_rest_of_line ();
1936 * Handle .def directives.
1938 * One might ask : why can't we symbol_new if the symbol does not
1939 * already exist and fill it with debug information. Because of
1940 * the C_EFCN special symbol. It would clobber the value of the
1941 * function symbol before we have a chance to notice that it is
1942 * a C_EFCN. And a second reason is that the code is more clear this
1943 * way. (at least I think it is :-).
1947 #define SKIP_SEMI_COLON() while (*input_line_pointer++ != ';')
1948 #define SKIP_WHITESPACES() while (*input_line_pointer == ' ' || \
1949 *input_line_pointer == '\t') \
1950 input_line_pointer++;
1956 char name_end
; /* Char after the end of name */
1957 char *symbol_name
; /* Name of the debug symbol */
1958 char *symbol_name_copy
; /* Temporary copy of the name */
1959 unsigned int symbol_name_length
;
1961 if (def_symbol_in_progress
!= NULL
)
1963 as_warn (".def pseudo-op used inside of .def/.endef: ignored.");
1964 demand_empty_rest_of_line ();
1966 } /* if not inside .def/.endef */
1968 SKIP_WHITESPACES ();
1970 def_symbol_in_progress
= (symbolS
*) obstack_alloc (¬es
, sizeof (*def_symbol_in_progress
));
1971 memset (def_symbol_in_progress
, 0, sizeof (*def_symbol_in_progress
));
1973 symbol_name
= input_line_pointer
;
1974 name_end
= get_symbol_end ();
1975 symbol_name_length
= strlen (symbol_name
);
1976 symbol_name_copy
= xmalloc (symbol_name_length
+ 1);
1977 strcpy (symbol_name_copy
, symbol_name
);
1979 /* Initialize the new symbol */
1980 #ifdef STRIP_UNDERSCORE
1981 S_SET_NAME (def_symbol_in_progress
, (*symbol_name_copy
== '_'
1982 ? symbol_name_copy
+ 1
1983 : symbol_name_copy
));
1984 #else /* STRIP_UNDERSCORE */
1985 S_SET_NAME (def_symbol_in_progress
, symbol_name_copy
);
1986 #endif /* STRIP_UNDERSCORE */
1987 /* free(symbol_name_copy); */
1988 def_symbol_in_progress
->sy_name_offset
= (unsigned long) ~0;
1989 def_symbol_in_progress
->sy_number
= ~0;
1990 def_symbol_in_progress
->sy_frag
= &zero_address_frag
;
1991 S_SET_VALUE (def_symbol_in_progress
, 0);
1993 if (S_IS_STRING (def_symbol_in_progress
))
1994 SF_SET_STRING (def_symbol_in_progress
);
1996 *input_line_pointer
= name_end
;
1998 demand_empty_rest_of_line ();
2001 unsigned int dim_index
;
2005 obj_coff_endef (ignore
)
2008 symbolS
*symbolP
= 0;
2009 /* DIM BUG FIX sac@cygnus.com */
2011 if (def_symbol_in_progress
== NULL
)
2013 as_warn (".endef pseudo-op used outside of .def/.endef: ignored.");
2014 demand_empty_rest_of_line ();
2016 } /* if not inside .def/.endef */
2018 /* Set the section number according to storage class. */
2019 switch (S_GET_STORAGE_CLASS (def_symbol_in_progress
))
2024 SF_SET_TAG (def_symbol_in_progress
);
2025 /* intentional fallthrough */
2028 SF_SET_DEBUG (def_symbol_in_progress
);
2029 S_SET_SEGMENT (def_symbol_in_progress
, SEG_DEBUG
);
2033 SF_SET_LOCAL (def_symbol_in_progress
); /* Do not emit this symbol. */
2034 /* intentional fallthrough */
2036 SF_SET_PROCESS (def_symbol_in_progress
); /* Will need processing before writing */
2037 /* intentional fallthrough */
2039 S_SET_SEGMENT (def_symbol_in_progress
, SEG_E0
);
2041 if (strcmp (S_GET_NAME (def_symbol_in_progress
), ".bf") == 0)
2043 if (function_lineoff
< 0)
2045 fprintf (stderr
, "`.bf' symbol without preceding function\n");
2046 } /* missing function symbol */
2047 SA_GET_SYM_LNNOPTR (last_line_symbol
) = function_lineoff
;
2049 SF_SET_PROCESS (last_line_symbol
);
2050 function_lineoff
= -1;
2052 /* Value is always set to . */
2053 def_symbol_in_progress
->sy_frag
= frag_now
;
2054 S_SET_VALUE (def_symbol_in_progress
, (valueT
) frag_now_fix ());
2059 #endif /* C_AUTOARG */
2069 SF_SET_DEBUG (def_symbol_in_progress
);
2070 S_SET_SEGMENT (def_symbol_in_progress
, absolute_section
);
2076 /* Valid but set somewhere else (s_comm, s_lcomm, colon) */
2082 as_warn ("unexpected storage class %d", S_GET_STORAGE_CLASS (def_symbol_in_progress
));
2084 } /* switch on storage class */
2086 /* Now that we have built a debug symbol, try to find if we should
2087 merge with an existing symbol or not. If a symbol is C_EFCN or
2088 absolute_section or untagged SEG_DEBUG it never merges. We also
2089 don't merge labels, which are in a different namespace, nor
2090 symbols which have not yet been defined since they are typically
2091 unique, nor do we merge tags with non-tags. */
2093 /* Two cases for functions. Either debug followed by definition or
2094 definition followed by debug. For definition first, we will
2095 merge the debug symbol into the definition. For debug first, the
2096 lineno entry MUST point to the definition function or else it
2097 will point off into space when crawl_symbols() merges the debug
2098 symbol into the real symbol. Therefor, let's presume the debug
2099 symbol is a real function reference. */
2101 /* FIXME-SOON If for some reason the definition label/symbol is
2102 never seen, this will probably leave an undefined symbol at link
2105 if (S_GET_STORAGE_CLASS (def_symbol_in_progress
) == C_EFCN
2106 || S_GET_STORAGE_CLASS (def_symbol_in_progress
) == C_LABEL
2107 || (S_GET_SEGMENT (def_symbol_in_progress
) == SEG_DEBUG
2108 && !SF_GET_TAG (def_symbol_in_progress
))
2109 || S_GET_SEGMENT (def_symbol_in_progress
) == absolute_section
2110 || def_symbol_in_progress
->sy_value
.X_op
!= O_constant
2111 || (symbolP
= symbol_find_base (S_GET_NAME (def_symbol_in_progress
), DO_NOT_STRIP
)) == NULL
2112 || (SF_GET_TAG (def_symbol_in_progress
) != SF_GET_TAG (symbolP
)))
2114 symbol_append (def_symbol_in_progress
, symbol_lastP
, &symbol_rootP
,
2119 /* This symbol already exists, merge the newly created symbol
2120 into the old one. This is not mandatory. The linker can
2121 handle duplicate symbols correctly. But I guess that it save
2122 a *lot* of space if the assembly file defines a lot of
2125 /* The debug entry (def_symbol_in_progress) is merged into the
2126 previous definition. */
2128 c_symbol_merge (def_symbol_in_progress
, symbolP
);
2129 /* FIXME-SOON Should *def_symbol_in_progress be free'd? xoxorich. */
2130 def_symbol_in_progress
= symbolP
;
2132 if (SF_GET_FUNCTION (def_symbol_in_progress
)
2133 || SF_GET_TAG (def_symbol_in_progress
))
2135 /* For functions, and tags, the symbol *must* be where the
2136 debug symbol appears. Move the existing symbol to the
2138 /* If it already is at the end of the symbol list, do nothing */
2139 if (def_symbol_in_progress
!= symbol_lastP
)
2141 symbol_remove (def_symbol_in_progress
, &symbol_rootP
,
2143 symbol_append (def_symbol_in_progress
, symbol_lastP
,
2144 &symbol_rootP
, &symbol_lastP
);
2145 } /* if not already in place */
2147 } /* normal or mergable */
2149 if (SF_GET_TAG (def_symbol_in_progress
)
2150 && symbol_find_base (S_GET_NAME (def_symbol_in_progress
), DO_NOT_STRIP
) == NULL
)
2152 tag_insert (S_GET_NAME (def_symbol_in_progress
), def_symbol_in_progress
);
2155 if (SF_GET_FUNCTION (def_symbol_in_progress
))
2157 know (sizeof (def_symbol_in_progress
) <= sizeof (long));
2159 = c_line_new (def_symbol_in_progress
, 0, 0, &zero_address_frag
);
2161 SF_SET_PROCESS (def_symbol_in_progress
);
2163 if (symbolP
== NULL
)
2165 /* That is, if this is the first time we've seen the
2167 symbol_table_insert (def_symbol_in_progress
);
2168 } /* definition follows debug */
2169 } /* Create the line number entry pointing to the function being defined */
2171 def_symbol_in_progress
= NULL
;
2172 demand_empty_rest_of_line ();
2176 obj_coff_dim (ignore
)
2181 if (def_symbol_in_progress
== NULL
)
2183 as_warn (".dim pseudo-op used outside of .def/.endef: ignored.");
2184 demand_empty_rest_of_line ();
2186 } /* if not inside .def/.endef */
2188 S_SET_NUMBER_AUXILIARY (def_symbol_in_progress
, 1);
2190 for (dim_index
= 0; dim_index
< DIMNUM
; dim_index
++)
2192 SKIP_WHITESPACES ();
2193 SA_SET_SYM_DIMEN (def_symbol_in_progress
, dim_index
,
2194 get_absolute_expression ());
2196 switch (*input_line_pointer
)
2199 input_line_pointer
++;
2203 as_warn ("badly formed .dim directive ignored");
2204 /* intentional fallthrough */
2212 demand_empty_rest_of_line ();
2216 obj_coff_line (ignore
)
2222 if (def_symbol_in_progress
== NULL
)
2228 name
= S_GET_NAME (def_symbol_in_progress
);
2229 this_base
= get_absolute_expression ();
2231 /* Only .bf symbols indicate the use of a new base line number; the
2232 line numbers associated with .ef, .bb, .eb are relative to the
2233 start of the containing function. */
2234 if (!strcmp (".bf", name
))
2236 #if 0 /* XXX Can we ever have line numbers going backwards? */
2237 if (this_base
> line_base
)
2240 line_base
= this_base
;
2248 listing_source_line ((unsigned int) line_base
);
2254 S_SET_NUMBER_AUXILIARY (def_symbol_in_progress
, 1);
2255 SA_SET_SYM_LNNO (def_symbol_in_progress
, this_base
);
2257 demand_empty_rest_of_line ();
2261 obj_coff_size (ignore
)
2264 if (def_symbol_in_progress
== NULL
)
2266 as_warn (".size pseudo-op used outside of .def/.endef ignored.");
2267 demand_empty_rest_of_line ();
2269 } /* if not inside .def/.endef */
2271 S_SET_NUMBER_AUXILIARY (def_symbol_in_progress
, 1);
2272 SA_SET_SYM_SIZE (def_symbol_in_progress
, get_absolute_expression ());
2273 demand_empty_rest_of_line ();
2277 obj_coff_scl (ignore
)
2280 if (def_symbol_in_progress
== NULL
)
2282 as_warn (".scl pseudo-op used outside of .def/.endef ignored.");
2283 demand_empty_rest_of_line ();
2285 } /* if not inside .def/.endef */
2287 S_SET_STORAGE_CLASS (def_symbol_in_progress
, get_absolute_expression ());
2288 demand_empty_rest_of_line ();
2292 obj_coff_tag (ignore
)
2298 if (def_symbol_in_progress
== NULL
)
2300 as_warn (".tag pseudo-op used outside of .def/.endef ignored.");
2301 demand_empty_rest_of_line ();
2305 S_SET_NUMBER_AUXILIARY (def_symbol_in_progress
, 1);
2306 symbol_name
= input_line_pointer
;
2307 name_end
= get_symbol_end ();
2309 /* Assume that the symbol referred to by .tag is always defined.
2310 This was a bad assumption. I've added find_or_make. xoxorich. */
2311 SA_SET_SYM_TAGNDX (def_symbol_in_progress
,
2312 (long) tag_find_or_make (symbol_name
));
2313 if (SA_GET_SYM_TAGNDX (def_symbol_in_progress
) == 0L)
2315 as_warn ("tag not found for .tag %s", symbol_name
);
2318 SF_SET_TAGGED (def_symbol_in_progress
);
2319 *input_line_pointer
= name_end
;
2321 demand_empty_rest_of_line ();
2325 obj_coff_type (ignore
)
2328 if (def_symbol_in_progress
== NULL
)
2330 as_warn (".type pseudo-op used outside of .def/.endef ignored.");
2331 demand_empty_rest_of_line ();
2333 } /* if not inside .def/.endef */
2335 S_SET_DATA_TYPE (def_symbol_in_progress
, get_absolute_expression ());
2337 if (ISFCN (S_GET_DATA_TYPE (def_symbol_in_progress
)) &&
2338 S_GET_STORAGE_CLASS (def_symbol_in_progress
) != C_TPDEF
)
2340 SF_SET_FUNCTION (def_symbol_in_progress
);
2341 } /* is a function */
2343 demand_empty_rest_of_line ();
2347 obj_coff_val (ignore
)
2350 if (def_symbol_in_progress
== NULL
)
2352 as_warn (".val pseudo-op used outside of .def/.endef ignored.");
2353 demand_empty_rest_of_line ();
2355 } /* if not inside .def/.endef */
2357 if (is_name_beginner (*input_line_pointer
))
2359 char *symbol_name
= input_line_pointer
;
2360 char name_end
= get_symbol_end ();
2362 if (!strcmp (symbol_name
, "."))
2364 def_symbol_in_progress
->sy_frag
= frag_now
;
2365 S_SET_VALUE (def_symbol_in_progress
, (valueT
) frag_now_fix ());
2366 /* If the .val is != from the .def (e.g. statics) */
2368 else if (strcmp (S_GET_NAME (def_symbol_in_progress
), symbol_name
))
2370 def_symbol_in_progress
->sy_value
.X_op
= O_symbol
;
2371 def_symbol_in_progress
->sy_value
.X_add_symbol
=
2372 symbol_find_or_make (symbol_name
);
2373 def_symbol_in_progress
->sy_value
.X_op_symbol
= NULL
;
2374 def_symbol_in_progress
->sy_value
.X_add_number
= 0;
2376 /* If the segment is undefined when the forward reference is
2377 resolved, then copy the segment id from the forward
2379 SF_SET_GET_SEGMENT (def_symbol_in_progress
);
2381 /* FIXME: gcc can generate address expressions
2382 here in unusual cases (search for "obscure"
2383 in sdbout.c). We just ignore the offset
2384 here, thus generating incorrect debugging
2385 information. We ignore the rest of the
2388 /* Otherwise, it is the name of a non debug symbol and
2389 its value will be calculated later. */
2390 *input_line_pointer
= name_end
;
2392 /* FIXME: this is to avoid an error message in the
2393 FIXME case mentioned just above. */
2394 while (! is_end_of_line
[(unsigned char) *input_line_pointer
])
2395 ++input_line_pointer
;
2399 S_SET_VALUE (def_symbol_in_progress
,
2400 (valueT
) get_absolute_expression ());
2401 } /* if symbol based */
2403 demand_empty_rest_of_line ();
2407 obj_read_begin_hook ()
2409 /* These had better be the same. Usually 18 bytes. */
2411 know (sizeof (SYMENT
) == sizeof (AUXENT
));
2412 know (SYMESZ
== AUXESZ
);
2417 /* This function runs through the symbol table and puts all the
2418 externals onto another chain */
2420 /* The chain of externals */
2421 symbolS
*symbol_externP
;
2422 symbolS
*symbol_extern_lastP
;
2425 symbolS
*last_functionP
;
2432 unsigned int symbol_number
= 0;
2433 unsigned int last_file_symno
= 0;
2435 for (symbolP
= symbol_rootP
;
2437 symbolP
= symbolP
? symbol_next (symbolP
) : symbol_rootP
)
2439 if (!SF_GET_DEBUG (symbolP
))
2441 /* Debug symbols do not need all this rubbish */
2442 symbolS
*real_symbolP
;
2444 /* L* and C_EFCN symbols never merge. */
2445 if (!SF_GET_LOCAL (symbolP
)
2446 && S_GET_STORAGE_CLASS (symbolP
) != C_LABEL
2447 && symbolP
->sy_value
.X_op
== O_constant
2448 && (real_symbolP
= symbol_find_base (S_GET_NAME (symbolP
), DO_NOT_STRIP
))
2449 && real_symbolP
!= symbolP
)
2451 /* FIXME-SOON: where do dups come from?
2452 Maybe tag references before definitions? xoxorich. */
2453 /* Move the debug data from the debug symbol to the
2454 real symbol. Do NOT do the oposite (i.e. move from
2455 real symbol to debug symbol and remove real symbol from the
2456 list.) Because some pointers refer to the real symbol
2457 whereas no pointers refer to the debug symbol. */
2458 c_symbol_merge (symbolP
, real_symbolP
);
2459 /* Replace the current symbol by the real one */
2460 /* The symbols will never be the last or the first
2461 because : 1st symbol is .file and 3 last symbols are
2462 .text, .data, .bss */
2463 symbol_remove (real_symbolP
, &symbol_rootP
, &symbol_lastP
);
2464 symbol_insert (real_symbolP
, symbolP
, &symbol_rootP
, &symbol_lastP
);
2465 symbol_remove (symbolP
, &symbol_rootP
, &symbol_lastP
);
2466 symbolP
= real_symbolP
;
2467 } /* if not local but dup'd */
2469 if (flag_readonly_data_in_text
&& (S_GET_SEGMENT (symbolP
) == SEG_E1
))
2471 S_SET_SEGMENT (symbolP
, SEG_E0
);
2472 } /* push data into text */
2474 resolve_symbol_value (symbolP
);
2476 if (S_GET_STORAGE_CLASS (symbolP
) == C_NULL
)
2478 if (!S_IS_DEFINED (symbolP
) && !SF_GET_LOCAL (symbolP
))
2480 S_SET_EXTERNAL (symbolP
);
2482 else if (S_GET_SEGMENT (symbolP
) == SEG_E0
)
2484 S_SET_STORAGE_CLASS (symbolP
, C_LABEL
);
2488 S_SET_STORAGE_CLASS (symbolP
, C_STAT
);
2492 /* Mainly to speed up if not -g */
2493 if (SF_GET_PROCESS (symbolP
))
2495 /* Handle the nested blocks auxiliary info. */
2496 if (S_GET_STORAGE_CLASS (symbolP
) == C_BLOCK
)
2498 if (!strcmp (S_GET_NAME (symbolP
), ".bb"))
2499 stack_push (block_stack
, (char *) &symbolP
);
2502 register symbolS
*begin_symbolP
;
2503 begin_symbolP
= *(symbolS
**) stack_pop (block_stack
);
2504 if (begin_symbolP
== (symbolS
*) 0)
2505 as_warn ("mismatched .eb");
2507 SA_SET_SYM_ENDNDX (begin_symbolP
, symbol_number
+ 2);
2510 /* If we are able to identify the type of a function, and we
2511 are out of a function (last_functionP == 0) then, the
2512 function symbol will be associated with an auxiliary
2514 if (last_functionP
== (symbolS
*) 0 &&
2515 SF_GET_FUNCTION (symbolP
))
2517 last_functionP
= symbolP
;
2519 if (S_GET_NUMBER_AUXILIARY (symbolP
) < 1)
2521 S_SET_NUMBER_AUXILIARY (symbolP
, 1);
2522 } /* make it at least 1 */
2524 /* Clobber possible stale .dim information. */
2526 /* Iffed out by steve - this fries the lnnoptr info too */
2527 bzero (symbolP
->sy_symbol
.ost_auxent
[0].x_sym
.x_fcnary
.x_ary
.x_dimen
,
2528 sizeof (symbolP
->sy_symbol
.ost_auxent
[0].x_sym
.x_fcnary
.x_ary
.x_dimen
));
2531 /* The C_FCN doesn't need any additional information. I
2532 don't even know if this is needed for sdb. But the
2533 standard assembler generates it, so... */
2534 if (S_GET_STORAGE_CLASS (symbolP
) == C_EFCN
)
2536 if (last_functionP
== (symbolS
*) 0)
2537 as_fatal ("C_EFCN symbol out of scope");
2538 SA_SET_SYM_FSIZE (last_functionP
,
2539 (long) (S_GET_VALUE (symbolP
) -
2540 S_GET_VALUE (last_functionP
)));
2541 SA_SET_SYM_ENDNDX (last_functionP
, symbol_number
);
2542 last_functionP
= (symbolS
*) 0;
2546 else if (SF_GET_TAG (symbolP
))
2548 /* First descriptor of a structure must point to
2549 the first slot after the structure description. */
2550 last_tagP
= symbolP
;
2553 else if (S_GET_STORAGE_CLASS (symbolP
) == C_EOS
)
2555 /* +2 take in account the current symbol */
2556 SA_SET_SYM_ENDNDX (last_tagP
, symbol_number
+ 2);
2558 else if (S_GET_STORAGE_CLASS (symbolP
) == C_FILE
)
2560 if (S_GET_VALUE (symbolP
))
2562 S_SET_VALUE (symbolP
, last_file_symno
);
2563 last_file_symno
= symbol_number
;
2564 } /* no one points at the first .file symbol */
2565 } /* if debug or tag or eos or file */
2567 /* We must put the external symbols apart. The loader
2568 does not bomb if we do not. But the references in
2569 the endndx field for a .bb symbol are not corrected
2570 if an external symbol is removed between .bb and .be.
2571 I.e in the following case :
2572 [20] .bb endndx = 22
2575 ld will move the symbol 21 to the end of the list but
2576 endndx will still be 22 instead of 21. */
2579 if (SF_GET_LOCAL (symbolP
))
2581 /* remove C_EFCN and LOCAL (L...) symbols */
2582 /* next pointer remains valid */
2583 symbol_remove (symbolP
, &symbol_rootP
, &symbol_lastP
);
2586 else if (!S_IS_DEFINED (symbolP
)
2587 && !S_IS_DEBUG (symbolP
)
2588 && !SF_GET_STATICS (symbolP
) &&
2589 S_GET_STORAGE_CLASS (symbolP
) == C_EXT
)
2590 { /* C_EXT && !SF_GET_FUNCTION(symbolP)) */
2591 /* if external, Remove from the list */
2592 symbolS
*hold
= symbol_previous (symbolP
);
2594 symbol_remove (symbolP
, &symbol_rootP
, &symbol_lastP
);
2595 symbol_clear_list_pointers (symbolP
);
2596 symbol_append (symbolP
, symbol_extern_lastP
, &symbol_externP
, &symbol_extern_lastP
);
2601 if (SF_GET_STRING (symbolP
))
2603 symbolP
->sy_name_offset
= string_byte_count
;
2604 string_byte_count
+= strlen (S_GET_NAME (symbolP
)) + 1;
2608 symbolP
->sy_name_offset
= 0;
2609 } /* fix "long" names */
2611 symbolP
->sy_number
= symbol_number
;
2612 symbol_number
+= 1 + S_GET_NUMBER_AUXILIARY (symbolP
);
2613 } /* if local symbol */
2614 } /* traverse the symbol list */
2615 return symbol_number
;
2623 unsigned int symbol_number
= 0;
2625 for (symbolP
= symbol_externP
; symbol_externP
;)
2627 symbolS
*tmp
= symbol_externP
;
2630 symbol_remove (tmp
, &symbol_externP
, &symbol_extern_lastP
);
2631 symbol_append (tmp
, symbol_lastP
, &symbol_rootP
, &symbol_lastP
);
2634 if (SF_GET_STRING (tmp
))
2636 tmp
->sy_name_offset
= string_byte_count
;
2637 string_byte_count
+= strlen (S_GET_NAME (tmp
)) + 1;
2641 tmp
->sy_name_offset
= 0;
2642 } /* fix "long" names */
2644 tmp
->sy_number
= symbol_number
;
2645 symbol_number
+= 1 + S_GET_NUMBER_AUXILIARY (tmp
);
2646 } /* append the entire extern chain */
2647 return symbol_number
;
2654 unsigned int symbol_number
= 0;
2657 for (symbolP
= symbol_rootP
; symbolP
; symbolP
=
2658 symbol_next (symbolP
))
2660 symbolP
->sy_number
= symbol_number
;
2664 if (SF_GET_TAGGED (symbolP
))
2668 ((symbolS
*) SA_GET_SYM_TAGNDX (symbolP
))->sy_number
);
2671 symbol_number
+= 1 + S_GET_NUMBER_AUXILIARY (symbolP
);
2673 return symbol_number
;
2678 crawl_symbols (h
, abfd
)
2684 /* Initialize the stack used to keep track of the matching .bb .be */
2686 block_stack
= stack_init (512, sizeof (symbolS
*));
2688 /* The symbol list should be ordered according to the following sequence
2691 * . debug entries for functions
2692 * . fake symbols for the sections, including.text .data and .bss
2694 * . undefined symbols
2695 * But this is not mandatory. The only important point is to put the
2696 * undefined symbols at the end of the list.
2699 if (symbol_rootP
== NULL
2700 || S_GET_STORAGE_CLASS (symbol_rootP
) != C_FILE
)
2702 c_dot_file_symbol ("fake");
2704 /* Is there a .file symbol ? If not insert one at the beginning. */
2707 * Build up static symbols for the sections, they are filled in later
2711 for (i
= SEG_E0
; i
< SEG_E9
; i
++)
2713 if (segment_info
[i
].scnhdr
.s_name
[0])
2717 strncpy (name
, segment_info
[i
].scnhdr
.s_name
, 8);
2719 segment_info
[i
].dot
= c_section_symbol (name
, i
- SEG_E0
+ 1);
2724 /* Take all the externals out and put them into another chain */
2725 H_SET_SYMBOL_TABLE_SIZE (h
, yank_symbols ());
2726 /* Take the externals and glue them onto the end.*/
2727 H_SET_SYMBOL_TABLE_SIZE (h
, H_GET_SYMBOL_COUNT (h
) + glue_symbols ());
2729 H_SET_SYMBOL_TABLE_SIZE (h
, tie_tags ());
2730 know (symbol_externP
== NULL
);
2731 know (symbol_extern_lastP
== NULL
);
2735 * Find strings by crawling along symbol table chain.
2744 /* Gotta do md_ byte-ordering stuff for string_byte_count first - KWK */
2745 md_number_to_chars (where
, (valueT
) string_byte_count
, 4);
2747 for (symbolP
= symbol_rootP
;
2749 symbolP
= symbol_next (symbolP
))
2753 if (SF_GET_STRING (symbolP
))
2755 size
= strlen (S_GET_NAME (symbolP
)) + 1;
2757 memcpy (where
, S_GET_NAME (symbolP
), size
);
2765 do_linenos_for (abfd
, h
, file_cursor
)
2768 unsigned long *file_cursor
;
2771 unsigned long start
= *file_cursor
;
2773 for (idx
= SEG_E0
; idx
< SEG_E9
; idx
++)
2775 segment_info_type
*s
= segment_info
+ idx
;
2778 if (s
->scnhdr
.s_nlnno
!= 0)
2780 struct lineno_list
*line_ptr
;
2782 struct external_lineno
*buffer
=
2783 (struct external_lineno
*) xmalloc (s
->scnhdr
.s_nlnno
* LINESZ
);
2785 struct external_lineno
*dst
= buffer
;
2787 /* Run through the table we've built and turn it into its external
2788 form, take this chance to remove duplicates */
2790 for (line_ptr
= s
->lineno_list_head
;
2791 line_ptr
!= (struct lineno_list
*) NULL
;
2792 line_ptr
= line_ptr
->next
)
2795 if (line_ptr
->line
.l_lnno
== 0)
2797 /* Turn a pointer to a symbol into the symbols' index */
2798 line_ptr
->line
.l_addr
.l_symndx
=
2799 ((symbolS
*) line_ptr
->line
.l_addr
.l_symndx
)->sy_number
;
2803 line_ptr
->line
.l_addr
.l_paddr
+= ((struct frag
*) (line_ptr
->frag
))->fr_address
;
2807 (void) bfd_coff_swap_lineno_out (abfd
, &(line_ptr
->line
), dst
);
2812 s
->scnhdr
.s_lnnoptr
= *file_cursor
;
2814 bfd_write (buffer
, 1, s
->scnhdr
.s_nlnno
* LINESZ
, abfd
);
2817 *file_cursor
+= s
->scnhdr
.s_nlnno
* LINESZ
;
2820 H_SET_LINENO_SIZE (h
, *file_cursor
- start
);
2824 /* Now we run through the list of frag chains in a segment and
2825 make all the subsegment frags appear at the end of the
2826 list, as if the seg 0 was extra long */
2833 for (i
= SEG_E0
; i
< SEG_UNKNOWN
; i
++)
2835 frchainS
*head
= segment_info
[i
].frchainP
;
2837 fragS
*prev_frag
= &dummy
;
2839 while (head
&& head
->frch_seg
== i
)
2841 prev_frag
->fr_next
= head
->frch_root
;
2842 prev_frag
= head
->frch_last
;
2843 head
= head
->frch_next
;
2845 prev_frag
->fr_next
= 0;
2849 unsigned long machine
;
2852 write_object_file ()
2856 struct frchain
*frchain_ptr
;
2858 object_headers headers
;
2859 unsigned long file_cursor
;
2862 abfd
= bfd_openw (out_file_name
, TARGET_FORMAT
);
2867 as_perror ("FATAL: Can't create %s", out_file_name
);
2868 exit (EXIT_FAILURE
);
2870 bfd_set_format (abfd
, bfd_object
);
2871 bfd_set_arch_mach (abfd
, BFD_ARCH
, machine
);
2873 string_byte_count
= 4;
2875 for (frchain_ptr
= frchain_root
;
2876 frchain_ptr
!= (struct frchain
*) NULL
;
2877 frchain_ptr
= frchain_ptr
->frch_next
)
2879 /* Run through all the sub-segments and align them up. Also
2880 close any open frags. We tack a .fill onto the end of the
2881 frag chain so that any .align's size can be worked by looking
2882 at the next frag. */
2884 subseg_set (frchain_ptr
->frch_seg
, frchain_ptr
->frch_subseg
);
2885 #ifndef SUB_SEGMENT_ALIGN
2886 #define SUB_SEGMENT_ALIGN(SEG) 1
2888 frag_align (SUB_SEGMENT_ALIGN (now_seg
), NOP_OPCODE
);
2889 frag_wane (frag_now
);
2890 frag_now
->fr_fix
= 0;
2891 know (frag_now
->fr_next
== NULL
);
2898 for (i
= SEG_E0
; i
< SEG_UNKNOWN
; i
++)
2900 relax_segment (segment_info
[i
].frchainP
->frch_root
, i
);
2903 H_SET_NUMBER_OF_SECTIONS (&headers
, 0);
2905 /* Find out how big the sections are, and set the addresses. */
2907 for (i
= SEG_E0
; i
< SEG_UNKNOWN
; i
++)
2911 segment_info
[i
].scnhdr
.s_paddr
= addr
;
2912 segment_info
[i
].scnhdr
.s_vaddr
= addr
;
2914 if (segment_info
[i
].scnhdr
.s_name
[0])
2916 H_SET_NUMBER_OF_SECTIONS (&headers
,
2917 H_GET_NUMBER_OF_SECTIONS (&headers
) + 1);
2920 size
= size_section (abfd
, (unsigned int) i
);
2923 /* I think the section alignment is only used on the i960; the
2924 i960 needs it, and it should do no harm on other targets. */
2925 segment_info
[i
].scnhdr
.s_align
= section_alignment
[i
];
2928 H_SET_TEXT_SIZE (&headers
, size
);
2929 else if (i
== SEG_E1
)
2930 H_SET_DATA_SIZE (&headers
, size
);
2931 else if (i
== SEG_E2
)
2932 H_SET_BSS_SIZE (&headers
, size
);
2935 /* Turn the gas native symbol table shape into a coff symbol table */
2936 crawl_symbols (&headers
, abfd
);
2938 if (string_byte_count
== 4)
2939 string_byte_count
= 0;
2941 H_SET_STRING_SIZE (&headers
, string_byte_count
);
2943 #if !defined(TC_H8300) && !defined(TC_Z8K)
2944 for (i
= SEG_E0
; i
< SEG_UNKNOWN
; i
++)
2946 fixup_mdeps (segment_info
[i
].frchainP
->frch_root
, &headers
, i
);
2947 fixup_segment (&segment_info
[i
], i
);
2951 /* Look for ".stab" segments and fill in their initial symbols
2953 for (i
= SEG_E0
; i
< SEG_UNKNOWN
; i
++)
2955 name
= segment_info
[i
].scnhdr
.s_name
;
2958 && strncmp (".stab", name
, 5) == 0
2959 && strncmp (".stabstr", name
, 8) != 0)
2960 adjust_stab_section (abfd
, i
);
2963 file_cursor
= H_GET_TEXT_FILE_OFFSET (&headers
);
2965 bfd_seek (abfd
, (file_ptr
) file_cursor
, 0);
2967 /* Plant the data */
2969 fill_section (abfd
, &headers
, &file_cursor
);
2971 do_relocs_for (abfd
, &headers
, &file_cursor
);
2973 do_linenos_for (abfd
, &headers
, &file_cursor
);
2975 H_SET_FILE_MAGIC_NUMBER (&headers
, COFF_MAGIC
);
2976 #ifndef OBJ_COFF_OMIT_TIMESTAMP
2977 H_SET_TIME_STAMP (&headers
, (long)time((long*)0));
2979 H_SET_TIME_STAMP (&headers
, 0);
2981 #ifdef TC_COFF_SET_MACHINE
2982 TC_COFF_SET_MACHINE (&headers
);
2985 #ifdef KEEP_RELOC_INFO
2986 H_SET_FLAGS (&headers
, ((H_GET_LINENO_SIZE(&headers
) ? 0 : F_LNNO
) |
2987 COFF_FLAGS
| coff_flags
));
2989 H_SET_FLAGS (&headers
, ((H_GET_LINENO_SIZE(&headers
) ? 0 : F_LNNO
) |
2990 (H_GET_RELOCATION_SIZE(&headers
) ? 0 : F_RELFLG
) |
2991 COFF_FLAGS
| coff_flags
));
2995 unsigned int symtable_size
= H_GET_SYMBOL_TABLE_SIZE (&headers
);
2996 char *buffer1
= xmalloc (symtable_size
+ string_byte_count
+ 1);
2998 H_SET_SYMBOL_TABLE_POINTER (&headers
, bfd_tell (abfd
));
2999 w_symbols (abfd
, buffer1
, symbol_rootP
);
3000 if (string_byte_count
> 0)
3001 w_strings (buffer1
+ symtable_size
);
3002 bfd_write (buffer1
, 1, symtable_size
+ string_byte_count
, abfd
);
3006 coff_header_append (abfd
, &headers
);
3008 /* Recent changes to write need this, but where it should
3009 go is up to Ken.. */
3010 if (bfd_close_all_done (abfd
) == false)
3011 as_fatal ("Can't close %s: %s", out_file_name
,
3012 bfd_errmsg (bfd_get_error ()));
3015 extern bfd
*stdoutput
;
3022 /* Add a new segment. This is called from subseg_new via the
3023 obj_new_segment macro. */
3026 obj_coff_add_segment (name
)
3032 /* Find out if we've already got a section of this name. */
3033 len
= strlen (name
);
3034 if (len
< sizeof (segment_info
[i
].scnhdr
.s_name
))
3037 len
= sizeof (segment_info
[i
].scnhdr
.s_name
);
3038 for (i
= SEG_E0
; i
< SEG_E9
&& segment_info
[i
].scnhdr
.s_name
[0]; i
++)
3039 if (strncmp (segment_info
[i
].scnhdr
.s_name
, name
, len
) == 0
3040 && (len
== sizeof (segment_info
[i
].scnhdr
.s_name
)
3041 || segment_info
[i
].scnhdr
.s_name
[len
] == '\0'))
3046 as_bad ("Too many new sections; can't add \"%s\"", name
);
3050 /* Add a new section. */
3051 strncpy (segment_info
[i
].scnhdr
.s_name
, name
,
3052 sizeof (segment_info
[i
].scnhdr
.s_name
));
3053 segment_info
[i
].scnhdr
.s_flags
= STYP_REG
;
3059 * implement the .section pseudo op:
3060 * .section name {, "flags"}
3062 * | +--- optional flags: 'b' for bss
3064 * +-- section name 'l' for lib
3068 * 'd' (apparently m88k for data)
3070 * But if the argument is not a quoted string, treat it as a
3071 * subsegment number.
3075 obj_coff_section (ignore
)
3078 /* Strip out the section name */
3080 char *section_name_end
;
3087 section_name
= input_line_pointer
;
3088 c
= get_symbol_end ();
3089 section_name_end
= input_line_pointer
;
3091 len
= section_name_end
- section_name
;
3092 input_line_pointer
++;
3098 else if (*input_line_pointer
== ',')
3101 ++input_line_pointer
;
3109 if (*input_line_pointer
!= '"')
3110 exp
= get_absolute_expression ();
3113 ++input_line_pointer
;
3114 while (*input_line_pointer
!= '"'
3115 && ! is_end_of_line
[(unsigned char) *input_line_pointer
])
3117 switch (*input_line_pointer
)
3119 case 'b': flags
|= STYP_BSS
; break;
3120 case 'i': flags
|= STYP_INFO
; break;
3121 case 'l': flags
|= STYP_LIB
; break;
3122 case 'n': flags
|= STYP_NOLOAD
; break;
3123 case 'o': flags
|= STYP_OVER
; break;
3125 case 'w': flags
|= STYP_DATA
; break;
3126 case 'x': flags
|= STYP_TEXT
; break;
3128 as_warn("unknown section attribute '%c'",
3129 *input_line_pointer
);
3132 ++input_line_pointer
;
3134 if (*input_line_pointer
== '"')
3135 ++input_line_pointer
;
3139 subseg_new (section_name
, (subsegT
) exp
);
3141 segment_info
[now_seg
].scnhdr
.s_flags
|= flags
;
3143 *section_name_end
= c
;
3148 obj_coff_text (ignore
)
3151 subseg_new (".text", get_absolute_expression ());
3156 obj_coff_data (ignore
)
3159 if (flag_readonly_data_in_text
)
3160 subseg_new (".text", get_absolute_expression () + 1000);
3162 subseg_new (".data", get_absolute_expression ());
3166 obj_coff_bss (ignore
)
3169 if (*input_line_pointer
== '\n') /* .bss */
3170 subseg_new(".bss", get_absolute_expression());
3171 else /* .bss id,expr */
3176 obj_coff_ident (ignore
)
3179 segT current_seg
= now_seg
; /* save current seg */
3180 subsegT current_subseg
= now_subseg
;
3181 subseg_new (".comment", 0); /* .comment seg */
3182 stringer (1); /* read string */
3183 subseg_set (current_seg
, current_subseg
); /* restore current seg */
3187 c_symbol_merge (debug
, normal
)
3191 S_SET_DATA_TYPE (normal
, S_GET_DATA_TYPE (debug
));
3192 S_SET_STORAGE_CLASS (normal
, S_GET_STORAGE_CLASS (debug
));
3194 if (S_GET_NUMBER_AUXILIARY (debug
) > S_GET_NUMBER_AUXILIARY (normal
))
3196 S_SET_NUMBER_AUXILIARY (normal
, S_GET_NUMBER_AUXILIARY (debug
));
3197 } /* take the most we have */
3199 if (S_GET_NUMBER_AUXILIARY (debug
) > 0)
3201 memcpy ((char *) &normal
->sy_symbol
.ost_auxent
[0],
3202 (char *) &debug
->sy_symbol
.ost_auxent
[0],
3203 (unsigned int) (S_GET_NUMBER_AUXILIARY (debug
) * AUXESZ
));
3204 } /* Move all the auxiliary information */
3206 /* Move the debug flags. */
3207 SF_SET_DEBUG_FIELD (normal
, SF_GET_DEBUG_FIELD (debug
));
3208 } /* c_symbol_merge() */
3211 c_line_new (symbol
, paddr
, line_number
, frag
)
3217 struct lineno_list
*new_line
=
3218 (struct lineno_list
*) xmalloc (sizeof (struct lineno_list
));
3220 segment_info_type
*s
= segment_info
+ now_seg
;
3221 new_line
->line
.l_lnno
= line_number
;
3223 if (line_number
== 0)
3225 last_line_symbol
= symbol
;
3226 new_line
->line
.l_addr
.l_symndx
= (long) symbol
;
3230 new_line
->line
.l_addr
.l_paddr
= paddr
;
3233 new_line
->frag
= (char *) frag
;
3234 new_line
->next
= (struct lineno_list
*) NULL
;
3237 if (s
->lineno_list_head
== (struct lineno_list
*) NULL
)
3239 s
->lineno_list_head
= new_line
;
3243 s
->lineno_list_tail
->next
= new_line
;
3245 s
->lineno_list_tail
= new_line
;
3246 return LINESZ
* s
->scnhdr
.s_nlnno
++;
3250 c_dot_file_symbol (filename
)
3255 symbolP
= symbol_new (".file",
3258 &zero_address_frag
);
3260 S_SET_STORAGE_CLASS (symbolP
, C_FILE
);
3261 S_SET_NUMBER_AUXILIARY (symbolP
, 1);
3262 SA_SET_FILE_FNAME (symbolP
, filename
);
3268 listing_source_file (filename
);
3274 SF_SET_DEBUG (symbolP
);
3275 S_SET_VALUE (symbolP
, (valueT
) previous_file_symbol
);
3277 previous_file_symbol
= symbolP
;
3279 /* Make sure that the symbol is first on the symbol chain */
3280 if (symbol_rootP
!= symbolP
)
3282 if (symbolP
== symbol_lastP
)
3284 symbol_lastP
= symbol_lastP
->sy_previous
;
3285 } /* if it was the last thing on the list */
3287 symbol_remove (symbolP
, &symbol_rootP
, &symbol_lastP
);
3288 symbol_insert (symbolP
, symbol_rootP
, &symbol_rootP
, &symbol_lastP
);
3289 symbol_rootP
= symbolP
;
3290 } /* if not first on the list */
3292 } /* c_dot_file_symbol() */
3295 * Build a 'section static' symbol.
3299 c_section_symbol (name
, idx
)
3305 symbolP
= symbol_new (name
, idx
,
3307 &zero_address_frag
);
3309 S_SET_STORAGE_CLASS (symbolP
, C_STAT
);
3310 S_SET_NUMBER_AUXILIARY (symbolP
, 1);
3312 SF_SET_STATICS (symbolP
);
3315 } /* c_section_symbol() */
3318 w_symbols (abfd
, where
, symbol_rootP
)
3321 symbolS
* symbol_rootP
;
3326 /* First fill in those values we have only just worked out */
3327 for (i
= SEG_E0
; i
< SEG_E9
; i
++)
3329 symbolP
= segment_info
[i
].dot
;
3332 SA_SET_SCN_SCNLEN (symbolP
, segment_info
[i
].scnhdr
.s_size
);
3333 SA_SET_SCN_NRELOC (symbolP
, segment_info
[i
].scnhdr
.s_nreloc
);
3334 SA_SET_SCN_NLINNO (symbolP
, segment_info
[i
].scnhdr
.s_nlnno
);
3339 * Emit all symbols left in the symbol chain.
3341 for (symbolP
= symbol_rootP
; symbolP
; symbolP
= symbol_next (symbolP
))
3343 /* Used to save the offset of the name. It is used to point
3344 to the string in memory but must be a file offset. */
3345 register char *temp
;
3347 tc_coff_symbol_emit_hook (symbolP
);
3349 temp
= S_GET_NAME (symbolP
);
3350 if (SF_GET_STRING (symbolP
))
3352 S_SET_OFFSET (symbolP
, symbolP
->sy_name_offset
);
3353 S_SET_ZEROES (symbolP
, 0);
3357 memset (symbolP
->sy_symbol
.ost_entry
.n_name
, 0, SYMNMLEN
);
3358 strncpy (symbolP
->sy_symbol
.ost_entry
.n_name
, temp
, SYMNMLEN
);
3360 where
= symbol_to_chars (abfd
, where
, symbolP
);
3361 S_SET_NAME (symbolP
, temp
);
3367 obj_coff_lcomm (ignore
)
3380 name
= input_line_pointer
;
3382 c
= get_symbol_end ();
3383 p
= input_line_pointer
;
3386 if (*input_line_pointer
!= ',')
3388 as_bad ("Expected comma after name");
3389 ignore_rest_of_line ();
3392 if (*input_line_pointer
== '\n')
3394 as_bad ("Missing size expression");
3397 input_line_pointer
++;
3398 if ((temp
= get_absolute_expression ()) < 0)
3400 as_warn ("lcomm length (%d.) <0! Ignored.", temp
);
3401 ignore_rest_of_line ();
3406 symbolP
= symbol_find_or_make(name
);
3408 if (S_GET_SEGMENT(symbolP
) == SEG_UNKNOWN
&&
3409 S_GET_VALUE(symbolP
) == 0)
3414 segT current_seg
= now_seg
; /* save current seg */
3415 subsegT current_subseg
= now_subseg
;
3417 subseg_set (SEG_E2
, 1);
3418 symbolP
->sy_frag
= frag_now
;
3419 p
= frag_var(rs_org
, 1, 1, (relax_substateT
)0, symbolP
,
3422 subseg_set (current_seg
, current_subseg
); /* restore current seg */
3423 S_SET_SEGMENT(symbolP
, SEG_E2
);
3424 S_SET_STORAGE_CLASS(symbolP
, C_STAT
);
3428 as_bad("Symbol %s already defined", name
);
3430 demand_empty_rest_of_line();
3435 fixup_mdeps (frags
, h
, this_segment
)
3440 subseg_change (this_segment
, 0);
3443 switch (frags
->fr_type
)
3447 frags
->fr_type
= rs_fill
;
3449 (frags
->fr_next
->fr_address
- frags
->fr_address
- frags
->fr_fix
);
3451 case rs_machine_dependent
:
3452 md_convert_frag (h
, frags
);
3458 frags
= frags
->fr_next
;
3464 fixup_segment (segP
, this_segment_type
)
3465 segment_info_type
* segP
;
3466 segT this_segment_type
;
3468 register fixS
* fixP
;
3469 register symbolS
*add_symbolP
;
3470 register symbolS
*sub_symbolP
;
3471 register long add_number
;
3473 register char *place
;
3474 register long where
;
3475 register char pcrel
;
3476 register fragS
*fragP
;
3477 register segT add_symbol_segment
= absolute_section
;
3480 for (fixP
= segP
->fix_root
; fixP
; fixP
= fixP
->fx_next
)
3482 fragP
= fixP
->fx_frag
;
3484 where
= fixP
->fx_where
;
3485 place
= fragP
->fr_literal
+ where
;
3486 size
= fixP
->fx_size
;
3487 add_symbolP
= fixP
->fx_addsy
;
3489 if (fixP
->fx_tcbit
&& SF_GET_CALLNAME (add_symbolP
))
3491 /* Relocation should be done via the associated 'bal' entry
3494 if (!SF_GET_BALNAME (tc_get_bal_of_call (add_symbolP
)))
3496 as_bad_where (fixP
->fx_file
, fixP
->fx_line
,
3497 "No 'bal' entry point for leafproc %s",
3498 S_GET_NAME (add_symbolP
));
3501 fixP
->fx_addsy
= add_symbolP
= tc_get_bal_of_call (add_symbolP
);
3504 sub_symbolP
= fixP
->fx_subsy
;
3505 add_number
= fixP
->fx_offset
;
3506 pcrel
= fixP
->fx_pcrel
;
3510 add_symbol_segment
= S_GET_SEGMENT (add_symbolP
);
3511 } /* if there is an addend */
3518 if (S_GET_SEGMENT (sub_symbolP
) != absolute_section
)
3520 as_bad_where (fixP
->fx_file
, fixP
->fx_line
,
3521 "Negative of non-absolute symbol %s",
3522 S_GET_NAME (sub_symbolP
));
3523 } /* not absolute */
3525 add_number
-= S_GET_VALUE (sub_symbolP
);
3528 /* if sub_symbol is in the same segment that add_symbol
3529 and add_symbol is either in DATA, TEXT, BSS or ABSOLUTE */
3531 else if ((S_GET_SEGMENT (sub_symbolP
) == add_symbol_segment
)
3532 && (SEG_NORMAL (add_symbol_segment
)
3533 || (add_symbol_segment
== absolute_section
)))
3535 /* Difference of 2 symbols from same segment. Can't
3536 make difference of 2 undefineds: 'value' means
3537 something different for N_UNDF. */
3539 /* Makes no sense to use the difference of 2 arbitrary symbols
3540 as the target of a call instruction. */
3543 as_bad_where (fixP
->fx_file
, fixP
->fx_line
,
3544 "callj to difference of 2 symbols");
3546 #endif /* TC_I960 */
3547 add_number
+= S_GET_VALUE (add_symbolP
) -
3548 S_GET_VALUE (sub_symbolP
);
3551 fixP
->fx_addsy
= NULL
;
3552 fixP
->fx_subsy
= NULL
;
3557 /* Different segments in subtraction. */
3558 know (!(S_IS_EXTERNAL (sub_symbolP
) && (S_GET_SEGMENT (sub_symbolP
) == absolute_section
)));
3560 if ((S_GET_SEGMENT (sub_symbolP
) == absolute_section
))
3562 add_number
-= S_GET_VALUE (sub_symbolP
);
3565 else if (S_GET_SEGMENT (sub_symbolP
) == this_segment_type
3566 #if 0 /* Okay for 68k, at least... */
3571 /* Make it pc-relative. */
3572 add_number
+= (md_pcrel_from (fixP
)
3573 - S_GET_VALUE (sub_symbolP
));
3582 as_bad_where (fixP
->fx_file
, fixP
->fx_line
,
3583 "Can't emit reloc {- %s-seg symbol \"%s\"} @ file address %ld.",
3584 segment_name (S_GET_SEGMENT (sub_symbolP
)),
3585 S_GET_NAME (sub_symbolP
),
3586 (long) (fragP
->fr_address
+ where
));
3589 } /* if sub_symbolP */
3593 if (add_symbol_segment
== this_segment_type
&& pcrel
)
3596 * This fixup was made when the symbol's segment was
3597 * SEG_UNKNOWN, but it is now in the local segment.
3598 * So we know how to do the address without relocation.
3601 /* reloc_callj() may replace a 'call' with a 'calls' or a 'bal',
3602 * in which cases it modifies *fixP as appropriate. In the case
3603 * of a 'calls', no further work is required, and *fixP has been
3604 * set up to make the rest of the code below a no-op.
3607 #endif /* TC_I960 */
3609 add_number
+= S_GET_VALUE (add_symbolP
);
3610 add_number
-= md_pcrel_from (fixP
);
3611 #if defined (TC_I386) || defined (TE_LYNX)
3612 /* On the 386 we must adjust by the segment
3613 vaddr as well. Ian Taylor. */
3614 add_number
-= segP
->scnhdr
.s_vaddr
;
3616 pcrel
= 0; /* Lie. Don't want further pcrel processing. */
3617 fixP
->fx_addsy
= NULL
;
3622 switch (add_symbol_segment
)
3624 case absolute_section
:
3626 reloc_callj (fixP
); /* See comment about reloc_callj() above*/
3627 #endif /* TC_I960 */
3628 add_number
+= S_GET_VALUE (add_symbolP
);
3629 fixP
->fx_addsy
= NULL
;
3636 /* This really should be handled in the linker, but
3637 backward compatibility forbids. */
3638 add_number
+= S_GET_VALUE (add_symbolP
);
3640 add_number
+= S_GET_VALUE (add_symbolP
) +
3641 segment_info
[S_GET_SEGMENT (add_symbolP
)].scnhdr
.s_paddr
;
3647 if ((int) fixP
->fx_bit_fixP
== 13)
3649 /* This is a COBR instruction. They have only a
3650 * 13-bit displacement and are only to be used
3651 * for local branches: flag as error, don't generate
3654 as_bad_where (fixP
->fx_file
, fixP
->fx_line
,
3655 "can't use COBR format with external label");
3656 fixP
->fx_addsy
= NULL
;
3660 #endif /* TC_I960 */
3661 #if defined (TC_I386) || defined (TE_LYNX)
3662 /* 386 COFF uses a peculiar format in
3663 which the value of a common symbol is
3664 stored in the .text segment (I've
3665 checked this on SVR3.2 and SCO 3.2.2)
3666 Ian Taylor <ian@cygnus.com>. */
3667 if (S_IS_COMMON (add_symbolP
))
3668 add_number
+= S_GET_VALUE (add_symbolP
);
3673 } /* switch on symbol seg */
3674 } /* if not in local seg */
3675 } /* if there was a + symbol */
3680 /* This adjustment is not correct on the m88k, for which the
3681 linker does all the computation. */
3682 add_number
-= md_pcrel_from (fixP
);
3684 if (add_symbolP
== 0)
3686 fixP
->fx_addsy
= &abs_symbol
;
3687 } /* if there's an add_symbol */
3688 #if defined (TC_I386) || defined (TE_LYNX)
3689 /* On the 386 we must adjust by the segment vaddr
3690 as well. Ian Taylor. */
3691 add_number
-= segP
->scnhdr
.s_vaddr
;
3695 if (!fixP
->fx_bit_fixP
)
3698 /* The m88k uses the offset field of the reloc to get around
3701 && (add_number
& ~0xFF)
3702 && ((add_number
& ~0xFF) != (-1 & ~0xFF)))
3704 && (add_number
& ~0xFFFF)
3705 && ((add_number
& ~0xFFFF) != (-1 & ~0xFFFF))))
3707 as_bad_where (fixP
->fx_file
, fixP
->fx_line
,
3708 "Value of %ld too large for field of %d bytes at 0x%lx",
3709 (long) add_number
, size
,
3710 (unsigned long) (fragP
->fr_address
+ where
));
3713 #ifdef WARN_SIGNED_OVERFLOW_WORD
3714 /* Warn if a .word value is too large when treated as
3715 a signed number. We already know it is not too
3716 negative. This is to catch over-large switches
3717 generated by gcc on the 68k. */
3718 if (!flag_signed_overflow_ok
3720 && add_number
> 0x7fff)
3721 as_bad_where (fixP
->fx_file
, fixP
->fx_line
,
3722 "Signed .word overflow; switch may be too large; %ld at 0x%lx",
3724 (unsigned long) (fragP
->fr_address
+ where
));
3726 } /* not a bit fix */
3727 /* once this fix has been applied, we don't have to output anything
3728 nothing more need be done -*/
3729 md_apply_fix (fixP
, add_number
);
3730 } /* For each fixS in this segment. */
3731 } /* fixup_segment() */
3735 /* The first entry in a .stab section is special. */
3738 obj_coff_init_stab_section (seg
)
3744 unsigned int stroff
;
3746 /* Make space for this first symbol. */
3750 as_where (&file
, (unsigned int *) NULL
);
3751 stabstr_name
= (char *) alloca (strlen (segment_info
[seg
].scnhdr
.s_name
) + 4);
3752 strcpy (stabstr_name
, segment_info
[seg
].scnhdr
.s_name
);
3753 strcat (stabstr_name
, "str");
3754 stroff
= get_stab_string_offset (file
, stabstr_name
);
3756 md_number_to_chars (p
, stroff
, 4);
3759 /* Fill in the counts in the first entry in a .stab section. */
3762 adjust_stab_section(abfd
, seg
)
3766 segT stabstrseg
= SEG_UNKNOWN
;
3767 char *secname
, *name
, *name2
;
3769 int i
, strsz
= 0, nsyms
;
3770 fragS
*frag
= segment_info
[seg
].frchainP
->frch_root
;
3772 /* Look for the associated string table section. */
3774 secname
= segment_info
[seg
].scnhdr
.s_name
;
3775 name
= (char *) alloca (strlen (secname
) + 4);
3776 strcpy (name
, secname
);
3777 strcat (name
, "str");
3779 for (i
= SEG_E0
; i
< SEG_UNKNOWN
; i
++)
3781 name2
= segment_info
[i
].scnhdr
.s_name
;
3782 if (name2
!= NULL
&& strncmp(name2
, name
, 8) == 0)
3789 /* If we found the section, get its size. */
3790 if (stabstrseg
!= SEG_UNKNOWN
)
3791 strsz
= size_section (abfd
, stabstrseg
);
3793 nsyms
= size_section (abfd
, seg
) / 12 - 1;
3795 /* Look for the first frag of sufficient size for the initial stab
3796 symbol, and collect a pointer to it. */
3797 while (frag
&& frag
->fr_fix
< 12)
3798 frag
= frag
->fr_next
;
3800 p
= frag
->fr_literal
;
3803 /* Write in the number of stab symbols and the size of the string
3805 bfd_h_put_16 (abfd
, (bfd_vma
) nsyms
, (bfd_byte
*) p
+ 6);
3806 bfd_h_put_32 (abfd
, (bfd_vma
) strsz
, (bfd_byte
*) p
+ 8);
3809 #endif /* not BFD_ASSEMBLER */
3811 const pseudo_typeS obj_pseudo_table
[] =
3813 {"def", obj_coff_def
, 0},
3814 {"dim", obj_coff_dim
, 0},
3815 {"endef", obj_coff_endef
, 0},
3816 {"line", obj_coff_line
, 0},
3817 {"ln", obj_coff_ln
, 0},
3818 {"appline", obj_coff_ln
, 1},
3819 {"scl", obj_coff_scl
, 0},
3820 {"size", obj_coff_size
, 0},
3821 {"tag", obj_coff_tag
, 0},
3822 {"type", obj_coff_type
, 0},
3823 {"val", obj_coff_val
, 0},
3824 {"section", obj_coff_section
, 0},
3825 #ifndef BFD_ASSEMBLER
3826 {"use", obj_coff_section
, 0},
3827 {"sect", obj_coff_section
, 0},
3828 {"text", obj_coff_text
, 0},
3829 {"data", obj_coff_data
, 0},
3830 {"bss", obj_coff_bss
, 0},
3831 {"lcomm", obj_coff_lcomm
, 0},
3832 {"ident", obj_coff_ident
, 0},
3834 {"optim", s_ignore
, 0}, /* For sun386i cc (?) */
3835 {"ident", s_ignore
, 0}, /* we don't yet handle this. */
3837 {"ABORT", s_abort
, 0},
3839 /* The m88k uses sdef instead of def. */
3840 {"sdef", obj_coff_def
, 0},
3842 {NULL
} /* end sentinel */
3843 }; /* obj_pseudo_table */