1 /* coff object file format
2 Copyright 1989, 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998,
4 Free Software Foundation, Inc.
6 This file is part of GAS.
8 GAS is free software; you can redistribute it and/or modify
9 it under the terms of the GNU General Public License as published by
10 the Free Software Foundation; either version 2, or (at your option)
13 GAS is distributed in the hope that it will be useful,
14 but WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 GNU General Public License for more details.
18 You should have received a copy of the GNU General Public License
19 along with GAS; see the file COPYING. If not, write to the Free
20 Software Foundation, 59 Temple Place - Suite 330, Boston, MA
23 #define OBJ_HEADER "obj-coff.h"
29 /* I think this is probably always correct. */
30 #ifndef KEEP_RELOC_INFO
31 #define KEEP_RELOC_INFO
34 /* The BFD_ASSEMBLER version of obj_coff_section will use this macro to set
35 a new section's attributes when a directive has no valid flags or the
36 "w" flag is used. This default should be appropriate for most. */
37 #ifndef TC_COFF_SECTION_DEFAULT_ATTRIBUTES
38 #define TC_COFF_SECTION_DEFAULT_ATTRIBUTES (SEC_LOAD | SEC_DATA)
41 /* This is used to hold the symbol built by a sequence of pseudo-ops
42 from .def and .endef. */
43 static symbolS
*def_symbol_in_progress
;
47 unsigned long chunk_size
;
48 unsigned long element_size
;
51 unsigned long pointer
;
55 static stack
*stack_init
PARAMS ((unsigned long, unsigned long));
56 static char *stack_push
PARAMS ((stack
*, char *));
57 static char *stack_pop
PARAMS ((stack
*));
58 static void tag_init
PARAMS ((void));
59 static void tag_insert
PARAMS ((const char *, symbolS
*));
60 static symbolS
*tag_find
PARAMS ((char *));
61 static symbolS
*tag_find_or_make
PARAMS ((char *));
62 static void obj_coff_bss
PARAMS ((int));
63 static void obj_coff_weak
PARAMS ((int));
64 const char *s_get_name
PARAMS ((symbolS
* s
));
65 static void obj_coff_ln
PARAMS ((int));
66 static void obj_coff_def
PARAMS ((int));
67 static void obj_coff_endef
PARAMS ((int));
68 static void obj_coff_dim
PARAMS ((int));
69 static void obj_coff_line
PARAMS ((int));
70 static void obj_coff_size
PARAMS ((int));
71 static void obj_coff_scl
PARAMS ((int));
72 static void obj_coff_tag
PARAMS ((int));
73 static void obj_coff_val
PARAMS ((int));
74 static void obj_coff_type
PARAMS ((int));
75 static void obj_coff_ident
PARAMS ((int));
77 static void obj_coff_loc
PARAMS((int));
83 stack_init (chunk_size
, element_size
)
84 unsigned long chunk_size
;
85 unsigned long element_size
;
89 st
= (stack
*) malloc (sizeof (stack
));
92 st
->data
= malloc (chunk_size
);
99 st
->size
= chunk_size
;
100 st
->chunk_size
= chunk_size
;
101 st
->element_size
= element_size
;
106 /* Not currently used. */
117 stack_push (st
, element
)
121 if (st
->pointer
+ st
->element_size
>= st
->size
)
123 st
->size
+= st
->chunk_size
;
124 if ((st
->data
= xrealloc (st
->data
, st
->size
)) == (char *) 0)
127 memcpy (st
->data
+ st
->pointer
, element
, st
->element_size
);
128 st
->pointer
+= st
->element_size
;
129 return st
->data
+ st
->pointer
;
136 if (st
->pointer
< st
->element_size
)
141 st
->pointer
-= st
->element_size
;
142 return st
->data
+ st
->pointer
;
146 * Maintain a list of the tagnames of the structres.
149 static struct hash_control
*tag_hash
;
154 tag_hash
= hash_new ();
158 tag_insert (name
, symbolP
)
162 const char *error_string
;
164 if ((error_string
= hash_jam (tag_hash
, name
, (char *) symbolP
)))
166 as_fatal (_("Inserting \"%s\" into structure table failed: %s"),
175 #ifdef STRIP_UNDERSCORE
178 #endif /* STRIP_UNDERSCORE */
179 return (symbolS
*) hash_find (tag_hash
, name
);
183 tag_find_or_make (name
)
188 if ((symbolP
= tag_find (name
)) == NULL
)
190 symbolP
= symbol_new (name
, undefined_section
,
191 0, &zero_address_frag
);
193 tag_insert (S_GET_NAME (symbolP
), symbolP
);
195 symbol_table_insert (symbolP
);
202 /* We accept the .bss directive to set the section for backward
203 compatibility with earlier versions of gas. */
206 obj_coff_bss (ignore
)
207 int ignore ATTRIBUTE_UNUSED
;
209 if (*input_line_pointer
== '\n')
210 subseg_new (".bss", get_absolute_expression ());
215 /* Handle .weak. This is a GNU extension. */
218 obj_coff_weak (ignore
)
219 int ignore ATTRIBUTE_UNUSED
;
227 name
= input_line_pointer
;
228 c
= get_symbol_end ();
229 symbolP
= symbol_find_or_make (name
);
230 *input_line_pointer
= c
;
233 #if defined BFD_ASSEMBLER || defined S_SET_WEAK
234 S_SET_WEAK (symbolP
);
238 S_SET_STORAGE_CLASS (symbolP
, C_NT_WEAK
);
240 S_SET_STORAGE_CLASS (symbolP
, C_WEAKEXT
);
245 input_line_pointer
++;
247 if (*input_line_pointer
== '\n')
253 demand_empty_rest_of_line ();
258 static segT fetch_coff_debug_section
PARAMS ((void));
259 static void SA_SET_SYM_TAGNDX
PARAMS ((symbolS
*, symbolS
*));
260 static int S_GET_DATA_TYPE
PARAMS ((symbolS
*));
261 void c_symbol_merge
PARAMS ((symbolS
*, symbolS
*));
262 static void add_lineno
PARAMS ((fragS
*, addressT
, int));
264 #define GET_FILENAME_STRING(X) \
265 ((char*) (&((X)->sy_symbol.ost_auxent->x_file.x_n.x_offset))[1])
269 fetch_coff_debug_section ()
271 static segT debug_section
;
275 s
= bfd_make_debug_symbol (stdoutput
, (char *) 0, 0);
277 debug_section
= s
->section
;
279 return debug_section
;
283 SA_SET_SYM_ENDNDX (sym
, val
)
287 combined_entry_type
*entry
, *p
;
289 entry
= &coffsymbol (symbol_get_bfdsym (sym
))->native
[1];
290 p
= coffsymbol (symbol_get_bfdsym (val
))->native
;
291 entry
->u
.auxent
.x_sym
.x_fcnary
.x_fcn
.x_endndx
.p
= p
;
296 SA_SET_SYM_TAGNDX (sym
, val
)
300 combined_entry_type
*entry
, *p
;
302 entry
= &coffsymbol (symbol_get_bfdsym (sym
))->native
[1];
303 p
= coffsymbol (symbol_get_bfdsym (val
))->native
;
304 entry
->u
.auxent
.x_sym
.x_tagndx
.p
= p
;
309 S_GET_DATA_TYPE (sym
)
312 return coffsymbol (symbol_get_bfdsym (sym
))->native
->u
.syment
.n_type
;
316 S_SET_DATA_TYPE (sym
, val
)
320 coffsymbol (symbol_get_bfdsym (sym
))->native
->u
.syment
.n_type
= val
;
325 S_GET_STORAGE_CLASS (sym
)
328 return coffsymbol (symbol_get_bfdsym (sym
))->native
->u
.syment
.n_sclass
;
332 S_SET_STORAGE_CLASS (sym
, val
)
336 coffsymbol (symbol_get_bfdsym (sym
))->native
->u
.syment
.n_sclass
= val
;
340 /* Merge a debug symbol containing debug information into a normal symbol. */
343 c_symbol_merge (debug
, normal
)
347 S_SET_DATA_TYPE (normal
, S_GET_DATA_TYPE (debug
));
348 S_SET_STORAGE_CLASS (normal
, S_GET_STORAGE_CLASS (debug
));
350 if (S_GET_NUMBER_AUXILIARY (debug
) > S_GET_NUMBER_AUXILIARY (normal
))
352 /* take the most we have */
353 S_SET_NUMBER_AUXILIARY (normal
, S_GET_NUMBER_AUXILIARY (debug
));
356 if (S_GET_NUMBER_AUXILIARY (debug
) > 0)
358 /* Move all the auxiliary information. */
359 memcpy (SYM_AUXINFO (normal
), SYM_AUXINFO (debug
),
360 (S_GET_NUMBER_AUXILIARY (debug
)
361 * sizeof (*SYM_AUXINFO (debug
))));
364 /* Move the debug flags. */
365 SF_SET_DEBUG_FIELD (normal
, SF_GET_DEBUG_FIELD (debug
));
369 c_dot_file_symbol (filename
)
370 const char *filename
;
374 /* BFD converts filename to a .file symbol with an aux entry. It
375 also handles chaining. */
376 symbolP
= symbol_new (filename
, bfd_abs_section_ptr
, 0, &zero_address_frag
);
378 S_SET_STORAGE_CLASS (symbolP
, C_FILE
);
379 S_SET_NUMBER_AUXILIARY (symbolP
, 1);
381 symbol_get_bfdsym (symbolP
)->flags
= BSF_DEBUGGING
;
388 listing_source_file (filename
);
393 /* Make sure that the symbol is first on the symbol chain */
394 if (symbol_rootP
!= symbolP
)
396 symbol_remove (symbolP
, &symbol_rootP
, &symbol_lastP
);
397 symbol_insert (symbolP
, symbol_rootP
, &symbol_rootP
, &symbol_lastP
);
398 } /* if not first on the list */
401 /* Line number handling */
404 struct line_no
*next
;
411 /* Symbol of last function, which we should hang line#s off of. */
412 static symbolS
*line_fsym
;
414 #define in_function() (line_fsym != 0)
415 #define clear_function() (line_fsym = 0)
416 #define set_function(F) (line_fsym = (F), coff_add_linesym (F))
420 coff_obj_symbol_new_hook (symbolP
)
423 long sz
= (OBJ_COFF_MAX_AUXENTRIES
+ 1) * sizeof (combined_entry_type
);
424 char * s
= (char *) xmalloc (sz
);
427 coffsymbol (symbol_get_bfdsym (symbolP
))->native
= (combined_entry_type
*) s
;
429 S_SET_DATA_TYPE (symbolP
, T_NULL
);
430 S_SET_STORAGE_CLASS (symbolP
, 0);
431 S_SET_NUMBER_AUXILIARY (symbolP
, 0);
433 if (S_IS_STRING (symbolP
))
434 SF_SET_STRING (symbolP
);
436 if (S_IS_LOCAL (symbolP
))
437 SF_SET_LOCAL (symbolP
);
442 * Handle .ln directives.
445 static symbolS
*current_lineno_sym
;
446 static struct line_no
*line_nos
;
447 /* @@ Blindly assume all .ln directives will be in the .text section... */
451 add_lineno (frag
, offset
, num
)
456 struct line_no
*new_line
=
457 (struct line_no
*) xmalloc (sizeof (struct line_no
));
458 if (!current_lineno_sym
)
464 /* The native aix assembler accepts negative line number */
468 /* Zero is used as an end marker in the file. */
469 as_warn (_("Line numbers must be positive integers\n"));
472 #endif /* OBJ_XCOFF */
473 new_line
->next
= line_nos
;
474 new_line
->frag
= frag
;
475 new_line
->l
.line_number
= num
;
476 new_line
->l
.u
.offset
= offset
;
482 coff_add_linesym (sym
)
487 coffsymbol (symbol_get_bfdsym (current_lineno_sym
))->lineno
=
492 current_lineno_sym
= sym
;
496 obj_coff_ln (appline
)
501 if (! appline
&& def_symbol_in_progress
!= NULL
)
503 as_warn (_(".ln pseudo-op inside .def/.endef: ignored."));
504 demand_empty_rest_of_line ();
508 l
= get_absolute_expression ();
510 /* If there is no lineno symbol, treat a .ln
511 directive as if it were a .appline directive. */
512 if (appline
|| current_lineno_sym
== NULL
)
513 new_logical_line ((char *) NULL
, l
- 1);
515 add_lineno (frag_now
, frag_now_fix (), l
);
524 l
+= coff_line_base
- 1;
525 listing_source_line (l
);
530 demand_empty_rest_of_line ();
533 /* .loc is essentially the same as .ln; parse it for assembler
537 obj_coff_loc (ignore
)
538 int ignore ATTRIBUTE_UNUSED
;
542 /* FIXME: Why do we need this check? We need it for ECOFF, but why
543 do we need it for COFF? */
544 if (now_seg
!= text_section
)
546 as_warn (_(".loc outside of .text"));
547 demand_empty_rest_of_line ();
551 if (def_symbol_in_progress
!= NULL
)
553 as_warn (_(".loc pseudo-op inside .def/.endef: ignored."));
554 demand_empty_rest_of_line ();
558 /* Skip the file number. */
560 get_absolute_expression ();
563 lineno
= get_absolute_expression ();
571 lineno
+= coff_line_base
- 1;
572 listing_source_line (lineno
);
577 demand_empty_rest_of_line ();
579 add_lineno (frag_now
, frag_now_fix (), lineno
);
582 /* Handle the .ident pseudo-op. */
585 obj_coff_ident (ignore
)
586 int ignore ATTRIBUTE_UNUSED
;
588 segT current_seg
= now_seg
;
589 subsegT current_subseg
= now_subseg
;
595 /* We could put it in .comment, but that creates an extra section
596 that shouldn't be loaded into memory, which requires linker
597 changes... For now, until proven otherwise, use .rdata. */
598 sec
= subseg_new (".rdata$zzz", 0);
599 bfd_set_section_flags (stdoutput
, sec
,
600 ((SEC_ALLOC
| SEC_LOAD
| SEC_READONLY
| SEC_DATA
)
601 & bfd_applicable_section_flags (stdoutput
)));
604 subseg_new (".comment", 0);
608 subseg_set (current_seg
, current_subseg
);
614 * Handle .def directives.
616 * One might ask : why can't we symbol_new if the symbol does not
617 * already exist and fill it with debug information. Because of
618 * the C_EFCN special symbol. It would clobber the value of the
619 * function symbol before we have a chance to notice that it is
620 * a C_EFCN. And a second reason is that the code is more clear this
621 * way. (at least I think it is :-).
625 #define SKIP_SEMI_COLON() while (*input_line_pointer++ != ';')
626 #define SKIP_WHITESPACES() while (*input_line_pointer == ' ' || \
627 *input_line_pointer == '\t') \
628 input_line_pointer++;
632 int what ATTRIBUTE_UNUSED
;
634 char name_end
; /* Char after the end of name */
635 char *symbol_name
; /* Name of the debug symbol */
636 char *symbol_name_copy
; /* Temporary copy of the name */
637 unsigned int symbol_name_length
;
639 if (def_symbol_in_progress
!= NULL
)
641 as_warn (_(".def pseudo-op used inside of .def/.endef: ignored."));
642 demand_empty_rest_of_line ();
644 } /* if not inside .def/.endef */
648 symbol_name
= input_line_pointer
;
649 #ifdef STRIP_UNDERSCORE
650 if (symbol_name
[0] == '_' && symbol_name
[1] != 0)
652 #endif /* STRIP_UNDERSCORE */
654 name_end
= get_symbol_end ();
655 symbol_name_length
= strlen (symbol_name
);
656 symbol_name_copy
= xmalloc (symbol_name_length
+ 1);
657 strcpy (symbol_name_copy
, symbol_name
);
658 #ifdef tc_canonicalize_symbol_name
659 symbol_name_copy
= tc_canonicalize_symbol_name (symbol_name_copy
);
662 /* Initialize the new symbol */
663 def_symbol_in_progress
= symbol_make (symbol_name_copy
);
664 symbol_set_frag (def_symbol_in_progress
, &zero_address_frag
);
665 S_SET_VALUE (def_symbol_in_progress
, 0);
667 if (S_IS_STRING (def_symbol_in_progress
))
668 SF_SET_STRING (def_symbol_in_progress
);
670 *input_line_pointer
= name_end
;
672 demand_empty_rest_of_line ();
675 unsigned int dim_index
;
678 obj_coff_endef (ignore
)
679 int ignore ATTRIBUTE_UNUSED
;
681 symbolS
*symbolP
= NULL
;
683 /* DIM BUG FIX sac@cygnus.com */
685 if (def_symbol_in_progress
== NULL
)
687 as_warn (_(".endef pseudo-op used outside of .def/.endef: ignored."));
688 demand_empty_rest_of_line ();
690 } /* if not inside .def/.endef */
692 /* Set the section number according to storage class. */
693 switch (S_GET_STORAGE_CLASS (def_symbol_in_progress
))
698 SF_SET_TAG (def_symbol_in_progress
);
699 /* intentional fallthrough */
702 SF_SET_DEBUG (def_symbol_in_progress
);
703 S_SET_SEGMENT (def_symbol_in_progress
, fetch_coff_debug_section ());
707 SF_SET_LOCAL (def_symbol_in_progress
); /* Do not emit this symbol. */
708 /* intentional fallthrough */
710 SF_SET_PROCESS (def_symbol_in_progress
); /* Will need processing before writing */
711 /* intentional fallthrough */
715 S_SET_SEGMENT (def_symbol_in_progress
, text_section
);
717 name
= S_GET_NAME (def_symbol_in_progress
);
718 if (name
[0] == '.' && name
[2] == 'f' && name
[3] == '\0')
724 if (! in_function ())
725 as_warn (_("`%s' symbol without preceding function"), name
);
726 /* Will need relocating. */
727 SF_SET_PROCESS (def_symbol_in_progress
);
733 /* The MS compilers output the actual endline, not the
734 function-relative one... we want to match without
735 changing the assembler input. */
736 SA_SET_SYM_LNNO (def_symbol_in_progress
,
737 (SA_GET_SYM_LNNO (def_symbol_in_progress
)
748 #endif /* C_AUTOARG */
755 /* According to the COFF documentation:
757 http://osr5doc.sco.com:1996/topics/COFF_SectNumFld.html
759 A special section number (-2) marks symbolic debugging symbols,
760 including structure/union/enumeration tag names, typedefs, and
761 the name of the file. A section number of -1 indicates that the
762 symbol has a value but is not relocatable. Examples of
763 absolute-valued symbols include automatic and register variables,
764 function arguments, and .eos symbols.
766 But from Ian Lance Taylor:
768 http://sources.redhat.com/ml/binutils/2000-08/msg00202.html
770 the actual tools all marked them as section -1. So the GNU COFF
771 assembler follows historical COFF assemblers.
773 However, it causes problems for djgpp
775 http://sources.redhat.com/ml/binutils/2000-08/msg00210.html
777 By defining STRICTCOFF, a COFF port can make the assembler to
778 follow the documented behavior. */
785 SF_SET_DEBUG (def_symbol_in_progress
);
786 S_SET_SEGMENT (def_symbol_in_progress
, absolute_section
);
794 S_SET_SEGMENT (def_symbol_in_progress
, absolute_section
);
805 /* Valid but set somewhere else (s_comm, s_lcomm, colon) */
812 as_warn (_("unexpected storage class %d"),
813 S_GET_STORAGE_CLASS (def_symbol_in_progress
));
815 } /* switch on storage class */
817 /* Now that we have built a debug symbol, try to find if we should
818 merge with an existing symbol or not. If a symbol is C_EFCN or
819 absolute_section or untagged SEG_DEBUG it never merges. We also
820 don't merge labels, which are in a different namespace, nor
821 symbols which have not yet been defined since they are typically
822 unique, nor do we merge tags with non-tags. */
824 /* Two cases for functions. Either debug followed by definition or
825 definition followed by debug. For definition first, we will
826 merge the debug symbol into the definition. For debug first, the
827 lineno entry MUST point to the definition function or else it
828 will point off into space when obj_crawl_symbol_chain() merges
829 the debug symbol into the real symbol. Therefor, let's presume
830 the debug symbol is a real function reference. */
832 /* FIXME-SOON If for some reason the definition label/symbol is
833 never seen, this will probably leave an undefined symbol at link
836 if (S_GET_STORAGE_CLASS (def_symbol_in_progress
) == C_EFCN
837 || S_GET_STORAGE_CLASS (def_symbol_in_progress
) == C_LABEL
838 || (!strcmp (bfd_get_section_name (stdoutput
,
839 S_GET_SEGMENT (def_symbol_in_progress
)),
841 && !SF_GET_TAG (def_symbol_in_progress
))
842 || S_GET_SEGMENT (def_symbol_in_progress
) == absolute_section
843 || ! symbol_constant_p (def_symbol_in_progress
)
844 || (symbolP
= symbol_find_base (S_GET_NAME (def_symbol_in_progress
),
845 DO_NOT_STRIP
)) == NULL
846 || SF_GET_TAG (def_symbol_in_progress
) != SF_GET_TAG (symbolP
))
848 /* If it already is at the end of the symbol list, do nothing */
849 if (def_symbol_in_progress
!= symbol_lastP
)
851 symbol_remove (def_symbol_in_progress
, &symbol_rootP
, &symbol_lastP
);
852 symbol_append (def_symbol_in_progress
, symbol_lastP
, &symbol_rootP
,
858 /* This symbol already exists, merge the newly created symbol
859 into the old one. This is not mandatory. The linker can
860 handle duplicate symbols correctly. But I guess that it save
861 a *lot* of space if the assembly file defines a lot of
864 /* The debug entry (def_symbol_in_progress) is merged into the
865 previous definition. */
867 c_symbol_merge (def_symbol_in_progress
, symbolP
);
868 symbol_remove (def_symbol_in_progress
, &symbol_rootP
, &symbol_lastP
);
870 def_symbol_in_progress
= symbolP
;
872 if (SF_GET_FUNCTION (def_symbol_in_progress
)
873 || SF_GET_TAG (def_symbol_in_progress
)
874 || S_GET_STORAGE_CLASS (def_symbol_in_progress
) == C_STAT
)
876 /* For functions, and tags, and static symbols, the symbol
877 *must* be where the debug symbol appears. Move the
878 existing symbol to the current place. */
879 /* If it already is at the end of the symbol list, do nothing */
880 if (def_symbol_in_progress
!= symbol_lastP
)
882 symbol_remove (def_symbol_in_progress
, &symbol_rootP
, &symbol_lastP
);
883 symbol_append (def_symbol_in_progress
, symbol_lastP
, &symbol_rootP
, &symbol_lastP
);
888 if (SF_GET_TAG (def_symbol_in_progress
))
892 oldtag
= symbol_find_base (S_GET_NAME (def_symbol_in_progress
),
894 if (oldtag
== NULL
|| ! SF_GET_TAG (oldtag
))
895 tag_insert (S_GET_NAME (def_symbol_in_progress
),
896 def_symbol_in_progress
);
899 if (SF_GET_FUNCTION (def_symbol_in_progress
))
901 know (sizeof (def_symbol_in_progress
) <= sizeof (long));
902 set_function (def_symbol_in_progress
);
903 SF_SET_PROCESS (def_symbol_in_progress
);
907 /* That is, if this is the first time we've seen the
909 symbol_table_insert (def_symbol_in_progress
);
910 } /* definition follows debug */
911 } /* Create the line number entry pointing to the function being defined */
913 def_symbol_in_progress
= NULL
;
914 demand_empty_rest_of_line ();
918 obj_coff_dim (ignore
)
919 int ignore ATTRIBUTE_UNUSED
;
923 if (def_symbol_in_progress
== NULL
)
925 as_warn (_(".dim pseudo-op used outside of .def/.endef: ignored."));
926 demand_empty_rest_of_line ();
928 } /* if not inside .def/.endef */
930 S_SET_NUMBER_AUXILIARY (def_symbol_in_progress
, 1);
932 for (dim_index
= 0; dim_index
< DIMNUM
; dim_index
++)
935 SA_SET_SYM_DIMEN (def_symbol_in_progress
, dim_index
,
936 get_absolute_expression ());
938 switch (*input_line_pointer
)
941 input_line_pointer
++;
945 as_warn (_("badly formed .dim directive ignored"));
946 /* intentional fallthrough */
954 demand_empty_rest_of_line ();
958 obj_coff_line (ignore
)
959 int ignore ATTRIBUTE_UNUSED
;
963 if (def_symbol_in_progress
== NULL
)
965 /* Probably stabs-style line? */
970 this_base
= get_absolute_expression ();
971 if (!strcmp (".bf", S_GET_NAME (def_symbol_in_progress
)))
972 coff_line_base
= this_base
;
974 S_SET_NUMBER_AUXILIARY (def_symbol_in_progress
, 1);
975 SA_SET_SYM_LNNO (def_symbol_in_progress
, this_base
);
977 demand_empty_rest_of_line ();
980 if (strcmp (".bf", S_GET_NAME (def_symbol_in_progress
)) == 0)
985 listing_source_line ((unsigned int) this_base
);
991 obj_coff_size (ignore
)
992 int ignore ATTRIBUTE_UNUSED
;
994 if (def_symbol_in_progress
== NULL
)
996 as_warn (_(".size pseudo-op used outside of .def/.endef ignored."));
997 demand_empty_rest_of_line ();
999 } /* if not inside .def/.endef */
1001 S_SET_NUMBER_AUXILIARY (def_symbol_in_progress
, 1);
1002 SA_SET_SYM_SIZE (def_symbol_in_progress
, get_absolute_expression ());
1003 demand_empty_rest_of_line ();
1007 obj_coff_scl (ignore
)
1008 int ignore ATTRIBUTE_UNUSED
;
1010 if (def_symbol_in_progress
== NULL
)
1012 as_warn (_(".scl pseudo-op used outside of .def/.endef ignored."));
1013 demand_empty_rest_of_line ();
1015 } /* if not inside .def/.endef */
1017 S_SET_STORAGE_CLASS (def_symbol_in_progress
, get_absolute_expression ());
1018 demand_empty_rest_of_line ();
1022 obj_coff_tag (ignore
)
1023 int ignore ATTRIBUTE_UNUSED
;
1028 if (def_symbol_in_progress
== NULL
)
1030 as_warn (_(".tag pseudo-op used outside of .def/.endef ignored."));
1031 demand_empty_rest_of_line ();
1035 S_SET_NUMBER_AUXILIARY (def_symbol_in_progress
, 1);
1036 symbol_name
= input_line_pointer
;
1037 name_end
= get_symbol_end ();
1039 #ifdef tc_canonicalize_symbol_name
1040 symbol_name
= tc_canonicalize_symbol_name (symbol_name
);
1043 /* Assume that the symbol referred to by .tag is always defined.
1044 This was a bad assumption. I've added find_or_make. xoxorich. */
1045 SA_SET_SYM_TAGNDX (def_symbol_in_progress
,
1046 tag_find_or_make (symbol_name
));
1047 if (SA_GET_SYM_TAGNDX (def_symbol_in_progress
) == 0L)
1049 as_warn (_("tag not found for .tag %s"), symbol_name
);
1052 SF_SET_TAGGED (def_symbol_in_progress
);
1053 *input_line_pointer
= name_end
;
1055 demand_empty_rest_of_line ();
1059 obj_coff_type (ignore
)
1060 int ignore ATTRIBUTE_UNUSED
;
1062 if (def_symbol_in_progress
== NULL
)
1064 as_warn (_(".type pseudo-op used outside of .def/.endef ignored."));
1065 demand_empty_rest_of_line ();
1067 } /* if not inside .def/.endef */
1069 S_SET_DATA_TYPE (def_symbol_in_progress
, get_absolute_expression ());
1071 if (ISFCN (S_GET_DATA_TYPE (def_symbol_in_progress
)) &&
1072 S_GET_STORAGE_CLASS (def_symbol_in_progress
) != C_TPDEF
)
1074 SF_SET_FUNCTION (def_symbol_in_progress
);
1075 } /* is a function */
1077 demand_empty_rest_of_line ();
1081 obj_coff_val (ignore
)
1082 int ignore ATTRIBUTE_UNUSED
;
1084 if (def_symbol_in_progress
== NULL
)
1086 as_warn (_(".val pseudo-op used outside of .def/.endef ignored."));
1087 demand_empty_rest_of_line ();
1089 } /* if not inside .def/.endef */
1091 if (is_name_beginner (*input_line_pointer
))
1093 char *symbol_name
= input_line_pointer
;
1094 char name_end
= get_symbol_end ();
1096 #ifdef tc_canonicalize_symbol_name
1097 symbol_name
= tc_canonicalize_symbol_name (symbol_name
);
1099 if (!strcmp (symbol_name
, "."))
1101 symbol_set_frag (def_symbol_in_progress
, frag_now
);
1102 S_SET_VALUE (def_symbol_in_progress
, (valueT
) frag_now_fix ());
1103 /* If the .val is != from the .def (e.g. statics) */
1105 else if (strcmp (S_GET_NAME (def_symbol_in_progress
), symbol_name
))
1109 exp
.X_op
= O_symbol
;
1110 exp
.X_add_symbol
= symbol_find_or_make (symbol_name
);
1111 exp
.X_op_symbol
= NULL
;
1112 exp
.X_add_number
= 0;
1113 symbol_set_value_expression (def_symbol_in_progress
, &exp
);
1115 /* If the segment is undefined when the forward reference is
1116 resolved, then copy the segment id from the forward
1118 SF_SET_GET_SEGMENT (def_symbol_in_progress
);
1120 /* FIXME: gcc can generate address expressions here in
1121 unusual cases (search for "obscure" in sdbout.c). We
1122 just ignore the offset here, thus generating incorrect
1123 debugging information. We ignore the rest of the line
1126 /* Otherwise, it is the name of a non debug symbol and its value
1127 will be calculated later. */
1128 *input_line_pointer
= name_end
;
1132 S_SET_VALUE (def_symbol_in_progress
, get_absolute_expression ());
1133 } /* if symbol based */
1135 demand_empty_rest_of_line ();
1139 coff_obj_read_begin_hook ()
1141 /* These had better be the same. Usually 18 bytes. */
1143 know (sizeof (SYMENT
) == sizeof (AUXENT
));
1144 know (SYMESZ
== AUXESZ
);
1149 symbolS
*coff_last_function
;
1150 static symbolS
*coff_last_bf
;
1153 coff_frob_symbol (symp
, punt
)
1157 static symbolS
*last_tagP
;
1158 static stack
*block_stack
;
1159 static symbolS
*set_end
;
1160 symbolS
*next_set_end
= NULL
;
1162 if (symp
== &abs_symbol
)
1168 if (current_lineno_sym
)
1169 coff_add_linesym ((symbolS
*) 0);
1172 block_stack
= stack_init (512, sizeof (symbolS
*));
1174 if (S_IS_WEAK (symp
))
1177 S_SET_STORAGE_CLASS (symp
, C_NT_WEAK
);
1179 S_SET_STORAGE_CLASS (symp
, C_WEAKEXT
);
1183 if (!S_IS_DEFINED (symp
)
1184 && !S_IS_WEAK (symp
)
1185 && S_GET_STORAGE_CLASS (symp
) != C_STAT
)
1186 S_SET_STORAGE_CLASS (symp
, C_EXT
);
1188 if (!SF_GET_DEBUG (symp
))
1192 if (!SF_GET_LOCAL (symp
)
1193 && !SF_GET_STATICS (symp
)
1194 && S_GET_STORAGE_CLASS (symp
) != C_LABEL
1195 && symbol_constant_p(symp
)
1196 && (real
= symbol_find_base (S_GET_NAME (symp
), DO_NOT_STRIP
))
1197 && S_GET_STORAGE_CLASS (real
) == C_NULL
1200 c_symbol_merge (symp
, real
);
1205 if (!S_IS_DEFINED (symp
) && !SF_GET_LOCAL (symp
))
1207 assert (S_GET_VALUE (symp
) == 0);
1208 S_SET_EXTERNAL (symp
);
1210 else if (S_GET_STORAGE_CLASS (symp
) == C_NULL
)
1212 if (S_GET_SEGMENT (symp
) == text_section
1213 && symp
!= seg_info (text_section
)->sym
)
1214 S_SET_STORAGE_CLASS (symp
, C_LABEL
);
1216 S_SET_STORAGE_CLASS (symp
, C_STAT
);
1219 if (SF_GET_PROCESS (symp
))
1221 if (S_GET_STORAGE_CLASS (symp
) == C_BLOCK
)
1223 if (!strcmp (S_GET_NAME (symp
), ".bb"))
1224 stack_push (block_stack
, (char *) &symp
);
1229 begin
= *(symbolS
**) stack_pop (block_stack
);
1231 as_warn (_("mismatched .eb"));
1233 next_set_end
= begin
;
1237 if (coff_last_function
== 0 && SF_GET_FUNCTION (symp
))
1239 union internal_auxent
*auxp
;
1241 coff_last_function
= symp
;
1242 if (S_GET_NUMBER_AUXILIARY (symp
) < 1)
1243 S_SET_NUMBER_AUXILIARY (symp
, 1);
1244 auxp
= SYM_AUXENT (symp
);
1245 memset (auxp
->x_sym
.x_fcnary
.x_ary
.x_dimen
, 0,
1246 sizeof (auxp
->x_sym
.x_fcnary
.x_ary
.x_dimen
));
1249 if (S_GET_STORAGE_CLASS (symp
) == C_EFCN
)
1251 if (coff_last_function
== 0)
1252 as_fatal (_("C_EFCN symbol out of scope"));
1253 SA_SET_SYM_FSIZE (coff_last_function
,
1254 (long) (S_GET_VALUE (symp
)
1255 - S_GET_VALUE (coff_last_function
)));
1256 next_set_end
= coff_last_function
;
1257 coff_last_function
= 0;
1261 if (S_IS_EXTERNAL (symp
))
1262 S_SET_STORAGE_CLASS (symp
, C_EXT
);
1263 else if (SF_GET_LOCAL (symp
))
1266 if (SF_GET_FUNCTION (symp
))
1267 symbol_get_bfdsym (symp
)->flags
|= BSF_FUNCTION
;
1272 /* Double check weak symbols. */
1273 if (S_IS_WEAK (symp
) && S_IS_COMMON (symp
))
1274 as_bad (_("Symbol `%s' can not be both weak and common"),
1277 if (SF_GET_TAG (symp
))
1279 else if (S_GET_STORAGE_CLASS (symp
) == C_EOS
)
1280 next_set_end
= last_tagP
;
1283 /* This is pretty horrible, but we have to set *punt correctly in
1284 order to call SA_SET_SYM_ENDNDX correctly. */
1285 if (! symbol_used_in_reloc_p (symp
)
1286 && ((symbol_get_bfdsym (symp
)->flags
& BSF_SECTION_SYM
) != 0
1287 || (! S_IS_EXTERNAL (symp
)
1288 && ! symbol_get_tc (symp
)->output
1289 && S_GET_STORAGE_CLASS (symp
) != C_FILE
)))
1293 if (set_end
!= (symbolS
*) NULL
1295 && ((symbol_get_bfdsym (symp
)->flags
& BSF_NOT_AT_END
) != 0
1296 || (S_IS_DEFINED (symp
)
1297 && ! S_IS_COMMON (symp
)
1298 && (! S_IS_EXTERNAL (symp
) || SF_GET_FUNCTION (symp
)))))
1300 SA_SET_SYM_ENDNDX (set_end
, symp
);
1304 if (next_set_end
!= NULL
)
1306 if (set_end
!= NULL
)
1307 as_warn ("Warning: internal error: forgetting to set endndx of %s",
1308 S_GET_NAME (set_end
));
1309 set_end
= next_set_end
;
1314 && S_GET_STORAGE_CLASS (symp
) == C_FCN
1315 && strcmp (S_GET_NAME (symp
), ".bf") == 0)
1317 if (coff_last_bf
!= NULL
)
1318 SA_SET_SYM_ENDNDX (coff_last_bf
, symp
);
1319 coff_last_bf
= symp
;
1322 if (coffsymbol (symbol_get_bfdsym (symp
))->lineno
)
1325 struct line_no
*lptr
;
1328 lptr
= (struct line_no
*) coffsymbol (symbol_get_bfdsym (symp
))->lineno
;
1329 for (i
= 0; lptr
; lptr
= lptr
->next
)
1331 lptr
= (struct line_no
*) coffsymbol (symbol_get_bfdsym (symp
))->lineno
;
1333 /* We need i entries for line numbers, plus 1 for the first
1334 entry which BFD will override, plus 1 for the last zero
1335 entry (a marker for BFD). */
1336 l
= (alent
*) xmalloc ((i
+ 2) * sizeof (alent
));
1337 coffsymbol (symbol_get_bfdsym (symp
))->lineno
= l
;
1338 l
[i
+ 1].line_number
= 0;
1339 l
[i
+ 1].u
.sym
= NULL
;
1343 lptr
->l
.u
.offset
+= lptr
->frag
->fr_address
/ OCTETS_PER_BYTE
;
1351 coff_adjust_section_syms (abfd
, sec
, x
)
1352 bfd
*abfd ATTRIBUTE_UNUSED
;
1354 PTR x ATTRIBUTE_UNUSED
;
1357 segment_info_type
*seginfo
= seg_info (sec
);
1358 int nlnno
, nrelocs
= 0;
1360 /* RS/6000 gas creates a .debug section manually in ppc_frob_file in
1361 tc-ppc.c. Do not get confused by it. */
1362 if (seginfo
== NULL
)
1365 if (!strcmp (sec
->name
, ".text"))
1366 nlnno
= coff_n_line_nos
;
1370 /* @@ Hope that none of the fixups expand to more than one reloc
1372 fixS
*fixp
= seginfo
->fix_root
;
1375 if (! fixp
->fx_done
)
1377 fixp
= fixp
->fx_next
;
1380 if (bfd_get_section_size_before_reloc (sec
) == 0
1383 && sec
!= text_section
1384 && sec
!= data_section
1385 && sec
!= bss_section
)
1387 secsym
= section_symbol (sec
);
1388 /* This is an estimate; we'll plug in the real value using
1389 SET_SECTION_RELOCS later */
1390 SA_SET_SCN_NRELOC (secsym
, nrelocs
);
1391 SA_SET_SCN_NLINNO (secsym
, nlnno
);
1395 coff_frob_file_after_relocs ()
1397 bfd_map_over_sections (stdoutput
, coff_adjust_section_syms
, (char*) 0);
1400 /* Implement the .section pseudo op:
1401 .section name {, "flags"}
1403 | +--- optional flags: 'b' for bss
1405 +-- section name 'l' for lib
1409 'd' (apparently m88k for data)
1411 'r' for read-only data
1412 's' for shared data (PE)
1413 But if the argument is not a quoted string, treat it as a
1416 Note the 'a' flag is silently ignored. This allows the same
1417 .section directive to be parsed in both ELF and COFF formats. */
1420 obj_coff_section (ignore
)
1421 int ignore ATTRIBUTE_UNUSED
;
1423 /* Strip out the section name */
1428 flagword flags
, oldflags
;
1439 section_name
= input_line_pointer
;
1440 c
= get_symbol_end ();
1442 name
= xmalloc (input_line_pointer
- section_name
+ 1);
1443 strcpy (name
, section_name
);
1445 *input_line_pointer
= c
;
1450 flags
= SEC_NO_FLAGS
;
1452 if (*input_line_pointer
== ',')
1454 ++input_line_pointer
;
1456 if (*input_line_pointer
!= '"')
1457 exp
= get_absolute_expression ();
1460 ++input_line_pointer
;
1461 while (*input_line_pointer
!= '"'
1462 && ! is_end_of_line
[(unsigned char) *input_line_pointer
])
1464 switch (*input_line_pointer
)
1466 case 'b': flags
|= SEC_ALLOC
; flags
&=~ SEC_LOAD
; break;
1467 case 'n': flags
&=~ SEC_LOAD
; flags
|= SEC_NEVER_LOAD
; break;
1468 case 'd': flags
|= SEC_DATA
| SEC_LOAD
; /* fall through */
1469 case 'w': flags
&=~ SEC_READONLY
; break;
1470 case 'a': break; /* For compatability with ELF. */
1471 case 'x': flags
|= SEC_CODE
| SEC_LOAD
; break;
1472 case 'r': flags
|= SEC_READONLY
; break;
1473 case 's': flags
|= SEC_SHARED
; break;
1475 case 'i': /* STYP_INFO */
1476 case 'l': /* STYP_LIB */
1477 case 'o': /* STYP_OVER */
1478 as_warn (_("unsupported section attribute '%c'"),
1479 *input_line_pointer
);
1483 as_warn(_("unknown section attribute '%c'"),
1484 *input_line_pointer
);
1487 ++input_line_pointer
;
1489 if (*input_line_pointer
== '"')
1490 ++input_line_pointer
;
1494 sec
= subseg_new (name
, (subsegT
) exp
);
1496 oldflags
= bfd_get_section_flags (stdoutput
, sec
);
1497 if (oldflags
== SEC_NO_FLAGS
)
1499 /* Set section flags for a new section just created by subseg_new.
1500 Provide a default if no flags were parsed. */
1501 if (flags
== SEC_NO_FLAGS
)
1502 flags
= TC_COFF_SECTION_DEFAULT_ATTRIBUTES
;
1504 #ifdef COFF_LONG_SECTION_NAMES
1505 /* Add SEC_LINK_ONCE and SEC_LINK_DUPLICATES_DISCARD to .gnu.linkonce
1506 sections so adjust_reloc_syms in write.c will correctly handle
1507 relocs which refer to non-local symbols in these sections. */
1508 if (strncmp (name
, ".gnu.linkonce", sizeof (".gnu.linkonce") - 1) == 0)
1509 flags
|= SEC_LINK_ONCE
| SEC_LINK_DUPLICATES_DISCARD
;
1512 if (! bfd_set_section_flags (stdoutput
, sec
, flags
))
1513 as_warn (_("error setting flags for \"%s\": %s"),
1514 bfd_section_name (stdoutput
, sec
),
1515 bfd_errmsg (bfd_get_error ()));
1517 else if (flags
!= SEC_NO_FLAGS
)
1519 /* This section's attributes have already been set. Warn if the
1520 attributes don't match. */
1521 flagword matchflags
= (SEC_ALLOC
| SEC_LOAD
| SEC_READONLY
| SEC_CODE
1522 | SEC_DATA
| SEC_SHARED
| SEC_NEVER_LOAD
);
1523 if ((flags
^ oldflags
) & matchflags
)
1524 as_warn (_("Ignoring changed section attributes for %s"), name
);
1527 demand_empty_rest_of_line ();
1531 coff_adjust_symtab ()
1533 if (symbol_rootP
== NULL
1534 || S_GET_STORAGE_CLASS (symbol_rootP
) != C_FILE
)
1535 c_dot_file_symbol ("fake");
1539 coff_frob_section (sec
)
1545 bfd_vma size
, n_entries
, mask
;
1546 bfd_vma align_power
= (bfd_vma
)sec
->alignment_power
+ OCTETS_PER_BYTE_POWER
;
1548 /* The COFF back end in BFD requires that all section sizes be
1549 rounded up to multiples of the corresponding section alignments,
1550 supposedly because standard COFF has no other way of encoding alignment
1551 for sections. If your COFF flavor has a different way of encoding
1552 section alignment, then skip this step, as TICOFF does. */
1553 size
= bfd_get_section_size_before_reloc (sec
);
1554 mask
= ((bfd_vma
) 1 << align_power
) - 1;
1555 #if !defined(TICOFF)
1561 new_size
= (size
+ mask
) & ~mask
;
1562 bfd_set_section_size (stdoutput
, sec
, new_size
);
1564 /* If the size had to be rounded up, add some padding in
1565 the last non-empty frag. */
1566 fragp
= seg_info (sec
)->frchainP
->frch_root
;
1567 last
= seg_info (sec
)->frchainP
->frch_last
;
1568 while (fragp
->fr_next
!= last
)
1569 fragp
= fragp
->fr_next
;
1570 last
->fr_address
= size
;
1571 fragp
->fr_offset
+= new_size
- size
;
1575 /* If the section size is non-zero, the section symbol needs an aux
1576 entry associated with it, indicating the size. We don't know
1577 all the values yet; coff_frob_symbol will fill them in later. */
1580 || sec
== text_section
1581 || sec
== data_section
1582 || sec
== bss_section
)
1585 symbolS
*secsym
= section_symbol (sec
);
1587 S_SET_STORAGE_CLASS (secsym
, C_STAT
);
1588 S_SET_NUMBER_AUXILIARY (secsym
, 1);
1589 SF_SET_STATICS (secsym
);
1590 SA_SET_SCN_SCNLEN (secsym
, size
);
1593 /* @@ these should be in a "stabs.h" file, or maybe as.h */
1594 #ifndef STAB_SECTION_NAME
1595 #define STAB_SECTION_NAME ".stab"
1597 #ifndef STAB_STRING_SECTION_NAME
1598 #define STAB_STRING_SECTION_NAME ".stabstr"
1600 if (strcmp (STAB_STRING_SECTION_NAME
, sec
->name
))
1604 sec
= subseg_get (STAB_SECTION_NAME
, 0);
1605 /* size is already rounded up, since other section will be listed first */
1606 size
= bfd_get_section_size_before_reloc (strsec
);
1608 n_entries
= bfd_get_section_size_before_reloc (sec
) / 12 - 1;
1610 /* Find first non-empty frag. It should be large enough. */
1611 fragp
= seg_info (sec
)->frchainP
->frch_root
;
1612 while (fragp
&& fragp
->fr_fix
== 0)
1613 fragp
= fragp
->fr_next
;
1614 assert (fragp
!= 0 && fragp
->fr_fix
>= 12);
1616 /* Store the values. */
1617 p
= fragp
->fr_literal
;
1618 bfd_h_put_16 (stdoutput
, n_entries
, (bfd_byte
*) p
+ 6);
1619 bfd_h_put_32 (stdoutput
, size
, (bfd_byte
*) p
+ 8);
1623 obj_coff_init_stab_section (seg
)
1629 unsigned int stroff
;
1631 /* Make space for this first symbol. */
1635 as_where (&file
, (unsigned int *) NULL
);
1636 stabstr_name
= (char *) xmalloc (strlen (seg
->name
) + 4);
1637 strcpy (stabstr_name
, seg
->name
);
1638 strcat (stabstr_name
, "str");
1639 stroff
= get_stab_string_offset (file
, stabstr_name
);
1641 md_number_to_chars (p
, stroff
, 4);
1650 return ((s
== NULL
) ? "(NULL)" : S_GET_NAME (s
));
1658 for (symbolP
= symbol_rootP
; symbolP
; symbolP
= symbol_next (symbolP
))
1660 printf (_("0x%lx: \"%s\" type = %ld, class = %d, segment = %d\n"),
1661 (unsigned long) symbolP
,
1662 S_GET_NAME(symbolP
),
1663 (long) S_GET_DATA_TYPE(symbolP
),
1664 S_GET_STORAGE_CLASS(symbolP
),
1665 (int) S_GET_SEGMENT(symbolP
));
1671 #else /* not BFD_ASSEMBLER */
1674 /* This is needed because we include internal bfd things. */
1678 #include "libcoff.h"
1681 #include "coff/pe.h"
1684 /* The NOP_OPCODE is for the alignment fill value. Fill with nop so
1685 that we can stick sections together without causing trouble. */
1687 #define NOP_OPCODE 0x00
1690 /* The zeroes if symbol name is longer than 8 chars */
1691 #define S_SET_ZEROES(s,v) ((s)->sy_symbol.ost_entry.n_zeroes = (v))
1693 #define MIN(a,b) ((a) < (b)? (a) : (b))
1695 /* This vector is used to turn a gas internal segment number into a
1696 section number suitable for insertion into a coff symbol table.
1697 This must correspond to seg_info_off_by_4. */
1699 const short seg_N_TYPE
[] =
1700 { /* in: segT out: N_TYPE bits */
1702 1, 2, 3, 4, 5, 6, 7, 8, 9, 10,
1703 11, 12, 13, 14, 15, 16, 17, 18, 19, 20,
1704 21, 22, 23, 24, 25, 26, 27, 28, 29, 30,
1705 31, 32, 33, 34, 35, 36, 37, 38, 39, 40,
1706 C_UNDEF_SECTION
, /* SEG_UNKNOWN */
1707 C_UNDEF_SECTION
, /* SEG_GOOF */
1708 C_UNDEF_SECTION
, /* SEG_EXPR */
1709 C_DEBUG_SECTION
, /* SEG_DEBUG */
1710 C_NTV_SECTION
, /* SEG_NTV */
1711 C_PTV_SECTION
, /* SEG_PTV */
1712 C_REGISTER_SECTION
, /* SEG_REGISTER */
1715 int function_lineoff
= -1; /* Offset in line#s where the last function
1716 started (the odd entry for line #0) */
1718 /* Structure used to keep the filenames which
1719 are too long around so that we can stick them
1720 into the string table. */
1721 struct filename_list
1724 struct filename_list
*next
;
1727 static struct filename_list
*filename_list_head
;
1728 static struct filename_list
*filename_list_tail
;
1730 static symbolS
*last_line_symbol
;
1732 /* Add 4 to the real value to get the index and compensate the
1733 negatives. This vector is used by S_GET_SEGMENT to turn a coff
1734 section number into a segment number. */
1737 static symbolS
*previous_file_symbol
;
1738 static int line_base
;
1740 void c_symbol_merge
PARAMS ((symbolS
*, symbolS
*));
1741 symbolS
*c_section_symbol
PARAMS ((char *, int));
1742 void obj_coff_section
PARAMS ((int));
1743 void do_relocs_for
PARAMS ((bfd
*, object_headers
*, unsigned long *));
1744 char * symbol_to_chars
PARAMS ((bfd
*, char *, symbolS
*));
1745 void w_strings
PARAMS ((char *));
1747 static void fixup_segment
PARAMS ((segment_info_type
*, segT
));
1748 static void fixup_mdeps
PARAMS ((fragS
*, object_headers
*, segT
));
1749 static void fill_section
PARAMS ((bfd
*, object_headers
*, unsigned long *));
1750 static int c_line_new
PARAMS ((symbolS
*, long, int, fragS
*));
1751 static void w_symbols
PARAMS ((bfd
*, char *, symbolS
*));
1752 static void adjust_stab_section
PARAMS ((bfd
*, segT
));
1753 static void obj_coff_lcomm
PARAMS ((int));
1754 static void obj_coff_text
PARAMS ((int));
1755 static void obj_coff_data
PARAMS ((int));
1756 static unsigned int count_entries_in_chain
PARAMS ((unsigned int));
1757 static void coff_header_append
PARAMS ((bfd
*, object_headers
*));
1758 static unsigned int yank_symbols
PARAMS ((void));
1759 static unsigned int glue_symbols
PARAMS ((symbolS
**, symbolS
**));
1760 static unsigned int tie_tags
PARAMS ((void));
1761 static void crawl_symbols
PARAMS ((object_headers
*, bfd
*));
1762 static void do_linenos_for
PARAMS ((bfd
*, object_headers
*, unsigned long *));
1763 static void remove_subsegs
PARAMS ((void));
1767 /* When not using BFD_ASSEMBLER, we permit up to 40 sections.
1769 This array maps a COFF section number into a gas section number.
1770 Because COFF uses negative section numbers, you must add 4 to the
1771 COFF section number when indexing into this array; this is done via
1772 the SEG_INFO_FROM_SECTION_NUMBER macro. This must correspond to
1775 static const segT seg_info_off_by_4
[] =
1782 SEG_E0
, SEG_E1
, SEG_E2
, SEG_E3
, SEG_E4
,
1783 SEG_E5
, SEG_E6
, SEG_E7
, SEG_E8
, SEG_E9
,
1784 SEG_E10
, SEG_E11
, SEG_E12
, SEG_E13
, SEG_E14
,
1785 SEG_E15
, SEG_E16
, SEG_E17
, SEG_E18
, SEG_E19
,
1786 SEG_E20
, SEG_E21
, SEG_E22
, SEG_E23
, SEG_E24
,
1787 SEG_E25
, SEG_E26
, SEG_E27
, SEG_E28
, SEG_E29
,
1788 SEG_E30
, SEG_E31
, SEG_E32
, SEG_E33
, SEG_E34
,
1789 SEG_E35
, SEG_E36
, SEG_E37
, SEG_E38
, SEG_E39
,
1802 #define SEG_INFO_FROM_SECTION_NUMBER(x) (seg_info_off_by_4[(x)+4])
1804 static relax_addressT relax_align
PARAMS ((relax_addressT
, long));
1806 static relax_addressT
1807 relax_align (address
, alignment
)
1808 relax_addressT address
;
1811 relax_addressT mask
;
1812 relax_addressT new_address
;
1814 mask
= ~((~0) << alignment
);
1815 new_address
= (address
+ mask
) & (~mask
);
1816 return (new_address
- address
);
1823 return SEG_INFO_FROM_SECTION_NUMBER (x
->sy_symbol
.ost_entry
.n_scnum
);
1826 static unsigned int size_section
PARAMS ((bfd
*, unsigned int));
1828 /* Calculate the size of the frag chain and fill in the section header
1829 to contain all of it, also fill in the addr of the sections. */
1832 size_section (abfd
, idx
)
1833 bfd
*abfd ATTRIBUTE_UNUSED
;
1837 unsigned int size
= 0;
1838 fragS
*frag
= segment_info
[idx
].frchainP
->frch_root
;
1842 size
= frag
->fr_address
;
1843 if (frag
->fr_address
!= size
)
1845 fprintf (stderr
, _("Out of step\n"));
1846 size
= frag
->fr_address
;
1849 switch (frag
->fr_type
)
1851 #ifdef TC_COFF_SIZEMACHDEP
1852 case rs_machine_dependent
:
1853 size
+= TC_COFF_SIZEMACHDEP (frag
);
1859 size
+= frag
->fr_fix
;
1860 size
+= frag
->fr_offset
* frag
->fr_var
;
1868 size
+= frag
->fr_fix
;
1869 off
= relax_align (size
, frag
->fr_offset
);
1870 if (frag
->fr_subtype
!= 0 && off
> frag
->fr_subtype
)
1876 BAD_CASE (frag
->fr_type
);
1879 frag
= frag
->fr_next
;
1881 segment_info
[idx
].scnhdr
.s_size
= size
;
1886 count_entries_in_chain (idx
)
1889 unsigned int nrelocs
;
1892 /* Count the relocations. */
1893 fixup_ptr
= segment_info
[idx
].fix_root
;
1895 while (fixup_ptr
!= (fixS
*) NULL
)
1897 if (fixup_ptr
->fx_done
== 0 && TC_COUNT_RELOC (fixup_ptr
))
1899 #if defined(TC_A29K) || defined(TC_OR32)
1900 if (fixup_ptr
->fx_r_type
== RELOC_CONSTH
)
1909 fixup_ptr
= fixup_ptr
->fx_next
;
1916 static int compare_external_relocs
PARAMS ((const PTR
, const PTR
));
1918 /* AUX's ld expects relocations to be sorted. */
1921 compare_external_relocs (x
, y
)
1925 struct external_reloc
*a
= (struct external_reloc
*) x
;
1926 struct external_reloc
*b
= (struct external_reloc
*) y
;
1927 bfd_vma aadr
= bfd_getb32 (a
->r_vaddr
);
1928 bfd_vma badr
= bfd_getb32 (b
->r_vaddr
);
1929 return (aadr
< badr
? -1 : badr
< aadr
? 1 : 0);
1934 /* Output all the relocations for a section. */
1937 do_relocs_for (abfd
, h
, file_cursor
)
1940 unsigned long *file_cursor
;
1942 unsigned int nrelocs
;
1944 unsigned long reloc_start
= *file_cursor
;
1946 for (idx
= SEG_E0
; idx
< SEG_LAST
; idx
++)
1948 if (segment_info
[idx
].scnhdr
.s_name
[0])
1950 struct external_reloc
*ext_ptr
;
1951 struct external_reloc
*external_reloc_vec
;
1952 unsigned int external_reloc_size
;
1953 unsigned int base
= segment_info
[idx
].scnhdr
.s_paddr
;
1954 fixS
*fix_ptr
= segment_info
[idx
].fix_root
;
1955 nrelocs
= count_entries_in_chain (idx
);
1958 /* Bypass this stuff if no relocs. This also incidentally
1959 avoids a SCO bug, where free(malloc(0)) tends to crash. */
1961 external_reloc_size
= nrelocs
* RELSZ
;
1962 external_reloc_vec
=
1963 (struct external_reloc
*) malloc (external_reloc_size
);
1965 ext_ptr
= external_reloc_vec
;
1967 /* Fill in the internal coff style reloc struct from the
1968 internal fix list. */
1971 struct internal_reloc intr
;
1973 /* Only output some of the relocations. */
1974 if (fix_ptr
->fx_done
== 0 && TC_COUNT_RELOC (fix_ptr
))
1976 #ifdef TC_RELOC_MANGLE
1977 TC_RELOC_MANGLE (&segment_info
[idx
], fix_ptr
, &intr
,
1981 symbolS
*symbol_ptr
= fix_ptr
->fx_addsy
;
1983 intr
.r_type
= TC_COFF_FIX2RTYPE (fix_ptr
);
1985 base
+ fix_ptr
->fx_frag
->fr_address
+ fix_ptr
->fx_where
;
1987 #ifdef TC_KEEP_FX_OFFSET
1988 intr
.r_offset
= fix_ptr
->fx_offset
;
1993 while (symbol_ptr
->sy_value
.X_op
== O_symbol
1994 && (! S_IS_DEFINED (symbol_ptr
)
1995 || S_IS_COMMON (symbol_ptr
)))
1999 /* We must avoid looping, as that can occur
2000 with a badly written program. */
2001 n
= symbol_ptr
->sy_value
.X_add_symbol
;
2002 if (n
== symbol_ptr
)
2007 /* Turn the segment of the symbol into an offset. */
2010 resolve_symbol_value (symbol_ptr
);
2011 if (! symbol_ptr
->sy_resolved
)
2016 if (expr_symbol_where (symbol_ptr
, &file
, &line
))
2017 as_bad_where (file
, line
,
2018 _("unresolved relocation"));
2020 as_bad (_("bad relocation: symbol `%s' not in symbol table"),
2021 S_GET_NAME (symbol_ptr
));
2024 dot
= segment_info
[S_GET_SEGMENT (symbol_ptr
)].dot
;
2026 intr
.r_symndx
= dot
->sy_number
;
2028 intr
.r_symndx
= symbol_ptr
->sy_number
;
2033 (void) bfd_coff_swap_reloc_out (abfd
, &intr
, ext_ptr
);
2035 #if defined(TC_A29K)
2036 /* The 29k has a special kludge for the high 16 bit
2037 reloc. Two relocations are emited, R_IHIHALF,
2038 and R_IHCONST. The second one doesn't contain a
2039 symbol, but uses the value for offset. */
2040 if (intr
.r_type
== R_IHIHALF
)
2042 /* Now emit the second bit. */
2043 intr
.r_type
= R_IHCONST
;
2044 intr
.r_symndx
= fix_ptr
->fx_addnumber
;
2045 (void) bfd_coff_swap_reloc_out (abfd
, &intr
, ext_ptr
);
2049 #if defined(TC_OR32)
2050 /* The or32 has a special kludge for the high 16 bit
2051 reloc. Two relocations are emited, R_IHIHALF,
2052 and R_IHCONST. The second one doesn't contain a
2053 symbol, but uses the value for offset. */
2054 if (intr
.r_type
== R_IHIHALF
)
2056 /* Now emit the second bit. */
2057 intr
.r_type
= R_IHCONST
;
2058 intr
.r_symndx
= fix_ptr
->fx_addnumber
;
2059 (void) bfd_coff_swap_reloc_out (abfd
, & intr
, ext_ptr
);
2065 fix_ptr
= fix_ptr
->fx_next
;
2068 /* Sort the reloc table. */
2069 qsort ((PTR
) external_reloc_vec
, nrelocs
,
2070 sizeof (struct external_reloc
), compare_external_relocs
);
2072 /* Write out the reloc table. */
2073 bfd_bwrite ((PTR
) external_reloc_vec
,
2074 (bfd_size_type
) external_reloc_size
, abfd
);
2075 free (external_reloc_vec
);
2077 /* Fill in section header info. */
2078 segment_info
[idx
].scnhdr
.s_relptr
= *file_cursor
;
2079 *file_cursor
+= external_reloc_size
;
2080 segment_info
[idx
].scnhdr
.s_nreloc
= nrelocs
;
2085 segment_info
[idx
].scnhdr
.s_relptr
= 0;
2090 /* Set relocation_size field in file headers. */
2091 H_SET_RELOCATION_SIZE (h
, *file_cursor
- reloc_start
, 0);
2094 /* Run through a frag chain and write out the data to go with it, fill
2095 in the scnhdrs with the info on the file postions. */
2098 fill_section (abfd
, h
, file_cursor
)
2100 object_headers
*h ATTRIBUTE_UNUSED
;
2101 unsigned long *file_cursor
;
2104 unsigned int paddr
= 0;
2106 for (i
= SEG_E0
; i
< SEG_UNKNOWN
; i
++)
2108 unsigned int offset
= 0;
2109 struct internal_scnhdr
*s
= &(segment_info
[i
].scnhdr
);
2115 fragS
*frag
= segment_info
[i
].frchainP
->frch_root
;
2116 char *buffer
= NULL
;
2122 buffer
= xmalloc (s
->s_size
);
2123 s
->s_scnptr
= *file_cursor
;
2125 know (s
->s_paddr
== paddr
);
2127 if (strcmp (s
->s_name
, ".text") == 0)
2128 s
->s_flags
|= STYP_TEXT
;
2129 else if (strcmp (s
->s_name
, ".data") == 0)
2130 s
->s_flags
|= STYP_DATA
;
2131 else if (strcmp (s
->s_name
, ".bss") == 0)
2134 s
->s_flags
|= STYP_BSS
;
2136 /* @@ Should make the i386 and a29k coff targets define
2137 COFF_NOLOAD_PROBLEM, and have only one test here. */
2141 #ifndef COFF_NOLOAD_PROBLEM
2142 /* Apparently the SVR3 linker (and exec syscall) and UDI
2143 mondfe progrem are confused by noload sections. */
2144 s
->s_flags
|= STYP_NOLOAD
;
2150 else if (strcmp (s
->s_name
, ".lit") == 0)
2151 s
->s_flags
= STYP_LIT
| STYP_TEXT
;
2152 else if (strcmp (s
->s_name
, ".init") == 0)
2153 s
->s_flags
|= STYP_TEXT
;
2154 else if (strcmp (s
->s_name
, ".fini") == 0)
2155 s
->s_flags
|= STYP_TEXT
;
2156 else if (strncmp (s
->s_name
, ".comment", 8) == 0)
2157 s
->s_flags
|= STYP_INFO
;
2161 unsigned int fill_size
;
2162 switch (frag
->fr_type
)
2164 case rs_machine_dependent
:
2167 memcpy (buffer
+ frag
->fr_address
,
2169 (unsigned int) frag
->fr_fix
);
2170 offset
+= frag
->fr_fix
;
2182 memcpy (buffer
+ frag
->fr_address
,
2184 (unsigned int) frag
->fr_fix
);
2185 offset
+= frag
->fr_fix
;
2188 fill_size
= frag
->fr_var
;
2189 if (fill_size
&& frag
->fr_offset
> 0)
2192 unsigned int off
= frag
->fr_fix
;
2193 for (count
= frag
->fr_offset
; count
; count
--)
2195 if (fill_size
+ frag
->fr_address
+ off
<= s
->s_size
)
2197 memcpy (buffer
+ frag
->fr_address
+ off
,
2198 frag
->fr_literal
+ frag
->fr_fix
,
2201 offset
+= fill_size
;
2206 case rs_broken_word
:
2211 frag
= frag
->fr_next
;
2216 if (s
->s_scnptr
!= 0)
2218 bfd_bwrite (buffer
, s
->s_size
, abfd
);
2219 *file_cursor
+= s
->s_size
;
2228 /* Coff file generation & utilities. */
2231 coff_header_append (abfd
, h
)
2238 #ifdef COFF_LONG_SECTION_NAMES
2239 unsigned long string_size
= 4;
2242 bfd_seek (abfd
, (file_ptr
) 0, 0);
2244 #ifndef OBJ_COFF_OMIT_OPTIONAL_HEADER
2245 H_SET_MAGIC_NUMBER (h
, COFF_MAGIC
);
2246 H_SET_VERSION_STAMP (h
, 0);
2247 H_SET_ENTRY_POINT (h
, 0);
2248 H_SET_TEXT_START (h
, segment_info
[SEG_E0
].frchainP
->frch_root
->fr_address
);
2249 H_SET_DATA_START (h
, segment_info
[SEG_E1
].frchainP
->frch_root
->fr_address
);
2250 H_SET_SIZEOF_OPTIONAL_HEADER (h
, bfd_coff_swap_aouthdr_out(abfd
, &h
->aouthdr
,
2252 #else /* defined (OBJ_COFF_OMIT_OPTIONAL_HEADER) */
2253 H_SET_SIZEOF_OPTIONAL_HEADER (h
, 0);
2254 #endif /* defined (OBJ_COFF_OMIT_OPTIONAL_HEADER) */
2256 i
= bfd_coff_swap_filehdr_out (abfd
, &h
->filehdr
, buffer
);
2258 bfd_bwrite (buffer
, (bfd_size_type
) i
, abfd
);
2259 bfd_bwrite (buffero
, (bfd_size_type
) H_GET_SIZEOF_OPTIONAL_HEADER (h
), abfd
);
2261 for (i
= SEG_E0
; i
< SEG_LAST
; i
++)
2263 if (segment_info
[i
].scnhdr
.s_name
[0])
2267 #ifdef COFF_LONG_SECTION_NAMES
2268 /* Support long section names as found in PE. This code
2269 must coordinate with that in write_object_file and
2271 if (strlen (segment_info
[i
].name
) > SCNNMLEN
)
2273 memset (segment_info
[i
].scnhdr
.s_name
, 0, SCNNMLEN
);
2274 sprintf (segment_info
[i
].scnhdr
.s_name
, "/%lu", string_size
);
2275 string_size
+= strlen (segment_info
[i
].name
) + 1;
2278 size
= bfd_coff_swap_scnhdr_out (abfd
,
2279 &(segment_info
[i
].scnhdr
),
2282 as_bad (_("bfd_coff_swap_scnhdr_out failed"));
2283 bfd_bwrite (buffer
, (bfd_size_type
) size
, abfd
);
2289 symbol_to_chars (abfd
, where
, symbolP
)
2294 unsigned int numaux
= symbolP
->sy_symbol
.ost_entry
.n_numaux
;
2298 /* Turn any symbols with register attributes into abs symbols. */
2299 if (S_GET_SEGMENT (symbolP
) == reg_section
)
2300 S_SET_SEGMENT (symbolP
, absolute_section
);
2302 /* At the same time, relocate all symbols to their output value. */
2304 val
= (segment_info
[S_GET_SEGMENT (symbolP
)].scnhdr
.s_paddr
2305 + S_GET_VALUE (symbolP
));
2307 val
= S_GET_VALUE (symbolP
);
2310 S_SET_VALUE (symbolP
, val
);
2312 symbolP
->sy_symbol
.ost_entry
.n_value
= val
;
2314 where
+= bfd_coff_swap_sym_out (abfd
, &symbolP
->sy_symbol
.ost_entry
,
2317 for (i
= 0; i
< numaux
; i
++)
2319 where
+= bfd_coff_swap_aux_out (abfd
,
2320 &symbolP
->sy_symbol
.ost_auxent
[i
],
2321 S_GET_DATA_TYPE (symbolP
),
2322 S_GET_STORAGE_CLASS (symbolP
),
2330 coff_obj_symbol_new_hook (symbolP
)
2333 char underscore
= 0; /* Symbol has leading _ */
2335 /* Effective symbol. */
2336 /* Store the pointer in the offset. */
2337 S_SET_ZEROES (symbolP
, 0L);
2338 S_SET_DATA_TYPE (symbolP
, T_NULL
);
2339 S_SET_STORAGE_CLASS (symbolP
, 0);
2340 S_SET_NUMBER_AUXILIARY (symbolP
, 0);
2341 /* Additional information. */
2342 symbolP
->sy_symbol
.ost_flags
= 0;
2343 /* Auxiliary entries. */
2344 memset ((char *) &symbolP
->sy_symbol
.ost_auxent
[0], 0, AUXESZ
);
2346 if (S_IS_STRING (symbolP
))
2347 SF_SET_STRING (symbolP
);
2348 if (!underscore
&& S_IS_LOCAL (symbolP
))
2349 SF_SET_LOCAL (symbolP
);
2352 /* Handle .ln directives. */
2355 obj_coff_ln (appline
)
2360 if (! appline
&& def_symbol_in_progress
!= NULL
)
2362 /* Wrong context. */
2363 as_warn (_(".ln pseudo-op inside .def/.endef: ignored."));
2364 demand_empty_rest_of_line ();
2368 l
= get_absolute_expression ();
2369 c_line_new (0, frag_now_fix (), l
, frag_now
);
2372 new_logical_line ((char *) NULL
, l
- 1);
2382 listing_source_line ((unsigned int) l
);
2387 demand_empty_rest_of_line ();
2390 /* Handle .def directives.
2392 One might ask : why can't we symbol_new if the symbol does not
2393 already exist and fill it with debug information. Because of
2394 the C_EFCN special symbol. It would clobber the value of the
2395 function symbol before we have a chance to notice that it is
2396 a C_EFCN. And a second reason is that the code is more clear this
2397 way. (at least I think it is :-). */
2399 #define SKIP_SEMI_COLON() while (*input_line_pointer++ != ';')
2400 #define SKIP_WHITESPACES() while (*input_line_pointer == ' ' || \
2401 *input_line_pointer == '\t') \
2402 input_line_pointer++;
2406 int what ATTRIBUTE_UNUSED
;
2408 char name_end
; /* Char after the end of name. */
2409 char *symbol_name
; /* Name of the debug symbol. */
2410 char *symbol_name_copy
; /* Temporary copy of the name. */
2411 unsigned int symbol_name_length
;
2413 if (def_symbol_in_progress
!= NULL
)
2415 as_warn (_(".def pseudo-op used inside of .def/.endef: ignored."));
2416 demand_empty_rest_of_line ();
2420 SKIP_WHITESPACES ();
2422 def_symbol_in_progress
= (symbolS
*) obstack_alloc (¬es
, sizeof (*def_symbol_in_progress
));
2423 memset (def_symbol_in_progress
, 0, sizeof (*def_symbol_in_progress
));
2425 symbol_name
= input_line_pointer
;
2426 name_end
= get_symbol_end ();
2427 symbol_name_length
= strlen (symbol_name
);
2428 symbol_name_copy
= xmalloc (symbol_name_length
+ 1);
2429 strcpy (symbol_name_copy
, symbol_name
);
2430 #ifdef tc_canonicalize_symbol_name
2431 symbol_name_copy
= tc_canonicalize_symbol_name (symbol_name_copy
);
2434 /* Initialize the new symbol. */
2435 #ifdef STRIP_UNDERSCORE
2436 S_SET_NAME (def_symbol_in_progress
, (*symbol_name_copy
== '_'
2437 ? symbol_name_copy
+ 1
2438 : symbol_name_copy
));
2439 #else /* STRIP_UNDERSCORE */
2440 S_SET_NAME (def_symbol_in_progress
, symbol_name_copy
);
2441 #endif /* STRIP_UNDERSCORE */
2442 /* free(symbol_name_copy); */
2443 def_symbol_in_progress
->sy_name_offset
= (unsigned long) ~0;
2444 def_symbol_in_progress
->sy_number
= ~0;
2445 def_symbol_in_progress
->sy_frag
= &zero_address_frag
;
2446 S_SET_VALUE (def_symbol_in_progress
, 0);
2448 if (S_IS_STRING (def_symbol_in_progress
))
2449 SF_SET_STRING (def_symbol_in_progress
);
2451 *input_line_pointer
= name_end
;
2453 demand_empty_rest_of_line ();
2456 unsigned int dim_index
;
2459 obj_coff_endef (ignore
)
2460 int ignore ATTRIBUTE_UNUSED
;
2462 symbolS
*symbolP
= 0;
2463 /* DIM BUG FIX sac@cygnus.com */
2465 if (def_symbol_in_progress
== NULL
)
2467 as_warn (_(".endef pseudo-op used outside of .def/.endef: ignored."));
2468 demand_empty_rest_of_line ();
2472 /* Set the section number according to storage class. */
2473 switch (S_GET_STORAGE_CLASS (def_symbol_in_progress
))
2478 SF_SET_TAG (def_symbol_in_progress
);
2479 /* Intentional fallthrough. */
2483 SF_SET_DEBUG (def_symbol_in_progress
);
2484 S_SET_SEGMENT (def_symbol_in_progress
, SEG_DEBUG
);
2488 /* Do not emit this symbol. */
2489 SF_SET_LOCAL (def_symbol_in_progress
);
2490 /* Intentional fallthrough. */
2493 /* Will need processing before writing. */
2494 SF_SET_PROCESS (def_symbol_in_progress
);
2495 /* Intentional fallthrough. */
2498 S_SET_SEGMENT (def_symbol_in_progress
, SEG_E0
);
2500 if (strcmp (S_GET_NAME (def_symbol_in_progress
), ".bf") == 0)
2502 if (function_lineoff
< 0)
2503 fprintf (stderr
, _("`.bf' symbol without preceding function\n"));
2505 SA_GET_SYM_LNNOPTR (last_line_symbol
) = function_lineoff
;
2507 SF_SET_PROCESS (last_line_symbol
);
2508 SF_SET_ADJ_LNNOPTR (last_line_symbol
);
2509 SF_SET_PROCESS (def_symbol_in_progress
);
2510 function_lineoff
= -1;
2513 /* Value is always set to . */
2514 def_symbol_in_progress
->sy_frag
= frag_now
;
2515 S_SET_VALUE (def_symbol_in_progress
, (valueT
) frag_now_fix ());
2520 #endif /* C_AUTOARG */
2530 SF_SET_DEBUG (def_symbol_in_progress
);
2531 S_SET_SEGMENT (def_symbol_in_progress
, absolute_section
);
2541 /* Valid but set somewhere else (s_comm, s_lcomm, colon). */
2547 as_warn (_("unexpected storage class %d"), S_GET_STORAGE_CLASS (def_symbol_in_progress
));
2551 /* Now that we have built a debug symbol, try to find if we should
2552 merge with an existing symbol or not. If a symbol is C_EFCN or
2553 absolute_section or untagged SEG_DEBUG it never merges. We also
2554 don't merge labels, which are in a different namespace, nor
2555 symbols which have not yet been defined since they are typically
2556 unique, nor do we merge tags with non-tags. */
2558 /* Two cases for functions. Either debug followed by definition or
2559 definition followed by debug. For definition first, we will
2560 merge the debug symbol into the definition. For debug first, the
2561 lineno entry MUST point to the definition function or else it
2562 will point off into space when crawl_symbols() merges the debug
2563 symbol into the real symbol. Therefor, let's presume the debug
2564 symbol is a real function reference. */
2566 /* FIXME-SOON If for some reason the definition label/symbol is
2567 never seen, this will probably leave an undefined symbol at link
2570 if (S_GET_STORAGE_CLASS (def_symbol_in_progress
) == C_EFCN
2571 || S_GET_STORAGE_CLASS (def_symbol_in_progress
) == C_LABEL
2572 || (S_GET_SEGMENT (def_symbol_in_progress
) == SEG_DEBUG
2573 && !SF_GET_TAG (def_symbol_in_progress
))
2574 || S_GET_SEGMENT (def_symbol_in_progress
) == absolute_section
2575 || def_symbol_in_progress
->sy_value
.X_op
!= O_constant
2576 || (symbolP
= symbol_find_base (S_GET_NAME (def_symbol_in_progress
), DO_NOT_STRIP
)) == NULL
2577 || (SF_GET_TAG (def_symbol_in_progress
) != SF_GET_TAG (symbolP
)))
2579 symbol_append (def_symbol_in_progress
, symbol_lastP
, &symbol_rootP
,
2584 /* This symbol already exists, merge the newly created symbol
2585 into the old one. This is not mandatory. The linker can
2586 handle duplicate symbols correctly. But I guess that it save
2587 a *lot* of space if the assembly file defines a lot of
2590 /* The debug entry (def_symbol_in_progress) is merged into the
2591 previous definition. */
2593 c_symbol_merge (def_symbol_in_progress
, symbolP
);
2594 /* FIXME-SOON Should *def_symbol_in_progress be free'd? xoxorich. */
2595 def_symbol_in_progress
= symbolP
;
2597 if (SF_GET_FUNCTION (def_symbol_in_progress
)
2598 || SF_GET_TAG (def_symbol_in_progress
)
2599 || S_GET_STORAGE_CLASS (def_symbol_in_progress
) == C_STAT
)
2601 /* For functions, and tags, and static symbols, the symbol
2602 *must* be where the debug symbol appears. Move the
2603 existing symbol to the current place. */
2604 /* If it already is at the end of the symbol list, do nothing. */
2605 if (def_symbol_in_progress
!= symbol_lastP
)
2607 symbol_remove (def_symbol_in_progress
, &symbol_rootP
,
2609 symbol_append (def_symbol_in_progress
, symbol_lastP
,
2610 &symbol_rootP
, &symbol_lastP
);
2615 if (SF_GET_TAG (def_symbol_in_progress
))
2619 oldtag
= symbol_find_base (S_GET_NAME (def_symbol_in_progress
),
2621 if (oldtag
== NULL
|| ! SF_GET_TAG (oldtag
))
2622 tag_insert (S_GET_NAME (def_symbol_in_progress
),
2623 def_symbol_in_progress
);
2626 if (SF_GET_FUNCTION (def_symbol_in_progress
))
2628 know (sizeof (def_symbol_in_progress
) <= sizeof (long));
2630 = c_line_new (def_symbol_in_progress
, 0, 0, &zero_address_frag
);
2632 SF_SET_PROCESS (def_symbol_in_progress
);
2634 if (symbolP
== NULL
)
2636 /* That is, if this is the first time we've seen the
2638 symbol_table_insert (def_symbol_in_progress
);
2642 def_symbol_in_progress
= NULL
;
2643 demand_empty_rest_of_line ();
2647 obj_coff_dim (ignore
)
2648 int ignore ATTRIBUTE_UNUSED
;
2652 if (def_symbol_in_progress
== NULL
)
2654 as_warn (_(".dim pseudo-op used outside of .def/.endef: ignored."));
2655 demand_empty_rest_of_line ();
2659 S_SET_NUMBER_AUXILIARY (def_symbol_in_progress
, 1);
2661 for (dim_index
= 0; dim_index
< DIMNUM
; dim_index
++)
2663 SKIP_WHITESPACES ();
2664 SA_SET_SYM_DIMEN (def_symbol_in_progress
, dim_index
,
2665 get_absolute_expression ());
2667 switch (*input_line_pointer
)
2670 input_line_pointer
++;
2674 as_warn (_("badly formed .dim directive ignored"));
2675 /* Intentional fallthrough. */
2684 demand_empty_rest_of_line ();
2688 obj_coff_line (ignore
)
2689 int ignore ATTRIBUTE_UNUSED
;
2694 if (def_symbol_in_progress
== NULL
)
2700 name
= S_GET_NAME (def_symbol_in_progress
);
2701 this_base
= get_absolute_expression ();
2703 /* Only .bf symbols indicate the use of a new base line number; the
2704 line numbers associated with .ef, .bb, .eb are relative to the
2705 start of the containing function. */
2706 if (!strcmp (".bf", name
))
2708 #if 0 /* XXX Can we ever have line numbers going backwards? */
2709 if (this_base
> line_base
)
2711 line_base
= this_base
;
2717 listing_source_line ((unsigned int) line_base
);
2722 S_SET_NUMBER_AUXILIARY (def_symbol_in_progress
, 1);
2723 SA_SET_SYM_LNNO (def_symbol_in_progress
, this_base
);
2725 demand_empty_rest_of_line ();
2729 obj_coff_size (ignore
)
2730 int ignore ATTRIBUTE_UNUSED
;
2732 if (def_symbol_in_progress
== NULL
)
2734 as_warn (_(".size pseudo-op used outside of .def/.endef ignored."));
2735 demand_empty_rest_of_line ();
2739 S_SET_NUMBER_AUXILIARY (def_symbol_in_progress
, 1);
2740 SA_SET_SYM_SIZE (def_symbol_in_progress
, get_absolute_expression ());
2741 demand_empty_rest_of_line ();
2745 obj_coff_scl (ignore
)
2746 int ignore ATTRIBUTE_UNUSED
;
2748 if (def_symbol_in_progress
== NULL
)
2750 as_warn (_(".scl pseudo-op used outside of .def/.endef ignored."));
2751 demand_empty_rest_of_line ();
2755 S_SET_STORAGE_CLASS (def_symbol_in_progress
, get_absolute_expression ());
2756 demand_empty_rest_of_line ();
2760 obj_coff_tag (ignore
)
2761 int ignore ATTRIBUTE_UNUSED
;
2766 if (def_symbol_in_progress
== NULL
)
2768 as_warn (_(".tag pseudo-op used outside of .def/.endef ignored."));
2769 demand_empty_rest_of_line ();
2773 S_SET_NUMBER_AUXILIARY (def_symbol_in_progress
, 1);
2774 symbol_name
= input_line_pointer
;
2775 name_end
= get_symbol_end ();
2776 #ifdef tc_canonicalize_symbol_name
2777 symbol_name
= tc_canonicalize_symbol_name (symbol_name
);
2780 /* Assume that the symbol referred to by .tag is always defined.
2781 This was a bad assumption. I've added find_or_make. xoxorich. */
2782 SA_SET_SYM_TAGNDX (def_symbol_in_progress
,
2783 (long) tag_find_or_make (symbol_name
));
2784 if (SA_GET_SYM_TAGNDX (def_symbol_in_progress
) == 0L)
2785 as_warn (_("tag not found for .tag %s"), symbol_name
);
2787 SF_SET_TAGGED (def_symbol_in_progress
);
2788 *input_line_pointer
= name_end
;
2790 demand_empty_rest_of_line ();
2794 obj_coff_type (ignore
)
2795 int ignore ATTRIBUTE_UNUSED
;
2797 if (def_symbol_in_progress
== NULL
)
2799 as_warn (_(".type pseudo-op used outside of .def/.endef ignored."));
2800 demand_empty_rest_of_line ();
2804 S_SET_DATA_TYPE (def_symbol_in_progress
, get_absolute_expression ());
2806 if (ISFCN (S_GET_DATA_TYPE (def_symbol_in_progress
)) &&
2807 S_GET_STORAGE_CLASS (def_symbol_in_progress
) != C_TPDEF
)
2808 SF_SET_FUNCTION (def_symbol_in_progress
);
2810 demand_empty_rest_of_line ();
2814 obj_coff_val (ignore
)
2815 int ignore ATTRIBUTE_UNUSED
;
2817 if (def_symbol_in_progress
== NULL
)
2819 as_warn (_(".val pseudo-op used outside of .def/.endef ignored."));
2820 demand_empty_rest_of_line ();
2824 if (is_name_beginner (*input_line_pointer
))
2826 char *symbol_name
= input_line_pointer
;
2827 char name_end
= get_symbol_end ();
2829 #ifdef tc_canonicalize_symbol_name
2830 symbol_name
= tc_canonicalize_symbol_name (symbol_name
);
2833 if (!strcmp (symbol_name
, "."))
2835 def_symbol_in_progress
->sy_frag
= frag_now
;
2836 S_SET_VALUE (def_symbol_in_progress
, (valueT
) frag_now_fix ());
2837 /* If the .val is != from the .def (e.g. statics). */
2839 else if (strcmp (S_GET_NAME (def_symbol_in_progress
), symbol_name
))
2841 def_symbol_in_progress
->sy_value
.X_op
= O_symbol
;
2842 def_symbol_in_progress
->sy_value
.X_add_symbol
=
2843 symbol_find_or_make (symbol_name
);
2844 def_symbol_in_progress
->sy_value
.X_op_symbol
= NULL
;
2845 def_symbol_in_progress
->sy_value
.X_add_number
= 0;
2847 /* If the segment is undefined when the forward reference is
2848 resolved, then copy the segment id from the forward
2850 SF_SET_GET_SEGMENT (def_symbol_in_progress
);
2852 /* FIXME: gcc can generate address expressions here in
2853 unusual cases (search for "obscure" in sdbout.c). We
2854 just ignore the offset here, thus generating incorrect
2855 debugging information. We ignore the rest of the line
2858 /* Otherwise, it is the name of a non debug symbol and
2859 its value will be calculated later. */
2860 *input_line_pointer
= name_end
;
2862 /* FIXME: this is to avoid an error message in the
2863 FIXME case mentioned just above. */
2864 while (! is_end_of_line
[(unsigned char) *input_line_pointer
])
2865 ++input_line_pointer
;
2869 S_SET_VALUE (def_symbol_in_progress
,
2870 (valueT
) get_absolute_expression ());
2871 } /* if symbol based */
2873 demand_empty_rest_of_line ();
2878 /* Handle the .linkonce pseudo-op. This is parsed by s_linkonce in
2879 read.c, which then calls this object file format specific routine. */
2882 obj_coff_pe_handle_link_once (type
)
2883 enum linkonce_type type
;
2885 seg_info (now_seg
)->scnhdr
.s_flags
|= IMAGE_SCN_LNK_COMDAT
;
2887 /* We store the type in the seg_info structure, and use it to set up
2888 the auxiliary entry for the section symbol in c_section_symbol. */
2889 seg_info (now_seg
)->linkonce
= type
;
2895 coff_obj_read_begin_hook ()
2897 /* These had better be the same. Usually 18 bytes. */
2899 know (sizeof (SYMENT
) == sizeof (AUXENT
));
2900 know (SYMESZ
== AUXESZ
);
2905 /* This function runs through the symbol table and puts all the
2906 externals onto another chain. */
2908 /* The chain of globals. */
2909 symbolS
*symbol_globalP
;
2910 symbolS
*symbol_global_lastP
;
2912 /* The chain of externals. */
2913 symbolS
*symbol_externP
;
2914 symbolS
*symbol_extern_lastP
;
2917 symbolS
*last_functionP
;
2918 static symbolS
*last_bfP
;
2925 unsigned int symbol_number
= 0;
2926 unsigned int last_file_symno
= 0;
2928 struct filename_list
*filename_list_scan
= filename_list_head
;
2930 for (symbolP
= symbol_rootP
;
2932 symbolP
= symbolP
? symbol_next (symbolP
) : symbol_rootP
)
2934 if (symbolP
->sy_mri_common
)
2936 if (S_GET_STORAGE_CLASS (symbolP
) == C_EXT
2938 || S_GET_STORAGE_CLASS (symbolP
) == C_NT_WEAK
2940 || S_GET_STORAGE_CLASS (symbolP
) == C_WEAKEXT
)
2941 as_bad (_("%s: global symbols not supported in common sections"),
2942 S_GET_NAME (symbolP
));
2943 symbol_remove (symbolP
, &symbol_rootP
, &symbol_lastP
);
2947 if (!SF_GET_DEBUG (symbolP
))
2949 /* Debug symbols do not need all this rubbish. */
2950 symbolS
*real_symbolP
;
2952 /* L* and C_EFCN symbols never merge. */
2953 if (!SF_GET_LOCAL (symbolP
)
2954 && !SF_GET_STATICS (symbolP
)
2955 && S_GET_STORAGE_CLASS (symbolP
) != C_LABEL
2956 && symbolP
->sy_value
.X_op
== O_constant
2957 && (real_symbolP
= symbol_find_base (S_GET_NAME (symbolP
), DO_NOT_STRIP
))
2958 && real_symbolP
!= symbolP
)
2960 /* FIXME-SOON: where do dups come from?
2961 Maybe tag references before definitions? xoxorich. */
2962 /* Move the debug data from the debug symbol to the
2963 real symbol. Do NOT do the oposite (i.e. move from
2964 real symbol to debug symbol and remove real symbol from the
2965 list.) Because some pointers refer to the real symbol
2966 whereas no pointers refer to the debug symbol. */
2967 c_symbol_merge (symbolP
, real_symbolP
);
2968 /* Replace the current symbol by the real one. */
2969 /* The symbols will never be the last or the first
2970 because : 1st symbol is .file and 3 last symbols are
2971 .text, .data, .bss. */
2972 symbol_remove (real_symbolP
, &symbol_rootP
, &symbol_lastP
);
2973 symbol_insert (real_symbolP
, symbolP
, &symbol_rootP
, &symbol_lastP
);
2974 symbol_remove (symbolP
, &symbol_rootP
, &symbol_lastP
);
2975 symbolP
= real_symbolP
;
2978 if (flag_readonly_data_in_text
&& (S_GET_SEGMENT (symbolP
) == SEG_E1
))
2979 S_SET_SEGMENT (symbolP
, SEG_E0
);
2981 resolve_symbol_value (symbolP
);
2983 if (S_GET_STORAGE_CLASS (symbolP
) == C_NULL
)
2985 if (!S_IS_DEFINED (symbolP
) && !SF_GET_LOCAL (symbolP
))
2987 S_SET_EXTERNAL (symbolP
);
2990 else if (S_GET_SEGMENT (symbolP
) == SEG_E0
)
2991 S_SET_STORAGE_CLASS (symbolP
, C_LABEL
);
2994 S_SET_STORAGE_CLASS (symbolP
, C_STAT
);
2997 /* Mainly to speed up if not -g. */
2998 if (SF_GET_PROCESS (symbolP
))
3000 /* Handle the nested blocks auxiliary info. */
3001 if (S_GET_STORAGE_CLASS (symbolP
) == C_BLOCK
)
3003 if (!strcmp (S_GET_NAME (symbolP
), ".bb"))
3004 stack_push (block_stack
, (char *) &symbolP
);
3008 symbolS
*begin_symbolP
;
3010 begin_symbolP
= *(symbolS
**) stack_pop (block_stack
);
3011 if (begin_symbolP
== (symbolS
*) 0)
3012 as_warn (_("mismatched .eb"));
3014 SA_SET_SYM_ENDNDX (begin_symbolP
, symbol_number
+ 2);
3017 /* If we are able to identify the type of a function, and we
3018 are out of a function (last_functionP == 0) then, the
3019 function symbol will be associated with an auxiliary
3021 if (last_functionP
== (symbolS
*) 0 &&
3022 SF_GET_FUNCTION (symbolP
))
3024 last_functionP
= symbolP
;
3026 if (S_GET_NUMBER_AUXILIARY (symbolP
) < 1)
3027 S_SET_NUMBER_AUXILIARY (symbolP
, 1);
3029 /* Clobber possible stale .dim information. */
3031 /* Iffed out by steve - this fries the lnnoptr info too. */
3032 bzero (symbolP
->sy_symbol
.ost_auxent
[0].x_sym
.x_fcnary
.x_ary
.x_dimen
,
3033 sizeof (symbolP
->sy_symbol
.ost_auxent
[0].x_sym
.x_fcnary
.x_ary
.x_dimen
));
3036 if (S_GET_STORAGE_CLASS (symbolP
) == C_FCN
)
3038 if (strcmp (S_GET_NAME (symbolP
), ".bf") == 0)
3040 if (last_bfP
!= NULL
)
3041 SA_SET_SYM_ENDNDX (last_bfP
, symbol_number
);
3045 else if (S_GET_STORAGE_CLASS (symbolP
) == C_EFCN
)
3047 /* I don't even know if this is needed for sdb. But
3048 the standard assembler generates it, so... */
3049 if (last_functionP
== (symbolS
*) 0)
3050 as_fatal (_("C_EFCN symbol out of scope"));
3051 SA_SET_SYM_FSIZE (last_functionP
,
3052 (long) (S_GET_VALUE (symbolP
) -
3053 S_GET_VALUE (last_functionP
)));
3054 SA_SET_SYM_ENDNDX (last_functionP
, symbol_number
);
3055 last_functionP
= (symbolS
*) 0;
3059 else if (SF_GET_TAG (symbolP
))
3061 /* First descriptor of a structure must point to
3062 the first slot after the structure description. */
3063 last_tagP
= symbolP
;
3066 else if (S_GET_STORAGE_CLASS (symbolP
) == C_EOS
)
3068 /* +2 take in account the current symbol. */
3069 SA_SET_SYM_ENDNDX (last_tagP
, symbol_number
+ 2);
3071 else if (S_GET_STORAGE_CLASS (symbolP
) == C_FILE
)
3073 /* If the filename was too long to fit in the
3074 auxent, put it in the string table. */
3075 if (SA_GET_FILE_FNAME_ZEROS (symbolP
) == 0
3076 && SA_GET_FILE_FNAME_OFFSET (symbolP
) != 0)
3078 SA_SET_FILE_FNAME_OFFSET (symbolP
, string_byte_count
);
3079 string_byte_count
+= strlen (filename_list_scan
->filename
) + 1;
3080 filename_list_scan
= filename_list_scan
->next
;
3082 if (S_GET_VALUE (symbolP
))
3084 S_SET_VALUE (symbolP
, last_file_symno
);
3085 last_file_symno
= symbol_number
;
3089 #ifdef tc_frob_coff_symbol
3090 tc_frob_coff_symbol (symbolP
);
3093 /* We must put the external symbols apart. The loader
3094 does not bomb if we do not. But the references in
3095 the endndx field for a .bb symbol are not corrected
3096 if an external symbol is removed between .bb and .be.
3097 I.e in the following case :
3098 [20] .bb endndx = 22
3101 ld will move the symbol 21 to the end of the list but
3102 endndx will still be 22 instead of 21. */
3104 if (SF_GET_LOCAL (symbolP
))
3106 /* Remove C_EFCN and LOCAL (L...) symbols. */
3107 /* Next pointer remains valid. */
3108 symbol_remove (symbolP
, &symbol_rootP
, &symbol_lastP
);
3111 else if (symbolP
->sy_value
.X_op
== O_symbol
3112 && (! S_IS_DEFINED (symbolP
) || S_IS_COMMON (symbolP
)))
3114 /* Skip symbols which were equated to undefined or common
3116 symbol_remove (symbolP
, &symbol_rootP
, &symbol_lastP
);
3118 else if (!S_IS_DEFINED (symbolP
)
3119 && !S_IS_DEBUG (symbolP
)
3120 && !SF_GET_STATICS (symbolP
)
3121 && (S_GET_STORAGE_CLASS (symbolP
) == C_EXT
3123 || S_GET_STORAGE_CLASS (symbolP
) == C_NT_WEAK
3125 || S_GET_STORAGE_CLASS (symbolP
) == C_WEAKEXT
))
3127 /* If external, Remove from the list. */
3128 symbolS
*hold
= symbol_previous (symbolP
);
3130 symbol_remove (symbolP
, &symbol_rootP
, &symbol_lastP
);
3131 symbol_clear_list_pointers (symbolP
);
3132 symbol_append (symbolP
, symbol_extern_lastP
, &symbol_externP
, &symbol_extern_lastP
);
3135 else if (! S_IS_DEBUG (symbolP
)
3136 && ! SF_GET_STATICS (symbolP
)
3137 && ! SF_GET_FUNCTION (symbolP
)
3138 && (S_GET_STORAGE_CLASS (symbolP
) == C_EXT
3140 || S_GET_STORAGE_CLASS (symbolP
) == C_NT_WEAK
3142 || S_GET_STORAGE_CLASS (symbolP
) == C_NT_WEAK
))
3144 symbolS
*hold
= symbol_previous (symbolP
);
3146 /* The O'Reilly COFF book says that defined global symbols
3147 come at the end of the symbol table, just before
3148 undefined global symbols. */
3149 symbol_remove (symbolP
, &symbol_rootP
, &symbol_lastP
);
3150 symbol_clear_list_pointers (symbolP
);
3151 symbol_append (symbolP
, symbol_global_lastP
, &symbol_globalP
,
3152 &symbol_global_lastP
);
3157 if (SF_GET_STRING (symbolP
))
3159 symbolP
->sy_name_offset
= string_byte_count
;
3160 string_byte_count
+= strlen (S_GET_NAME (symbolP
)) + 1;
3164 symbolP
->sy_name_offset
= 0;
3167 symbolP
->sy_number
= symbol_number
;
3168 symbol_number
+= 1 + S_GET_NUMBER_AUXILIARY (symbolP
);
3172 return symbol_number
;
3176 glue_symbols (head
, tail
)
3180 unsigned int symbol_number
= 0;
3182 while (*head
!= NULL
)
3184 symbolS
*tmp
= *head
;
3187 symbol_remove (tmp
, head
, tail
);
3188 symbol_append (tmp
, symbol_lastP
, &symbol_rootP
, &symbol_lastP
);
3191 if (SF_GET_STRING (tmp
))
3193 tmp
->sy_name_offset
= string_byte_count
;
3194 string_byte_count
+= strlen (S_GET_NAME (tmp
)) + 1;
3198 /* Fix "long" names. */
3199 tmp
->sy_name_offset
= 0;
3202 tmp
->sy_number
= symbol_number
;
3203 symbol_number
+= 1 + S_GET_NUMBER_AUXILIARY (tmp
);
3206 return symbol_number
;
3212 unsigned int symbol_number
= 0;
3215 for (symbolP
= symbol_rootP
; symbolP
; symbolP
= symbol_next (symbolP
))
3217 symbolP
->sy_number
= symbol_number
;
3219 if (SF_GET_TAGGED (symbolP
))
3223 ((symbolS
*) SA_GET_SYM_TAGNDX (symbolP
))->sy_number
);
3226 symbol_number
+= 1 + S_GET_NUMBER_AUXILIARY (symbolP
);
3229 return symbol_number
;
3234 crawl_symbols (h
, abfd
)
3236 bfd
*abfd ATTRIBUTE_UNUSED
;
3240 /* Initialize the stack used to keep track of the matching .bb .be. */
3242 block_stack
= stack_init (512, sizeof (symbolS
*));
3244 /* The symbol list should be ordered according to the following sequence
3247 . debug entries for functions
3248 . fake symbols for the sections, including .text .data and .bss
3251 But this is not mandatory. The only important point is to put the
3252 undefined symbols at the end of the list. */
3254 /* Is there a .file symbol ? If not insert one at the beginning. */
3255 if (symbol_rootP
== NULL
3256 || S_GET_STORAGE_CLASS (symbol_rootP
) != C_FILE
)
3257 c_dot_file_symbol ("fake");
3259 /* Build up static symbols for the sections, they are filled in later. */
3261 for (i
= SEG_E0
; i
< SEG_LAST
; i
++)
3262 if (segment_info
[i
].scnhdr
.s_name
[0])
3263 segment_info
[i
].dot
= c_section_symbol ((char *) segment_info
[i
].name
,
3266 /* Take all the externals out and put them into another chain. */
3267 H_SET_SYMBOL_TABLE_SIZE (h
, yank_symbols ());
3268 /* Take the externals and glue them onto the end. */
3269 H_SET_SYMBOL_TABLE_SIZE (h
,
3270 (H_GET_SYMBOL_COUNT (h
)
3271 + glue_symbols (&symbol_globalP
,
3272 &symbol_global_lastP
)
3273 + glue_symbols (&symbol_externP
,
3274 &symbol_extern_lastP
)));
3276 H_SET_SYMBOL_TABLE_SIZE (h
, tie_tags ());
3277 know (symbol_globalP
== NULL
);
3278 know (symbol_global_lastP
== NULL
);
3279 know (symbol_externP
== NULL
);
3280 know (symbol_extern_lastP
== NULL
);
3283 /* Find strings by crawling along symbol table chain. */
3290 struct filename_list
*filename_list_scan
= filename_list_head
;
3292 /* Gotta do md_ byte-ordering stuff for string_byte_count first - KWK. */
3293 md_number_to_chars (where
, (valueT
) string_byte_count
, 4);
3296 #ifdef COFF_LONG_SECTION_NAMES
3297 /* Support long section names as found in PE. This code must
3298 coordinate with that in coff_header_append and write_object_file. */
3302 for (i
= SEG_E0
; i
< SEG_LAST
; i
++)
3304 if (segment_info
[i
].scnhdr
.s_name
[0]
3305 && strlen (segment_info
[i
].name
) > SCNNMLEN
)
3309 size
= strlen (segment_info
[i
].name
) + 1;
3310 memcpy (where
, segment_info
[i
].name
, size
);
3315 #endif /* COFF_LONG_SECTION_NAMES */
3317 for (symbolP
= symbol_rootP
;
3319 symbolP
= symbol_next (symbolP
))
3323 if (SF_GET_STRING (symbolP
))
3325 size
= strlen (S_GET_NAME (symbolP
)) + 1;
3326 memcpy (where
, S_GET_NAME (symbolP
), size
);
3329 if (S_GET_STORAGE_CLASS (symbolP
) == C_FILE
3330 && SA_GET_FILE_FNAME_ZEROS (symbolP
) == 0
3331 && SA_GET_FILE_FNAME_OFFSET (symbolP
) != 0)
3333 size
= strlen (filename_list_scan
->filename
) + 1;
3334 memcpy (where
, filename_list_scan
->filename
, size
);
3335 filename_list_scan
= filename_list_scan
->next
;
3342 do_linenos_for (abfd
, h
, file_cursor
)
3345 unsigned long *file_cursor
;
3348 unsigned long start
= *file_cursor
;
3350 for (idx
= SEG_E0
; idx
< SEG_LAST
; idx
++)
3352 segment_info_type
*s
= segment_info
+ idx
;
3354 if (s
->scnhdr
.s_nlnno
!= 0)
3356 struct lineno_list
*line_ptr
;
3358 struct external_lineno
*buffer
=
3359 (struct external_lineno
*) xmalloc (s
->scnhdr
.s_nlnno
* LINESZ
);
3361 struct external_lineno
*dst
= buffer
;
3363 /* Run through the table we've built and turn it into its external
3364 form, take this chance to remove duplicates. */
3366 for (line_ptr
= s
->lineno_list_head
;
3367 line_ptr
!= (struct lineno_list
*) NULL
;
3368 line_ptr
= line_ptr
->next
)
3370 if (line_ptr
->line
.l_lnno
== 0)
3372 /* Turn a pointer to a symbol into the symbols' index,
3373 provided that it has been initialised. */
3374 if (line_ptr
->line
.l_addr
.l_symndx
)
3375 line_ptr
->line
.l_addr
.l_symndx
=
3376 ((symbolS
*) line_ptr
->line
.l_addr
.l_symndx
)->sy_number
;
3379 line_ptr
->line
.l_addr
.l_paddr
+= ((struct frag
*) (line_ptr
->frag
))->fr_address
;
3381 (void) bfd_coff_swap_lineno_out (abfd
, &(line_ptr
->line
), dst
);
3385 s
->scnhdr
.s_lnnoptr
= *file_cursor
;
3387 bfd_bwrite (buffer
, (bfd_size_type
) s
->scnhdr
.s_nlnno
* LINESZ
, abfd
);
3390 *file_cursor
+= s
->scnhdr
.s_nlnno
* LINESZ
;
3394 H_SET_LINENO_SIZE (h
, *file_cursor
- start
);
3397 /* Now we run through the list of frag chains in a segment and
3398 make all the subsegment frags appear at the end of the
3399 list, as if the seg 0 was extra long. */
3406 for (i
= SEG_E0
; i
< SEG_UNKNOWN
; i
++)
3408 frchainS
*head
= segment_info
[i
].frchainP
;
3410 fragS
*prev_frag
= &dummy
;
3412 while (head
&& head
->frch_seg
== i
)
3414 prev_frag
->fr_next
= head
->frch_root
;
3415 prev_frag
= head
->frch_last
;
3416 head
= head
->frch_next
;
3418 prev_frag
->fr_next
= 0;
3422 unsigned long machine
;
3425 #ifndef SUB_SEGMENT_ALIGN
3427 /* The last subsegment gets an aligment corresponding to the alignment
3428 of the section. This allows proper nop-filling at the end of
3429 code-bearing sections. */
3430 #define SUB_SEGMENT_ALIGN(SEG, FRCHAIN) \
3431 (!(FRCHAIN)->frch_next || (FRCHAIN)->frch_next->frch_seg != (SEG) \
3432 ? get_recorded_alignment (SEG) : 0)
3434 #define SUB_SEGMENT_ALIGN(SEG, FRCHAIN) 1
3439 write_object_file ()
3443 struct frchain
*frchain_ptr
;
3445 object_headers headers
;
3446 unsigned long file_cursor
;
3449 abfd
= bfd_openw (out_file_name
, TARGET_FORMAT
);
3453 as_perror (_("FATAL: Can't create %s"), out_file_name
);
3454 exit (EXIT_FAILURE
);
3456 bfd_set_format (abfd
, bfd_object
);
3457 bfd_set_arch_mach (abfd
, BFD_ARCH
, machine
);
3459 string_byte_count
= 4;
3461 /* Run through all the sub-segments and align them up. Also
3462 close any open frags. We tack a .fill onto the end of the
3463 frag chain so that any .align's size can be worked by looking
3464 at the next frag. */
3465 for (frchain_ptr
= frchain_root
;
3466 frchain_ptr
!= (struct frchain
*) NULL
;
3467 frchain_ptr
= frchain_ptr
->frch_next
)
3471 subseg_set (frchain_ptr
->frch_seg
, frchain_ptr
->frch_subseg
);
3473 alignment
= SUB_SEGMENT_ALIGN (now_seg
, frchain_ptr
);
3476 md_do_align (alignment
, (char *) NULL
, 0, 0, alignment_done
);
3478 if (subseg_text_p (now_seg
))
3479 frag_align_code (alignment
, 0);
3481 frag_align (alignment
, 0, 0);
3487 frag_wane (frag_now
);
3488 frag_now
->fr_fix
= 0;
3489 know (frag_now
->fr_next
== NULL
);
3494 for (i
= SEG_E0
; i
< SEG_UNKNOWN
; i
++)
3495 relax_segment (segment_info
[i
].frchainP
->frch_root
, i
);
3497 /* Relaxation has completed. Freeze all syms. */
3500 H_SET_NUMBER_OF_SECTIONS (&headers
, 0);
3502 /* Find out how big the sections are, and set the addresses. */
3504 for (i
= SEG_E0
; i
< SEG_UNKNOWN
; i
++)
3508 segment_info
[i
].scnhdr
.s_paddr
= addr
;
3509 segment_info
[i
].scnhdr
.s_vaddr
= addr
;
3511 if (segment_info
[i
].scnhdr
.s_name
[0])
3513 H_SET_NUMBER_OF_SECTIONS (&headers
,
3514 H_GET_NUMBER_OF_SECTIONS (&headers
) + 1);
3516 #ifdef COFF_LONG_SECTION_NAMES
3517 /* Support long section names as found in PE. This code
3518 must coordinate with that in coff_header_append and
3523 len
= strlen (segment_info
[i
].name
);
3525 string_byte_count
+= len
+ 1;
3527 #endif /* COFF_LONG_SECTION_NAMES */
3530 size
= size_section (abfd
, (unsigned int) i
);
3533 /* I think the section alignment is only used on the i960; the
3534 i960 needs it, and it should do no harm on other targets. */
3535 #ifdef ALIGNMENT_IN_S_FLAGS
3536 segment_info
[i
].scnhdr
.s_flags
|= (section_alignment
[i
] & 0xF) << 8;
3538 segment_info
[i
].scnhdr
.s_align
= 1 << section_alignment
[i
];
3542 H_SET_TEXT_SIZE (&headers
, size
);
3543 else if (i
== SEG_E1
)
3544 H_SET_DATA_SIZE (&headers
, size
);
3545 else if (i
== SEG_E2
)
3546 H_SET_BSS_SIZE (&headers
, size
);
3549 /* Turn the gas native symbol table shape into a coff symbol table. */
3550 crawl_symbols (&headers
, abfd
);
3552 if (string_byte_count
== 4)
3553 string_byte_count
= 0;
3555 H_SET_STRING_SIZE (&headers
, string_byte_count
);
3561 for (i
= SEG_E0
; i
< SEG_UNKNOWN
; i
++)
3563 fixup_mdeps (segment_info
[i
].frchainP
->frch_root
, &headers
, i
);
3564 fixup_segment (&segment_info
[i
], i
);
3567 /* Look for ".stab" segments and fill in their initial symbols
3569 for (i
= SEG_E0
; i
< SEG_UNKNOWN
; i
++)
3571 name
= segment_info
[i
].name
;
3574 && strncmp (".stab", name
, 5) == 0
3575 && strncmp (".stabstr", name
, 8) != 0)
3576 adjust_stab_section (abfd
, i
);
3579 file_cursor
= H_GET_TEXT_FILE_OFFSET (&headers
);
3581 bfd_seek (abfd
, (file_ptr
) file_cursor
, 0);
3583 /* Plant the data. */
3584 fill_section (abfd
, &headers
, &file_cursor
);
3586 do_relocs_for (abfd
, &headers
, &file_cursor
);
3588 do_linenos_for (abfd
, &headers
, &file_cursor
);
3590 H_SET_FILE_MAGIC_NUMBER (&headers
, COFF_MAGIC
);
3591 #ifndef OBJ_COFF_OMIT_TIMESTAMP
3592 H_SET_TIME_STAMP (&headers
, (long)time((time_t *)0));
3594 H_SET_TIME_STAMP (&headers
, 0);
3596 #ifdef TC_COFF_SET_MACHINE
3597 TC_COFF_SET_MACHINE (&headers
);
3601 #define COFF_FLAGS 0
3604 #ifdef KEEP_RELOC_INFO
3605 H_SET_FLAGS (&headers
, ((H_GET_LINENO_SIZE(&headers
) ? 0 : F_LNNO
) |
3606 COFF_FLAGS
| coff_flags
));
3608 H_SET_FLAGS (&headers
, ((H_GET_LINENO_SIZE(&headers
) ? 0 : F_LNNO
) |
3609 (H_GET_RELOCATION_SIZE(&headers
) ? 0 : F_RELFLG
) |
3610 COFF_FLAGS
| coff_flags
));
3614 unsigned int symtable_size
= H_GET_SYMBOL_TABLE_SIZE (&headers
);
3615 char *buffer1
= xmalloc (symtable_size
+ string_byte_count
+ 1);
3617 H_SET_SYMBOL_TABLE_POINTER (&headers
, bfd_tell (abfd
));
3618 w_symbols (abfd
, buffer1
, symbol_rootP
);
3619 if (string_byte_count
> 0)
3620 w_strings (buffer1
+ symtable_size
);
3621 bfd_bwrite (buffer1
, (bfd_size_type
) symtable_size
+ string_byte_count
,
3626 coff_header_append (abfd
, &headers
);
3628 /* Recent changes to write need this, but where it should
3629 go is up to Ken.. */
3630 if (bfd_close_all_done (abfd
) == false)
3631 as_fatal (_("Can't close %s: %s"), out_file_name
,
3632 bfd_errmsg (bfd_get_error ()));
3635 extern bfd
*stdoutput
;
3642 /* Add a new segment. This is called from subseg_new via the
3643 obj_new_segment macro. */
3646 obj_coff_add_segment (name
)
3651 #ifndef COFF_LONG_SECTION_NAMES
3652 char buf
[SCNNMLEN
+ 1];
3654 strncpy (buf
, name
, SCNNMLEN
);
3655 buf
[SCNNMLEN
] = '\0';
3659 for (i
= SEG_E0
; i
< SEG_LAST
&& segment_info
[i
].scnhdr
.s_name
[0]; i
++)
3660 if (strcmp (name
, segment_info
[i
].name
) == 0)
3665 as_bad (_("Too many new sections; can't add \"%s\""), name
);
3669 /* Add a new section. */
3670 strncpy (segment_info
[i
].scnhdr
.s_name
, name
,
3671 sizeof (segment_info
[i
].scnhdr
.s_name
));
3672 segment_info
[i
].scnhdr
.s_flags
= STYP_REG
;
3673 segment_info
[i
].name
= xstrdup (name
);
3678 /* Implement the .section pseudo op:
3679 .section name {, "flags"}
3681 | +--- optional flags: 'b' for bss
3683 +-- section name 'l' for lib
3687 'd' (apparently m88k for data)
3689 'r' for read-only data
3690 But if the argument is not a quoted string, treat it as a
3691 subsegment number. */
3694 obj_coff_section (ignore
)
3695 int ignore ATTRIBUTE_UNUSED
;
3697 /* Strip out the section name. */
3698 char *section_name
, *name
;
3711 else if (type
== 'D')
3713 segment_info
[now_seg
].scnhdr
.s_flags
|= flags
;
3718 section_name
= input_line_pointer
;
3719 c
= get_symbol_end ();
3721 name
= xmalloc (input_line_pointer
- section_name
+ 1);
3722 strcpy (name
, section_name
);
3724 *input_line_pointer
= c
;
3730 if (*input_line_pointer
== ',')
3732 ++input_line_pointer
;
3735 if (*input_line_pointer
!= '"')
3736 exp
= get_absolute_expression ();
3739 ++input_line_pointer
;
3740 while (*input_line_pointer
!= '"'
3741 && ! is_end_of_line
[(unsigned char) *input_line_pointer
])
3743 switch (*input_line_pointer
)
3745 case 'b': flags
|= STYP_BSS
; break;
3746 case 'i': flags
|= STYP_INFO
; break;
3747 case 'l': flags
|= STYP_LIB
; break;
3748 case 'n': flags
|= STYP_NOLOAD
; break;
3749 case 'o': flags
|= STYP_OVER
; break;
3751 case 'w': flags
|= STYP_DATA
; break;
3752 case 'x': flags
|= STYP_TEXT
; break;
3753 case 'r': flags
|= STYP_LIT
; break;
3755 as_warn(_("unknown section attribute '%c'"),
3756 *input_line_pointer
);
3759 ++input_line_pointer
;
3761 if (*input_line_pointer
== '"')
3762 ++input_line_pointer
;
3766 subseg_new (name
, (subsegT
) exp
);
3768 segment_info
[now_seg
].scnhdr
.s_flags
|= flags
;
3770 demand_empty_rest_of_line ();
3774 obj_coff_text (ignore
)
3775 int ignore ATTRIBUTE_UNUSED
;
3777 subseg_new (".text", get_absolute_expression ());
3781 obj_coff_data (ignore
)
3782 int ignore ATTRIBUTE_UNUSED
;
3784 if (flag_readonly_data_in_text
)
3785 subseg_new (".text", get_absolute_expression () + 1000);
3787 subseg_new (".data", get_absolute_expression ());
3791 obj_coff_ident (ignore
)
3792 int ignore ATTRIBUTE_UNUSED
;
3794 segT current_seg
= now_seg
; /* Save current seg. */
3795 subsegT current_subseg
= now_subseg
;
3797 subseg_new (".comment", 0); /* .comment seg. */
3798 stringer (1); /* Read string. */
3799 subseg_set (current_seg
, current_subseg
); /* Restore current seg. */
3803 c_symbol_merge (debug
, normal
)
3807 S_SET_DATA_TYPE (normal
, S_GET_DATA_TYPE (debug
));
3808 S_SET_STORAGE_CLASS (normal
, S_GET_STORAGE_CLASS (debug
));
3810 if (S_GET_NUMBER_AUXILIARY (debug
) > S_GET_NUMBER_AUXILIARY (normal
))
3811 S_SET_NUMBER_AUXILIARY (normal
, S_GET_NUMBER_AUXILIARY (debug
));
3813 if (S_GET_NUMBER_AUXILIARY (debug
) > 0)
3814 memcpy ((char *) &normal
->sy_symbol
.ost_auxent
[0],
3815 (char *) &debug
->sy_symbol
.ost_auxent
[0],
3816 (unsigned int) (S_GET_NUMBER_AUXILIARY (debug
) * AUXESZ
));
3818 /* Move the debug flags. */
3819 SF_SET_DEBUG_FIELD (normal
, SF_GET_DEBUG_FIELD (debug
));
3823 c_line_new (symbol
, paddr
, line_number
, frag
)
3829 struct lineno_list
*new_line
=
3830 (struct lineno_list
*) xmalloc (sizeof (struct lineno_list
));
3832 segment_info_type
*s
= segment_info
+ now_seg
;
3833 new_line
->line
.l_lnno
= line_number
;
3835 if (line_number
== 0)
3837 last_line_symbol
= symbol
;
3838 new_line
->line
.l_addr
.l_symndx
= (long) symbol
;
3842 new_line
->line
.l_addr
.l_paddr
= paddr
;
3845 new_line
->frag
= (char *) frag
;
3846 new_line
->next
= (struct lineno_list
*) NULL
;
3848 if (s
->lineno_list_head
== (struct lineno_list
*) NULL
)
3849 s
->lineno_list_head
= new_line
;
3851 s
->lineno_list_tail
->next
= new_line
;
3853 s
->lineno_list_tail
= new_line
;
3854 return LINESZ
* s
->scnhdr
.s_nlnno
++;
3858 c_dot_file_symbol (filename
)
3863 symbolP
= symbol_new (".file",
3866 &zero_address_frag
);
3868 S_SET_STORAGE_CLASS (symbolP
, C_FILE
);
3869 S_SET_NUMBER_AUXILIARY (symbolP
, 1);
3871 if (strlen (filename
) > FILNMLEN
)
3873 /* Filename is too long to fit into an auxent,
3874 we stick it into the string table instead. We keep
3875 a linked list of the filenames we find so we can emit
3877 struct filename_list
*f
= ((struct filename_list
*)
3878 xmalloc (sizeof (struct filename_list
)));
3880 f
->filename
= filename
;
3883 SA_SET_FILE_FNAME_ZEROS (symbolP
, 0);
3884 SA_SET_FILE_FNAME_OFFSET (symbolP
, 1);
3886 if (filename_list_tail
)
3887 filename_list_tail
->next
= f
;
3889 filename_list_head
= f
;
3890 filename_list_tail
= f
;
3894 SA_SET_FILE_FNAME (symbolP
, filename
);
3900 listing_source_file (filename
);
3903 SF_SET_DEBUG (symbolP
);
3904 S_SET_VALUE (symbolP
, (valueT
) previous_file_symbol
);
3906 previous_file_symbol
= symbolP
;
3908 /* Make sure that the symbol is first on the symbol chain. */
3909 if (symbol_rootP
!= symbolP
)
3911 symbol_remove (symbolP
, &symbol_rootP
, &symbol_lastP
);
3912 symbol_insert (symbolP
, symbol_rootP
, &symbol_rootP
, &symbol_lastP
);
3916 /* Build a 'section static' symbol. */
3919 c_section_symbol (name
, idx
)
3925 symbolP
= symbol_find_base (name
, DO_NOT_STRIP
);
3926 if (symbolP
== NULL
)
3927 symbolP
= symbol_new (name
, idx
, 0, &zero_address_frag
);
3930 /* Mmmm. I just love violating interfaces. Makes me feel...dirty. */
3931 S_SET_SEGMENT (symbolP
, idx
);
3932 symbolP
->sy_frag
= &zero_address_frag
;
3935 S_SET_STORAGE_CLASS (symbolP
, C_STAT
);
3936 S_SET_NUMBER_AUXILIARY (symbolP
, 1);
3938 SF_SET_STATICS (symbolP
);
3941 /* manfred@s-direktnet.de: section symbols *must* have the LOCAL bit cleared,
3942 which is set by the new definition of LOCAL_LABEL in tc-m68k.h. */
3943 SF_CLEAR_LOCAL (symbolP
);
3946 /* If the .linkonce pseudo-op was used for this section, we must
3947 store the information in the auxiliary entry for the section
3949 if (segment_info
[idx
].linkonce
!= LINKONCE_UNSET
)
3953 switch (segment_info
[idx
].linkonce
)
3957 case LINKONCE_DISCARD
:
3958 type
= IMAGE_COMDAT_SELECT_ANY
;
3960 case LINKONCE_ONE_ONLY
:
3961 type
= IMAGE_COMDAT_SELECT_NODUPLICATES
;
3963 case LINKONCE_SAME_SIZE
:
3964 type
= IMAGE_COMDAT_SELECT_SAME_SIZE
;
3966 case LINKONCE_SAME_CONTENTS
:
3967 type
= IMAGE_COMDAT_SELECT_EXACT_MATCH
;
3971 SYM_AUXENT (symbolP
)->x_scn
.x_comdat
= type
;
3979 w_symbols (abfd
, where
, symbol_rootP
)
3982 symbolS
* symbol_rootP
;
3987 /* First fill in those values we have only just worked out. */
3988 for (i
= SEG_E0
; i
< SEG_LAST
; i
++)
3990 symbolP
= segment_info
[i
].dot
;
3993 SA_SET_SCN_SCNLEN (symbolP
, segment_info
[i
].scnhdr
.s_size
);
3994 SA_SET_SCN_NRELOC (symbolP
, segment_info
[i
].scnhdr
.s_nreloc
);
3995 SA_SET_SCN_NLINNO (symbolP
, segment_info
[i
].scnhdr
.s_nlnno
);
3999 /* Emit all symbols left in the symbol chain. */
4000 for (symbolP
= symbol_rootP
; symbolP
; symbolP
= symbol_next (symbolP
))
4002 /* Used to save the offset of the name. It is used to point
4003 to the string in memory but must be a file offset. */
4006 /* We can't fix the lnnoptr field in yank_symbols with the other
4007 adjustments, because we have to wait until we know where they
4009 if (SF_GET_ADJ_LNNOPTR (symbolP
))
4010 SA_GET_SYM_LNNOPTR (symbolP
) +=
4011 segment_info
[S_GET_SEGMENT (symbolP
)].scnhdr
.s_lnnoptr
;
4013 tc_coff_symbol_emit_hook (symbolP
);
4015 temp
= S_GET_NAME (symbolP
);
4016 if (SF_GET_STRING (symbolP
))
4018 S_SET_OFFSET (symbolP
, symbolP
->sy_name_offset
);
4019 S_SET_ZEROES (symbolP
, 0);
4023 memset (symbolP
->sy_symbol
.ost_entry
.n_name
, 0, SYMNMLEN
);
4024 strncpy (symbolP
->sy_symbol
.ost_entry
.n_name
, temp
, SYMNMLEN
);
4026 where
= symbol_to_chars (abfd
, where
, symbolP
);
4027 S_SET_NAME (symbolP
, temp
);
4032 obj_coff_lcomm (ignore
)
4033 int ignore ATTRIBUTE_UNUSED
;
4045 name
= input_line_pointer
;
4047 c
= get_symbol_end ();
4048 p
= input_line_pointer
;
4051 if (*input_line_pointer
!= ',')
4053 as_bad (_("Expected comma after name"));
4054 ignore_rest_of_line ();
4057 if (*input_line_pointer
== '\n')
4059 as_bad (_("Missing size expression"));
4062 input_line_pointer
++;
4063 if ((temp
= get_absolute_expression ()) < 0)
4065 as_warn (_("lcomm length (%d.) <0! Ignored."), temp
);
4066 ignore_rest_of_line ();
4071 symbolP
= symbol_find_or_make (name
);
4073 if (S_GET_SEGMENT (symbolP
) == SEG_UNKNOWN
&&
4074 S_GET_VALUE (symbolP
) == 0)
4079 segT current_seg
= now_seg
; /* Save current seg. */
4080 subsegT current_subseg
= now_subseg
;
4082 subseg_set (SEG_E2
, 1);
4083 symbolP
->sy_frag
= frag_now
;
4084 p
= frag_var(rs_org
, 1, 1, (relax_substateT
)0, symbolP
,
4085 (offsetT
) temp
, (char *) 0);
4087 subseg_set (current_seg
, current_subseg
); /* Restore current seg. */
4088 S_SET_SEGMENT (symbolP
, SEG_E2
);
4089 S_SET_STORAGE_CLASS (symbolP
, C_STAT
);
4093 as_bad (_("Symbol %s already defined"), name
);
4095 demand_empty_rest_of_line ();
4100 fixup_mdeps (frags
, h
, this_segment
)
4105 subseg_change (this_segment
, 0);
4109 switch (frags
->fr_type
)
4116 HANDLE_ALIGN (frags
);
4118 frags
->fr_type
= rs_fill
;
4120 ((frags
->fr_next
->fr_address
- frags
->fr_address
- frags
->fr_fix
)
4123 case rs_machine_dependent
:
4124 md_convert_frag (h
, this_segment
, frags
);
4130 frags
= frags
->fr_next
;
4136 #ifndef TC_FORCE_RELOCATION
4137 #define TC_FORCE_RELOCATION(fix) 0
4141 fixup_segment (segP
, this_segment_type
)
4142 segment_info_type
* segP
;
4143 segT this_segment_type
;
4146 symbolS
*add_symbolP
;
4147 symbolS
*sub_symbolP
;
4154 segT add_symbol_segment
= absolute_section
;
4156 for (fixP
= segP
->fix_root
; fixP
; fixP
= fixP
->fx_next
)
4158 fragP
= fixP
->fx_frag
;
4160 where
= fixP
->fx_where
;
4161 place
= fragP
->fr_literal
+ where
;
4162 size
= fixP
->fx_size
;
4163 add_symbolP
= fixP
->fx_addsy
;
4164 sub_symbolP
= fixP
->fx_subsy
;
4165 add_number
= fixP
->fx_offset
;
4166 pcrel
= fixP
->fx_pcrel
;
4168 /* We want function-relative stabs to work on systems which
4169 may use a relaxing linker; thus we must handle the sym1-sym2
4170 fixups function-relative stabs generates.
4172 Of course, if you actually enable relaxing in the linker, the
4173 line and block scoping information is going to be incorrect
4174 in some cases. The only way to really fix this is to support
4175 a reloc involving the difference of two symbols. */
4177 && (!sub_symbolP
|| pcrel
))
4181 if (fixP
->fx_tcbit
&& SF_GET_CALLNAME (add_symbolP
))
4183 /* Relocation should be done via the associated 'bal' entry
4186 if (!SF_GET_BALNAME (tc_get_bal_of_call (add_symbolP
)))
4188 as_bad_where (fixP
->fx_file
, fixP
->fx_line
,
4189 _("No 'bal' entry point for leafproc %s"),
4190 S_GET_NAME (add_symbolP
));
4193 fixP
->fx_addsy
= add_symbolP
= tc_get_bal_of_call (add_symbolP
);
4197 /* Make sure the symbols have been resolved; this may not have
4198 happened if these are expression symbols. */
4199 if (add_symbolP
!= NULL
&& ! add_symbolP
->sy_resolved
)
4200 resolve_symbol_value (add_symbolP
);
4202 if (add_symbolP
!= NULL
)
4204 /* If this fixup is against a symbol which has been equated
4205 to another symbol, convert it to the other symbol. */
4206 if (add_symbolP
->sy_value
.X_op
== O_symbol
4207 && (! S_IS_DEFINED (add_symbolP
)
4208 || S_IS_COMMON (add_symbolP
)))
4210 while (add_symbolP
->sy_value
.X_op
== O_symbol
4211 && (! S_IS_DEFINED (add_symbolP
)
4212 || S_IS_COMMON (add_symbolP
)))
4216 /* We must avoid looping, as that can occur with a
4217 badly written program. */
4218 n
= add_symbolP
->sy_value
.X_add_symbol
;
4219 if (n
== add_symbolP
)
4221 add_number
+= add_symbolP
->sy_value
.X_add_number
;
4224 fixP
->fx_addsy
= add_symbolP
;
4225 fixP
->fx_offset
= add_number
;
4229 if (sub_symbolP
!= NULL
&& ! sub_symbolP
->sy_resolved
)
4230 resolve_symbol_value (sub_symbolP
);
4232 if (add_symbolP
!= NULL
4233 && add_symbolP
->sy_mri_common
)
4235 know (add_symbolP
->sy_value
.X_op
== O_symbol
);
4236 add_number
+= S_GET_VALUE (add_symbolP
);
4237 fixP
->fx_offset
= add_number
;
4238 add_symbolP
= fixP
->fx_addsy
= add_symbolP
->sy_value
.X_add_symbol
;
4242 add_symbol_segment
= S_GET_SEGMENT (add_symbolP
);
4246 if (add_symbolP
== NULL
|| add_symbol_segment
== absolute_section
)
4248 if (add_symbolP
!= NULL
)
4250 add_number
+= S_GET_VALUE (add_symbolP
);
4252 fixP
->fx_addsy
= NULL
;
4255 /* It's just -sym. */
4256 if (S_GET_SEGMENT (sub_symbolP
) == absolute_section
)
4258 add_number
-= S_GET_VALUE (sub_symbolP
);
4265 as_bad_where (fixP
->fx_file
, fixP
->fx_line
,
4266 _("Negative of non-absolute symbol %s"),
4267 S_GET_NAME (sub_symbolP
));
4269 add_number
-= S_GET_VALUE (sub_symbolP
);
4270 } /* not absolute */
4272 /* if sub_symbol is in the same segment that add_symbol
4273 and add_symbol is either in DATA, TEXT, BSS or ABSOLUTE. */
4275 else if (S_GET_SEGMENT (sub_symbolP
) == add_symbol_segment
4276 && SEG_NORMAL (add_symbol_segment
))
4278 /* Difference of 2 symbols from same segment. Can't
4279 make difference of 2 undefineds: 'value' means
4280 something different for N_UNDF. */
4282 /* Makes no sense to use the difference of 2 arbitrary symbols
4283 as the target of a call instruction. */
4285 as_bad_where (fixP
->fx_file
, fixP
->fx_line
,
4286 _("callj to difference of 2 symbols"));
4287 #endif /* TC_I960 */
4288 add_number
+= S_GET_VALUE (add_symbolP
) -
4289 S_GET_VALUE (sub_symbolP
);
4292 if (!TC_FORCE_RELOCATION (fixP
))
4294 fixP
->fx_addsy
= NULL
;
4295 fixP
->fx_subsy
= NULL
;
4297 #ifdef TC_M68K /* is this right? */
4305 /* Different segments in subtraction. */
4306 know (!(S_IS_EXTERNAL (sub_symbolP
) && (S_GET_SEGMENT (sub_symbolP
) == absolute_section
)));
4308 if ((S_GET_SEGMENT (sub_symbolP
) == absolute_section
))
4309 add_number
-= S_GET_VALUE (sub_symbolP
);
4312 else if (S_GET_SEGMENT (sub_symbolP
) == this_segment_type
4313 #if 0 /* Okay for 68k, at least... */
4318 /* Make it pc-relative. */
4319 add_number
+= (md_pcrel_from (fixP
)
4320 - S_GET_VALUE (sub_symbolP
));
4329 as_bad_where (fixP
->fx_file
, fixP
->fx_line
,
4330 _("Can't emit reloc {- %s-seg symbol \"%s\"} @ file address %ld."),
4331 segment_name (S_GET_SEGMENT (sub_symbolP
)),
4332 S_GET_NAME (sub_symbolP
),
4333 (long) (fragP
->fr_address
+ where
));
4340 if (add_symbol_segment
== this_segment_type
&& pcrel
)
4342 /* This fixup was made when the symbol's segment was
4343 SEG_UNKNOWN, but it is now in the local segment.
4344 So we know how to do the address without relocation. */
4346 /* reloc_callj() may replace a 'call' with a 'calls' or a 'bal',
4347 in which cases it modifies *fixP as appropriate. In the case
4348 of a 'calls', no further work is required, and *fixP has been
4349 set up to make the rest of the code below a no-op. */
4351 #endif /* TC_I960 */
4353 add_number
+= S_GET_VALUE (add_symbolP
);
4354 add_number
-= md_pcrel_from (fixP
);
4357 add_number -= segP->scnhdr.s_vaddr;
4358 if defined (TC_I386) || defined (TE_LYNX). I now
4359 think that was an error propagated from the case when
4360 we are going to emit the relocation. If we are not
4361 going to emit the relocation, then we just want to
4362 set add_number to the difference between the symbols.
4363 This is a case that would only arise when there is a
4364 PC relative reference from a section other than .text
4365 to a symbol defined in the same section, and the
4366 reference is not relaxed. Since jump instructions on
4367 the i386 are relaxed, this could only arise with a
4368 call instruction. */
4370 pcrel
= 0; /* Lie. Don't want further pcrel processing. */
4371 if (!TC_FORCE_RELOCATION (fixP
))
4373 fixP
->fx_addsy
= NULL
;
4379 switch (add_symbol_segment
)
4381 case absolute_section
:
4383 /* See comment about reloc_callj() above. */
4385 #endif /* TC_I960 */
4386 add_number
+= S_GET_VALUE (add_symbolP
);
4389 if (!TC_FORCE_RELOCATION (fixP
))
4391 fixP
->fx_addsy
= NULL
;
4397 #if defined(TC_A29K) || (defined(TE_PE) && defined(TC_I386)) || defined(TC_M88K) || defined(TC_OR32)
4398 /* This really should be handled in the linker, but
4399 backward compatibility forbids. */
4400 add_number
+= S_GET_VALUE (add_symbolP
);
4402 add_number
+= S_GET_VALUE (add_symbolP
) +
4403 segment_info
[S_GET_SEGMENT (add_symbolP
)].scnhdr
.s_paddr
;
4409 if ((int) fixP
->fx_bit_fixP
== 13)
4411 /* This is a COBR instruction. They have only a
4412 13-bit displacement and are only to be used
4413 for local branches: flag as error, don't generate
4415 as_bad_where (fixP
->fx_file
, fixP
->fx_line
,
4416 _("can't use COBR format with external label"));
4417 fixP
->fx_addsy
= NULL
;
4421 #endif /* TC_I960 */
4422 #if ((defined (TC_I386) || defined (TE_LYNX) || defined (TE_AUX)) && !defined(TE_PE)) || defined (COFF_COMMON_ADDEND)
4423 /* 386 COFF uses a peculiar format in which the
4424 value of a common symbol is stored in the .text
4425 segment (I've checked this on SVR3.2 and SCO
4426 3.2.2) Ian Taylor <ian@cygnus.com>. */
4427 /* This is also true for 68k COFF on sysv machines
4428 (Checked on Motorola sysv68 R3V6 and R3V7.1, and also on
4429 UNIX System V/M68000, Release 1.0 from ATT/Bell Labs)
4430 Philippe De Muyter <phdm@info.ucl.ac.be>. */
4431 if (S_IS_COMMON (add_symbolP
))
4432 add_number
+= S_GET_VALUE (add_symbolP
);
4442 #if !defined(TC_M88K) && !(defined(TE_PE) && defined(TC_I386)) && !defined(TC_A29K) && !defined(TC_OR32)
4443 /* This adjustment is not correct on the m88k, for which the
4444 linker does all the computation. */
4445 add_number
-= md_pcrel_from (fixP
);
4447 if (add_symbolP
== 0)
4448 fixP
->fx_addsy
= &abs_symbol
;
4449 #if defined (TC_I386) || defined (TE_LYNX) || defined (TC_I960) || defined (TC_M68K)
4450 /* On the 386 we must adjust by the segment vaddr as well.
4453 I changed the i960 to work this way as well. This is
4454 compatible with the current GNU linker behaviour. I do
4455 not know what other i960 COFF assemblers do. This is not
4456 a common case: normally, only assembler code will contain
4457 a PC relative reloc, and only branches which do not
4458 originate in the .text section will have a non-zero
4461 I changed the m68k to work this way as well. This will
4462 break existing PC relative relocs from sections which do
4463 not start at address 0, but it will make ld -r work.
4464 Ian Taylor, 4 Oct 96. */
4466 add_number
-= segP
->scnhdr
.s_vaddr
;
4470 md_apply_fix3 (fixP
, (valueT
*) & add_number
, this_segment_type
);
4472 if (!fixP
->fx_bit_fixP
&& ! fixP
->fx_no_overflow
)
4475 /* The m88k uses the offset field of the reloc to get around
4478 && ((add_number
& ~0xFF)
4479 || (fixP
->fx_signed
&& (add_number
& 0x80)))
4480 && ((add_number
& ~0xFF) != (-1 & ~0xFF)
4481 || (add_number
& 0x80) == 0))
4483 && ((add_number
& ~0xFFFF)
4484 || (fixP
->fx_signed
&& (add_number
& 0x8000)))
4485 && ((add_number
& ~0xFFFF) != (-1 & ~0xFFFF)
4486 || (add_number
& 0x8000) == 0)))
4488 as_bad_where (fixP
->fx_file
, fixP
->fx_line
,
4489 _("Value of %ld too large for field of %d bytes at 0x%lx"),
4490 (long) add_number
, size
,
4491 (unsigned long) (fragP
->fr_address
+ where
));
4494 #ifdef WARN_SIGNED_OVERFLOW_WORD
4495 /* Warn if a .word value is too large when treated as a
4496 signed number. We already know it is not too negative.
4497 This is to catch over-large switches generated by gcc on
4499 if (!flag_signed_overflow_ok
4501 && add_number
> 0x7fff)
4502 as_bad_where (fixP
->fx_file
, fixP
->fx_line
,
4503 _("Signed .word overflow; switch may be too large; %ld at 0x%lx"),
4505 (unsigned long) (fragP
->fr_address
+ where
));
4513 /* The first entry in a .stab section is special. */
4516 obj_coff_init_stab_section (seg
)
4522 unsigned int stroff
;
4524 /* Make space for this first symbol. */
4528 as_where (&file
, (unsigned int *) NULL
);
4529 stabstr_name
= (char *) alloca (strlen (segment_info
[seg
].name
) + 4);
4530 strcpy (stabstr_name
, segment_info
[seg
].name
);
4531 strcat (stabstr_name
, "str");
4532 stroff
= get_stab_string_offset (file
, stabstr_name
);
4534 md_number_to_chars (p
, stroff
, 4);
4537 /* Fill in the counts in the first entry in a .stab section. */
4540 adjust_stab_section(abfd
, seg
)
4544 segT stabstrseg
= SEG_UNKNOWN
;
4545 const char *secname
, *name2
;
4548 int i
, strsz
= 0, nsyms
;
4549 fragS
*frag
= segment_info
[seg
].frchainP
->frch_root
;
4551 /* Look for the associated string table section. */
4553 secname
= segment_info
[seg
].name
;
4554 name
= (char *) alloca (strlen (secname
) + 4);
4555 strcpy (name
, secname
);
4556 strcat (name
, "str");
4558 for (i
= SEG_E0
; i
< SEG_UNKNOWN
; i
++)
4560 name2
= segment_info
[i
].name
;
4561 if (name2
!= NULL
&& strncmp(name2
, name
, 8) == 0)
4568 /* If we found the section, get its size. */
4569 if (stabstrseg
!= SEG_UNKNOWN
)
4570 strsz
= size_section (abfd
, stabstrseg
);
4572 nsyms
= size_section (abfd
, seg
) / 12 - 1;
4574 /* Look for the first frag of sufficient size for the initial stab
4575 symbol, and collect a pointer to it. */
4576 while (frag
&& frag
->fr_fix
< 12)
4577 frag
= frag
->fr_next
;
4579 p
= frag
->fr_literal
;
4582 /* Write in the number of stab symbols and the size of the string
4584 bfd_h_put_16 (abfd
, (bfd_vma
) nsyms
, (bfd_byte
*) p
+ 6);
4585 bfd_h_put_32 (abfd
, (bfd_vma
) strsz
, (bfd_byte
*) p
+ 8);
4588 #endif /* not BFD_ASSEMBLER */
4590 const pseudo_typeS coff_pseudo_table
[] =
4592 {"def", obj_coff_def
, 0},
4593 {"dim", obj_coff_dim
, 0},
4594 {"endef", obj_coff_endef
, 0},
4595 {"line", obj_coff_line
, 0},
4596 {"ln", obj_coff_ln
, 0},
4597 #ifdef BFD_ASSEMBLER
4598 {"loc", obj_coff_loc
, 0},
4600 {"appline", obj_coff_ln
, 1},
4601 {"scl", obj_coff_scl
, 0},
4602 {"size", obj_coff_size
, 0},
4603 {"tag", obj_coff_tag
, 0},
4604 {"type", obj_coff_type
, 0},
4605 {"val", obj_coff_val
, 0},
4606 {"section", obj_coff_section
, 0},
4607 {"sect", obj_coff_section
, 0},
4608 /* FIXME: We ignore the MRI short attribute. */
4609 {"section.s", obj_coff_section
, 0},
4610 {"sect.s", obj_coff_section
, 0},
4611 /* We accept the .bss directive for backward compatibility with
4612 earlier versions of gas. */
4613 {"bss", obj_coff_bss
, 0},
4614 {"weak", obj_coff_weak
, 0},
4615 {"ident", obj_coff_ident
, 0},
4616 #ifndef BFD_ASSEMBLER
4617 {"use", obj_coff_section
, 0},
4618 {"text", obj_coff_text
, 0},
4619 {"data", obj_coff_data
, 0},
4620 {"lcomm", obj_coff_lcomm
, 0},
4622 {"optim", s_ignore
, 0}, /* For sun386i cc (?) */
4624 {"version", s_ignore
, 0},
4625 {"ABORT", s_abort
, 0},
4626 #if defined( TC_M88K ) || defined ( TC_TIC4X )
4627 /* The m88k and tic4x uses sdef instead of def. */
4628 {"sdef", obj_coff_def
, 0},
4630 {NULL
, NULL
, 0} /* end sentinel */
4631 }; /* coff_pseudo_table */
4633 #ifdef BFD_ASSEMBLER
4635 /* Support for a COFF emulation. */
4637 static void coff_pop_insert
PARAMS ((void));
4638 static int coff_separate_stab_sections
PARAMS ((void));
4643 pop_insert (coff_pseudo_table
);
4647 coff_separate_stab_sections ()
4652 const struct format_ops coff_format_ops
=
4654 bfd_target_coff_flavour
,
4655 0, /* dfl_leading_underscore */
4656 1, /* emit_section_symbols */
4661 0, /* frob_file_before_adjust */
4662 0, /* frob_file_before_fix */
4663 coff_frob_file_after_relocs
,
4666 0, /* s_get_align */
4667 0, /* s_set_align */
4668 0, /* s_get_other */
4669 0, /* s_set_other */
4674 0, /* copy_symbol_attributes */
4675 0, /* generate_asm_lineno */
4676 0, /* process_stab */
4677 coff_separate_stab_sections
,
4678 obj_coff_init_stab_section
,
4679 0, /* sec_sym_ok_for_reloc */
4681 0, /* ecoff_set_ext */
4682 coff_obj_read_begin_hook
,
4683 coff_obj_symbol_new_hook