1 /* symbols.c -symbol table-
2 Copyright 1987, 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998,
3 1999, 2000, 2001, 2002, 2003, 2004
4 Free Software Foundation, Inc.
6 This file is part of GAS, the GNU Assembler.
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 DEBUG_SYMS / * to debug symbol list maintenance. */
27 #include "safe-ctype.h"
28 #include "obstack.h" /* For "symbols.h" */
31 #include "struc-symbol.h"
33 /* This is non-zero if symbols are case sensitive, which is the
35 int symbols_case_sensitive
= 1;
37 #ifndef WORKING_DOT_WORD
38 extern int new_broken_words
;
41 /* symbol-name => struct symbol pointer */
42 static struct hash_control
*sy_hash
;
44 /* Table of local symbols. */
45 static struct hash_control
*local_hash
;
47 /* Below are commented in "symbols.h". */
48 symbolS
*symbol_rootP
;
49 symbolS
*symbol_lastP
;
53 #define debug_verify_symchain verify_symbol_chain
55 #define debug_verify_symchain(root, last) ((void) 0)
58 #define DOLLAR_LABEL_CHAR '\001'
59 #define LOCAL_LABEL_CHAR '\002'
63 static char *save_symbol_name (const char *);
64 static void fb_label_init (void);
65 static long dollar_label_instance (long);
66 static long fb_label_instance (long);
68 static void print_binary (FILE *, const char *, expressionS
*);
69 static void report_op_error (symbolS
*, symbolS
*, symbolS
*);
71 /* Return a pointer to a new symbol. Die if we can't make a new
72 symbol. Fill in the symbol's values. Add symbol to end of symbol
75 This function should be called in the general case of creating a
76 symbol. However, if the output file symbol table has already been
77 set, and you are certain that this symbol won't be wanted in the
78 output file, you can call symbol_create. */
81 symbol_new (const char *name
, segT segment
, valueT valu
, fragS
*frag
)
83 symbolS
*symbolP
= symbol_create (name
, segment
, valu
, frag
);
85 /* Link to end of symbol chain. */
88 extern int symbol_table_frozen
;
89 if (symbol_table_frozen
)
93 symbol_append (symbolP
, symbol_lastP
, &symbol_rootP
, &symbol_lastP
);
98 /* Save a symbol name on a permanent obstack, and convert it according
99 to the object file format. */
102 save_symbol_name (const char *name
)
104 unsigned int name_length
;
107 name_length
= strlen (name
) + 1; /* +1 for \0. */
108 obstack_grow (¬es
, name
, name_length
);
109 ret
= obstack_finish (¬es
);
111 #ifdef STRIP_UNDERSCORE
116 #ifdef tc_canonicalize_symbol_name
117 ret
= tc_canonicalize_symbol_name (ret
);
120 if (! symbols_case_sensitive
)
124 for (s
= ret
; *s
!= '\0'; s
++)
132 symbol_create (const char *name
, /* It is copied, the caller can destroy/modify. */
133 segT segment
, /* Segment identifier (SEG_<something>). */
134 valueT valu
, /* Symbol value. */
135 fragS
*frag
/* Associated fragment. */)
137 char *preserved_copy_of_name
;
140 preserved_copy_of_name
= save_symbol_name (name
);
142 symbolP
= (symbolS
*) obstack_alloc (¬es
, sizeof (symbolS
));
144 /* symbol must be born in some fixed state. This seems as good as any. */
145 memset (symbolP
, 0, sizeof (symbolS
));
148 symbolP
->bsym
= bfd_make_empty_symbol (stdoutput
);
149 if (symbolP
->bsym
== NULL
)
150 as_perror ("%s", "bfd_make_empty_symbol");
151 symbolP
->bsym
->udata
.p
= (PTR
) symbolP
;
153 S_SET_NAME (symbolP
, preserved_copy_of_name
);
155 S_SET_SEGMENT (symbolP
, segment
);
156 S_SET_VALUE (symbolP
, valu
);
157 symbol_clear_list_pointers (symbolP
);
159 symbolP
->sy_frag
= frag
;
160 #ifndef BFD_ASSEMBLER
161 symbolP
->sy_number
= ~0;
162 symbolP
->sy_name_offset
= (unsigned int) ~0;
165 obj_symbol_new_hook (symbolP
);
167 #ifdef tc_symbol_new_hook
168 tc_symbol_new_hook (symbolP
);
176 /* Local symbol support. If we can get away with it, we keep only a
177 small amount of information for local symbols. */
179 static symbolS
*local_symbol_convert (struct local_symbol
*);
181 /* Used for statistics. */
183 static unsigned long local_symbol_count
;
184 static unsigned long local_symbol_conversion_count
;
186 /* This macro is called with a symbol argument passed by reference.
187 It returns whether this is a local symbol. If necessary, it
188 changes its argument to the real symbol. */
190 #define LOCAL_SYMBOL_CHECK(s) \
192 ? (local_symbol_converted_p ((struct local_symbol *) s) \
193 ? (s = local_symbol_get_real_symbol ((struct local_symbol *) s), \
198 /* Create a local symbol and insert it into the local hash table. */
200 struct local_symbol
*
201 local_symbol_make (const char *name
, segT section
, valueT value
, fragS
*frag
)
204 struct local_symbol
*ret
;
206 ++local_symbol_count
;
208 name_copy
= save_symbol_name (name
);
210 ret
= (struct local_symbol
*) obstack_alloc (¬es
, sizeof *ret
);
211 ret
->lsy_marker
= NULL
;
212 ret
->lsy_name
= name_copy
;
213 ret
->lsy_section
= section
;
214 local_symbol_set_frag (ret
, frag
);
215 ret
->lsy_value
= value
;
217 hash_jam (local_hash
, name_copy
, (PTR
) ret
);
222 /* Convert a local symbol into a real symbol. Note that we do not
223 reclaim the space used by the local symbol. */
226 local_symbol_convert (struct local_symbol
*locsym
)
230 assert (locsym
->lsy_marker
== NULL
);
231 if (local_symbol_converted_p (locsym
))
232 return local_symbol_get_real_symbol (locsym
);
234 ++local_symbol_conversion_count
;
236 ret
= symbol_new (locsym
->lsy_name
, locsym
->lsy_section
, locsym
->lsy_value
,
237 local_symbol_get_frag (locsym
));
239 if (local_symbol_resolved_p (locsym
))
240 ret
->sy_resolved
= 1;
242 /* Local symbols are always either defined or used. */
245 #ifdef TC_LOCAL_SYMFIELD_CONVERT
246 TC_LOCAL_SYMFIELD_CONVERT (locsym
, ret
);
249 symbol_table_insert (ret
);
251 local_symbol_mark_converted (locsym
);
252 local_symbol_set_real_symbol (locsym
, ret
);
254 hash_jam (local_hash
, locsym
->lsy_name
, NULL
);
259 #else /* ! BFD_ASSEMBLER */
261 #define LOCAL_SYMBOL_CHECK(s) 0
262 #define local_symbol_convert(s) ((symbolS *) s)
264 #endif /* ! BFD_ASSEMBLER */
266 /* We have just seen "<name>:".
267 Creates a struct symbol unless it already exists.
269 Gripes if we are redefining a symbol incompatibly (and ignores it). */
272 colon (/* Just seen "x:" - rattle symbols & frags. */
273 const char *sym_name
/* Symbol name, as a cannonical string. */
274 /* We copy this string: OK to alter later. */)
276 register symbolS
*symbolP
; /* Symbol we are working with. */
278 /* Sun local labels go out of scope whenever a non-local symbol is
280 if (LOCAL_LABELS_DOLLAR
)
285 local
= bfd_is_local_label_name (stdoutput
, sym_name
);
287 local
= LOCAL_LABEL (sym_name
);
291 dollar_label_clear ();
294 #ifndef WORKING_DOT_WORD
295 if (new_broken_words
)
297 struct broken_word
*a
;
302 if (now_seg
== absolute_section
)
304 as_bad (_("cannot define symbol `%s' in absolute section"), sym_name
);
308 possible_bytes
= (md_short_jump_size
309 + new_broken_words
* md_long_jump_size
);
312 frag_opcode
= frag_var (rs_broken_word
,
316 (symbolS
*) broken_words
,
320 /* We want to store the pointer to where to insert the jump
321 table in the fr_opcode of the rs_broken_word frag. This
322 requires a little hackery. */
324 && (frag_tmp
->fr_type
!= rs_broken_word
325 || frag_tmp
->fr_opcode
))
326 frag_tmp
= frag_tmp
->fr_next
;
328 frag_tmp
->fr_opcode
= frag_opcode
;
329 new_broken_words
= 0;
331 for (a
= broken_words
; a
&& a
->dispfrag
== 0; a
= a
->next_broken_word
)
332 a
->dispfrag
= frag_tmp
;
334 #endif /* WORKING_DOT_WORD */
336 if ((symbolP
= symbol_find (sym_name
)) != 0)
338 #ifdef RESOLVE_SYMBOL_REDEFINITION
339 if (RESOLVE_SYMBOL_REDEFINITION (symbolP
))
342 /* Now check for undefined symbols. */
343 if (LOCAL_SYMBOL_CHECK (symbolP
))
346 struct local_symbol
*locsym
= (struct local_symbol
*) symbolP
;
348 if (locsym
->lsy_section
!= undefined_section
349 && (local_symbol_get_frag (locsym
) != frag_now
350 || locsym
->lsy_section
!= now_seg
351 || locsym
->lsy_value
!= frag_now_fix ()))
353 as_bad (_("symbol `%s' is already defined"), sym_name
);
357 locsym
->lsy_section
= now_seg
;
358 local_symbol_set_frag (locsym
, frag_now
);
359 locsym
->lsy_value
= frag_now_fix ();
362 else if (!S_IS_DEFINED (symbolP
) || S_IS_COMMON (symbolP
))
364 if (S_GET_VALUE (symbolP
) == 0)
366 symbolP
->sy_frag
= frag_now
;
368 S_SET_OTHER (symbolP
, const_flag
);
370 S_SET_VALUE (symbolP
, (valueT
) frag_now_fix ());
371 S_SET_SEGMENT (symbolP
, now_seg
);
374 #endif /* if we have one, it better be zero. */
379 /* There are still several cases to check:
381 A .comm/.lcomm symbol being redefined as initialized
384 A .comm/.lcomm symbol being redefined with a larger
387 This only used to be allowed on VMS gas, but Sun cc
388 on the sparc also depends on it. */
390 if (((!S_IS_DEBUG (symbolP
)
391 && (!S_IS_DEFINED (symbolP
) || S_IS_COMMON (symbolP
))
392 && S_IS_EXTERNAL (symbolP
))
393 || S_GET_SEGMENT (symbolP
) == bss_section
)
394 && (now_seg
== data_section
395 || now_seg
== S_GET_SEGMENT (symbolP
)))
397 /* Select which of the 2 cases this is. */
398 if (now_seg
!= data_section
)
400 /* New .comm for prev .comm symbol.
402 If the new size is larger we just change its
403 value. If the new size is smaller, we ignore
405 if (S_GET_VALUE (symbolP
)
406 < ((unsigned) frag_now_fix ()))
408 S_SET_VALUE (symbolP
, (valueT
) frag_now_fix ());
413 /* It is a .comm/.lcomm being converted to initialized
415 symbolP
->sy_frag
= frag_now
;
417 S_SET_OTHER (symbolP
, const_flag
);
419 S_SET_VALUE (symbolP
, (valueT
) frag_now_fix ());
420 S_SET_SEGMENT (symbolP
, now_seg
); /* Keep N_EXT bit. */
425 #if (!defined (OBJ_AOUT) && !defined (OBJ_MAYBE_AOUT) \
426 && !defined (OBJ_BOUT) && !defined (OBJ_MAYBE_BOUT))
427 static const char *od_buf
= "";
432 if (OUTPUT_FLAVOR
== bfd_target_aout_flavour
)
434 sprintf (od_buf
, "%d.%d.",
435 S_GET_OTHER (symbolP
),
436 S_GET_DESC (symbolP
));
438 as_bad (_("symbol `%s' is already defined as \"%s\"/%s%ld"),
440 segment_name (S_GET_SEGMENT (symbolP
)),
442 (long) S_GET_VALUE (symbolP
));
444 } /* if the undefined symbol has no value */
448 /* Don't blow up if the definition is the same. */
449 if (!(frag_now
== symbolP
->sy_frag
450 && S_GET_VALUE (symbolP
) == frag_now_fix ()
451 && S_GET_SEGMENT (symbolP
) == now_seg
))
452 as_bad (_("symbol `%s' is already defined"), sym_name
);
457 else if (! flag_keep_locals
&& bfd_is_local_label_name (stdoutput
, sym_name
))
459 symbolP
= (symbolS
*) local_symbol_make (sym_name
, now_seg
,
460 (valueT
) frag_now_fix (),
463 #endif /* BFD_ASSEMBLER */
466 symbolP
= symbol_new (sym_name
, now_seg
, (valueT
) frag_now_fix (),
469 S_SET_OTHER (symbolP
, const_flag
);
472 symbol_table_insert (symbolP
);
475 if (mri_common_symbol
!= NULL
)
477 /* This symbol is actually being defined within an MRI common
478 section. This requires special handling. */
479 if (LOCAL_SYMBOL_CHECK (symbolP
))
480 symbolP
= local_symbol_convert ((struct local_symbol
*) symbolP
);
481 symbolP
->sy_value
.X_op
= O_symbol
;
482 symbolP
->sy_value
.X_add_symbol
= mri_common_symbol
;
483 symbolP
->sy_value
.X_add_number
= S_GET_VALUE (mri_common_symbol
);
484 symbolP
->sy_frag
= &zero_address_frag
;
485 S_SET_SEGMENT (symbolP
, expr_section
);
486 symbolP
->sy_mri_common
= 1;
490 tc_frob_label (symbolP
);
492 #ifdef obj_frob_label
493 obj_frob_label (symbolP
);
499 /* Die if we can't insert the symbol. */
502 symbol_table_insert (symbolS
*symbolP
)
504 register const char *error_string
;
507 know (S_GET_NAME (symbolP
));
509 if (LOCAL_SYMBOL_CHECK (symbolP
))
511 error_string
= hash_jam (local_hash
, S_GET_NAME (symbolP
),
513 if (error_string
!= NULL
)
514 as_fatal (_("inserting \"%s\" into symbol table failed: %s"),
515 S_GET_NAME (symbolP
), error_string
);
519 if ((error_string
= hash_jam (sy_hash
, S_GET_NAME (symbolP
), (PTR
) symbolP
)))
521 as_fatal (_("inserting \"%s\" into symbol table failed: %s"),
522 S_GET_NAME (symbolP
), error_string
);
526 /* If a symbol name does not exist, create it as undefined, and insert
527 it into the symbol table. Return a pointer to it. */
530 symbol_find_or_make (const char *name
)
532 register symbolS
*symbolP
;
534 symbolP
= symbol_find (name
);
539 if (! flag_keep_locals
&& bfd_is_local_label_name (stdoutput
, name
))
541 symbolP
= md_undefined_symbol ((char *) name
);
545 symbolP
= (symbolS
*) local_symbol_make (name
, undefined_section
,
552 symbolP
= symbol_make (name
);
554 symbol_table_insert (symbolP
);
555 } /* if symbol wasn't found */
561 symbol_make (const char *name
)
565 /* Let the machine description default it, e.g. for register names. */
566 symbolP
= md_undefined_symbol ((char *) name
);
569 symbolP
= symbol_new (name
, undefined_section
, (valueT
) 0, &zero_address_frag
);
575 symbol_temp_new (segT seg
, valueT ofs
, fragS
*frag
)
577 return symbol_new (FAKE_LABEL_NAME
, seg
, ofs
, frag
);
581 symbol_temp_new_now (void)
583 return symbol_temp_new (now_seg
, frag_now_fix (), frag_now
);
587 symbol_temp_make (void)
589 return symbol_make (FAKE_LABEL_NAME
);
592 /* Implement symbol table lookup.
593 In: A symbol's name as a string: '\0' can't be part of a symbol name.
594 Out: NULL if the name was not in the symbol table, else the address
595 of a struct symbol associated with that name. */
598 symbol_find (const char *name
)
600 #ifdef STRIP_UNDERSCORE
601 return (symbol_find_base (name
, 1));
602 #else /* STRIP_UNDERSCORE */
603 return (symbol_find_base (name
, 0));
604 #endif /* STRIP_UNDERSCORE */
608 symbol_find_exact (const char *name
)
612 struct local_symbol
*locsym
;
614 locsym
= (struct local_symbol
*) hash_find (local_hash
, name
);
616 return (symbolS
*) locsym
;
620 return ((symbolS
*) hash_find (sy_hash
, name
));
624 symbol_find_base (const char *name
, int strip_underscore
)
626 if (strip_underscore
&& *name
== '_')
629 #ifdef tc_canonicalize_symbol_name
632 size_t len
= strlen (name
) + 1;
634 copy
= (char *) alloca (len
);
635 memcpy (copy
, name
, len
);
636 name
= tc_canonicalize_symbol_name (copy
);
640 if (! symbols_case_sensitive
)
647 name
= copy
= (char *) alloca (strlen (name
) + 1);
649 while ((c
= *orig
++) != '\0')
651 *copy
++ = TOUPPER (c
);
656 return symbol_find_exact (name
);
659 /* Once upon a time, symbols were kept in a singly linked list. At
660 least coff needs to be able to rearrange them from time to time, for
661 which a doubly linked list is much more convenient. Loic did these
662 as macros which seemed dangerous to me so they're now functions.
665 /* Link symbol ADDME after symbol TARGET in the chain. */
668 symbol_append (symbolS
*addme
, symbolS
*target
,
669 symbolS
**rootPP
, symbolS
**lastPP
)
671 if (LOCAL_SYMBOL_CHECK (addme
))
673 if (target
!= NULL
&& LOCAL_SYMBOL_CHECK (target
))
678 know (*rootPP
== NULL
);
679 know (*lastPP
== NULL
);
680 addme
->sy_next
= NULL
;
681 #ifdef SYMBOLS_NEED_BACKPOINTERS
682 addme
->sy_previous
= NULL
;
687 } /* if the list is empty */
689 if (target
->sy_next
!= NULL
)
691 #ifdef SYMBOLS_NEED_BACKPOINTERS
692 target
->sy_next
->sy_previous
= addme
;
693 #endif /* SYMBOLS_NEED_BACKPOINTERS */
697 know (*lastPP
== target
);
699 } /* if we have a next */
701 addme
->sy_next
= target
->sy_next
;
702 target
->sy_next
= addme
;
704 #ifdef SYMBOLS_NEED_BACKPOINTERS
705 addme
->sy_previous
= target
;
706 #endif /* SYMBOLS_NEED_BACKPOINTERS */
708 debug_verify_symchain (symbol_rootP
, symbol_lastP
);
711 /* Set the chain pointers of SYMBOL to null. */
714 symbol_clear_list_pointers (symbolS
*symbolP
)
716 if (LOCAL_SYMBOL_CHECK (symbolP
))
718 symbolP
->sy_next
= NULL
;
719 #ifdef SYMBOLS_NEED_BACKPOINTERS
720 symbolP
->sy_previous
= NULL
;
724 #ifdef SYMBOLS_NEED_BACKPOINTERS
725 /* Remove SYMBOLP from the list. */
728 symbol_remove (symbolS
*symbolP
, symbolS
**rootPP
, symbolS
**lastPP
)
730 if (LOCAL_SYMBOL_CHECK (symbolP
))
733 if (symbolP
== *rootPP
)
735 *rootPP
= symbolP
->sy_next
;
736 } /* if it was the root */
738 if (symbolP
== *lastPP
)
740 *lastPP
= symbolP
->sy_previous
;
741 } /* if it was the tail */
743 if (symbolP
->sy_next
!= NULL
)
745 symbolP
->sy_next
->sy_previous
= symbolP
->sy_previous
;
748 if (symbolP
->sy_previous
!= NULL
)
750 symbolP
->sy_previous
->sy_next
= symbolP
->sy_next
;
753 debug_verify_symchain (*rootPP
, *lastPP
);
756 /* Link symbol ADDME before symbol TARGET in the chain. */
759 symbol_insert (symbolS
*addme
, symbolS
*target
,
760 symbolS
**rootPP
, symbolS
**lastPP ATTRIBUTE_UNUSED
)
762 if (LOCAL_SYMBOL_CHECK (addme
))
764 if (LOCAL_SYMBOL_CHECK (target
))
767 if (target
->sy_previous
!= NULL
)
769 target
->sy_previous
->sy_next
= addme
;
773 know (*rootPP
== target
);
777 addme
->sy_previous
= target
->sy_previous
;
778 target
->sy_previous
= addme
;
779 addme
->sy_next
= target
;
781 debug_verify_symchain (*rootPP
, *lastPP
);
784 #endif /* SYMBOLS_NEED_BACKPOINTERS */
787 verify_symbol_chain (symbolS
*rootP
, symbolS
*lastP
)
789 symbolS
*symbolP
= rootP
;
794 for (; symbol_next (symbolP
) != NULL
; symbolP
= symbol_next (symbolP
))
797 assert (symbolP
->bsym
!= NULL
);
799 #ifdef SYMBOLS_NEED_BACKPOINTERS
800 assert (symbolP
->sy_next
->sy_previous
== symbolP
);
802 /* Walk the list anyways, to make sure pointers are still good. */
804 #endif /* SYMBOLS_NEED_BACKPOINTERS */
807 assert (lastP
== symbolP
);
811 verify_symbol_chain_2 (symbolS
*sym
)
813 symbolS
*p
= sym
, *n
= sym
;
814 #ifdef SYMBOLS_NEED_BACKPOINTERS
815 while (symbol_previous (p
))
816 p
= symbol_previous (p
);
818 while (symbol_next (n
))
820 verify_symbol_chain (p
, n
);
824 report_op_error (symbolS
*symp
, symbolS
*left
, symbolS
*right
)
828 segT seg_left
= S_GET_SEGMENT (left
);
829 segT seg_right
= right
? S_GET_SEGMENT (right
) : 0;
831 if (expr_symbol_where (symp
, &file
, &line
))
833 if (seg_left
== undefined_section
)
834 as_bad_where (file
, line
,
835 _("undefined symbol `%s' in operation"),
837 if (seg_right
== undefined_section
)
838 as_bad_where (file
, line
,
839 _("undefined symbol `%s' in operation"),
841 if (seg_left
!= undefined_section
842 && seg_right
!= undefined_section
)
845 as_bad_where (file
, line
,
846 _("invalid sections for operation on `%s' and `%s'"),
847 S_GET_NAME (left
), S_GET_NAME (right
));
849 as_bad_where (file
, line
,
850 _("invalid section for operation on `%s'"),
857 if (seg_left
== undefined_section
)
858 as_bad (_("undefined symbol `%s' in operation setting `%s'"),
859 S_GET_NAME (left
), S_GET_NAME (symp
));
860 if (seg_right
== undefined_section
)
861 as_bad (_("undefined symbol `%s' in operation setting `%s'"),
862 S_GET_NAME (right
), S_GET_NAME (symp
));
863 if (seg_left
!= undefined_section
864 && seg_right
!= undefined_section
)
867 as_bad_where (file
, line
,
868 _("invalid sections for operation on `%s' and `%s' setting `%s'"),
869 S_GET_NAME (left
), S_GET_NAME (right
), S_GET_NAME (symp
));
871 as_bad_where (file
, line
,
872 _("invalid section for operation on `%s' setting `%s'"),
873 S_GET_NAME (left
), S_GET_NAME (symp
));
878 /* Resolve the value of a symbol. This is called during the final
879 pass over the symbol table to resolve any symbols with complex
883 resolve_symbol_value (symbolS
*symp
)
886 valueT final_val
= 0;
890 if (LOCAL_SYMBOL_CHECK (symp
))
892 struct local_symbol
*locsym
= (struct local_symbol
*) symp
;
894 final_val
= locsym
->lsy_value
;
895 if (local_symbol_resolved_p (locsym
))
898 final_val
+= local_symbol_get_frag (locsym
)->fr_address
/ OCTETS_PER_BYTE
;
902 locsym
->lsy_value
= final_val
;
903 local_symbol_mark_resolved (locsym
);
910 if (symp
->sy_resolved
)
912 if (symp
->sy_value
.X_op
== O_constant
)
913 return (valueT
) symp
->sy_value
.X_add_number
;
919 final_seg
= S_GET_SEGMENT (symp
);
921 if (symp
->sy_resolving
)
924 as_bad (_("symbol definition loop encountered at `%s'"),
931 symbolS
*add_symbol
, *op_symbol
;
933 segT seg_left
, seg_right
;
936 symp
->sy_resolving
= 1;
938 /* Help out with CSE. */
939 add_symbol
= symp
->sy_value
.X_add_symbol
;
940 op_symbol
= symp
->sy_value
.X_op_symbol
;
941 final_val
= symp
->sy_value
.X_add_number
;
942 op
= symp
->sy_value
.X_op
;
955 final_val
+= symp
->sy_frag
->fr_address
/ OCTETS_PER_BYTE
;
956 if (final_seg
== expr_section
)
957 final_seg
= absolute_section
;
963 left
= resolve_symbol_value (add_symbol
);
964 seg_left
= S_GET_SEGMENT (add_symbol
);
966 symp
->sy_value
.X_op_symbol
= NULL
;
969 if (symp
->sy_mri_common
)
971 /* This is a symbol inside an MRI common section. The
972 relocation routines are going to handle it specially.
973 Don't change the value. */
974 resolved
= symbol_resolved_p (add_symbol
);
978 if (finalize_syms
&& final_val
== 0)
980 if (LOCAL_SYMBOL_CHECK (add_symbol
))
981 add_symbol
= local_symbol_convert ((struct local_symbol
*)
983 copy_symbol_attributes (symp
, add_symbol
);
986 /* If we have equated this symbol to an undefined or common
987 symbol, keep X_op set to O_symbol, and don't change
988 X_add_number. This permits the routine which writes out
989 relocation to detect this case, and convert the
990 relocation to be against the symbol to which this symbol
992 if (! S_IS_DEFINED (add_symbol
) || S_IS_COMMON (add_symbol
))
996 symp
->sy_value
.X_op
= O_symbol
;
997 symp
->sy_value
.X_add_symbol
= add_symbol
;
998 symp
->sy_value
.X_add_number
= final_val
;
999 /* Use X_op_symbol as a flag. */
1000 symp
->sy_value
.X_op_symbol
= add_symbol
;
1001 final_seg
= seg_left
;
1004 resolved
= symbol_resolved_p (add_symbol
);
1005 symp
->sy_resolving
= 0;
1006 goto exit_dont_set_value
;
1008 else if (finalize_syms
&& final_seg
== expr_section
1009 && seg_left
!= expr_section
)
1011 /* If the symbol is an expression symbol, do similarly
1012 as for undefined and common syms above. Handles
1013 "sym +/- expr" where "expr" cannot be evaluated
1014 immediately, and we want relocations to be against
1015 "sym", eg. because it is weak. */
1016 symp
->sy_value
.X_op
= O_symbol
;
1017 symp
->sy_value
.X_add_symbol
= add_symbol
;
1018 symp
->sy_value
.X_add_number
= final_val
;
1019 symp
->sy_value
.X_op_symbol
= add_symbol
;
1020 final_seg
= seg_left
;
1021 final_val
+= symp
->sy_frag
->fr_address
+ left
;
1022 resolved
= symbol_resolved_p (add_symbol
);
1023 symp
->sy_resolving
= 0;
1024 goto exit_dont_set_value
;
1028 final_val
+= symp
->sy_frag
->fr_address
+ left
;
1029 if (final_seg
== expr_section
|| final_seg
== undefined_section
)
1030 final_seg
= seg_left
;
1033 resolved
= symbol_resolved_p (add_symbol
);
1039 left
= resolve_symbol_value (add_symbol
);
1040 seg_left
= S_GET_SEGMENT (add_symbol
);
1042 /* By reducing these to the relevant dyadic operator, we get
1043 !S -> S == 0 permitted on anything,
1044 -S -> 0 - S only permitted on absolute
1045 ~S -> S ^ ~0 only permitted on absolute */
1046 if (op
!= O_logical_not
&& seg_left
!= absolute_section
1048 report_op_error (symp
, add_symbol
, NULL
);
1050 if (final_seg
== expr_section
|| final_seg
== undefined_section
)
1051 final_seg
= absolute_section
;
1055 else if (op
== O_logical_not
)
1060 final_val
+= left
+ symp
->sy_frag
->fr_address
;
1062 resolved
= symbol_resolved_p (add_symbol
);
1070 case O_bit_inclusive_or
:
1072 case O_bit_exclusive_or
:
1084 left
= resolve_symbol_value (add_symbol
);
1085 right
= resolve_symbol_value (op_symbol
);
1086 seg_left
= S_GET_SEGMENT (add_symbol
);
1087 seg_right
= S_GET_SEGMENT (op_symbol
);
1089 /* Simplify addition or subtraction of a constant by folding the
1090 constant into X_add_number. */
1093 if (seg_right
== absolute_section
)
1098 else if (seg_left
== absolute_section
)
1101 add_symbol
= op_symbol
;
1103 seg_left
= seg_right
;
1107 else if (op
== O_subtract
)
1109 if (seg_right
== absolute_section
)
1116 /* Equality and non-equality tests are permitted on anything.
1117 Subtraction, and other comparison operators are permitted if
1118 both operands are in the same section. Otherwise, both
1119 operands must be absolute. We already handled the case of
1120 addition or subtraction of a constant above. This will
1121 probably need to be changed for an object file format which
1122 supports arbitrary expressions, such as IEEE-695.
1124 Don't emit messages unless we're finalizing the symbol value,
1125 otherwise we may get the same message multiple times. */
1127 && !(seg_left
== absolute_section
1128 && seg_right
== absolute_section
)
1129 && !(op
== O_eq
|| op
== O_ne
)
1130 && !((op
== O_subtract
1131 || op
== O_lt
|| op
== O_le
|| op
== O_ge
|| op
== O_gt
)
1132 && seg_left
== seg_right
1133 && (seg_left
!= undefined_section
1134 || add_symbol
== op_symbol
)))
1135 report_op_error (symp
, add_symbol
, op_symbol
);
1137 if (final_seg
== expr_section
|| final_seg
== undefined_section
)
1138 final_seg
= absolute_section
;
1140 /* Check for division by zero. */
1141 if ((op
== O_divide
|| op
== O_modulus
) && right
== 0)
1143 /* If seg_right is not absolute_section, then we've
1144 already issued a warning about using a bad symbol. */
1145 if (seg_right
== absolute_section
&& finalize_syms
)
1150 if (expr_symbol_where (symp
, &file
, &line
))
1151 as_bad_where (file
, line
, _("division by zero"));
1153 as_bad (_("division by zero when setting `%s'"),
1160 switch (symp
->sy_value
.X_op
)
1162 case O_multiply
: left
*= right
; break;
1163 case O_divide
: left
/= right
; break;
1164 case O_modulus
: left
%= right
; break;
1165 case O_left_shift
: left
<<= right
; break;
1166 case O_right_shift
: left
>>= right
; break;
1167 case O_bit_inclusive_or
: left
|= right
; break;
1168 case O_bit_or_not
: left
|= ~right
; break;
1169 case O_bit_exclusive_or
: left
^= right
; break;
1170 case O_bit_and
: left
&= right
; break;
1171 case O_add
: left
+= right
; break;
1172 case O_subtract
: left
-= right
; break;
1175 left
= (left
== right
&& seg_left
== seg_right
1176 && (seg_left
!= undefined_section
1177 || add_symbol
== op_symbol
)
1178 ? ~ (offsetT
) 0 : 0);
1179 if (symp
->sy_value
.X_op
== O_ne
)
1182 case O_lt
: left
= left
< right
? ~ (offsetT
) 0 : 0; break;
1183 case O_le
: left
= left
<= right
? ~ (offsetT
) 0 : 0; break;
1184 case O_ge
: left
= left
>= right
? ~ (offsetT
) 0 : 0; break;
1185 case O_gt
: left
= left
> right
? ~ (offsetT
) 0 : 0; break;
1186 case O_logical_and
: left
= left
&& right
; break;
1187 case O_logical_or
: left
= left
|| right
; break;
1191 final_val
+= symp
->sy_frag
->fr_address
+ left
;
1192 if (final_seg
== expr_section
|| final_seg
== undefined_section
)
1194 if (seg_left
== undefined_section
1195 || seg_right
== undefined_section
)
1196 final_seg
= undefined_section
;
1197 else if (seg_left
== absolute_section
)
1198 final_seg
= seg_right
;
1200 final_seg
= seg_left
;
1202 resolved
= (symbol_resolved_p (add_symbol
)
1203 && symbol_resolved_p (op_symbol
));
1209 /* Give an error (below) if not in expr_section. We don't
1210 want to worry about expr_section symbols, because they
1211 are fictional (they are created as part of expression
1212 resolution), and any problems may not actually mean
1217 symp
->sy_resolving
= 0;
1221 S_SET_VALUE (symp
, final_val
);
1223 exit_dont_set_value
:
1224 /* Always set the segment, even if not finalizing the value.
1225 The segment is used to determine whether a symbol is defined. */
1226 #if defined (OBJ_AOUT) && ! defined (BFD_ASSEMBLER)
1227 /* The old a.out backend does not handle S_SET_SEGMENT correctly
1228 for a stab symbol, so we use this bad hack. */
1229 if (final_seg
!= S_GET_SEGMENT (symp
))
1231 S_SET_SEGMENT (symp
, final_seg
);
1233 /* Don't worry if we can't resolve an expr_section symbol. */
1237 symp
->sy_resolved
= 1;
1238 else if (S_GET_SEGMENT (symp
) != expr_section
)
1240 as_bad (_("can't resolve value for symbol `%s'"),
1242 symp
->sy_resolved
= 1;
1249 #ifdef BFD_ASSEMBLER
1251 static void resolve_local_symbol (const char *, PTR
);
1253 /* A static function passed to hash_traverse. */
1256 resolve_local_symbol (const char *key ATTRIBUTE_UNUSED
, PTR value
)
1259 resolve_symbol_value (value
);
1264 /* Resolve all local symbols. */
1267 resolve_local_symbol_values (void)
1269 #ifdef BFD_ASSEMBLER
1270 hash_traverse (local_hash
, resolve_local_symbol
);
1274 /* Dollar labels look like a number followed by a dollar sign. Eg, "42$".
1275 They are *really* local. That is, they go out of scope whenever we see a
1276 label that isn't local. Also, like fb labels, there can be multiple
1277 instances of a dollar label. Therefor, we name encode each instance with
1278 the instance number, keep a list of defined symbols separate from the real
1279 symbol table, and we treat these buggers as a sparse array. */
1281 static long *dollar_labels
;
1282 static long *dollar_label_instances
;
1283 static char *dollar_label_defines
;
1284 static unsigned long dollar_label_count
;
1285 static unsigned long dollar_label_max
;
1288 dollar_label_defined (long label
)
1292 know ((dollar_labels
!= NULL
) || (dollar_label_count
== 0));
1294 for (i
= dollar_labels
; i
< dollar_labels
+ dollar_label_count
; ++i
)
1296 return dollar_label_defines
[i
- dollar_labels
];
1298 /* If we get here, label isn't defined. */
1303 dollar_label_instance (long label
)
1307 know ((dollar_labels
!= NULL
) || (dollar_label_count
== 0));
1309 for (i
= dollar_labels
; i
< dollar_labels
+ dollar_label_count
; ++i
)
1311 return (dollar_label_instances
[i
- dollar_labels
]);
1313 /* If we get here, we haven't seen the label before.
1314 Therefore its instance count is zero. */
1319 dollar_label_clear (void)
1321 memset (dollar_label_defines
, '\0', (unsigned int) dollar_label_count
);
1324 #define DOLLAR_LABEL_BUMP_BY 10
1327 define_dollar_label (long label
)
1331 for (i
= dollar_labels
; i
< dollar_labels
+ dollar_label_count
; ++i
)
1334 ++dollar_label_instances
[i
- dollar_labels
];
1335 dollar_label_defines
[i
- dollar_labels
] = 1;
1339 /* If we get to here, we don't have label listed yet. */
1341 if (dollar_labels
== NULL
)
1343 dollar_labels
= (long *) xmalloc (DOLLAR_LABEL_BUMP_BY
* sizeof (long));
1344 dollar_label_instances
= (long *) xmalloc (DOLLAR_LABEL_BUMP_BY
* sizeof (long));
1345 dollar_label_defines
= xmalloc (DOLLAR_LABEL_BUMP_BY
);
1346 dollar_label_max
= DOLLAR_LABEL_BUMP_BY
;
1347 dollar_label_count
= 0;
1349 else if (dollar_label_count
== dollar_label_max
)
1351 dollar_label_max
+= DOLLAR_LABEL_BUMP_BY
;
1352 dollar_labels
= (long *) xrealloc ((char *) dollar_labels
,
1353 dollar_label_max
* sizeof (long));
1354 dollar_label_instances
= (long *) xrealloc ((char *) dollar_label_instances
,
1355 dollar_label_max
* sizeof (long));
1356 dollar_label_defines
= xrealloc (dollar_label_defines
, dollar_label_max
);
1357 } /* if we needed to grow */
1359 dollar_labels
[dollar_label_count
] = label
;
1360 dollar_label_instances
[dollar_label_count
] = 1;
1361 dollar_label_defines
[dollar_label_count
] = 1;
1362 ++dollar_label_count
;
1365 /* Caller must copy returned name: we re-use the area for the next name.
1367 The mth occurence of label n: is turned into the symbol "Ln^Am"
1368 where n is the label number and m is the instance number. "L" makes
1369 it a label discarded unless debugging and "^A"('\1') ensures no
1370 ordinary symbol SHOULD get the same name as a local label
1371 symbol. The first "4:" is "L4^A1" - the m numbers begin at 1.
1373 fb labels get the same treatment, except that ^B is used in place
1376 char * /* Return local label name. */
1377 dollar_label_name (register long n
, /* we just saw "n$:" : n a number. */
1378 register int augend
/* 0 for current instance, 1 for new instance. */)
1381 /* Returned to caller, then copied. Used for created names ("4f"). */
1382 static char symbol_name_build
[24];
1385 char symbol_name_temporary
[20]; /* Build up a number, BACKWARDS. */
1388 know (augend
== 0 || augend
== 1);
1389 p
= symbol_name_build
;
1390 #ifdef LOCAL_LABEL_PREFIX
1391 *p
++ = LOCAL_LABEL_PREFIX
;
1395 /* Next code just does sprintf( {}, "%d", n); */
1397 q
= symbol_name_temporary
;
1398 for (*q
++ = 0, i
= n
; i
; ++q
)
1403 while ((*p
= *--q
) != '\0')
1406 *p
++ = DOLLAR_LABEL_CHAR
; /* ^A */
1408 /* Instance number. */
1409 q
= symbol_name_temporary
;
1410 for (*q
++ = 0, i
= dollar_label_instance (n
) + augend
; i
; ++q
)
1415 while ((*p
++ = *--q
) != '\0');;
1417 /* The label, as a '\0' ended string, starts at symbol_name_build. */
1418 return symbol_name_build
;
1421 /* Somebody else's idea of local labels. They are made by "n:" where n
1422 is any decimal digit. Refer to them with
1423 "nb" for previous (backward) n:
1424 or "nf" for next (forward) n:.
1426 We do a little better and let n be any number, not just a single digit, but
1427 since the other guy's assembler only does ten, we treat the first ten
1430 Like someone else's assembler, we have one set of local label counters for
1431 entire assembly, not one set per (sub)segment like in most assemblers. This
1432 implies that one can refer to a label in another segment, and indeed some
1433 crufty compilers have done just that.
1435 Since there could be a LOT of these things, treat them as a sparse
1438 #define FB_LABEL_SPECIAL (10)
1440 static long fb_low_counter
[FB_LABEL_SPECIAL
];
1441 static long *fb_labels
;
1442 static long *fb_label_instances
;
1443 static long fb_label_count
;
1444 static long fb_label_max
;
1446 /* This must be more than FB_LABEL_SPECIAL. */
1447 #define FB_LABEL_BUMP_BY (FB_LABEL_SPECIAL + 6)
1450 fb_label_init (void)
1452 memset ((void *) fb_low_counter
, '\0', sizeof (fb_low_counter
));
1455 /* Add one to the instance number of this fb label. */
1458 fb_label_instance_inc (long label
)
1462 if (label
< FB_LABEL_SPECIAL
)
1464 ++fb_low_counter
[label
];
1468 if (fb_labels
!= NULL
)
1470 for (i
= fb_labels
+ FB_LABEL_SPECIAL
;
1471 i
< fb_labels
+ fb_label_count
; ++i
)
1475 ++fb_label_instances
[i
- fb_labels
];
1477 } /* if we find it */
1478 } /* for each existing label */
1481 /* If we get to here, we don't have label listed yet. */
1483 if (fb_labels
== NULL
)
1485 fb_labels
= (long *) xmalloc (FB_LABEL_BUMP_BY
* sizeof (long));
1486 fb_label_instances
= (long *) xmalloc (FB_LABEL_BUMP_BY
* sizeof (long));
1487 fb_label_max
= FB_LABEL_BUMP_BY
;
1488 fb_label_count
= FB_LABEL_SPECIAL
;
1491 else if (fb_label_count
== fb_label_max
)
1493 fb_label_max
+= FB_LABEL_BUMP_BY
;
1494 fb_labels
= (long *) xrealloc ((char *) fb_labels
,
1495 fb_label_max
* sizeof (long));
1496 fb_label_instances
= (long *) xrealloc ((char *) fb_label_instances
,
1497 fb_label_max
* sizeof (long));
1498 } /* if we needed to grow */
1500 fb_labels
[fb_label_count
] = label
;
1501 fb_label_instances
[fb_label_count
] = 1;
1506 fb_label_instance (long label
)
1510 if (label
< FB_LABEL_SPECIAL
)
1512 return (fb_low_counter
[label
]);
1515 if (fb_labels
!= NULL
)
1517 for (i
= fb_labels
+ FB_LABEL_SPECIAL
;
1518 i
< fb_labels
+ fb_label_count
; ++i
)
1522 return (fb_label_instances
[i
- fb_labels
]);
1523 } /* if we find it */
1524 } /* for each existing label */
1527 /* We didn't find the label, so this must be a reference to the
1532 /* Caller must copy returned name: we re-use the area for the next name.
1534 The mth occurence of label n: is turned into the symbol "Ln^Bm"
1535 where n is the label number and m is the instance number. "L" makes
1536 it a label discarded unless debugging and "^B"('\2') ensures no
1537 ordinary symbol SHOULD get the same name as a local label
1538 symbol. The first "4:" is "L4^B1" - the m numbers begin at 1.
1540 dollar labels get the same treatment, except that ^A is used in
1543 char * /* Return local label name. */
1544 fb_label_name (long n
, /* We just saw "n:", "nf" or "nb" : n a number. */
1545 long augend
/* 0 for nb, 1 for n:, nf. */)
1548 /* Returned to caller, then copied. Used for created names ("4f"). */
1549 static char symbol_name_build
[24];
1552 char symbol_name_temporary
[20]; /* Build up a number, BACKWARDS. */
1555 know (augend
== 0 || augend
== 1);
1556 p
= symbol_name_build
;
1557 #ifdef LOCAL_LABEL_PREFIX
1558 *p
++ = LOCAL_LABEL_PREFIX
;
1562 /* Next code just does sprintf( {}, "%d", n); */
1564 q
= symbol_name_temporary
;
1565 for (*q
++ = 0, i
= n
; i
; ++q
)
1570 while ((*p
= *--q
) != '\0')
1573 *p
++ = LOCAL_LABEL_CHAR
; /* ^B */
1575 /* Instance number. */
1576 q
= symbol_name_temporary
;
1577 for (*q
++ = 0, i
= fb_label_instance (n
) + augend
; i
; ++q
)
1582 while ((*p
++ = *--q
) != '\0');;
1584 /* The label, as a '\0' ended string, starts at symbol_name_build. */
1585 return (symbol_name_build
);
1588 /* Decode name that may have been generated by foo_label_name() above.
1589 If the name wasn't generated by foo_label_name(), then return it
1590 unaltered. This is used for error messages. */
1593 decode_local_label_name (char *s
)
1596 char *symbol_decode
;
1598 int instance_number
;
1600 const char *message_format
;
1603 #ifdef LOCAL_LABEL_PREFIX
1604 if (s
[index
] == LOCAL_LABEL_PREFIX
)
1608 if (s
[index
] != 'L')
1611 for (label_number
= 0, p
= s
+ index
+ 1; ISDIGIT (*p
); ++p
)
1612 label_number
= (10 * label_number
) + *p
- '0';
1614 if (*p
== DOLLAR_LABEL_CHAR
)
1616 else if (*p
== LOCAL_LABEL_CHAR
)
1621 for (instance_number
= 0, p
++; ISDIGIT (*p
); ++p
)
1622 instance_number
= (10 * instance_number
) + *p
- '0';
1624 message_format
= _("\"%d\" (instance number %d of a %s label)");
1625 symbol_decode
= obstack_alloc (¬es
, strlen (message_format
) + 30);
1626 sprintf (symbol_decode
, message_format
, label_number
, instance_number
, type
);
1628 return symbol_decode
;
1631 /* Get the value of a symbol. */
1634 S_GET_VALUE (symbolS
*s
)
1636 #ifdef BFD_ASSEMBLER
1637 if (LOCAL_SYMBOL_CHECK (s
))
1638 return resolve_symbol_value (s
);
1641 if (!s
->sy_resolved
)
1643 valueT val
= resolve_symbol_value (s
);
1647 if (s
->sy_value
.X_op
!= O_constant
)
1649 static symbolS
*recur
;
1651 /* FIXME: In non BFD assemblers, S_IS_DEFINED and S_IS_COMMON
1652 may call S_GET_VALUE. We use a static symbol to avoid the
1653 immediate recursion. */
1655 return (valueT
) s
->sy_value
.X_add_number
;
1657 if (! s
->sy_resolved
1658 || s
->sy_value
.X_op
!= O_symbol
1659 || (S_IS_DEFINED (s
) && ! S_IS_COMMON (s
)))
1660 as_bad (_("attempt to get value of unresolved symbol `%s'"),
1664 return (valueT
) s
->sy_value
.X_add_number
;
1667 /* Set the value of a symbol. */
1670 S_SET_VALUE (symbolS
*s
, valueT val
)
1672 #ifdef BFD_ASSEMBLER
1673 if (LOCAL_SYMBOL_CHECK (s
))
1675 ((struct local_symbol
*) s
)->lsy_value
= val
;
1680 s
->sy_value
.X_op
= O_constant
;
1681 s
->sy_value
.X_add_number
= (offsetT
) val
;
1682 s
->sy_value
.X_unsigned
= 0;
1686 copy_symbol_attributes (symbolS
*dest
, symbolS
*src
)
1688 if (LOCAL_SYMBOL_CHECK (dest
))
1689 dest
= local_symbol_convert ((struct local_symbol
*) dest
);
1690 if (LOCAL_SYMBOL_CHECK (src
))
1691 src
= local_symbol_convert ((struct local_symbol
*) src
);
1693 #ifdef BFD_ASSEMBLER
1694 /* In an expression, transfer the settings of these flags.
1695 The user can override later, of course. */
1696 #define COPIED_SYMFLAGS (BSF_FUNCTION | BSF_OBJECT)
1697 dest
->bsym
->flags
|= src
->bsym
->flags
& COPIED_SYMFLAGS
;
1700 #ifdef OBJ_COPY_SYMBOL_ATTRIBUTES
1701 OBJ_COPY_SYMBOL_ATTRIBUTES (dest
, src
);
1705 #ifdef BFD_ASSEMBLER
1708 S_IS_FUNCTION (symbolS
*s
)
1712 if (LOCAL_SYMBOL_CHECK (s
))
1715 flags
= s
->bsym
->flags
;
1717 return (flags
& BSF_FUNCTION
) != 0;
1721 S_IS_EXTERNAL (symbolS
*s
)
1725 if (LOCAL_SYMBOL_CHECK (s
))
1728 flags
= s
->bsym
->flags
;
1731 if ((flags
& BSF_LOCAL
) && (flags
& BSF_GLOBAL
))
1734 return (flags
& BSF_GLOBAL
) != 0;
1738 S_IS_WEAK (symbolS
*s
)
1740 if (LOCAL_SYMBOL_CHECK (s
))
1742 return (s
->bsym
->flags
& BSF_WEAK
) != 0;
1746 S_IS_COMMON (symbolS
*s
)
1748 if (LOCAL_SYMBOL_CHECK (s
))
1750 return bfd_is_com_section (s
->bsym
->section
);
1754 S_IS_DEFINED (symbolS
*s
)
1756 if (LOCAL_SYMBOL_CHECK (s
))
1757 return ((struct local_symbol
*) s
)->lsy_section
!= undefined_section
;
1758 return s
->bsym
->section
!= undefined_section
;
1762 #ifndef EXTERN_FORCE_RELOC
1763 #define EXTERN_FORCE_RELOC IS_ELF
1766 /* Return true for symbols that should not be reduced to section
1767 symbols or eliminated from expressions, because they may be
1768 overridden by the linker. */
1770 S_FORCE_RELOC (symbolS
*s
, int strict
)
1772 if (LOCAL_SYMBOL_CHECK (s
))
1773 return ((struct local_symbol
*) s
)->lsy_section
== undefined_section
;
1776 && ((s
->bsym
->flags
& BSF_WEAK
) != 0
1777 || (EXTERN_FORCE_RELOC
1778 && (s
->bsym
->flags
& BSF_GLOBAL
) != 0)))
1779 || s
->bsym
->section
== undefined_section
1780 || bfd_is_com_section (s
->bsym
->section
));
1784 S_IS_DEBUG (symbolS
*s
)
1786 if (LOCAL_SYMBOL_CHECK (s
))
1788 if (s
->bsym
->flags
& BSF_DEBUGGING
)
1794 S_IS_LOCAL (symbolS
*s
)
1799 if (LOCAL_SYMBOL_CHECK (s
))
1802 flags
= s
->bsym
->flags
;
1805 if ((flags
& BSF_LOCAL
) && (flags
& BSF_GLOBAL
))
1808 if (bfd_get_section (s
->bsym
) == reg_section
)
1811 if (flag_strip_local_absolute
1812 /* Keep BSF_FILE symbols in order to allow debuggers to identify
1813 the source file even when the object file is stripped. */
1814 && (flags
& (BSF_GLOBAL
| BSF_FILE
)) == 0
1815 && bfd_get_section (s
->bsym
) == absolute_section
)
1818 name
= S_GET_NAME (s
);
1819 return (name
!= NULL
1821 && (strchr (name
, DOLLAR_LABEL_CHAR
)
1822 || strchr (name
, LOCAL_LABEL_CHAR
)
1823 || (! flag_keep_locals
1824 && (bfd_is_local_label (stdoutput
, s
->bsym
)
1827 && name
[1] == '?')))));
1831 S_IS_EXTERN (symbolS
*s
)
1833 return S_IS_EXTERNAL (s
);
1837 S_IS_STABD (symbolS
*s
)
1839 return S_GET_NAME (s
) == 0;
1843 S_GET_NAME (symbolS
*s
)
1845 if (LOCAL_SYMBOL_CHECK (s
))
1846 return ((struct local_symbol
*) s
)->lsy_name
;
1847 return s
->bsym
->name
;
1851 S_GET_SEGMENT (symbolS
*s
)
1853 if (LOCAL_SYMBOL_CHECK (s
))
1854 return ((struct local_symbol
*) s
)->lsy_section
;
1855 return s
->bsym
->section
;
1859 S_SET_SEGMENT (symbolS
*s
, segT seg
)
1861 /* Don't reassign section symbols. The direct reason is to prevent seg
1862 faults assigning back to const global symbols such as *ABS*, but it
1863 shouldn't happen anyway. */
1865 if (LOCAL_SYMBOL_CHECK (s
))
1867 if (seg
== reg_section
)
1868 s
= local_symbol_convert ((struct local_symbol
*) s
);
1871 ((struct local_symbol
*) s
)->lsy_section
= seg
;
1876 if (s
->bsym
->flags
& BSF_SECTION_SYM
)
1878 if (s
->bsym
->section
!= seg
)
1882 s
->bsym
->section
= seg
;
1886 S_SET_EXTERNAL (symbolS
*s
)
1888 if (LOCAL_SYMBOL_CHECK (s
))
1889 s
= local_symbol_convert ((struct local_symbol
*) s
);
1890 if ((s
->bsym
->flags
& BSF_WEAK
) != 0)
1892 /* Let .weak override .global. */
1895 if (s
->bsym
->flags
& BSF_SECTION_SYM
)
1900 /* Do not reassign section symbols. */
1901 as_where (& file
, & line
);
1902 as_warn_where (file
, line
,
1903 _("section symbols are already global"));
1906 s
->bsym
->flags
|= BSF_GLOBAL
;
1907 s
->bsym
->flags
&= ~(BSF_LOCAL
| BSF_WEAK
);
1911 S_CLEAR_EXTERNAL (symbolS
*s
)
1913 if (LOCAL_SYMBOL_CHECK (s
))
1915 if ((s
->bsym
->flags
& BSF_WEAK
) != 0)
1917 /* Let .weak override. */
1920 s
->bsym
->flags
|= BSF_LOCAL
;
1921 s
->bsym
->flags
&= ~(BSF_GLOBAL
| BSF_WEAK
);
1925 S_SET_WEAK (symbolS
*s
)
1927 if (LOCAL_SYMBOL_CHECK (s
))
1928 s
= local_symbol_convert ((struct local_symbol
*) s
);
1929 s
->bsym
->flags
|= BSF_WEAK
;
1930 s
->bsym
->flags
&= ~(BSF_GLOBAL
| BSF_LOCAL
);
1934 S_SET_THREAD_LOCAL (symbolS
*s
)
1936 if (LOCAL_SYMBOL_CHECK (s
))
1937 s
= local_symbol_convert ((struct local_symbol
*) s
);
1938 if (bfd_is_com_section (s
->bsym
->section
)
1939 && (s
->bsym
->flags
& BSF_THREAD_LOCAL
) != 0)
1941 s
->bsym
->flags
|= BSF_THREAD_LOCAL
;
1942 if ((s
->bsym
->flags
& BSF_FUNCTION
) != 0)
1943 as_bad (_("Accessing function `%s' as thread-local object"),
1945 else if (! bfd_is_und_section (s
->bsym
->section
)
1946 && (s
->bsym
->section
->flags
& SEC_THREAD_LOCAL
) == 0)
1947 as_bad (_("Accessing `%s' as thread-local object"),
1952 S_SET_NAME (symbolS
*s
, char *name
)
1954 if (LOCAL_SYMBOL_CHECK (s
))
1956 ((struct local_symbol
*) s
)->lsy_name
= name
;
1959 s
->bsym
->name
= name
;
1961 #endif /* BFD_ASSEMBLER */
1963 #ifdef SYMBOLS_NEED_BACKPOINTERS
1965 /* Return the previous symbol in a chain. */
1968 symbol_previous (symbolS
*s
)
1970 if (LOCAL_SYMBOL_CHECK (s
))
1972 return s
->sy_previous
;
1975 #endif /* SYMBOLS_NEED_BACKPOINTERS */
1977 /* Return the next symbol in a chain. */
1980 symbol_next (symbolS
*s
)
1982 if (LOCAL_SYMBOL_CHECK (s
))
1987 /* Return a pointer to the value of a symbol as an expression. */
1990 symbol_get_value_expression (symbolS
*s
)
1992 if (LOCAL_SYMBOL_CHECK (s
))
1993 s
= local_symbol_convert ((struct local_symbol
*) s
);
1994 return &s
->sy_value
;
1997 /* Set the value of a symbol to an expression. */
2000 symbol_set_value_expression (symbolS
*s
, const expressionS
*exp
)
2002 if (LOCAL_SYMBOL_CHECK (s
))
2003 s
= local_symbol_convert ((struct local_symbol
*) s
);
2007 /* Set the value of SYM to the current position in the current segment. */
2010 symbol_set_value_now (symbolS
*sym
)
2012 S_SET_SEGMENT (sym
, now_seg
);
2013 S_SET_VALUE (sym
, frag_now_fix ());
2014 symbol_set_frag (sym
, frag_now
);
2017 /* Set the frag of a symbol. */
2020 symbol_set_frag (symbolS
*s
, fragS
*f
)
2022 #ifdef BFD_ASSEMBLER
2023 if (LOCAL_SYMBOL_CHECK (s
))
2025 local_symbol_set_frag ((struct local_symbol
*) s
, f
);
2032 /* Return the frag of a symbol. */
2035 symbol_get_frag (symbolS
*s
)
2037 #ifdef BFD_ASSEMBLER
2038 if (LOCAL_SYMBOL_CHECK (s
))
2039 return local_symbol_get_frag ((struct local_symbol
*) s
);
2044 /* Mark a symbol as having been used. */
2047 symbol_mark_used (symbolS
*s
)
2049 if (LOCAL_SYMBOL_CHECK (s
))
2054 /* Clear the mark of whether a symbol has been used. */
2057 symbol_clear_used (symbolS
*s
)
2059 if (LOCAL_SYMBOL_CHECK (s
))
2060 s
= local_symbol_convert ((struct local_symbol
*) s
);
2064 /* Return whether a symbol has been used. */
2067 symbol_used_p (symbolS
*s
)
2069 if (LOCAL_SYMBOL_CHECK (s
))
2074 /* Mark a symbol as having been used in a reloc. */
2077 symbol_mark_used_in_reloc (symbolS
*s
)
2079 if (LOCAL_SYMBOL_CHECK (s
))
2080 s
= local_symbol_convert ((struct local_symbol
*) s
);
2081 s
->sy_used_in_reloc
= 1;
2084 /* Clear the mark of whether a symbol has been used in a reloc. */
2087 symbol_clear_used_in_reloc (symbolS
*s
)
2089 if (LOCAL_SYMBOL_CHECK (s
))
2091 s
->sy_used_in_reloc
= 0;
2094 /* Return whether a symbol has been used in a reloc. */
2097 symbol_used_in_reloc_p (symbolS
*s
)
2099 if (LOCAL_SYMBOL_CHECK (s
))
2101 return s
->sy_used_in_reloc
;
2104 /* Mark a symbol as an MRI common symbol. */
2107 symbol_mark_mri_common (symbolS
*s
)
2109 if (LOCAL_SYMBOL_CHECK (s
))
2110 s
= local_symbol_convert ((struct local_symbol
*) s
);
2111 s
->sy_mri_common
= 1;
2114 /* Clear the mark of whether a symbol is an MRI common symbol. */
2117 symbol_clear_mri_common (symbolS
*s
)
2119 if (LOCAL_SYMBOL_CHECK (s
))
2121 s
->sy_mri_common
= 0;
2124 /* Return whether a symbol is an MRI common symbol. */
2127 symbol_mri_common_p (symbolS
*s
)
2129 if (LOCAL_SYMBOL_CHECK (s
))
2131 return s
->sy_mri_common
;
2134 /* Mark a symbol as having been written. */
2137 symbol_mark_written (symbolS
*s
)
2139 if (LOCAL_SYMBOL_CHECK (s
))
2144 /* Clear the mark of whether a symbol has been written. */
2147 symbol_clear_written (symbolS
*s
)
2149 if (LOCAL_SYMBOL_CHECK (s
))
2154 /* Return whether a symbol has been written. */
2157 symbol_written_p (symbolS
*s
)
2159 if (LOCAL_SYMBOL_CHECK (s
))
2164 /* Mark a symbol has having been resolved. */
2167 symbol_mark_resolved (symbolS
*s
)
2169 #ifdef BFD_ASSEMBLER
2170 if (LOCAL_SYMBOL_CHECK (s
))
2172 local_symbol_mark_resolved ((struct local_symbol
*) s
);
2179 /* Return whether a symbol has been resolved. */
2182 symbol_resolved_p (symbolS
*s
)
2184 #ifdef BFD_ASSEMBLER
2185 if (LOCAL_SYMBOL_CHECK (s
))
2186 return local_symbol_resolved_p ((struct local_symbol
*) s
);
2188 return s
->sy_resolved
;
2191 /* Return whether a symbol is a section symbol. */
2194 symbol_section_p (symbolS
*s ATTRIBUTE_UNUSED
)
2196 if (LOCAL_SYMBOL_CHECK (s
))
2198 #ifdef BFD_ASSEMBLER
2199 return (s
->bsym
->flags
& BSF_SECTION_SYM
) != 0;
2206 /* Return whether a symbol is equated to another symbol. */
2209 symbol_equated_p (symbolS
*s
)
2211 if (LOCAL_SYMBOL_CHECK (s
))
2213 return s
->sy_value
.X_op
== O_symbol
;
2216 /* Return whether a symbol is equated to another symbol, and should be
2217 treated specially when writing out relocs. */
2220 symbol_equated_reloc_p (symbolS
*s
)
2222 if (LOCAL_SYMBOL_CHECK (s
))
2224 /* X_op_symbol, normally not used for O_symbol, is set by
2225 resolve_symbol_value to flag expression syms that have been
2227 return (s
->sy_value
.X_op
== O_symbol
2228 && ((s
->sy_resolved
&& s
->sy_value
.X_op_symbol
!= NULL
)
2229 || ! S_IS_DEFINED (s
)
2230 || S_IS_COMMON (s
)));
2233 /* Return whether a symbol has a constant value. */
2236 symbol_constant_p (symbolS
*s
)
2238 if (LOCAL_SYMBOL_CHECK (s
))
2240 return s
->sy_value
.X_op
== O_constant
;
2243 #ifdef BFD_ASSEMBLER
2245 /* Return the BFD symbol for a symbol. */
2248 symbol_get_bfdsym (symbolS
*s
)
2250 if (LOCAL_SYMBOL_CHECK (s
))
2251 s
= local_symbol_convert ((struct local_symbol
*) s
);
2255 /* Set the BFD symbol for a symbol. */
2258 symbol_set_bfdsym (symbolS
*s
, asymbol
*bsym
)
2260 if (LOCAL_SYMBOL_CHECK (s
))
2261 s
= local_symbol_convert ((struct local_symbol
*) s
);
2262 /* Usually, it is harmless to reset a symbol to a BFD section
2263 symbol. For example, obj_elf_change_section sets the BFD symbol
2264 of an old symbol with the newly created section symbol. But when
2265 we have multiple sections with the same name, the newly created
2266 section may have the same name as an old section. We check if the
2267 old symbol has been already marked as a section symbol before
2269 if ((s
->bsym
->flags
& BSF_SECTION_SYM
) == 0)
2271 /* else XXX - What do we do now ? */
2274 #endif /* BFD_ASSEMBLER */
2276 #ifdef OBJ_SYMFIELD_TYPE
2278 /* Get a pointer to the object format information for a symbol. */
2281 symbol_get_obj (symbolS
*s
)
2283 if (LOCAL_SYMBOL_CHECK (s
))
2284 s
= local_symbol_convert ((struct local_symbol
*) s
);
2288 /* Set the object format information for a symbol. */
2291 symbol_set_obj (symbolS
*s
, OBJ_SYMFIELD_TYPE
*o
)
2293 if (LOCAL_SYMBOL_CHECK (s
))
2294 s
= local_symbol_convert ((struct local_symbol
*) s
);
2298 #endif /* OBJ_SYMFIELD_TYPE */
2300 #ifdef TC_SYMFIELD_TYPE
2302 /* Get a pointer to the processor information for a symbol. */
2305 symbol_get_tc (symbolS
*s
)
2307 if (LOCAL_SYMBOL_CHECK (s
))
2308 s
= local_symbol_convert ((struct local_symbol
*) s
);
2312 /* Set the processor information for a symbol. */
2315 symbol_set_tc (symbolS
*s
, TC_SYMFIELD_TYPE
*o
)
2317 if (LOCAL_SYMBOL_CHECK (s
))
2318 s
= local_symbol_convert ((struct local_symbol
*) s
);
2322 #endif /* TC_SYMFIELD_TYPE */
2327 symbol_lastP
= NULL
;
2328 symbol_rootP
= NULL
; /* In case we have 0 symbols (!!) */
2329 sy_hash
= hash_new ();
2330 #ifdef BFD_ASSEMBLER
2331 local_hash
= hash_new ();
2334 memset ((char *) (&abs_symbol
), '\0', sizeof (abs_symbol
));
2335 #ifdef BFD_ASSEMBLER
2336 #if defined (EMIT_SECTION_SYMBOLS) || !defined (RELOC_REQUIRES_SYMBOL)
2337 abs_symbol
.bsym
= bfd_abs_section
.symbol
;
2340 /* Can't initialise a union. Sigh. */
2341 S_SET_SEGMENT (&abs_symbol
, absolute_section
);
2343 abs_symbol
.sy_value
.X_op
= O_constant
;
2344 abs_symbol
.sy_frag
= &zero_address_frag
;
2346 if (LOCAL_LABELS_FB
)
2352 /* Maximum indent level.
2353 Available for modification inside a gdb session. */
2354 int max_indent_level
= 8;
2361 printf ("%*s", indent_level
* 4, "");
2367 print_symbol_value_1 (FILE *file
, symbolS
*sym
)
2369 const char *name
= S_GET_NAME (sym
);
2370 if (!name
|| !name
[0])
2372 fprintf (file
, "sym %lx %s", (unsigned long) sym
, name
);
2374 if (LOCAL_SYMBOL_CHECK (sym
))
2376 #ifdef BFD_ASSEMBLER
2377 struct local_symbol
*locsym
= (struct local_symbol
*) sym
;
2378 if (local_symbol_get_frag (locsym
) != &zero_address_frag
2379 && local_symbol_get_frag (locsym
) != NULL
)
2380 fprintf (file
, " frag %lx", (long) local_symbol_get_frag (locsym
));
2381 if (local_symbol_resolved_p (locsym
))
2382 fprintf (file
, " resolved");
2383 fprintf (file
, " local");
2388 if (sym
->sy_frag
!= &zero_address_frag
)
2389 fprintf (file
, " frag %lx", (long) sym
->sy_frag
);
2391 fprintf (file
, " written");
2392 if (sym
->sy_resolved
)
2393 fprintf (file
, " resolved");
2394 else if (sym
->sy_resolving
)
2395 fprintf (file
, " resolving");
2396 if (sym
->sy_used_in_reloc
)
2397 fprintf (file
, " used-in-reloc");
2399 fprintf (file
, " used");
2400 if (S_IS_LOCAL (sym
))
2401 fprintf (file
, " local");
2402 if (S_IS_EXTERN (sym
))
2403 fprintf (file
, " extern");
2404 if (S_IS_DEBUG (sym
))
2405 fprintf (file
, " debug");
2406 if (S_IS_DEFINED (sym
))
2407 fprintf (file
, " defined");
2409 fprintf (file
, " %s", segment_name (S_GET_SEGMENT (sym
)));
2410 if (symbol_resolved_p (sym
))
2412 segT s
= S_GET_SEGMENT (sym
);
2414 if (s
!= undefined_section
2415 && s
!= expr_section
)
2416 fprintf (file
, " %lx", (long) S_GET_VALUE (sym
));
2418 else if (indent_level
< max_indent_level
2419 && S_GET_SEGMENT (sym
) != undefined_section
)
2422 fprintf (file
, "\n%*s<", indent_level
* 4, "");
2423 #ifdef BFD_ASSEMBLER
2424 if (LOCAL_SYMBOL_CHECK (sym
))
2425 fprintf (file
, "constant %lx",
2426 (long) ((struct local_symbol
*) sym
)->lsy_value
);
2429 print_expr_1 (file
, &sym
->sy_value
);
2430 fprintf (file
, ">");
2437 print_symbol_value (symbolS
*sym
)
2440 print_symbol_value_1 (stderr
, sym
);
2441 fprintf (stderr
, "\n");
2445 print_binary (FILE *file
, const char *name
, expressionS
*exp
)
2448 fprintf (file
, "%s\n%*s<", name
, indent_level
* 4, "");
2449 print_symbol_value_1 (file
, exp
->X_add_symbol
);
2450 fprintf (file
, ">\n%*s<", indent_level
* 4, "");
2451 print_symbol_value_1 (file
, exp
->X_op_symbol
);
2452 fprintf (file
, ">");
2457 print_expr_1 (FILE *file
, expressionS
*exp
)
2459 fprintf (file
, "expr %lx ", (long) exp
);
2463 fprintf (file
, "illegal");
2466 fprintf (file
, "absent");
2469 fprintf (file
, "constant %lx", (long) exp
->X_add_number
);
2473 fprintf (file
, "symbol\n%*s<", indent_level
* 4, "");
2474 print_symbol_value_1 (file
, exp
->X_add_symbol
);
2475 fprintf (file
, ">");
2477 if (exp
->X_add_number
)
2478 fprintf (file
, "\n%*s%lx", indent_level
* 4, "",
2479 (long) exp
->X_add_number
);
2483 fprintf (file
, "register #%d", (int) exp
->X_add_number
);
2486 fprintf (file
, "big");
2489 fprintf (file
, "uminus -<");
2491 print_symbol_value_1 (file
, exp
->X_add_symbol
);
2492 fprintf (file
, ">");
2493 goto maybe_print_addnum
;
2495 fprintf (file
, "bit_not");
2498 print_binary (file
, "multiply", exp
);
2501 print_binary (file
, "divide", exp
);
2504 print_binary (file
, "modulus", exp
);
2507 print_binary (file
, "lshift", exp
);
2510 print_binary (file
, "rshift", exp
);
2512 case O_bit_inclusive_or
:
2513 print_binary (file
, "bit_ior", exp
);
2515 case O_bit_exclusive_or
:
2516 print_binary (file
, "bit_xor", exp
);
2519 print_binary (file
, "bit_and", exp
);
2522 print_binary (file
, "eq", exp
);
2525 print_binary (file
, "ne", exp
);
2528 print_binary (file
, "lt", exp
);
2531 print_binary (file
, "le", exp
);
2534 print_binary (file
, "ge", exp
);
2537 print_binary (file
, "gt", exp
);
2540 print_binary (file
, "logical_and", exp
);
2543 print_binary (file
, "logical_or", exp
);
2547 fprintf (file
, "add\n%*s<", indent_level
* 4, "");
2548 print_symbol_value_1 (file
, exp
->X_add_symbol
);
2549 fprintf (file
, ">\n%*s<", indent_level
* 4, "");
2550 print_symbol_value_1 (file
, exp
->X_op_symbol
);
2551 fprintf (file
, ">");
2552 goto maybe_print_addnum
;
2555 fprintf (file
, "subtract\n%*s<", indent_level
* 4, "");
2556 print_symbol_value_1 (file
, exp
->X_add_symbol
);
2557 fprintf (file
, ">\n%*s<", indent_level
* 4, "");
2558 print_symbol_value_1 (file
, exp
->X_op_symbol
);
2559 fprintf (file
, ">");
2560 goto maybe_print_addnum
;
2562 fprintf (file
, "{unknown opcode %d}", (int) exp
->X_op
);
2569 print_expr (expressionS
*exp
)
2571 print_expr_1 (stderr
, exp
);
2572 fprintf (stderr
, "\n");
2576 symbol_print_statistics (FILE *file
)
2578 hash_print_statistics (file
, "symbol table", sy_hash
);
2579 #ifdef BFD_ASSEMBLER
2580 hash_print_statistics (file
, "mini local symbol table", local_hash
);
2581 fprintf (file
, "%lu mini local symbols created, %lu converted\n",
2582 local_symbol_count
, local_symbol_conversion_count
);