xref: /openbsd/gnu/usr.bin/binutils/gas/symbols.c (revision 007c2a45)
1 /* symbols.c -symbol table-
2    Copyright 1987, 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998,
3    1999, 2000, 2001, 2002, 2003
4    Free Software Foundation, Inc.
5 
6    This file is part of GAS, the GNU Assembler.
7 
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)
11    any later version.
12 
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.
17 
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
21    02111-1307, USA.  */
22 
23 /* #define DEBUG_SYMS / * to debug symbol list maintenance.  */
24 
25 #include "as.h"
26 
27 #include "safe-ctype.h"
28 #include "obstack.h"		/* For "symbols.h" */
29 #include "subsegs.h"
30 
31 #include "struc-symbol.h"
32 
33 /* This is non-zero if symbols are case sensitive, which is the
34    default.  */
35 int symbols_case_sensitive = 1;
36 
37 #ifndef WORKING_DOT_WORD
38 extern int new_broken_words;
39 #endif
40 
41 /* symbol-name => struct symbol pointer */
42 static struct hash_control *sy_hash;
43 
44 /* Table of local symbols.  */
45 static struct hash_control *local_hash;
46 
47 /* Below are commented in "symbols.h".  */
48 symbolS *symbol_rootP;
49 symbolS *symbol_lastP;
50 symbolS abs_symbol;
51 
52 #ifdef DEBUG_SYMS
53 #define debug_verify_symchain verify_symbol_chain
54 #else
55 #define debug_verify_symchain(root, last) ((void) 0)
56 #endif
57 
58 #define DOLLAR_LABEL_CHAR	'\001'
59 #define LOCAL_LABEL_CHAR	'\002'
60 
61 struct obstack notes;
62 
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);
67 
68 static void print_binary (FILE *, const char *, expressionS *);
69 static void report_op_error (symbolS *, symbolS *, symbolS *);
70 
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
73    chain.
74 
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.  */
79 
80 symbolS *
symbol_new(const char * name,segT segment,valueT valu,fragS * frag)81 symbol_new (const char *name, segT segment, valueT valu, fragS *frag)
82 {
83   symbolS *symbolP = symbol_create (name, segment, valu, frag);
84 
85   /* Link to end of symbol chain.  */
86 #ifdef BFD_ASSEMBLER
87   {
88     extern int symbol_table_frozen;
89     if (symbol_table_frozen)
90       abort ();
91   }
92 #endif
93   symbol_append (symbolP, symbol_lastP, &symbol_rootP, &symbol_lastP);
94 
95   return symbolP;
96 }
97 
98 /* Save a symbol name on a permanent obstack, and convert it according
99    to the object file format.  */
100 
101 static char *
save_symbol_name(const char * name)102 save_symbol_name (const char *name)
103 {
104   unsigned int name_length;
105   char *ret;
106 
107   name_length = strlen (name) + 1;	/* +1 for \0.  */
108   obstack_grow (&notes, name, name_length);
109   ret = obstack_finish (&notes);
110 
111 #ifdef STRIP_UNDERSCORE
112   if (ret[0] == '_')
113     ++ret;
114 #endif
115 
116 #ifdef tc_canonicalize_symbol_name
117   ret = tc_canonicalize_symbol_name (ret);
118 #endif
119 
120   if (! symbols_case_sensitive)
121     {
122       char *s;
123 
124       for (s = ret; *s != '\0'; s++)
125 	*s = TOUPPER (*s);
126     }
127 
128   return ret;
129 }
130 
131 symbolS *
symbol_create(const char * name,segT segment,valueT valu,fragS * frag)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.  */)
136 {
137   char *preserved_copy_of_name;
138   symbolS *symbolP;
139 
140   preserved_copy_of_name = save_symbol_name (name);
141 
142   symbolP = (symbolS *) obstack_alloc (&notes, sizeof (symbolS));
143 
144   /* symbol must be born in some fixed state.  This seems as good as any.  */
145   memset (symbolP, 0, sizeof (symbolS));
146 
147 #ifdef BFD_ASSEMBLER
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;
152 #endif
153   S_SET_NAME (symbolP, preserved_copy_of_name);
154 
155   S_SET_SEGMENT (symbolP, segment);
156   S_SET_VALUE (symbolP, valu);
157   symbol_clear_list_pointers (symbolP);
158 
159   symbolP->sy_frag = frag;
160 #ifndef BFD_ASSEMBLER
161   symbolP->sy_number = ~0;
162   symbolP->sy_name_offset = (unsigned int) ~0;
163 #endif
164 
165   obj_symbol_new_hook (symbolP);
166 
167 #ifdef tc_symbol_new_hook
168   tc_symbol_new_hook (symbolP);
169 #endif
170 
171   return symbolP;
172 }
173 
174 #ifdef BFD_ASSEMBLER
175 
176 /* Local symbol support.  If we can get away with it, we keep only a
177    small amount of information for local symbols.  */
178 
179 static symbolS *local_symbol_convert (struct local_symbol *);
180 
181 /* Used for statistics.  */
182 
183 static unsigned long local_symbol_count;
184 static unsigned long local_symbol_conversion_count;
185 
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.  */
189 
190 #define LOCAL_SYMBOL_CHECK(s)						\
191   (s->bsym == NULL							\
192    ? (local_symbol_converted_p ((struct local_symbol *) s)		\
193       ? (s = local_symbol_get_real_symbol ((struct local_symbol *) s),	\
194 	 0)								\
195       : 1)								\
196    : 0)
197 
198 /* Create a local symbol and insert it into the local hash table.  */
199 
200 struct local_symbol *
local_symbol_make(const char * name,segT section,valueT value,fragS * frag)201 local_symbol_make (const char *name, segT section, valueT value, fragS *frag)
202 {
203   char *name_copy;
204   struct local_symbol *ret;
205 
206   ++local_symbol_count;
207 
208   name_copy = save_symbol_name (name);
209 
210   ret = (struct local_symbol *) obstack_alloc (&notes, 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;
216 
217   hash_jam (local_hash, name_copy, (PTR) ret);
218 
219   return ret;
220 }
221 
222 /* Convert a local symbol into a real symbol.  Note that we do not
223    reclaim the space used by the local symbol.  */
224 
225 static symbolS *
local_symbol_convert(struct local_symbol * locsym)226 local_symbol_convert (struct local_symbol *locsym)
227 {
228   symbolS *ret;
229 
230   assert (locsym->lsy_marker == NULL);
231   if (local_symbol_converted_p (locsym))
232     return local_symbol_get_real_symbol (locsym);
233 
234   ++local_symbol_conversion_count;
235 
236   ret = symbol_new (locsym->lsy_name, locsym->lsy_section, locsym->lsy_value,
237 		    local_symbol_get_frag (locsym));
238 
239   if (local_symbol_resolved_p (locsym))
240     ret->sy_resolved = 1;
241 
242   /* Local symbols are always either defined or used.  */
243   ret->sy_used = 1;
244 
245 #ifdef TC_LOCAL_SYMFIELD_CONVERT
246   TC_LOCAL_SYMFIELD_CONVERT (locsym, ret);
247 #endif
248 
249   symbol_table_insert (ret);
250 
251   local_symbol_mark_converted (locsym);
252   local_symbol_set_real_symbol (locsym, ret);
253 
254   hash_jam (local_hash, locsym->lsy_name, NULL);
255 
256   return ret;
257 }
258 
259 #else /* ! BFD_ASSEMBLER */
260 
261 #define LOCAL_SYMBOL_CHECK(s) 0
262 #define local_symbol_convert(s) ((symbolS *) s)
263 
264 #endif /* ! BFD_ASSEMBLER */
265 
266 /* We have just seen "<name>:".
267    Creates a struct symbol unless it already exists.
268 
269    Gripes if we are redefining a symbol incompatibly (and ignores it).  */
270 
271 symbolS *
colon(const char * sym_name)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.  */)
275 {
276   register symbolS *symbolP;	/* Symbol we are working with.  */
277 
278   /* Sun local labels go out of scope whenever a non-local symbol is
279      defined.  */
280   if (LOCAL_LABELS_DOLLAR)
281     {
282       int local;
283 
284 #ifdef BFD_ASSEMBLER
285       local = bfd_is_local_label_name (stdoutput, sym_name);
286 #else
287       local = LOCAL_LABEL (sym_name);
288 #endif
289 
290       if (! local)
291 	dollar_label_clear ();
292     }
293 
294 #ifndef WORKING_DOT_WORD
295   if (new_broken_words)
296     {
297       struct broken_word *a;
298       int possible_bytes;
299       fragS *frag_tmp;
300       char *frag_opcode;
301 
302       extern const int md_short_jump_size;
303       extern const int md_long_jump_size;
304 
305       if (now_seg == absolute_section)
306 	{
307 	  as_bad (_("cannot define symbol `%s' in absolute section"), sym_name);
308 	  return NULL;
309 	}
310 
311       possible_bytes = (md_short_jump_size
312 			+ new_broken_words * md_long_jump_size);
313 
314       frag_tmp = frag_now;
315       frag_opcode = frag_var (rs_broken_word,
316 			      possible_bytes,
317 			      possible_bytes,
318 			      (relax_substateT) 0,
319 			      (symbolS *) broken_words,
320 			      (offsetT) 0,
321 			      NULL);
322 
323       /* We want to store the pointer to where to insert the jump
324 	 table in the fr_opcode of the rs_broken_word frag.  This
325 	 requires a little hackery.  */
326       while (frag_tmp
327 	     && (frag_tmp->fr_type != rs_broken_word
328 		 || frag_tmp->fr_opcode))
329 	frag_tmp = frag_tmp->fr_next;
330       know (frag_tmp);
331       frag_tmp->fr_opcode = frag_opcode;
332       new_broken_words = 0;
333 
334       for (a = broken_words; a && a->dispfrag == 0; a = a->next_broken_word)
335 	a->dispfrag = frag_tmp;
336     }
337 #endif /* WORKING_DOT_WORD */
338 
339   if ((symbolP = symbol_find (sym_name)) != 0)
340     {
341 #ifdef RESOLVE_SYMBOL_REDEFINITION
342       if (RESOLVE_SYMBOL_REDEFINITION (symbolP))
343 	return symbolP;
344 #endif
345       /* Now check for undefined symbols.  */
346       if (LOCAL_SYMBOL_CHECK (symbolP))
347 	{
348 #ifdef BFD_ASSEMBLER
349 	  struct local_symbol *locsym = (struct local_symbol *) symbolP;
350 
351 	  if (locsym->lsy_section != undefined_section
352 	      && (local_symbol_get_frag (locsym) != frag_now
353 		  || locsym->lsy_section != now_seg
354 		  || locsym->lsy_value != frag_now_fix ()))
355 	    {
356 	      as_bad (_("symbol `%s' is already defined"), sym_name);
357 	      return symbolP;
358 	    }
359 
360 	  locsym->lsy_section = now_seg;
361 	  local_symbol_set_frag (locsym, frag_now);
362 	  locsym->lsy_value = frag_now_fix ();
363 #endif
364 	}
365       else if (!S_IS_DEFINED (symbolP) || S_IS_COMMON (symbolP))
366 	{
367 	  if (S_GET_VALUE (symbolP) == 0)
368 	    {
369 	      symbolP->sy_frag = frag_now;
370 #ifdef OBJ_VMS
371 	      S_SET_OTHER (symbolP, const_flag);
372 #endif
373 	      S_SET_VALUE (symbolP, (valueT) frag_now_fix ());
374 	      S_SET_SEGMENT (symbolP, now_seg);
375 #ifdef N_UNDF
376 	      know (N_UNDF == 0);
377 #endif /* if we have one, it better be zero.  */
378 
379 	    }
380 	  else
381 	    {
382 	      /* There are still several cases to check:
383 
384 		 A .comm/.lcomm symbol being redefined as initialized
385 		 data is OK
386 
387 		 A .comm/.lcomm symbol being redefined with a larger
388 		 size is also OK
389 
390 		 This only used to be allowed on VMS gas, but Sun cc
391 		 on the sparc also depends on it.  */
392 
393 	      if (((!S_IS_DEBUG (symbolP)
394 		    && (!S_IS_DEFINED (symbolP) || S_IS_COMMON (symbolP))
395 		    && S_IS_EXTERNAL (symbolP))
396 		   || S_GET_SEGMENT (symbolP) == bss_section)
397 		  && (now_seg == data_section
398 		      || now_seg == S_GET_SEGMENT (symbolP)))
399 		{
400 		  /* Select which of the 2 cases this is.  */
401 		  if (now_seg != data_section)
402 		    {
403 		      /* New .comm for prev .comm symbol.
404 
405 			 If the new size is larger we just change its
406 			 value.  If the new size is smaller, we ignore
407 			 this symbol.  */
408 		      if (S_GET_VALUE (symbolP)
409 			  < ((unsigned) frag_now_fix ()))
410 			{
411 			  S_SET_VALUE (symbolP, (valueT) frag_now_fix ());
412 			}
413 		    }
414 		  else
415 		    {
416 		      /* It is a .comm/.lcomm being converted to initialized
417 			 data.  */
418 		      symbolP->sy_frag = frag_now;
419 #ifdef OBJ_VMS
420 		      S_SET_OTHER (symbolP, const_flag);
421 #endif
422 		      S_SET_VALUE (symbolP, (valueT) frag_now_fix ());
423 		      S_SET_SEGMENT (symbolP, now_seg);	/* Keep N_EXT bit.  */
424 		    }
425 		}
426 	      else
427 		{
428 #if (!defined (OBJ_AOUT) && !defined (OBJ_MAYBE_AOUT) \
429      && !defined (OBJ_BOUT) && !defined (OBJ_MAYBE_BOUT))
430 		  static const char *od_buf = "";
431 #else
432 		  char od_buf[100];
433 		  od_buf[0] = '\0';
434 #ifdef BFD_ASSEMBLER
435 		  if (OUTPUT_FLAVOR == bfd_target_aout_flavour)
436 #endif
437 		    sprintf (od_buf, "%d.%d.",
438 			     S_GET_OTHER (symbolP),
439 			     S_GET_DESC (symbolP));
440 #endif
441 		  as_bad (_("symbol `%s' is already defined as \"%s\"/%s%ld"),
442 			    sym_name,
443 			    segment_name (S_GET_SEGMENT (symbolP)),
444 			    od_buf,
445 			    (long) S_GET_VALUE (symbolP));
446 		}
447 	    }			/* if the undefined symbol has no value  */
448 	}
449       else
450 	{
451 	  /* Don't blow up if the definition is the same.  */
452 	  if (!(frag_now == symbolP->sy_frag
453 		&& S_GET_VALUE (symbolP) == frag_now_fix ()
454 		&& S_GET_SEGMENT (symbolP) == now_seg))
455 	    as_bad (_("symbol `%s' is already defined"), sym_name);
456 	}
457 
458     }
459 #ifdef BFD_ASSEMBLER
460   else if (! flag_keep_locals && bfd_is_local_label_name (stdoutput, sym_name))
461     {
462       symbolP = (symbolS *) local_symbol_make (sym_name, now_seg,
463 					       (valueT) frag_now_fix (),
464 					       frag_now);
465     }
466 #endif /* BFD_ASSEMBLER */
467   else
468     {
469       symbolP = symbol_new (sym_name, now_seg, (valueT) frag_now_fix (),
470 			    frag_now);
471 #ifdef OBJ_VMS
472       S_SET_OTHER (symbolP, const_flag);
473 #endif /* OBJ_VMS */
474 
475       symbol_table_insert (symbolP);
476     }
477 
478   if (mri_common_symbol != NULL)
479     {
480       /* This symbol is actually being defined within an MRI common
481 	 section.  This requires special handling.  */
482       if (LOCAL_SYMBOL_CHECK (symbolP))
483 	symbolP = local_symbol_convert ((struct local_symbol *) symbolP);
484       symbolP->sy_value.X_op = O_symbol;
485       symbolP->sy_value.X_add_symbol = mri_common_symbol;
486       symbolP->sy_value.X_add_number = S_GET_VALUE (mri_common_symbol);
487       symbolP->sy_frag = &zero_address_frag;
488       S_SET_SEGMENT (symbolP, expr_section);
489       symbolP->sy_mri_common = 1;
490     }
491 
492 #ifdef tc_frob_label
493   tc_frob_label (symbolP);
494 #endif
495 #ifdef obj_frob_label
496   obj_frob_label (symbolP);
497 #endif
498 
499   return symbolP;
500 }
501 
502 /* Die if we can't insert the symbol.  */
503 
504 void
symbol_table_insert(symbolS * symbolP)505 symbol_table_insert (symbolS *symbolP)
506 {
507   register const char *error_string;
508 
509   know (symbolP);
510   know (S_GET_NAME (symbolP));
511 
512   if (LOCAL_SYMBOL_CHECK (symbolP))
513     {
514       error_string = hash_jam (local_hash, S_GET_NAME (symbolP),
515 			       (PTR) symbolP);
516       if (error_string != NULL)
517 	as_fatal (_("inserting \"%s\" into symbol table failed: %s"),
518 		  S_GET_NAME (symbolP), error_string);
519       return;
520     }
521 
522   if ((error_string = hash_jam (sy_hash, S_GET_NAME (symbolP), (PTR) symbolP)))
523     {
524       as_fatal (_("inserting \"%s\" into symbol table failed: %s"),
525 		S_GET_NAME (symbolP), error_string);
526     }				/* on error  */
527 }
528 
529 /* If a symbol name does not exist, create it as undefined, and insert
530    it into the symbol table.  Return a pointer to it.  */
531 
532 symbolS *
symbol_find_or_make(const char * name)533 symbol_find_or_make (const char *name)
534 {
535   register symbolS *symbolP;
536 
537   symbolP = symbol_find (name);
538 
539   if (symbolP == NULL)
540     {
541 #ifdef BFD_ASSEMBLER
542       if (! flag_keep_locals && bfd_is_local_label_name (stdoutput, name))
543 	{
544 	  symbolP = md_undefined_symbol ((char *) name);
545 	  if (symbolP != NULL)
546 	    return symbolP;
547 
548 	  symbolP = (symbolS *) local_symbol_make (name, undefined_section,
549 						   (valueT) 0,
550 						   &zero_address_frag);
551 	  return symbolP;
552 	}
553 #endif
554 
555       symbolP = symbol_make (name);
556 
557       symbol_table_insert (symbolP);
558     }				/* if symbol wasn't found */
559 
560   return (symbolP);
561 }
562 
563 symbolS *
symbol_make(const char * name)564 symbol_make (const char *name)
565 {
566   symbolS *symbolP;
567 
568   /* Let the machine description default it, e.g. for register names.  */
569   symbolP = md_undefined_symbol ((char *) name);
570 
571   if (!symbolP)
572     symbolP = symbol_new (name, undefined_section, (valueT) 0, &zero_address_frag);
573 
574   return (symbolP);
575 }
576 
577 symbolS *
symbol_temp_new(segT seg,valueT ofs,fragS * frag)578 symbol_temp_new (segT seg, valueT ofs, fragS *frag)
579 {
580   return symbol_new (FAKE_LABEL_NAME, seg, ofs, frag);
581 }
582 
583 symbolS *
symbol_temp_new_now(void)584 symbol_temp_new_now (void)
585 {
586   return symbol_temp_new (now_seg, frag_now_fix (), frag_now);
587 }
588 
589 symbolS *
symbol_temp_make(void)590 symbol_temp_make (void)
591 {
592   return symbol_make (FAKE_LABEL_NAME);
593 }
594 
595 /* Implement symbol table lookup.
596    In:	A symbol's name as a string: '\0' can't be part of a symbol name.
597    Out:	NULL if the name was not in the symbol table, else the address
598    of a struct symbol associated with that name.  */
599 
600 symbolS *
symbol_find(const char * name)601 symbol_find (const char *name)
602 {
603 #ifdef STRIP_UNDERSCORE
604   return (symbol_find_base (name, 1));
605 #else /* STRIP_UNDERSCORE */
606   return (symbol_find_base (name, 0));
607 #endif /* STRIP_UNDERSCORE */
608 }
609 
610 symbolS *
symbol_find_exact(const char * name)611 symbol_find_exact (const char *name)
612 {
613 #ifdef BFD_ASSEMBLER
614   {
615     struct local_symbol *locsym;
616 
617     locsym = (struct local_symbol *) hash_find (local_hash, name);
618     if (locsym != NULL)
619       return (symbolS *) locsym;
620   }
621 #endif
622 
623   return ((symbolS *) hash_find (sy_hash, name));
624 }
625 
626 symbolS *
symbol_find_base(const char * name,int strip_underscore)627 symbol_find_base (const char *name, int strip_underscore)
628 {
629   if (strip_underscore && *name == '_')
630     name++;
631 
632 #ifdef tc_canonicalize_symbol_name
633   {
634     char *copy;
635     size_t len = strlen (name) + 1;
636 
637     copy = (char *) alloca (len);
638     memcpy (copy, name, len);
639     name = tc_canonicalize_symbol_name (copy);
640   }
641 #endif
642 
643   if (! symbols_case_sensitive)
644     {
645       char *copy;
646       const char *orig;
647       unsigned char c;
648 
649       orig = name;
650       name = copy = (char *) alloca (strlen (name) + 1);
651 
652       while ((c = *orig++) != '\0')
653 	{
654 	  *copy++ = TOUPPER (c);
655 	}
656       *copy = '\0';
657     }
658 
659   return symbol_find_exact (name);
660 }
661 
662 /* Once upon a time, symbols were kept in a singly linked list.  At
663    least coff needs to be able to rearrange them from time to time, for
664    which a doubly linked list is much more convenient.  Loic did these
665    as macros which seemed dangerous to me so they're now functions.
666    xoxorich.  */
667 
668 /* Link symbol ADDME after symbol TARGET in the chain.  */
669 
670 void
symbol_append(symbolS * addme,symbolS * target,symbolS ** rootPP,symbolS ** lastPP)671 symbol_append (symbolS *addme, symbolS *target,
672 	       symbolS **rootPP, symbolS **lastPP)
673 {
674   if (LOCAL_SYMBOL_CHECK (addme))
675     abort ();
676   if (target != NULL && LOCAL_SYMBOL_CHECK (target))
677     abort ();
678 
679   if (target == NULL)
680     {
681       know (*rootPP == NULL);
682       know (*lastPP == NULL);
683       addme->sy_next = NULL;
684 #ifdef SYMBOLS_NEED_BACKPOINTERS
685       addme->sy_previous = NULL;
686 #endif
687       *rootPP = addme;
688       *lastPP = addme;
689       return;
690     }				/* if the list is empty  */
691 
692   if (target->sy_next != NULL)
693     {
694 #ifdef SYMBOLS_NEED_BACKPOINTERS
695       target->sy_next->sy_previous = addme;
696 #endif /* SYMBOLS_NEED_BACKPOINTERS */
697     }
698   else
699     {
700       know (*lastPP == target);
701       *lastPP = addme;
702     }				/* if we have a next  */
703 
704   addme->sy_next = target->sy_next;
705   target->sy_next = addme;
706 
707 #ifdef SYMBOLS_NEED_BACKPOINTERS
708   addme->sy_previous = target;
709 #endif /* SYMBOLS_NEED_BACKPOINTERS */
710 
711   debug_verify_symchain (symbol_rootP, symbol_lastP);
712 }
713 
714 /* Set the chain pointers of SYMBOL to null.  */
715 
716 void
symbol_clear_list_pointers(symbolS * symbolP)717 symbol_clear_list_pointers (symbolS *symbolP)
718 {
719   if (LOCAL_SYMBOL_CHECK (symbolP))
720     abort ();
721   symbolP->sy_next = NULL;
722 #ifdef SYMBOLS_NEED_BACKPOINTERS
723   symbolP->sy_previous = NULL;
724 #endif
725 }
726 
727 #ifdef SYMBOLS_NEED_BACKPOINTERS
728 /* Remove SYMBOLP from the list.  */
729 
730 void
symbol_remove(symbolS * symbolP,symbolS ** rootPP,symbolS ** lastPP)731 symbol_remove (symbolS *symbolP, symbolS **rootPP, symbolS **lastPP)
732 {
733   if (LOCAL_SYMBOL_CHECK (symbolP))
734     abort ();
735 
736   if (symbolP == *rootPP)
737     {
738       *rootPP = symbolP->sy_next;
739     }				/* if it was the root  */
740 
741   if (symbolP == *lastPP)
742     {
743       *lastPP = symbolP->sy_previous;
744     }				/* if it was the tail  */
745 
746   if (symbolP->sy_next != NULL)
747     {
748       symbolP->sy_next->sy_previous = symbolP->sy_previous;
749     }				/* if not last  */
750 
751   if (symbolP->sy_previous != NULL)
752     {
753       symbolP->sy_previous->sy_next = symbolP->sy_next;
754     }				/* if not first  */
755 
756   debug_verify_symchain (*rootPP, *lastPP);
757 }
758 
759 /* Link symbol ADDME before symbol TARGET in the chain.  */
760 
761 void
symbol_insert(symbolS * addme,symbolS * target,symbolS ** rootPP,symbolS ** lastPP ATTRIBUTE_UNUSED)762 symbol_insert (symbolS *addme, symbolS *target,
763 	       symbolS **rootPP, symbolS **lastPP ATTRIBUTE_UNUSED)
764 {
765   if (LOCAL_SYMBOL_CHECK (addme))
766     abort ();
767   if (LOCAL_SYMBOL_CHECK (target))
768     abort ();
769 
770   if (target->sy_previous != NULL)
771     {
772       target->sy_previous->sy_next = addme;
773     }
774   else
775     {
776       know (*rootPP == target);
777       *rootPP = addme;
778     }				/* if not first  */
779 
780   addme->sy_previous = target->sy_previous;
781   target->sy_previous = addme;
782   addme->sy_next = target;
783 
784   debug_verify_symchain (*rootPP, *lastPP);
785 }
786 
787 #endif /* SYMBOLS_NEED_BACKPOINTERS */
788 
789 void
verify_symbol_chain(symbolS * rootP,symbolS * lastP)790 verify_symbol_chain (symbolS *rootP, symbolS *lastP)
791 {
792   symbolS *symbolP = rootP;
793 
794   if (symbolP == NULL)
795     return;
796 
797   for (; symbol_next (symbolP) != NULL; symbolP = symbol_next (symbolP))
798     {
799 #ifdef BFD_ASSEMBLER
800       assert (symbolP->bsym != NULL);
801 #endif
802 #ifdef SYMBOLS_NEED_BACKPOINTERS
803       assert (symbolP->sy_next->sy_previous == symbolP);
804 #else
805       /* Walk the list anyways, to make sure pointers are still good.  */
806       ;
807 #endif /* SYMBOLS_NEED_BACKPOINTERS */
808     }
809 
810   assert (lastP == symbolP);
811 }
812 
813 void
verify_symbol_chain_2(symbolS * sym)814 verify_symbol_chain_2 (symbolS *sym)
815 {
816   symbolS *p = sym, *n = sym;
817 #ifdef SYMBOLS_NEED_BACKPOINTERS
818   while (symbol_previous (p))
819     p = symbol_previous (p);
820 #endif
821   while (symbol_next (n))
822     n = symbol_next (n);
823   verify_symbol_chain (p, n);
824 }
825 
826 static void
report_op_error(symbolS * symp,symbolS * left,symbolS * right)827 report_op_error (symbolS *symp, symbolS *left, symbolS *right)
828 {
829   char *file;
830   unsigned int line;
831   segT seg_left = S_GET_SEGMENT (left);
832   segT seg_right = right ? S_GET_SEGMENT (right) : 0;
833 
834   if (expr_symbol_where (symp, &file, &line))
835     {
836       if (seg_left == undefined_section)
837 	as_bad_where (file, line,
838 		      _("undefined symbol `%s' in operation"),
839 		      S_GET_NAME (left));
840       if (seg_right == undefined_section)
841 	as_bad_where (file, line,
842 		      _("undefined symbol `%s' in operation"),
843 		      S_GET_NAME (right));
844       if (seg_left != undefined_section
845 	  && seg_right != undefined_section)
846 	{
847 	  if (right)
848 	    as_bad_where (file, line,
849 			  _("invalid sections for operation on `%s' and `%s'"),
850 			  S_GET_NAME (left), S_GET_NAME (right));
851 	  else
852 	    as_bad_where (file, line,
853 			  _("invalid section for operation on `%s'"),
854 			  S_GET_NAME (left));
855 	}
856 
857     }
858   else
859     {
860       if (seg_left == undefined_section)
861 	as_bad (_("undefined symbol `%s' in operation setting `%s'"),
862 		S_GET_NAME (left), S_GET_NAME (symp));
863       if (seg_right == undefined_section)
864 	as_bad (_("undefined symbol `%s' in operation setting `%s'"),
865 		S_GET_NAME (right), S_GET_NAME (symp));
866       if (seg_left != undefined_section
867 	  && seg_right != undefined_section)
868 	{
869 	  if (right)
870 	    as_bad_where (file, line,
871 			  _("invalid sections for operation on `%s' and `%s' setting `%s'"),
872 			  S_GET_NAME (left), S_GET_NAME (right), S_GET_NAME (symp));
873 	  else
874 	    as_bad_where (file, line,
875 			  _("invalid section for operation on `%s' setting `%s'"),
876 			  S_GET_NAME (left), S_GET_NAME (symp));
877 	}
878     }
879 }
880 
881 /* Resolve the value of a symbol.  This is called during the final
882    pass over the symbol table to resolve any symbols with complex
883    values.  */
884 
885 valueT
resolve_symbol_value(symbolS * symp)886 resolve_symbol_value (symbolS *symp)
887 {
888   int resolved;
889   valueT final_val = 0;
890   segT final_seg;
891 
892 #ifdef BFD_ASSEMBLER
893   if (LOCAL_SYMBOL_CHECK (symp))
894     {
895       struct local_symbol *locsym = (struct local_symbol *) symp;
896 
897       final_val = locsym->lsy_value;
898       if (local_symbol_resolved_p (locsym))
899 	return final_val;
900 
901       final_val += local_symbol_get_frag (locsym)->fr_address / OCTETS_PER_BYTE;
902 
903       if (finalize_syms)
904 	{
905 	  locsym->lsy_value = final_val;
906 	  local_symbol_mark_resolved (locsym);
907 	}
908 
909       return final_val;
910     }
911 #endif
912 
913   if (symp->sy_resolved)
914     {
915       if (symp->sy_value.X_op == O_constant)
916 	return (valueT) symp->sy_value.X_add_number;
917       else
918 	return 0;
919     }
920 
921   resolved = 0;
922   final_seg = S_GET_SEGMENT (symp);
923 
924   if (symp->sy_resolving)
925     {
926       if (finalize_syms)
927 	as_bad (_("symbol definition loop encountered at `%s'"),
928 		S_GET_NAME (symp));
929       final_val = 0;
930       resolved = 1;
931     }
932   else
933     {
934       symbolS *add_symbol, *op_symbol;
935       offsetT left, right;
936       segT seg_left, seg_right;
937       operatorT op;
938 
939       symp->sy_resolving = 1;
940 
941       /* Help out with CSE.  */
942       add_symbol = symp->sy_value.X_add_symbol;
943       op_symbol = symp->sy_value.X_op_symbol;
944       final_val = symp->sy_value.X_add_number;
945       op = symp->sy_value.X_op;
946 
947       switch (op)
948 	{
949 	default:
950 	  BAD_CASE (op);
951 	  break;
952 
953 	case O_absent:
954 	  final_val = 0;
955 	  /* Fall through.  */
956 
957 	case O_constant:
958 	  final_val += symp->sy_frag->fr_address / OCTETS_PER_BYTE;
959 	  if (final_seg == expr_section)
960 	    final_seg = absolute_section;
961 	  resolved = 1;
962 	  break;
963 
964 	case O_symbol:
965 	case O_symbol_rva:
966 	  left = resolve_symbol_value (add_symbol);
967 	  seg_left = S_GET_SEGMENT (add_symbol);
968 	  if (finalize_syms)
969 	    symp->sy_value.X_op_symbol = NULL;
970 
971 	do_symbol:
972 	  if (symp->sy_mri_common)
973 	    {
974 	      /* This is a symbol inside an MRI common section.  The
975 		 relocation routines are going to handle it specially.
976 		 Don't change the value.  */
977 	      resolved = symbol_resolved_p (add_symbol);
978 	      break;
979 	    }
980 
981 	  if (finalize_syms && final_val == 0)
982 	    {
983 	      if (LOCAL_SYMBOL_CHECK (add_symbol))
984 		add_symbol = local_symbol_convert ((struct local_symbol *)
985 						   add_symbol);
986 	      copy_symbol_attributes (symp, add_symbol);
987 	    }
988 
989 	  /* If we have equated this symbol to an undefined or common
990 	     symbol, keep X_op set to O_symbol, and don't change
991 	     X_add_number.  This permits the routine which writes out
992 	     relocation to detect this case, and convert the
993 	     relocation to be against the symbol to which this symbol
994 	     is equated.  */
995 	  if (! S_IS_DEFINED (add_symbol) || S_IS_COMMON (add_symbol))
996 	    {
997 	      if (finalize_syms)
998 		{
999 		  symp->sy_value.X_op = O_symbol;
1000 		  symp->sy_value.X_add_symbol = add_symbol;
1001 		  symp->sy_value.X_add_number = final_val;
1002 		  /* Use X_op_symbol as a flag.  */
1003 		  symp->sy_value.X_op_symbol = add_symbol;
1004 		  final_seg = seg_left;
1005 		}
1006 	      final_val = 0;
1007 	      resolved = symbol_resolved_p (add_symbol);
1008 	      symp->sy_resolving = 0;
1009 	      goto exit_dont_set_value;
1010 	    }
1011 	  else if (finalize_syms && final_seg == expr_section
1012 		   && seg_left != expr_section)
1013 	    {
1014 	      /* If the symbol is an expression symbol, do similarly
1015 		 as for undefined and common syms above.  Handles
1016 		 "sym +/- expr" where "expr" cannot be evaluated
1017 		 immediately, and we want relocations to be against
1018 		 "sym", eg. because it is weak.  */
1019 	      symp->sy_value.X_op = O_symbol;
1020 	      symp->sy_value.X_add_symbol = add_symbol;
1021 	      symp->sy_value.X_add_number = final_val;
1022 	      symp->sy_value.X_op_symbol = add_symbol;
1023 	      final_seg = seg_left;
1024 	      final_val += symp->sy_frag->fr_address + left;
1025 	      resolved = symbol_resolved_p (add_symbol);
1026 	      symp->sy_resolving = 0;
1027 	      goto exit_dont_set_value;
1028 	    }
1029 	  else
1030 	    {
1031 	      final_val += symp->sy_frag->fr_address + left;
1032 	      if (final_seg == expr_section || final_seg == undefined_section)
1033 		final_seg = seg_left;
1034 	    }
1035 
1036 	  resolved = symbol_resolved_p (add_symbol);
1037 	  break;
1038 
1039 	case O_uminus:
1040 	case O_bit_not:
1041 	case O_logical_not:
1042 	  left = resolve_symbol_value (add_symbol);
1043 	  seg_left = S_GET_SEGMENT (add_symbol);
1044 
1045 	  /* By reducing these to the relevant dyadic operator, we get
1046 	     	!S -> S == 0 	permitted on anything,
1047 		-S -> 0 - S 	only permitted on absolute
1048 		~S -> S ^ ~0 	only permitted on absolute  */
1049 	  if (op != O_logical_not && seg_left != absolute_section
1050 	      && finalize_syms)
1051 	    report_op_error (symp, add_symbol, NULL);
1052 
1053 	  if (final_seg == expr_section || final_seg == undefined_section)
1054 	    final_seg = absolute_section;
1055 
1056 	  if (op == O_uminus)
1057 	    left = -left;
1058 	  else if (op == O_logical_not)
1059 	    left = !left;
1060 	  else
1061 	    left = ~left;
1062 
1063 	  final_val += left + symp->sy_frag->fr_address;
1064 
1065 	  resolved = symbol_resolved_p (add_symbol);
1066 	  break;
1067 
1068 	case O_multiply:
1069 	case O_divide:
1070 	case O_modulus:
1071 	case O_left_shift:
1072 	case O_right_shift:
1073 	case O_bit_inclusive_or:
1074 	case O_bit_or_not:
1075 	case O_bit_exclusive_or:
1076 	case O_bit_and:
1077 	case O_add:
1078 	case O_subtract:
1079 	case O_eq:
1080 	case O_ne:
1081 	case O_lt:
1082 	case O_le:
1083 	case O_ge:
1084 	case O_gt:
1085 	case O_logical_and:
1086 	case O_logical_or:
1087 	  left = resolve_symbol_value (add_symbol);
1088 	  right = resolve_symbol_value (op_symbol);
1089 	  seg_left = S_GET_SEGMENT (add_symbol);
1090 	  seg_right = S_GET_SEGMENT (op_symbol);
1091 
1092 	  /* Simplify addition or subtraction of a constant by folding the
1093 	     constant into X_add_number.  */
1094 	  if (op == O_add)
1095 	    {
1096 	      if (seg_right == absolute_section)
1097 		{
1098 		  final_val += right;
1099 		  goto do_symbol;
1100 		}
1101 	      else if (seg_left == absolute_section)
1102 		{
1103 		  final_val += left;
1104 		  add_symbol = op_symbol;
1105 		  left = right;
1106 		  seg_left = seg_right;
1107 		  goto do_symbol;
1108 		}
1109 	    }
1110 	  else if (op == O_subtract)
1111 	    {
1112 	      if (seg_right == absolute_section)
1113 		{
1114 		  final_val -= right;
1115 		  goto do_symbol;
1116 		}
1117 	    }
1118 
1119 	  /* Equality and non-equality tests are permitted on anything.
1120 	     Subtraction, and other comparison operators are permitted if
1121 	     both operands are in the same section.  Otherwise, both
1122 	     operands must be absolute.  We already handled the case of
1123 	     addition or subtraction of a constant above.  This will
1124 	     probably need to be changed for an object file format which
1125 	     supports arbitrary expressions, such as IEEE-695.
1126 
1127 	     Don't emit messages unless we're finalizing the symbol value,
1128 	     otherwise we may get the same message multiple times.  */
1129 	  if (finalize_syms
1130 	      && !(seg_left == absolute_section
1131 		   && seg_right == absolute_section)
1132 	      && !(op == O_eq || op == O_ne)
1133 	      && !((op == O_subtract
1134 		    || op == O_lt || op == O_le || op == O_ge || op == O_gt)
1135 		   && seg_left == seg_right
1136 		   && (seg_left != undefined_section
1137 		       || add_symbol == op_symbol)))
1138 	    report_op_error (symp, add_symbol, op_symbol);
1139 
1140 	  if (final_seg == expr_section || final_seg == undefined_section)
1141 	    final_seg = absolute_section;
1142 
1143 	  /* Check for division by zero.  */
1144 	  if ((op == O_divide || op == O_modulus) && right == 0)
1145 	    {
1146 	      /* If seg_right is not absolute_section, then we've
1147 		 already issued a warning about using a bad symbol.  */
1148 	      if (seg_right == absolute_section && finalize_syms)
1149 		{
1150 		  char *file;
1151 		  unsigned int line;
1152 
1153 		  if (expr_symbol_where (symp, &file, &line))
1154 		    as_bad_where (file, line, _("division by zero"));
1155 		  else
1156 		    as_bad (_("division by zero when setting `%s'"),
1157 			    S_GET_NAME (symp));
1158 		}
1159 
1160 	      right = 1;
1161 	    }
1162 
1163 	  switch (symp->sy_value.X_op)
1164 	    {
1165 	    case O_multiply:		left *= right; break;
1166 	    case O_divide:		left /= right; break;
1167 	    case O_modulus:		left %= right; break;
1168 	    case O_left_shift:		left <<= right; break;
1169 	    case O_right_shift:		left >>= right; break;
1170 	    case O_bit_inclusive_or:	left |= right; break;
1171 	    case O_bit_or_not:		left |= ~right; break;
1172 	    case O_bit_exclusive_or:	left ^= right; break;
1173 	    case O_bit_and:		left &= right; break;
1174 	    case O_add:			left += right; break;
1175 	    case O_subtract:		left -= right; break;
1176 	    case O_eq:
1177 	    case O_ne:
1178 	      left = (left == right && seg_left == seg_right
1179 		      && (seg_left != undefined_section
1180 			  || add_symbol == op_symbol)
1181 		      ? ~ (offsetT) 0 : 0);
1182 	      if (symp->sy_value.X_op == O_ne)
1183 		left = ~left;
1184 	      break;
1185 	    case O_lt:	left = left <  right ? ~ (offsetT) 0 : 0; break;
1186 	    case O_le:	left = left <= right ? ~ (offsetT) 0 : 0; break;
1187 	    case O_ge:	left = left >= right ? ~ (offsetT) 0 : 0; break;
1188 	    case O_gt:	left = left >  right ? ~ (offsetT) 0 : 0; break;
1189 	    case O_logical_and:	left = left && right; break;
1190 	    case O_logical_or:	left = left || right; break;
1191 	    default:		abort ();
1192 	    }
1193 
1194 	  final_val += symp->sy_frag->fr_address + left;
1195 	  if (final_seg == expr_section || final_seg == undefined_section)
1196 	    {
1197 	      if (seg_left == undefined_section
1198 		  || seg_right == undefined_section)
1199 		final_seg = undefined_section;
1200 	      else if (seg_left == absolute_section)
1201 		final_seg = seg_right;
1202 	      else
1203 		final_seg = seg_left;
1204 	    }
1205 	  resolved = (symbol_resolved_p (add_symbol)
1206 		      && symbol_resolved_p (op_symbol));
1207 	  break;
1208 
1209 	case O_register:
1210 	case O_big:
1211 	case O_illegal:
1212 	  /* Give an error (below) if not in expr_section.  We don't
1213 	     want to worry about expr_section symbols, because they
1214 	     are fictional (they are created as part of expression
1215 	     resolution), and any problems may not actually mean
1216 	     anything.  */
1217 	  break;
1218 	}
1219 
1220       symp->sy_resolving = 0;
1221     }
1222 
1223   if (finalize_syms)
1224     S_SET_VALUE (symp, final_val);
1225 
1226 exit_dont_set_value:
1227   /* Always set the segment, even if not finalizing the value.
1228      The segment is used to determine whether a symbol is defined.  */
1229 #if defined (OBJ_AOUT) && ! defined (BFD_ASSEMBLER)
1230   /* The old a.out backend does not handle S_SET_SEGMENT correctly
1231      for a stab symbol, so we use this bad hack.  */
1232   if (final_seg != S_GET_SEGMENT (symp))
1233 #endif
1234     S_SET_SEGMENT (symp, final_seg);
1235 
1236   /* Don't worry if we can't resolve an expr_section symbol.  */
1237   if (finalize_syms)
1238     {
1239       if (resolved)
1240 	symp->sy_resolved = 1;
1241       else if (S_GET_SEGMENT (symp) != expr_section)
1242 	{
1243 	  as_bad (_("can't resolve value for symbol `%s'"),
1244 		  S_GET_NAME (symp));
1245 	  symp->sy_resolved = 1;
1246 	}
1247     }
1248 
1249   return final_val;
1250 }
1251 
1252 #ifdef BFD_ASSEMBLER
1253 
1254 static void resolve_local_symbol (const char *, PTR);
1255 
1256 /* A static function passed to hash_traverse.  */
1257 
1258 static void
resolve_local_symbol(const char * key ATTRIBUTE_UNUSED,PTR value)1259 resolve_local_symbol (const char *key ATTRIBUTE_UNUSED, PTR value)
1260 {
1261   if (value != NULL)
1262     resolve_symbol_value (value);
1263 }
1264 
1265 #endif
1266 
1267 /* Resolve all local symbols.  */
1268 
1269 void
resolve_local_symbol_values(void)1270 resolve_local_symbol_values (void)
1271 {
1272 #ifdef BFD_ASSEMBLER
1273   hash_traverse (local_hash, resolve_local_symbol);
1274 #endif
1275 }
1276 
1277 /* Dollar labels look like a number followed by a dollar sign.  Eg, "42$".
1278    They are *really* local.  That is, they go out of scope whenever we see a
1279    label that isn't local.  Also, like fb labels, there can be multiple
1280    instances of a dollar label.  Therefor, we name encode each instance with
1281    the instance number, keep a list of defined symbols separate from the real
1282    symbol table, and we treat these buggers as a sparse array.  */
1283 
1284 static long *dollar_labels;
1285 static long *dollar_label_instances;
1286 static char *dollar_label_defines;
1287 static unsigned long dollar_label_count;
1288 static unsigned long dollar_label_max;
1289 
1290 int
dollar_label_defined(long label)1291 dollar_label_defined (long label)
1292 {
1293   long *i;
1294 
1295   know ((dollar_labels != NULL) || (dollar_label_count == 0));
1296 
1297   for (i = dollar_labels; i < dollar_labels + dollar_label_count; ++i)
1298     if (*i == label)
1299       return dollar_label_defines[i - dollar_labels];
1300 
1301   /* If we get here, label isn't defined.  */
1302   return 0;
1303 }
1304 
1305 static long
dollar_label_instance(long label)1306 dollar_label_instance (long label)
1307 {
1308   long *i;
1309 
1310   know ((dollar_labels != NULL) || (dollar_label_count == 0));
1311 
1312   for (i = dollar_labels; i < dollar_labels + dollar_label_count; ++i)
1313     if (*i == label)
1314       return (dollar_label_instances[i - dollar_labels]);
1315 
1316   /* If we get here, we haven't seen the label before.
1317      Therefore its instance count is zero.  */
1318   return 0;
1319 }
1320 
1321 void
dollar_label_clear(void)1322 dollar_label_clear (void)
1323 {
1324   memset (dollar_label_defines, '\0', (unsigned int) dollar_label_count);
1325 }
1326 
1327 #define DOLLAR_LABEL_BUMP_BY 10
1328 
1329 void
define_dollar_label(long label)1330 define_dollar_label (long label)
1331 {
1332   long *i;
1333 
1334   for (i = dollar_labels; i < dollar_labels + dollar_label_count; ++i)
1335     if (*i == label)
1336       {
1337 	++dollar_label_instances[i - dollar_labels];
1338 	dollar_label_defines[i - dollar_labels] = 1;
1339 	return;
1340       }
1341 
1342   /* If we get to here, we don't have label listed yet.  */
1343 
1344   if (dollar_labels == NULL)
1345     {
1346       dollar_labels = (long *) xmalloc (DOLLAR_LABEL_BUMP_BY * sizeof (long));
1347       dollar_label_instances = (long *) xmalloc (DOLLAR_LABEL_BUMP_BY * sizeof (long));
1348       dollar_label_defines = xmalloc (DOLLAR_LABEL_BUMP_BY);
1349       dollar_label_max = DOLLAR_LABEL_BUMP_BY;
1350       dollar_label_count = 0;
1351     }
1352   else if (dollar_label_count == dollar_label_max)
1353     {
1354       dollar_label_max += DOLLAR_LABEL_BUMP_BY;
1355       dollar_labels = (long *) xrealloc ((char *) dollar_labels,
1356 					 dollar_label_max * sizeof (long));
1357       dollar_label_instances = (long *) xrealloc ((char *) dollar_label_instances,
1358 					  dollar_label_max * sizeof (long));
1359       dollar_label_defines = xrealloc (dollar_label_defines, dollar_label_max);
1360     }				/* if we needed to grow  */
1361 
1362   dollar_labels[dollar_label_count] = label;
1363   dollar_label_instances[dollar_label_count] = 1;
1364   dollar_label_defines[dollar_label_count] = 1;
1365   ++dollar_label_count;
1366 }
1367 
1368 /* Caller must copy returned name: we re-use the area for the next name.
1369 
1370    The mth occurence of label n: is turned into the symbol "Ln^Am"
1371    where n is the label number and m is the instance number. "L" makes
1372    it a label discarded unless debugging and "^A"('\1') ensures no
1373    ordinary symbol SHOULD get the same name as a local label
1374    symbol. The first "4:" is "L4^A1" - the m numbers begin at 1.
1375 
1376    fb labels get the same treatment, except that ^B is used in place
1377    of ^A.  */
1378 
1379 char *				/* Return local label name.  */
dollar_label_name(register long n,register int augend)1380 dollar_label_name (register long n,	/* we just saw "n$:" : n a number.  */
1381 		   register int augend	/* 0 for current instance, 1 for new instance.  */)
1382 {
1383   long i;
1384   /* Returned to caller, then copied.  Used for created names ("4f").  */
1385   static char symbol_name_build[24];
1386   register char *p;
1387   register char *q;
1388   char symbol_name_temporary[20];	/* Build up a number, BACKWARDS.  */
1389 
1390   know (n >= 0);
1391   know (augend == 0 || augend == 1);
1392   p = symbol_name_build;
1393 #ifdef LOCAL_LABEL_PREFIX
1394   *p++ = LOCAL_LABEL_PREFIX;
1395 #endif
1396   *p++ = 'L';
1397 
1398   /* Next code just does sprintf( {}, "%d", n);  */
1399   /* Label number.  */
1400   q = symbol_name_temporary;
1401   for (*q++ = 0, i = n; i; ++q)
1402     {
1403       *q = i % 10 + '0';
1404       i /= 10;
1405     }
1406   while ((*p = *--q) != '\0')
1407     ++p;
1408 
1409   *p++ = DOLLAR_LABEL_CHAR;		/* ^A  */
1410 
1411   /* Instance number.  */
1412   q = symbol_name_temporary;
1413   for (*q++ = 0, i = dollar_label_instance (n) + augend; i; ++q)
1414     {
1415       *q = i % 10 + '0';
1416       i /= 10;
1417     }
1418   while ((*p++ = *--q) != '\0');;
1419 
1420   /* The label, as a '\0' ended string, starts at symbol_name_build.  */
1421   return symbol_name_build;
1422 }
1423 
1424 /* Somebody else's idea of local labels. They are made by "n:" where n
1425    is any decimal digit. Refer to them with
1426     "nb" for previous (backward) n:
1427    or "nf" for next (forward) n:.
1428 
1429    We do a little better and let n be any number, not just a single digit, but
1430    since the other guy's assembler only does ten, we treat the first ten
1431    specially.
1432 
1433    Like someone else's assembler, we have one set of local label counters for
1434    entire assembly, not one set per (sub)segment like in most assemblers. This
1435    implies that one can refer to a label in another segment, and indeed some
1436    crufty compilers have done just that.
1437 
1438    Since there could be a LOT of these things, treat them as a sparse
1439    array.  */
1440 
1441 #define FB_LABEL_SPECIAL (10)
1442 
1443 static long fb_low_counter[FB_LABEL_SPECIAL];
1444 static long *fb_labels;
1445 static long *fb_label_instances;
1446 static long fb_label_count;
1447 static long fb_label_max;
1448 
1449 /* This must be more than FB_LABEL_SPECIAL.  */
1450 #define FB_LABEL_BUMP_BY (FB_LABEL_SPECIAL + 6)
1451 
1452 static void
fb_label_init(void)1453 fb_label_init (void)
1454 {
1455   memset ((void *) fb_low_counter, '\0', sizeof (fb_low_counter));
1456 }
1457 
1458 /* Add one to the instance number of this fb label.  */
1459 
1460 void
fb_label_instance_inc(long label)1461 fb_label_instance_inc (long label)
1462 {
1463   long *i;
1464 
1465   if (label < FB_LABEL_SPECIAL)
1466     {
1467       ++fb_low_counter[label];
1468       return;
1469     }
1470 
1471   if (fb_labels != NULL)
1472     {
1473       for (i = fb_labels + FB_LABEL_SPECIAL;
1474 	   i < fb_labels + fb_label_count; ++i)
1475 	{
1476 	  if (*i == label)
1477 	    {
1478 	      ++fb_label_instances[i - fb_labels];
1479 	      return;
1480 	    }			/* if we find it  */
1481 	}			/* for each existing label  */
1482     }
1483 
1484   /* If we get to here, we don't have label listed yet.  */
1485 
1486   if (fb_labels == NULL)
1487     {
1488       fb_labels = (long *) xmalloc (FB_LABEL_BUMP_BY * sizeof (long));
1489       fb_label_instances = (long *) xmalloc (FB_LABEL_BUMP_BY * sizeof (long));
1490       fb_label_max = FB_LABEL_BUMP_BY;
1491       fb_label_count = FB_LABEL_SPECIAL;
1492 
1493     }
1494   else if (fb_label_count == fb_label_max)
1495     {
1496       fb_label_max += FB_LABEL_BUMP_BY;
1497       fb_labels = (long *) xrealloc ((char *) fb_labels,
1498 				     fb_label_max * sizeof (long));
1499       fb_label_instances = (long *) xrealloc ((char *) fb_label_instances,
1500 					      fb_label_max * sizeof (long));
1501     }				/* if we needed to grow  */
1502 
1503   fb_labels[fb_label_count] = label;
1504   fb_label_instances[fb_label_count] = 1;
1505   ++fb_label_count;
1506 }
1507 
1508 static long
fb_label_instance(long label)1509 fb_label_instance (long label)
1510 {
1511   long *i;
1512 
1513   if (label < FB_LABEL_SPECIAL)
1514     {
1515       return (fb_low_counter[label]);
1516     }
1517 
1518   if (fb_labels != NULL)
1519     {
1520       for (i = fb_labels + FB_LABEL_SPECIAL;
1521 	   i < fb_labels + fb_label_count; ++i)
1522 	{
1523 	  if (*i == label)
1524 	    {
1525 	      return (fb_label_instances[i - fb_labels]);
1526 	    }			/* if we find it  */
1527 	}			/* for each existing label  */
1528     }
1529 
1530   /* We didn't find the label, so this must be a reference to the
1531      first instance.  */
1532   return 0;
1533 }
1534 
1535 /* Caller must copy returned name: we re-use the area for the next name.
1536 
1537    The mth occurence of label n: is turned into the symbol "Ln^Bm"
1538    where n is the label number and m is the instance number. "L" makes
1539    it a label discarded unless debugging and "^B"('\2') ensures no
1540    ordinary symbol SHOULD get the same name as a local label
1541    symbol. The first "4:" is "L4^B1" - the m numbers begin at 1.
1542 
1543    dollar labels get the same treatment, except that ^A is used in
1544    place of ^B.  */
1545 
1546 char *				/* Return local label name.  */
fb_label_name(long n,long augend)1547 fb_label_name (long n,	/* We just saw "n:", "nf" or "nb" : n a number.  */
1548 	       long augend	/* 0 for nb, 1 for n:, nf.  */)
1549 {
1550   long i;
1551   /* Returned to caller, then copied.  Used for created names ("4f").  */
1552   static char symbol_name_build[24];
1553   register char *p;
1554   register char *q;
1555   char symbol_name_temporary[20];	/* Build up a number, BACKWARDS.  */
1556 
1557   know (n >= 0);
1558   know (augend == 0 || augend == 1);
1559   p = symbol_name_build;
1560 #ifdef LOCAL_LABEL_PREFIX
1561   *p++ = LOCAL_LABEL_PREFIX;
1562 #endif
1563   *p++ = 'L';
1564 
1565   /* Next code just does sprintf( {}, "%d", n);  */
1566   /* Label number.  */
1567   q = symbol_name_temporary;
1568   for (*q++ = 0, i = n; i; ++q)
1569     {
1570       *q = i % 10 + '0';
1571       i /= 10;
1572     }
1573   while ((*p = *--q) != '\0')
1574     ++p;
1575 
1576   *p++ = LOCAL_LABEL_CHAR;		/* ^B  */
1577 
1578   /* Instance number.  */
1579   q = symbol_name_temporary;
1580   for (*q++ = 0, i = fb_label_instance (n) + augend; i; ++q)
1581     {
1582       *q = i % 10 + '0';
1583       i /= 10;
1584     }
1585   while ((*p++ = *--q) != '\0');;
1586 
1587   /* The label, as a '\0' ended string, starts at symbol_name_build.  */
1588   return (symbol_name_build);
1589 }
1590 
1591 /* Decode name that may have been generated by foo_label_name() above.
1592    If the name wasn't generated by foo_label_name(), then return it
1593    unaltered.  This is used for error messages.  */
1594 
1595 char *
decode_local_label_name(char * s)1596 decode_local_label_name (char *s)
1597 {
1598   char *p;
1599   char *symbol_decode;
1600   int label_number;
1601   int instance_number;
1602   char *type;
1603   const char *message_format;
1604   int index = 0;
1605 
1606 #ifdef LOCAL_LABEL_PREFIX
1607   if (s[index] == LOCAL_LABEL_PREFIX)
1608     ++index;
1609 #endif
1610 
1611   if (s[index] != 'L')
1612     return s;
1613 
1614   for (label_number = 0, p = s + index + 1; ISDIGIT (*p); ++p)
1615     label_number = (10 * label_number) + *p - '0';
1616 
1617   if (*p == DOLLAR_LABEL_CHAR)
1618     type = "dollar";
1619   else if (*p == LOCAL_LABEL_CHAR)
1620     type = "fb";
1621   else
1622     return s;
1623 
1624   for (instance_number = 0, p++; ISDIGIT (*p); ++p)
1625     instance_number = (10 * instance_number) + *p - '0';
1626 
1627   message_format = _("\"%d\" (instance number %d of a %s label)");
1628   symbol_decode = obstack_alloc (&notes, strlen (message_format) + 30);
1629   sprintf (symbol_decode, message_format, label_number, instance_number, type);
1630 
1631   return symbol_decode;
1632 }
1633 
1634 /* Get the value of a symbol.  */
1635 
1636 valueT
S_GET_VALUE(symbolS * s)1637 S_GET_VALUE (symbolS *s)
1638 {
1639 #ifdef BFD_ASSEMBLER
1640   if (LOCAL_SYMBOL_CHECK (s))
1641     return resolve_symbol_value (s);
1642 #endif
1643 
1644   if (!s->sy_resolved)
1645     {
1646       valueT val = resolve_symbol_value (s);
1647       if (!finalize_syms)
1648 	return val;
1649     }
1650   if (s->sy_value.X_op != O_constant)
1651     {
1652       static symbolS *recur;
1653 
1654       /* FIXME: In non BFD assemblers, S_IS_DEFINED and S_IS_COMMON
1655 	 may call S_GET_VALUE.  We use a static symbol to avoid the
1656 	 immediate recursion.  */
1657       if (recur == s)
1658 	return (valueT) s->sy_value.X_add_number;
1659       recur = s;
1660       if (! s->sy_resolved
1661 	  || s->sy_value.X_op != O_symbol
1662 	  || (S_IS_DEFINED (s) && ! S_IS_COMMON (s)))
1663 	as_bad (_("attempt to get value of unresolved symbol `%s'"),
1664 		S_GET_NAME (s));
1665       recur = NULL;
1666     }
1667   return (valueT) s->sy_value.X_add_number;
1668 }
1669 
1670 /* Set the value of a symbol.  */
1671 
1672 void
S_SET_VALUE(symbolS * s,valueT val)1673 S_SET_VALUE (symbolS *s, valueT val)
1674 {
1675 #ifdef BFD_ASSEMBLER
1676   if (LOCAL_SYMBOL_CHECK (s))
1677     {
1678       ((struct local_symbol *) s)->lsy_value = val;
1679       return;
1680     }
1681 #endif
1682 
1683   s->sy_value.X_op = O_constant;
1684   s->sy_value.X_add_number = (offsetT) val;
1685   s->sy_value.X_unsigned = 0;
1686 }
1687 
1688 void
copy_symbol_attributes(symbolS * dest,symbolS * src)1689 copy_symbol_attributes (symbolS *dest, symbolS *src)
1690 {
1691   if (LOCAL_SYMBOL_CHECK (dest))
1692     dest = local_symbol_convert ((struct local_symbol *) dest);
1693   if (LOCAL_SYMBOL_CHECK (src))
1694     src = local_symbol_convert ((struct local_symbol *) src);
1695 
1696 #ifdef BFD_ASSEMBLER
1697   /* In an expression, transfer the settings of these flags.
1698      The user can override later, of course.  */
1699 #define COPIED_SYMFLAGS	(BSF_FUNCTION | BSF_OBJECT)
1700   dest->bsym->flags |= src->bsym->flags & COPIED_SYMFLAGS;
1701 #endif
1702 
1703 #ifdef OBJ_COPY_SYMBOL_ATTRIBUTES
1704   OBJ_COPY_SYMBOL_ATTRIBUTES (dest, src);
1705 #endif
1706 }
1707 
1708 #ifdef BFD_ASSEMBLER
1709 
1710 int
S_IS_FUNCTION(symbolS * s)1711 S_IS_FUNCTION (symbolS *s)
1712 {
1713   flagword flags;
1714 
1715   if (LOCAL_SYMBOL_CHECK (s))
1716     return 0;
1717 
1718   flags = s->bsym->flags;
1719 
1720   return (flags & BSF_FUNCTION) != 0;
1721 }
1722 
1723 int
S_IS_EXTERNAL(symbolS * s)1724 S_IS_EXTERNAL (symbolS *s)
1725 {
1726   flagword flags;
1727 
1728   if (LOCAL_SYMBOL_CHECK (s))
1729     return 0;
1730 
1731   flags = s->bsym->flags;
1732 
1733   /* Sanity check.  */
1734   if ((flags & BSF_LOCAL) && (flags & BSF_GLOBAL))
1735     abort ();
1736 
1737   return (flags & BSF_GLOBAL) != 0;
1738 }
1739 
1740 int
S_IS_WEAK(symbolS * s)1741 S_IS_WEAK (symbolS *s)
1742 {
1743   if (LOCAL_SYMBOL_CHECK (s))
1744     return 0;
1745   return (s->bsym->flags & BSF_WEAK) != 0;
1746 }
1747 
1748 int
S_IS_COMMON(symbolS * s)1749 S_IS_COMMON (symbolS *s)
1750 {
1751   if (LOCAL_SYMBOL_CHECK (s))
1752     return 0;
1753   return bfd_is_com_section (s->bsym->section);
1754 }
1755 
1756 int
S_IS_DEFINED(symbolS * s)1757 S_IS_DEFINED (symbolS *s)
1758 {
1759   if (LOCAL_SYMBOL_CHECK (s))
1760     return ((struct local_symbol *) s)->lsy_section != undefined_section;
1761   return s->bsym->section != undefined_section;
1762 }
1763 
1764 
1765 #ifndef EXTERN_FORCE_RELOC
1766 #define EXTERN_FORCE_RELOC IS_ELF
1767 #endif
1768 
1769 /* Return true for symbols that should not be reduced to section
1770    symbols or eliminated from expressions, because they may be
1771    overridden by the linker.  */
1772 int
S_FORCE_RELOC(symbolS * s,int strict)1773 S_FORCE_RELOC (symbolS *s, int strict)
1774 {
1775   if (LOCAL_SYMBOL_CHECK (s))
1776     return ((struct local_symbol *) s)->lsy_section == undefined_section;
1777 
1778   return ((strict
1779 	   && ((s->bsym->flags & BSF_WEAK) != 0
1780 	       || (EXTERN_FORCE_RELOC
1781 		   && (s->bsym->flags & BSF_GLOBAL) != 0)))
1782 	  || s->bsym->section == undefined_section
1783 	  || bfd_is_com_section (s->bsym->section));
1784 }
1785 
1786 int
S_IS_DEBUG(symbolS * s)1787 S_IS_DEBUG (symbolS *s)
1788 {
1789   if (LOCAL_SYMBOL_CHECK (s))
1790     return 0;
1791   if (s->bsym->flags & BSF_DEBUGGING)
1792     return 1;
1793   return 0;
1794 }
1795 
1796 int
S_IS_LOCAL(symbolS * s)1797 S_IS_LOCAL (symbolS *s)
1798 {
1799   flagword flags;
1800   const char *name;
1801 
1802   if (LOCAL_SYMBOL_CHECK (s))
1803     return 1;
1804 
1805   flags = s->bsym->flags;
1806 
1807   /* Sanity check.  */
1808   if ((flags & BSF_LOCAL) && (flags & BSF_GLOBAL))
1809     abort ();
1810 
1811   if (bfd_get_section (s->bsym) == reg_section)
1812     return 1;
1813 
1814   if (flag_strip_local_absolute
1815       && (flags & BSF_GLOBAL) == 0
1816       && bfd_get_section (s->bsym) == absolute_section)
1817     return 1;
1818 
1819   name = S_GET_NAME (s);
1820   return (name != NULL
1821 	  && ! S_IS_DEBUG (s)
1822 	  && (strchr (name, DOLLAR_LABEL_CHAR)
1823 	      || strchr (name, LOCAL_LABEL_CHAR)
1824 	      || (! flag_keep_locals
1825 		  && (bfd_is_local_label (stdoutput, s->bsym)
1826 		      || (flag_mri
1827 			  && name[0] == '?'
1828 			  && name[1] == '?')))));
1829 }
1830 
1831 int
S_IS_EXTERN(symbolS * s)1832 S_IS_EXTERN (symbolS *s)
1833 {
1834   return S_IS_EXTERNAL (s);
1835 }
1836 
1837 int
S_IS_STABD(symbolS * s)1838 S_IS_STABD (symbolS *s)
1839 {
1840   return S_GET_NAME (s) == 0;
1841 }
1842 
1843 const char *
S_GET_NAME(symbolS * s)1844 S_GET_NAME (symbolS *s)
1845 {
1846   if (LOCAL_SYMBOL_CHECK (s))
1847     return ((struct local_symbol *) s)->lsy_name;
1848   return s->bsym->name;
1849 }
1850 
1851 segT
S_GET_SEGMENT(symbolS * s)1852 S_GET_SEGMENT (symbolS *s)
1853 {
1854   if (LOCAL_SYMBOL_CHECK (s))
1855     return ((struct local_symbol *) s)->lsy_section;
1856   return s->bsym->section;
1857 }
1858 
1859 void
S_SET_SEGMENT(symbolS * s,segT seg)1860 S_SET_SEGMENT (symbolS *s, segT seg)
1861 {
1862   /* Don't reassign section symbols.  The direct reason is to prevent seg
1863      faults assigning back to const global symbols such as *ABS*, but it
1864      shouldn't happen anyway.  */
1865 
1866   if (LOCAL_SYMBOL_CHECK (s))
1867     {
1868       if (seg == reg_section)
1869 	s = local_symbol_convert ((struct local_symbol *) s);
1870       else
1871 	{
1872 	  ((struct local_symbol *) s)->lsy_section = seg;
1873 	  return;
1874 	}
1875     }
1876 
1877   if (s->bsym->flags & BSF_SECTION_SYM)
1878     {
1879       if (s->bsym->section != seg)
1880 	abort ();
1881     }
1882   else
1883     s->bsym->section = seg;
1884 }
1885 
1886 void
S_SET_EXTERNAL(symbolS * s)1887 S_SET_EXTERNAL (symbolS *s)
1888 {
1889   if (LOCAL_SYMBOL_CHECK (s))
1890     s = local_symbol_convert ((struct local_symbol *) s);
1891   if ((s->bsym->flags & BSF_WEAK) != 0)
1892     {
1893       /* Let .weak override .global.  */
1894       return;
1895     }
1896   if (s->bsym->flags & BSF_SECTION_SYM)
1897     {
1898       char * file;
1899       unsigned int line;
1900 
1901       /* Do not reassign section symbols.  */
1902       as_where (& file, & line);
1903       as_warn_where (file, line,
1904 		     _("section symbols are already global"));
1905       return;
1906     }
1907   s->bsym->flags |= BSF_GLOBAL;
1908   s->bsym->flags &= ~(BSF_LOCAL | BSF_WEAK);
1909 }
1910 
1911 void
S_CLEAR_EXTERNAL(symbolS * s)1912 S_CLEAR_EXTERNAL (symbolS *s)
1913 {
1914   if (LOCAL_SYMBOL_CHECK (s))
1915     return;
1916   if ((s->bsym->flags & BSF_WEAK) != 0)
1917     {
1918       /* Let .weak override.  */
1919       return;
1920     }
1921   s->bsym->flags |= BSF_LOCAL;
1922   s->bsym->flags &= ~(BSF_GLOBAL | BSF_WEAK);
1923 }
1924 
1925 void
S_SET_WEAK(symbolS * s)1926 S_SET_WEAK (symbolS *s)
1927 {
1928   if (LOCAL_SYMBOL_CHECK (s))
1929     s = local_symbol_convert ((struct local_symbol *) s);
1930   s->bsym->flags |= BSF_WEAK;
1931   s->bsym->flags &= ~(BSF_GLOBAL | BSF_LOCAL);
1932 }
1933 
1934 void
S_SET_THREAD_LOCAL(symbolS * s)1935 S_SET_THREAD_LOCAL (symbolS *s)
1936 {
1937   if (LOCAL_SYMBOL_CHECK (s))
1938     s = local_symbol_convert ((struct local_symbol *) s);
1939   if (bfd_is_com_section (s->bsym->section)
1940       && (s->bsym->flags & BSF_THREAD_LOCAL) != 0)
1941     return;
1942   s->bsym->flags |= BSF_THREAD_LOCAL;
1943   if ((s->bsym->flags & BSF_FUNCTION) != 0)
1944     as_bad (_("Accessing function `%s' as thread-local object"),
1945 	    S_GET_NAME (s));
1946   else if (! bfd_is_und_section (s->bsym->section)
1947 	   && (s->bsym->section->flags & SEC_THREAD_LOCAL) == 0)
1948     as_bad (_("Accessing `%s' as thread-local object"),
1949 	    S_GET_NAME (s));
1950 }
1951 
1952 void
S_SET_NAME(symbolS * s,char * name)1953 S_SET_NAME (symbolS *s, char *name)
1954 {
1955   if (LOCAL_SYMBOL_CHECK (s))
1956     {
1957       ((struct local_symbol *) s)->lsy_name = name;
1958       return;
1959     }
1960   s->bsym->name = name;
1961 }
1962 #endif /* BFD_ASSEMBLER */
1963 
1964 #ifdef SYMBOLS_NEED_BACKPOINTERS
1965 
1966 /* Return the previous symbol in a chain.  */
1967 
1968 symbolS *
symbol_previous(symbolS * s)1969 symbol_previous (symbolS *s)
1970 {
1971   if (LOCAL_SYMBOL_CHECK (s))
1972     abort ();
1973   return s->sy_previous;
1974 }
1975 
1976 #endif /* SYMBOLS_NEED_BACKPOINTERS */
1977 
1978 /* Return the next symbol in a chain.  */
1979 
1980 symbolS *
symbol_next(symbolS * s)1981 symbol_next (symbolS *s)
1982 {
1983   if (LOCAL_SYMBOL_CHECK (s))
1984     abort ();
1985   return s->sy_next;
1986 }
1987 
1988 /* Return a pointer to the value of a symbol as an expression.  */
1989 
1990 expressionS *
symbol_get_value_expression(symbolS * s)1991 symbol_get_value_expression (symbolS *s)
1992 {
1993   if (LOCAL_SYMBOL_CHECK (s))
1994     s = local_symbol_convert ((struct local_symbol *) s);
1995   return &s->sy_value;
1996 }
1997 
1998 /* Set the value of a symbol to an expression.  */
1999 
2000 void
symbol_set_value_expression(symbolS * s,const expressionS * exp)2001 symbol_set_value_expression (symbolS *s, const expressionS *exp)
2002 {
2003   if (LOCAL_SYMBOL_CHECK (s))
2004     s = local_symbol_convert ((struct local_symbol *) s);
2005   s->sy_value = *exp;
2006 }
2007 
2008 /* Set the value of SYM to the current position in the current segment.  */
2009 
2010 void
symbol_set_value_now(symbolS * sym)2011 symbol_set_value_now (symbolS *sym)
2012 {
2013   S_SET_SEGMENT (sym, now_seg);
2014   S_SET_VALUE (sym, frag_now_fix ());
2015   symbol_set_frag (sym, frag_now);
2016 }
2017 
2018 /* Set the frag of a symbol.  */
2019 
2020 void
symbol_set_frag(symbolS * s,fragS * f)2021 symbol_set_frag (symbolS *s, fragS *f)
2022 {
2023 #ifdef BFD_ASSEMBLER
2024   if (LOCAL_SYMBOL_CHECK (s))
2025     {
2026       local_symbol_set_frag ((struct local_symbol *) s, f);
2027       return;
2028     }
2029 #endif
2030   s->sy_frag = f;
2031 }
2032 
2033 /* Return the frag of a symbol.  */
2034 
2035 fragS *
symbol_get_frag(symbolS * s)2036 symbol_get_frag (symbolS *s)
2037 {
2038 #ifdef BFD_ASSEMBLER
2039   if (LOCAL_SYMBOL_CHECK (s))
2040     return local_symbol_get_frag ((struct local_symbol *) s);
2041 #endif
2042   return s->sy_frag;
2043 }
2044 
2045 /* Mark a symbol as having been used.  */
2046 
2047 void
symbol_mark_used(symbolS * s)2048 symbol_mark_used (symbolS *s)
2049 {
2050   if (LOCAL_SYMBOL_CHECK (s))
2051     return;
2052   s->sy_used = 1;
2053 }
2054 
2055 /* Clear the mark of whether a symbol has been used.  */
2056 
2057 void
symbol_clear_used(symbolS * s)2058 symbol_clear_used (symbolS *s)
2059 {
2060   if (LOCAL_SYMBOL_CHECK (s))
2061     s = local_symbol_convert ((struct local_symbol *) s);
2062   s->sy_used = 0;
2063 }
2064 
2065 /* Return whether a symbol has been used.  */
2066 
2067 int
symbol_used_p(symbolS * s)2068 symbol_used_p (symbolS *s)
2069 {
2070   if (LOCAL_SYMBOL_CHECK (s))
2071     return 1;
2072   return s->sy_used;
2073 }
2074 
2075 /* Mark a symbol as having been used in a reloc.  */
2076 
2077 void
symbol_mark_used_in_reloc(symbolS * s)2078 symbol_mark_used_in_reloc (symbolS *s)
2079 {
2080   if (LOCAL_SYMBOL_CHECK (s))
2081     s = local_symbol_convert ((struct local_symbol *) s);
2082   s->sy_used_in_reloc = 1;
2083 }
2084 
2085 /* Clear the mark of whether a symbol has been used in a reloc.  */
2086 
2087 void
symbol_clear_used_in_reloc(symbolS * s)2088 symbol_clear_used_in_reloc (symbolS *s)
2089 {
2090   if (LOCAL_SYMBOL_CHECK (s))
2091     return;
2092   s->sy_used_in_reloc = 0;
2093 }
2094 
2095 /* Return whether a symbol has been used in a reloc.  */
2096 
2097 int
symbol_used_in_reloc_p(symbolS * s)2098 symbol_used_in_reloc_p (symbolS *s)
2099 {
2100   if (LOCAL_SYMBOL_CHECK (s))
2101     return 0;
2102   return s->sy_used_in_reloc;
2103 }
2104 
2105 /* Mark a symbol as an MRI common symbol.  */
2106 
2107 void
symbol_mark_mri_common(symbolS * s)2108 symbol_mark_mri_common (symbolS *s)
2109 {
2110   if (LOCAL_SYMBOL_CHECK (s))
2111     s = local_symbol_convert ((struct local_symbol *) s);
2112   s->sy_mri_common = 1;
2113 }
2114 
2115 /* Clear the mark of whether a symbol is an MRI common symbol.  */
2116 
2117 void
symbol_clear_mri_common(symbolS * s)2118 symbol_clear_mri_common (symbolS *s)
2119 {
2120   if (LOCAL_SYMBOL_CHECK (s))
2121     return;
2122   s->sy_mri_common = 0;
2123 }
2124 
2125 /* Return whether a symbol is an MRI common symbol.  */
2126 
2127 int
symbol_mri_common_p(symbolS * s)2128 symbol_mri_common_p (symbolS *s)
2129 {
2130   if (LOCAL_SYMBOL_CHECK (s))
2131     return 0;
2132   return s->sy_mri_common;
2133 }
2134 
2135 /* Mark a symbol as having been written.  */
2136 
2137 void
symbol_mark_written(symbolS * s)2138 symbol_mark_written (symbolS *s)
2139 {
2140   if (LOCAL_SYMBOL_CHECK (s))
2141     return;
2142   s->written = 1;
2143 }
2144 
2145 /* Clear the mark of whether a symbol has been written.  */
2146 
2147 void
symbol_clear_written(symbolS * s)2148 symbol_clear_written (symbolS *s)
2149 {
2150   if (LOCAL_SYMBOL_CHECK (s))
2151     return;
2152   s->written = 0;
2153 }
2154 
2155 /* Return whether a symbol has been written.  */
2156 
2157 int
symbol_written_p(symbolS * s)2158 symbol_written_p (symbolS *s)
2159 {
2160   if (LOCAL_SYMBOL_CHECK (s))
2161     return 0;
2162   return s->written;
2163 }
2164 
2165 /* Mark a symbol has having been resolved.  */
2166 
2167 void
symbol_mark_resolved(symbolS * s)2168 symbol_mark_resolved (symbolS *s)
2169 {
2170 #ifdef BFD_ASSEMBLER
2171   if (LOCAL_SYMBOL_CHECK (s))
2172     {
2173       local_symbol_mark_resolved ((struct local_symbol *) s);
2174       return;
2175     }
2176 #endif
2177   s->sy_resolved = 1;
2178 }
2179 
2180 /* Return whether a symbol has been resolved.  */
2181 
2182 int
symbol_resolved_p(symbolS * s)2183 symbol_resolved_p (symbolS *s)
2184 {
2185 #ifdef BFD_ASSEMBLER
2186   if (LOCAL_SYMBOL_CHECK (s))
2187     return local_symbol_resolved_p ((struct local_symbol *) s);
2188 #endif
2189   return s->sy_resolved;
2190 }
2191 
2192 /* Return whether a symbol is a section symbol.  */
2193 
2194 int
symbol_section_p(symbolS * s ATTRIBUTE_UNUSED)2195 symbol_section_p (symbolS *s ATTRIBUTE_UNUSED)
2196 {
2197   if (LOCAL_SYMBOL_CHECK (s))
2198     return 0;
2199 #ifdef BFD_ASSEMBLER
2200   return (s->bsym->flags & BSF_SECTION_SYM) != 0;
2201 #else
2202   /* FIXME.  */
2203   return 0;
2204 #endif
2205 }
2206 
2207 /* Return whether a symbol is equated to another symbol.  */
2208 
2209 int
symbol_equated_p(symbolS * s)2210 symbol_equated_p (symbolS *s)
2211 {
2212   if (LOCAL_SYMBOL_CHECK (s))
2213     return 0;
2214   return s->sy_value.X_op == O_symbol;
2215 }
2216 
2217 /* Return whether a symbol is equated to another symbol, and should be
2218    treated specially when writing out relocs.  */
2219 
2220 int
symbol_equated_reloc_p(symbolS * s)2221 symbol_equated_reloc_p (symbolS *s)
2222 {
2223   if (LOCAL_SYMBOL_CHECK (s))
2224     return 0;
2225   /* X_op_symbol, normally not used for O_symbol, is set by
2226      resolve_symbol_value to flag expression syms that have been
2227      equated.  */
2228   return (s->sy_value.X_op == O_symbol
2229 	  && ((s->sy_resolved && s->sy_value.X_op_symbol != NULL)
2230 	      || ! S_IS_DEFINED (s)
2231 	      || S_IS_COMMON (s)));
2232 }
2233 
2234 /* Return whether a symbol has a constant value.  */
2235 
2236 int
symbol_constant_p(symbolS * s)2237 symbol_constant_p (symbolS *s)
2238 {
2239   if (LOCAL_SYMBOL_CHECK (s))
2240     return 1;
2241   return s->sy_value.X_op == O_constant;
2242 }
2243 
2244 #ifdef BFD_ASSEMBLER
2245 
2246 /* Return the BFD symbol for a symbol.  */
2247 
2248 asymbol *
symbol_get_bfdsym(symbolS * s)2249 symbol_get_bfdsym (symbolS *s)
2250 {
2251   if (LOCAL_SYMBOL_CHECK (s))
2252     s = local_symbol_convert ((struct local_symbol *) s);
2253   return s->bsym;
2254 }
2255 
2256 /* Set the BFD symbol for a symbol.  */
2257 
2258 void
symbol_set_bfdsym(symbolS * s,asymbol * bsym)2259 symbol_set_bfdsym (symbolS *s, asymbol *bsym)
2260 {
2261   if (LOCAL_SYMBOL_CHECK (s))
2262     s = local_symbol_convert ((struct local_symbol *) s);
2263   s->bsym = bsym;
2264 }
2265 
2266 #endif /* BFD_ASSEMBLER */
2267 
2268 #ifdef OBJ_SYMFIELD_TYPE
2269 
2270 /* Get a pointer to the object format information for a symbol.  */
2271 
2272 OBJ_SYMFIELD_TYPE *
symbol_get_obj(symbolS * s)2273 symbol_get_obj (symbolS *s)
2274 {
2275   if (LOCAL_SYMBOL_CHECK (s))
2276     s = local_symbol_convert ((struct local_symbol *) s);
2277   return &s->sy_obj;
2278 }
2279 
2280 /* Set the object format information for a symbol.  */
2281 
2282 void
symbol_set_obj(symbolS * s,OBJ_SYMFIELD_TYPE * o)2283 symbol_set_obj (symbolS *s, OBJ_SYMFIELD_TYPE *o)
2284 {
2285   if (LOCAL_SYMBOL_CHECK (s))
2286     s = local_symbol_convert ((struct local_symbol *) s);
2287   s->sy_obj = *o;
2288 }
2289 
2290 #endif /* OBJ_SYMFIELD_TYPE */
2291 
2292 #ifdef TC_SYMFIELD_TYPE
2293 
2294 /* Get a pointer to the processor information for a symbol.  */
2295 
2296 TC_SYMFIELD_TYPE *
symbol_get_tc(symbolS * s)2297 symbol_get_tc (symbolS *s)
2298 {
2299   if (LOCAL_SYMBOL_CHECK (s))
2300     s = local_symbol_convert ((struct local_symbol *) s);
2301   return &s->sy_tc;
2302 }
2303 
2304 /* Set the processor information for a symbol.  */
2305 
2306 void
symbol_set_tc(symbolS * s,TC_SYMFIELD_TYPE * o)2307 symbol_set_tc (symbolS *s, TC_SYMFIELD_TYPE *o)
2308 {
2309   if (LOCAL_SYMBOL_CHECK (s))
2310     s = local_symbol_convert ((struct local_symbol *) s);
2311   s->sy_tc = *o;
2312 }
2313 
2314 #endif /* TC_SYMFIELD_TYPE */
2315 
2316 void
symbol_begin(void)2317 symbol_begin (void)
2318 {
2319   symbol_lastP = NULL;
2320   symbol_rootP = NULL;		/* In case we have 0 symbols (!!)  */
2321   sy_hash = hash_new ();
2322 #ifdef BFD_ASSEMBLER
2323   local_hash = hash_new ();
2324 #endif
2325 
2326   memset ((char *) (&abs_symbol), '\0', sizeof (abs_symbol));
2327 #ifdef BFD_ASSEMBLER
2328 #if defined (EMIT_SECTION_SYMBOLS) || !defined (RELOC_REQUIRES_SYMBOL)
2329   abs_symbol.bsym = bfd_abs_section.symbol;
2330 #endif
2331 #else
2332   /* Can't initialise a union. Sigh.  */
2333   S_SET_SEGMENT (&abs_symbol, absolute_section);
2334 #endif
2335   abs_symbol.sy_value.X_op = O_constant;
2336   abs_symbol.sy_frag = &zero_address_frag;
2337 
2338   if (LOCAL_LABELS_FB)
2339     fb_label_init ();
2340 }
2341 
2342 int indent_level;
2343 
2344 /* Maximum indent level.
2345    Available for modification inside a gdb session.  */
2346 int max_indent_level = 8;
2347 
2348 #if 0
2349 
2350 static void
2351 indent (void)
2352 {
2353   printf ("%*s", indent_level * 4, "");
2354 }
2355 
2356 #endif
2357 
2358 void
print_symbol_value_1(FILE * file,symbolS * sym)2359 print_symbol_value_1 (FILE *file, symbolS *sym)
2360 {
2361   const char *name = S_GET_NAME (sym);
2362   if (!name || !name[0])
2363     name = "(unnamed)";
2364   fprintf (file, "sym %lx %s", (unsigned long) sym, name);
2365 
2366   if (LOCAL_SYMBOL_CHECK (sym))
2367     {
2368 #ifdef BFD_ASSEMBLER
2369       struct local_symbol *locsym = (struct local_symbol *) sym;
2370       if (local_symbol_get_frag (locsym) != &zero_address_frag
2371 	  && local_symbol_get_frag (locsym) != NULL)
2372 	fprintf (file, " frag %lx", (long) local_symbol_get_frag (locsym));
2373       if (local_symbol_resolved_p (locsym))
2374 	fprintf (file, " resolved");
2375       fprintf (file, " local");
2376 #endif
2377     }
2378   else
2379     {
2380       if (sym->sy_frag != &zero_address_frag)
2381 	fprintf (file, " frag %lx", (long) sym->sy_frag);
2382       if (sym->written)
2383 	fprintf (file, " written");
2384       if (sym->sy_resolved)
2385 	fprintf (file, " resolved");
2386       else if (sym->sy_resolving)
2387 	fprintf (file, " resolving");
2388       if (sym->sy_used_in_reloc)
2389 	fprintf (file, " used-in-reloc");
2390       if (sym->sy_used)
2391 	fprintf (file, " used");
2392       if (S_IS_LOCAL (sym))
2393 	fprintf (file, " local");
2394       if (S_IS_EXTERN (sym))
2395 	fprintf (file, " extern");
2396       if (S_IS_DEBUG (sym))
2397 	fprintf (file, " debug");
2398       if (S_IS_DEFINED (sym))
2399 	fprintf (file, " defined");
2400     }
2401   fprintf (file, " %s", segment_name (S_GET_SEGMENT (sym)));
2402   if (symbol_resolved_p (sym))
2403     {
2404       segT s = S_GET_SEGMENT (sym);
2405 
2406       if (s != undefined_section
2407 	  && s != expr_section)
2408 	fprintf (file, " %lx", (long) S_GET_VALUE (sym));
2409     }
2410   else if (indent_level < max_indent_level
2411 	   && S_GET_SEGMENT (sym) != undefined_section)
2412     {
2413       indent_level++;
2414       fprintf (file, "\n%*s<", indent_level * 4, "");
2415 #ifdef BFD_ASSEMBLER
2416       if (LOCAL_SYMBOL_CHECK (sym))
2417 	fprintf (file, "constant %lx",
2418 		 (long) ((struct local_symbol *) sym)->lsy_value);
2419       else
2420 #endif
2421 	print_expr_1 (file, &sym->sy_value);
2422       fprintf (file, ">");
2423       indent_level--;
2424     }
2425   fflush (file);
2426 }
2427 
2428 void
print_symbol_value(symbolS * sym)2429 print_symbol_value (symbolS *sym)
2430 {
2431   indent_level = 0;
2432   print_symbol_value_1 (stderr, sym);
2433   fprintf (stderr, "\n");
2434 }
2435 
2436 static void
print_binary(FILE * file,const char * name,expressionS * exp)2437 print_binary (FILE *file, const char *name, expressionS *exp)
2438 {
2439   indent_level++;
2440   fprintf (file, "%s\n%*s<", name, indent_level * 4, "");
2441   print_symbol_value_1 (file, exp->X_add_symbol);
2442   fprintf (file, ">\n%*s<", indent_level * 4, "");
2443   print_symbol_value_1 (file, exp->X_op_symbol);
2444   fprintf (file, ">");
2445   indent_level--;
2446 }
2447 
2448 void
print_expr_1(FILE * file,expressionS * exp)2449 print_expr_1 (FILE *file, expressionS *exp)
2450 {
2451   fprintf (file, "expr %lx ", (long) exp);
2452   switch (exp->X_op)
2453     {
2454     case O_illegal:
2455       fprintf (file, "illegal");
2456       break;
2457     case O_absent:
2458       fprintf (file, "absent");
2459       break;
2460     case O_constant:
2461       fprintf (file, "constant %lx", (long) exp->X_add_number);
2462       break;
2463     case O_symbol:
2464       indent_level++;
2465       fprintf (file, "symbol\n%*s<", indent_level * 4, "");
2466       print_symbol_value_1 (file, exp->X_add_symbol);
2467       fprintf (file, ">");
2468     maybe_print_addnum:
2469       if (exp->X_add_number)
2470 	fprintf (file, "\n%*s%lx", indent_level * 4, "",
2471 		 (long) exp->X_add_number);
2472       indent_level--;
2473       break;
2474     case O_register:
2475       fprintf (file, "register #%d", (int) exp->X_add_number);
2476       break;
2477     case O_big:
2478       fprintf (file, "big");
2479       break;
2480     case O_uminus:
2481       fprintf (file, "uminus -<");
2482       indent_level++;
2483       print_symbol_value_1 (file, exp->X_add_symbol);
2484       fprintf (file, ">");
2485       goto maybe_print_addnum;
2486     case O_bit_not:
2487       fprintf (file, "bit_not");
2488       break;
2489     case O_multiply:
2490       print_binary (file, "multiply", exp);
2491       break;
2492     case O_divide:
2493       print_binary (file, "divide", exp);
2494       break;
2495     case O_modulus:
2496       print_binary (file, "modulus", exp);
2497       break;
2498     case O_left_shift:
2499       print_binary (file, "lshift", exp);
2500       break;
2501     case O_right_shift:
2502       print_binary (file, "rshift", exp);
2503       break;
2504     case O_bit_inclusive_or:
2505       print_binary (file, "bit_ior", exp);
2506       break;
2507     case O_bit_exclusive_or:
2508       print_binary (file, "bit_xor", exp);
2509       break;
2510     case O_bit_and:
2511       print_binary (file, "bit_and", exp);
2512       break;
2513     case O_eq:
2514       print_binary (file, "eq", exp);
2515       break;
2516     case O_ne:
2517       print_binary (file, "ne", exp);
2518       break;
2519     case O_lt:
2520       print_binary (file, "lt", exp);
2521       break;
2522     case O_le:
2523       print_binary (file, "le", exp);
2524       break;
2525     case O_ge:
2526       print_binary (file, "ge", exp);
2527       break;
2528     case O_gt:
2529       print_binary (file, "gt", exp);
2530       break;
2531     case O_logical_and:
2532       print_binary (file, "logical_and", exp);
2533       break;
2534     case O_logical_or:
2535       print_binary (file, "logical_or", exp);
2536       break;
2537     case O_add:
2538       indent_level++;
2539       fprintf (file, "add\n%*s<", indent_level * 4, "");
2540       print_symbol_value_1 (file, exp->X_add_symbol);
2541       fprintf (file, ">\n%*s<", indent_level * 4, "");
2542       print_symbol_value_1 (file, exp->X_op_symbol);
2543       fprintf (file, ">");
2544       goto maybe_print_addnum;
2545     case O_subtract:
2546       indent_level++;
2547       fprintf (file, "subtract\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;
2553     default:
2554       fprintf (file, "{unknown opcode %d}", (int) exp->X_op);
2555       break;
2556     }
2557   fflush (stdout);
2558 }
2559 
2560 void
print_expr(expressionS * exp)2561 print_expr (expressionS *exp)
2562 {
2563   print_expr_1 (stderr, exp);
2564   fprintf (stderr, "\n");
2565 }
2566 
2567 void
symbol_print_statistics(FILE * file)2568 symbol_print_statistics (FILE *file)
2569 {
2570   hash_print_statistics (file, "symbol table", sy_hash);
2571 #ifdef BFD_ASSEMBLER
2572   hash_print_statistics (file, "mini local symbol table", local_hash);
2573   fprintf (file, "%lu mini local symbols created, %lu converted\n",
2574 	   local_symbol_count, local_symbol_conversion_count);
2575 #endif
2576 }
2577