1 /* symbols.c -symbol table-
2    Copyright (C) 1987-2014 Free Software Foundation, Inc.
3 
4    This file is part of GAS, the GNU Assembler.
5 
6    GAS is free software; you can redistribute it and/or modify
7    it under the terms of the GNU General Public License as published by
8    the Free Software Foundation; either version 3, or (at your option)
9    any later version.
10 
11    GAS is distributed in the hope that it will be useful,
12    but WITHOUT ANY WARRANTY; without even the implied warranty of
13    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14    GNU General Public License for more details.
15 
16    You should have received a copy of the GNU General Public License
17    along with GAS; see the file COPYING.  If not, write to the Free
18    Software Foundation, 51 Franklin Street - Fifth Floor, Boston, MA
19    02110-1301, USA.  */
20 
21 /* #define DEBUG_SYMS / * to debug symbol list maintenance.  */
22 
23 #include "as.h"
24 #include "safe-ctype.h"
25 #include "obstack.h"		/* For "symbols.h" */
26 #include "subsegs.h"
27 #include "struc-symbol.h"
28 
29 /* This is non-zero if symbols are case sensitive, which is the
30    default.  */
31 int symbols_case_sensitive = 1;
32 
33 #ifndef WORKING_DOT_WORD
34 extern int new_broken_words;
35 #endif
36 
37 /* symbol-name => struct symbol pointer */
38 static struct hash_control *sy_hash;
39 
40 /* Table of local symbols.  */
41 static struct hash_control *local_hash;
42 
43 /* Below are commented in "symbols.h".  */
44 symbolS *symbol_rootP;
45 symbolS *symbol_lastP;
46 symbolS abs_symbol;
47 symbolS dot_symbol;
48 
49 #ifdef DEBUG_SYMS
50 #define debug_verify_symchain verify_symbol_chain
51 #else
52 #define debug_verify_symchain(root, last) ((void) 0)
53 #endif
54 
55 #define DOLLAR_LABEL_CHAR	'\001'
56 #define LOCAL_LABEL_CHAR	'\002'
57 
58 #ifndef TC_LABEL_IS_LOCAL
59 #define TC_LABEL_IS_LOCAL(name)	0
60 #endif
61 
62 struct obstack notes;
63 #ifdef TE_PE
64 /* The name of an external symbol which is
65    used to make weak PE symbol names unique.  */
66 const char * an_external_name;
67 #endif
68 
69 static char *save_symbol_name (const char *);
70 static void fb_label_init (void);
71 static long dollar_label_instance (long);
72 static long fb_label_instance (long);
73 
74 static void print_binary (FILE *, const char *, expressionS *);
75 
76 /* Return a pointer to a new symbol.  Die if we can't make a new
77    symbol.  Fill in the symbol's values.  Add symbol to end of symbol
78    chain.
79 
80    This function should be called in the general case of creating a
81    symbol.  However, if the output file symbol table has already been
82    set, and you are certain that this symbol won't be wanted in the
83    output file, you can call symbol_create.  */
84 
85 symbolS *
symbol_new(const char * name,segT segment,valueT valu,fragS * frag)86 symbol_new (const char *name, segT segment, valueT valu, fragS *frag)
87 {
88   symbolS *symbolP = symbol_create (name, segment, valu, frag);
89 
90   /* Link to end of symbol chain.  */
91   {
92     extern int symbol_table_frozen;
93     if (symbol_table_frozen)
94       abort ();
95   }
96   symbol_append (symbolP, symbol_lastP, &symbol_rootP, &symbol_lastP);
97 
98   return symbolP;
99 }
100 
101 /* Save a symbol name on a permanent obstack, and convert it according
102    to the object file format.  */
103 
104 static char *
save_symbol_name(const char * name)105 save_symbol_name (const char *name)
106 {
107   size_t name_length;
108   char *ret;
109 
110   name_length = strlen (name) + 1;	/* +1 for \0.  */
111   obstack_grow (&notes, name, name_length);
112   ret = (char *) obstack_finish (&notes);
113 
114 #ifdef tc_canonicalize_symbol_name
115   ret = tc_canonicalize_symbol_name (ret);
116 #endif
117 
118   if (! symbols_case_sensitive)
119     {
120       char *s;
121 
122       for (s = ret; *s != '\0'; s++)
123 	*s = TOUPPER (*s);
124     }
125 
126   return ret;
127 }
128 
129 symbolS *
symbol_create(const char * name,segT segment,valueT valu,fragS * frag)130 symbol_create (const char *name, /* It is copied, the caller can destroy/modify.  */
131 	       segT segment,	/* Segment identifier (SEG_<something>).  */
132 	       valueT valu,	/* Symbol value.  */
133 	       fragS *frag	/* Associated fragment.  */)
134 {
135   char *preserved_copy_of_name;
136   symbolS *symbolP;
137 
138   preserved_copy_of_name = save_symbol_name (name);
139 
140   symbolP = (symbolS *) obstack_alloc (&notes, sizeof (symbolS));
141 
142   /* symbol must be born in some fixed state.  This seems as good as any.  */
143   memset (symbolP, 0, sizeof (symbolS));
144 
145   symbolP->bsym = bfd_make_empty_symbol (stdoutput);
146   if (symbolP->bsym == NULL)
147     as_fatal ("bfd_make_empty_symbol: %s", bfd_errmsg (bfd_get_error ()));
148   S_SET_NAME (symbolP, preserved_copy_of_name);
149 
150   S_SET_SEGMENT (symbolP, segment);
151   S_SET_VALUE (symbolP, valu);
152   symbol_clear_list_pointers (symbolP);
153 
154   symbolP->sy_frag = frag;
155 
156   obj_symbol_new_hook (symbolP);
157 
158 #ifdef tc_symbol_new_hook
159   tc_symbol_new_hook (symbolP);
160 #endif
161 
162   return symbolP;
163 }
164 
165 
166 /* Local symbol support.  If we can get away with it, we keep only a
167    small amount of information for local symbols.  */
168 
169 static symbolS *local_symbol_convert (struct local_symbol *);
170 
171 /* Used for statistics.  */
172 
173 static unsigned long local_symbol_count;
174 static unsigned long local_symbol_conversion_count;
175 
176 /* This macro is called with a symbol argument passed by reference.
177    It returns whether this is a local symbol.  If necessary, it
178    changes its argument to the real symbol.  */
179 
180 #define LOCAL_SYMBOL_CHECK(s)						\
181   (s->sy_flags.sy_local_symbol 						\
182    ? (local_symbol_converted_p ((struct local_symbol *) s)		\
183       ? (s = local_symbol_get_real_symbol ((struct local_symbol *) s),	\
184 	 0)								\
185       : 1)								\
186    : 0)
187 
188 /* Create a local symbol and insert it into the local hash table.  */
189 
190 struct local_symbol *
local_symbol_make(const char * name,segT section,valueT val,fragS * frag)191 local_symbol_make (const char *name, segT section, valueT val, fragS *frag)
192 {
193   char *name_copy;
194   struct local_symbol *ret;
195 
196   ++local_symbol_count;
197 
198   name_copy = save_symbol_name (name);
199 
200   ret = (struct local_symbol *) obstack_alloc (&notes, sizeof *ret);
201   ret->lsy_flags.sy_local_symbol = 1;
202   ret->lsy_flags.sy_resolved = 0;
203   ret->lsy_name = name_copy;
204   ret->lsy_section = section;
205   local_symbol_set_frag (ret, frag);
206   ret->lsy_value = val;
207 
208   hash_jam (local_hash, name_copy, (void *) ret);
209 
210   return ret;
211 }
212 
213 /* Convert a local symbol into a real symbol.  Note that we do not
214    reclaim the space used by the local symbol.  */
215 
216 static symbolS *
local_symbol_convert(struct local_symbol * locsym)217 local_symbol_convert (struct local_symbol *locsym)
218 {
219   symbolS *ret;
220 
221   gas_assert (locsym->lsy_flags.sy_local_symbol);
222   if (local_symbol_converted_p (locsym))
223     return local_symbol_get_real_symbol (locsym);
224 
225   ++local_symbol_conversion_count;
226 
227   ret = symbol_new (locsym->lsy_name, locsym->lsy_section, locsym->lsy_value,
228 		    local_symbol_get_frag (locsym));
229 
230   if (local_symbol_resolved_p (locsym))
231     ret->sy_flags.sy_resolved = 1;
232 
233   /* Local symbols are always either defined or used.  */
234   ret->sy_flags.sy_used = 1;
235 
236 #ifdef TC_LOCAL_SYMFIELD_CONVERT
237   TC_LOCAL_SYMFIELD_CONVERT (locsym, ret);
238 #endif
239 
240   symbol_table_insert (ret);
241 
242   local_symbol_mark_converted (locsym);
243   local_symbol_set_real_symbol (locsym, ret);
244 
245   hash_jam (local_hash, locsym->lsy_name, NULL);
246 
247   return ret;
248 }
249 
250 static void
define_sym_at_dot(symbolS * symbolP)251 define_sym_at_dot (symbolS *symbolP)
252 {
253   symbolP->sy_frag = frag_now;
254   S_SET_VALUE (symbolP, (valueT) frag_now_fix ());
255   S_SET_SEGMENT (symbolP, now_seg);
256 }
257 
258 /* We have just seen "<name>:".
259    Creates a struct symbol unless it already exists.
260 
261    Gripes if we are redefining a symbol incompatibly (and ignores it).  */
262 
263 symbolS *
colon(const char * sym_name)264 colon (/* Just seen "x:" - rattle symbols & frags.  */
265        const char *sym_name	/* Symbol name, as a cannonical string.  */
266        /* We copy this string: OK to alter later.  */)
267 {
268   symbolS *symbolP;	/* Symbol we are working with.  */
269 
270   /* Sun local labels go out of scope whenever a non-local symbol is
271      defined.  */
272   if (LOCAL_LABELS_DOLLAR
273       && !bfd_is_local_label_name (stdoutput, sym_name))
274     dollar_label_clear ();
275 
276 #ifndef WORKING_DOT_WORD
277   if (new_broken_words)
278     {
279       struct broken_word *a;
280       int possible_bytes;
281       fragS *frag_tmp;
282       char *frag_opcode;
283 
284       if (now_seg == absolute_section)
285 	{
286 	  as_bad (_("cannot define symbol `%s' in absolute section"), sym_name);
287 	  return NULL;
288 	}
289 
290       possible_bytes = (md_short_jump_size
291 			+ new_broken_words * md_long_jump_size);
292 
293       frag_tmp = frag_now;
294       frag_opcode = frag_var (rs_broken_word,
295 			      possible_bytes,
296 			      possible_bytes,
297 			      (relax_substateT) 0,
298 			      (symbolS *) broken_words,
299 			      (offsetT) 0,
300 			      NULL);
301 
302       /* We want to store the pointer to where to insert the jump
303 	 table in the fr_opcode of the rs_broken_word frag.  This
304 	 requires a little hackery.  */
305       while (frag_tmp
306 	     && (frag_tmp->fr_type != rs_broken_word
307 		 || frag_tmp->fr_opcode))
308 	frag_tmp = frag_tmp->fr_next;
309       know (frag_tmp);
310       frag_tmp->fr_opcode = frag_opcode;
311       new_broken_words = 0;
312 
313       for (a = broken_words; a && a->dispfrag == 0; a = a->next_broken_word)
314 	a->dispfrag = frag_tmp;
315     }
316 #endif /* WORKING_DOT_WORD */
317 
318 #ifdef obj_frob_colon
319   obj_frob_colon (sym_name);
320 #endif
321 
322   if ((symbolP = symbol_find (sym_name)) != 0)
323     {
324       S_CLEAR_WEAKREFR (symbolP);
325 #ifdef RESOLVE_SYMBOL_REDEFINITION
326       if (RESOLVE_SYMBOL_REDEFINITION (symbolP))
327 	return symbolP;
328 #endif
329       /* Now check for undefined symbols.  */
330       if (LOCAL_SYMBOL_CHECK (symbolP))
331 	{
332 	  struct local_symbol *locsym = (struct local_symbol *) symbolP;
333 
334 	  if (locsym->lsy_section != undefined_section
335 	      && (local_symbol_get_frag (locsym) != frag_now
336 		  || locsym->lsy_section != now_seg
337 		  || locsym->lsy_value != frag_now_fix ()))
338 	    {
339 	      as_bad (_("symbol `%s' is already defined"), sym_name);
340 	      return symbolP;
341 	    }
342 
343 	  locsym->lsy_section = now_seg;
344 	  local_symbol_set_frag (locsym, frag_now);
345 	  locsym->lsy_value = frag_now_fix ();
346 	}
347       else if (!(S_IS_DEFINED (symbolP) || symbol_equated_p (symbolP))
348 	       || S_IS_COMMON (symbolP)
349 	       || S_IS_VOLATILE (symbolP))
350 	{
351 	  if (S_IS_VOLATILE (symbolP))
352 	    {
353 	      symbolP = symbol_clone (symbolP, 1);
354 	      S_SET_VALUE (symbolP, 0);
355 	      S_CLEAR_VOLATILE (symbolP);
356 	    }
357 	  if (S_GET_VALUE (symbolP) == 0)
358 	    {
359 	      define_sym_at_dot (symbolP);
360 #ifdef N_UNDF
361 	      know (N_UNDF == 0);
362 #endif /* if we have one, it better be zero.  */
363 
364 	    }
365 	  else
366 	    {
367 	      /* There are still several cases to check:
368 
369 		 A .comm/.lcomm symbol being redefined as initialized
370 		 data is OK
371 
372 		 A .comm/.lcomm symbol being redefined with a larger
373 		 size is also OK
374 
375 		 This only used to be allowed on VMS gas, but Sun cc
376 		 on the sparc also depends on it.  */
377 
378 	      if (((!S_IS_DEBUG (symbolP)
379 		    && (!S_IS_DEFINED (symbolP) || S_IS_COMMON (symbolP))
380 		    && S_IS_EXTERNAL (symbolP))
381 		   || S_GET_SEGMENT (symbolP) == bss_section)
382 		  && (now_seg == data_section
383 		      || now_seg == bss_section
384 		      || now_seg == S_GET_SEGMENT (symbolP)))
385 		{
386 		  /* Select which of the 2 cases this is.  */
387 		  if (now_seg != data_section)
388 		    {
389 		      /* New .comm for prev .comm symbol.
390 
391 			 If the new size is larger we just change its
392 			 value.  If the new size is smaller, we ignore
393 			 this symbol.  */
394 		      if (S_GET_VALUE (symbolP)
395 			  < ((unsigned) frag_now_fix ()))
396 			{
397 			  S_SET_VALUE (symbolP, (valueT) frag_now_fix ());
398 			}
399 		    }
400 		  else
401 		    {
402 		      /* It is a .comm/.lcomm being converted to initialized
403 			 data.  */
404 		      define_sym_at_dot (symbolP);
405 		    }
406 		}
407 	      else
408 		{
409 #if (!defined (OBJ_AOUT) && !defined (OBJ_MAYBE_AOUT) \
410      && !defined (OBJ_BOUT) && !defined (OBJ_MAYBE_BOUT))
411 		  static const char *od_buf = "";
412 #else
413 		  char od_buf[100];
414 		  od_buf[0] = '\0';
415 		  if (OUTPUT_FLAVOR == bfd_target_aout_flavour)
416 		    sprintf (od_buf, "%d.%d.",
417 			     S_GET_OTHER (symbolP),
418 			     S_GET_DESC (symbolP));
419 #endif
420 		  as_bad (_("symbol `%s' is already defined as \"%s\"/%s%ld"),
421 			    sym_name,
422 			    segment_name (S_GET_SEGMENT (symbolP)),
423 			    od_buf,
424 			    (long) S_GET_VALUE (symbolP));
425 		}
426 	    }			/* if the undefined symbol has no value  */
427 	}
428       else
429 	{
430 	  /* Don't blow up if the definition is the same.  */
431 	  if (!(frag_now == symbolP->sy_frag
432 		&& S_GET_VALUE (symbolP) == frag_now_fix ()
433 		&& S_GET_SEGMENT (symbolP) == now_seg))
434 	    {
435 	      as_bad (_("symbol `%s' is already defined"), sym_name);
436 	      symbolP = symbol_clone (symbolP, 0);
437 	      define_sym_at_dot (symbolP);
438 	    }
439 	}
440 
441     }
442   else if (! flag_keep_locals && bfd_is_local_label_name (stdoutput, sym_name))
443     {
444       symbolP = (symbolS *) local_symbol_make (sym_name, now_seg,
445 					       (valueT) frag_now_fix (),
446 					       frag_now);
447     }
448   else
449     {
450       symbolP = symbol_new (sym_name, now_seg, (valueT) frag_now_fix (),
451 			    frag_now);
452 
453       symbol_table_insert (symbolP);
454     }
455 
456   if (mri_common_symbol != NULL)
457     {
458       /* This symbol is actually being defined within an MRI common
459 	 section.  This requires special handling.  */
460       if (LOCAL_SYMBOL_CHECK (symbolP))
461 	symbolP = local_symbol_convert ((struct local_symbol *) symbolP);
462       symbolP->sy_value.X_op = O_symbol;
463       symbolP->sy_value.X_add_symbol = mri_common_symbol;
464       symbolP->sy_value.X_add_number = S_GET_VALUE (mri_common_symbol);
465       symbolP->sy_frag = &zero_address_frag;
466       S_SET_SEGMENT (symbolP, expr_section);
467       symbolP->sy_flags.sy_mri_common = 1;
468     }
469 
470 #ifdef tc_frob_label
471   tc_frob_label (symbolP);
472 #endif
473 #ifdef obj_frob_label
474   obj_frob_label (symbolP);
475 #endif
476 
477   return symbolP;
478 }
479 
480 /* Die if we can't insert the symbol.  */
481 
482 void
symbol_table_insert(symbolS * symbolP)483 symbol_table_insert (symbolS *symbolP)
484 {
485   const char *error_string;
486 
487   know (symbolP);
488   know (S_GET_NAME (symbolP));
489 
490   if (LOCAL_SYMBOL_CHECK (symbolP))
491     {
492       error_string = hash_jam (local_hash, S_GET_NAME (symbolP),
493 			       (void *) symbolP);
494       if (error_string != NULL)
495 	as_fatal (_("inserting \"%s\" into symbol table failed: %s"),
496 		  S_GET_NAME (symbolP), error_string);
497       return;
498     }
499 
500   if ((error_string = hash_jam (sy_hash, S_GET_NAME (symbolP), (void *) symbolP)))
501     {
502       as_fatal (_("inserting \"%s\" into symbol table failed: %s"),
503 		S_GET_NAME (symbolP), error_string);
504     }				/* on error  */
505 }
506 
507 /* If a symbol name does not exist, create it as undefined, and insert
508    it into the symbol table.  Return a pointer to it.  */
509 
510 symbolS *
symbol_find_or_make(const char * name)511 symbol_find_or_make (const char *name)
512 {
513   symbolS *symbolP;
514 
515   symbolP = symbol_find (name);
516 
517   if (symbolP == NULL)
518     {
519       if (! flag_keep_locals && bfd_is_local_label_name (stdoutput, name))
520 	{
521 	  symbolP = md_undefined_symbol ((char *) name);
522 	  if (symbolP != NULL)
523 	    return symbolP;
524 
525 	  symbolP = (symbolS *) local_symbol_make (name, undefined_section,
526 						   (valueT) 0,
527 						   &zero_address_frag);
528 	  return symbolP;
529 	}
530 
531       symbolP = symbol_make (name);
532 
533       symbol_table_insert (symbolP);
534     }				/* if symbol wasn't found */
535 
536   return (symbolP);
537 }
538 
539 symbolS *
symbol_make(const char * name)540 symbol_make (const char *name)
541 {
542   symbolS *symbolP;
543 
544   /* Let the machine description default it, e.g. for register names.  */
545   symbolP = md_undefined_symbol ((char *) name);
546 
547   if (!symbolP)
548     symbolP = symbol_new (name, undefined_section, (valueT) 0, &zero_address_frag);
549 
550   return (symbolP);
551 }
552 
553 symbolS *
symbol_clone(symbolS * orgsymP,int replace)554 symbol_clone (symbolS *orgsymP, int replace)
555 {
556   symbolS *newsymP;
557   asymbol *bsymorg, *bsymnew;
558 
559   /* Make sure we never clone the dot special symbol.  */
560   gas_assert (orgsymP != &dot_symbol);
561 
562   /* Running local_symbol_convert on a clone that's not the one currently
563      in local_hash would incorrectly replace the hash entry.  Thus the
564      symbol must be converted here.  Note that the rest of the function
565      depends on not encountering an unconverted symbol.  */
566   if (LOCAL_SYMBOL_CHECK (orgsymP))
567     orgsymP = local_symbol_convert ((struct local_symbol *) orgsymP);
568   bsymorg = orgsymP->bsym;
569 
570   newsymP = (symbolS *) obstack_alloc (&notes, sizeof (*newsymP));
571   *newsymP = *orgsymP;
572   bsymnew = bfd_make_empty_symbol (bfd_asymbol_bfd (bsymorg));
573   if (bsymnew == NULL)
574     as_fatal ("bfd_make_empty_symbol: %s", bfd_errmsg (bfd_get_error ()));
575   newsymP->bsym = bsymnew;
576   bsymnew->name = bsymorg->name;
577   bsymnew->flags = bsymorg->flags & ~BSF_SECTION_SYM;
578   bsymnew->section = bsymorg->section;
579   bfd_copy_private_symbol_data (bfd_asymbol_bfd (bsymorg), bsymorg,
580 				bfd_asymbol_bfd (bsymnew), bsymnew);
581 
582 #ifdef obj_symbol_clone_hook
583   obj_symbol_clone_hook (newsymP, orgsymP);
584 #endif
585 
586 #ifdef tc_symbol_clone_hook
587   tc_symbol_clone_hook (newsymP, orgsymP);
588 #endif
589 
590   if (replace)
591     {
592       if (symbol_rootP == orgsymP)
593 	symbol_rootP = newsymP;
594       else if (orgsymP->sy_previous)
595 	{
596 	  orgsymP->sy_previous->sy_next = newsymP;
597 	  orgsymP->sy_previous = NULL;
598 	}
599       if (symbol_lastP == orgsymP)
600 	symbol_lastP = newsymP;
601       else if (orgsymP->sy_next)
602 	orgsymP->sy_next->sy_previous = newsymP;
603 
604       /* Symbols that won't be output can't be external.  */
605       S_CLEAR_EXTERNAL (orgsymP);
606       orgsymP->sy_previous = orgsymP->sy_next = orgsymP;
607       debug_verify_symchain (symbol_rootP, symbol_lastP);
608 
609       symbol_table_insert (newsymP);
610     }
611   else
612     {
613       /* Symbols that won't be output can't be external.  */
614       S_CLEAR_EXTERNAL (newsymP);
615       newsymP->sy_previous = newsymP->sy_next = newsymP;
616     }
617 
618   return newsymP;
619 }
620 
621 /* Referenced symbols, if they are forward references, need to be cloned
622    (without replacing the original) so that the value of the referenced
623    symbols at the point of use .  */
624 
625 #undef symbol_clone_if_forward_ref
626 symbolS *
symbol_clone_if_forward_ref(symbolS * symbolP,int is_forward)627 symbol_clone_if_forward_ref (symbolS *symbolP, int is_forward)
628 {
629   if (symbolP && !LOCAL_SYMBOL_CHECK (symbolP))
630     {
631       symbolS *add_symbol = symbolP->sy_value.X_add_symbol;
632       symbolS *op_symbol = symbolP->sy_value.X_op_symbol;
633 
634       if (symbolP->sy_flags.sy_forward_ref)
635 	is_forward = 1;
636 
637       if (is_forward)
638 	{
639 	  /* assign_symbol() clones volatile symbols; pre-existing expressions
640 	     hold references to the original instance, but want the current
641 	     value.  Just repeat the lookup.  */
642 	  if (add_symbol && S_IS_VOLATILE (add_symbol))
643 	    add_symbol = symbol_find_exact (S_GET_NAME (add_symbol));
644 	  if (op_symbol && S_IS_VOLATILE (op_symbol))
645 	    op_symbol = symbol_find_exact (S_GET_NAME (op_symbol));
646 	}
647 
648       /* Re-using sy_resolving here, as this routine cannot get called from
649 	 symbol resolution code.  */
650       if ((symbolP->bsym->section == expr_section
651            || symbolP->sy_flags.sy_forward_ref)
652 	  && !symbolP->sy_flags.sy_resolving)
653 	{
654 	  symbolP->sy_flags.sy_resolving = 1;
655 	  add_symbol = symbol_clone_if_forward_ref (add_symbol, is_forward);
656 	  op_symbol = symbol_clone_if_forward_ref (op_symbol, is_forward);
657 	  symbolP->sy_flags.sy_resolving = 0;
658 	}
659 
660       if (symbolP->sy_flags.sy_forward_ref
661 	  || add_symbol != symbolP->sy_value.X_add_symbol
662 	  || op_symbol != symbolP->sy_value.X_op_symbol)
663 	{
664 	  if (symbolP != &dot_symbol)
665 	    {
666 	      symbolP = symbol_clone (symbolP, 0);
667 	      symbolP->sy_flags.sy_resolving = 0;
668 	    }
669 	  else
670 	    {
671 	      symbolP = symbol_temp_new_now ();
672 #ifdef tc_new_dot_label
673 	      tc_new_dot_label (symbolP);
674 #endif
675 	    }
676 	}
677 
678       symbolP->sy_value.X_add_symbol = add_symbol;
679       symbolP->sy_value.X_op_symbol = op_symbol;
680     }
681 
682   return symbolP;
683 }
684 
685 symbolS *
symbol_temp_new(segT seg,valueT ofs,fragS * frag)686 symbol_temp_new (segT seg, valueT ofs, fragS *frag)
687 {
688   return symbol_new (FAKE_LABEL_NAME, seg, ofs, frag);
689 }
690 
691 symbolS *
symbol_temp_new_now(void)692 symbol_temp_new_now (void)
693 {
694   return symbol_temp_new (now_seg, frag_now_fix (), frag_now);
695 }
696 
697 symbolS *
symbol_temp_make(void)698 symbol_temp_make (void)
699 {
700   return symbol_make (FAKE_LABEL_NAME);
701 }
702 
703 /* Implement symbol table lookup.
704    In:	A symbol's name as a string: '\0' can't be part of a symbol name.
705    Out:	NULL if the name was not in the symbol table, else the address
706    of a struct symbol associated with that name.  */
707 
708 symbolS *
symbol_find_exact(const char * name)709 symbol_find_exact (const char *name)
710 {
711   return symbol_find_exact_noref (name, 0);
712 }
713 
714 symbolS *
symbol_find_exact_noref(const char * name,int noref)715 symbol_find_exact_noref (const char *name, int noref)
716 {
717   struct local_symbol *locsym;
718   symbolS* sym;
719 
720   locsym = (struct local_symbol *) hash_find (local_hash, name);
721   if (locsym != NULL)
722     return (symbolS *) locsym;
723 
724   sym = ((symbolS *) hash_find (sy_hash, name));
725 
726   /* Any references to the symbol, except for the reference in
727      .weakref, must clear this flag, such that the symbol does not
728      turn into a weak symbol.  Note that we don't have to handle the
729      local_symbol case, since a weakrefd is always promoted out of the
730      local_symbol table when it is turned into a weak symbol.  */
731   if (sym && ! noref)
732     S_CLEAR_WEAKREFD (sym);
733 
734   return sym;
735 }
736 
737 symbolS *
symbol_find(const char * name)738 symbol_find (const char *name)
739 {
740   return symbol_find_noref (name, 0);
741 }
742 
743 symbolS *
symbol_find_noref(const char * name,int noref)744 symbol_find_noref (const char *name, int noref)
745 {
746 #ifdef tc_canonicalize_symbol_name
747   {
748     char *copy;
749     size_t len = strlen (name) + 1;
750 
751     copy = (char *) alloca (len);
752     memcpy (copy, name, len);
753     name = tc_canonicalize_symbol_name (copy);
754   }
755 #endif
756 
757   if (! symbols_case_sensitive)
758     {
759       char *copy;
760       const char *orig;
761       unsigned char c;
762 
763       orig = name;
764       name = copy = (char *) alloca (strlen (name) + 1);
765 
766       while ((c = *orig++) != '\0')
767 	{
768 	  *copy++ = TOUPPER (c);
769 	}
770       *copy = '\0';
771     }
772 
773   return symbol_find_exact_noref (name, noref);
774 }
775 
776 /* Once upon a time, symbols were kept in a singly linked list.  At
777    least coff needs to be able to rearrange them from time to time, for
778    which a doubly linked list is much more convenient.  Loic did these
779    as macros which seemed dangerous to me so they're now functions.
780    xoxorich.  */
781 
782 /* Link symbol ADDME after symbol TARGET in the chain.  */
783 
784 void
symbol_append(symbolS * addme,symbolS * target,symbolS ** rootPP,symbolS ** lastPP)785 symbol_append (symbolS *addme, symbolS *target,
786 	       symbolS **rootPP, symbolS **lastPP)
787 {
788   if (LOCAL_SYMBOL_CHECK (addme))
789     abort ();
790   if (target != NULL && LOCAL_SYMBOL_CHECK (target))
791     abort ();
792 
793   if (target == NULL)
794     {
795       know (*rootPP == NULL);
796       know (*lastPP == NULL);
797       addme->sy_next = NULL;
798       addme->sy_previous = NULL;
799       *rootPP = addme;
800       *lastPP = addme;
801       return;
802     }				/* if the list is empty  */
803 
804   if (target->sy_next != NULL)
805     {
806       target->sy_next->sy_previous = addme;
807     }
808   else
809     {
810       know (*lastPP == target);
811       *lastPP = addme;
812     }				/* if we have a next  */
813 
814   addme->sy_next = target->sy_next;
815   target->sy_next = addme;
816   addme->sy_previous = target;
817 
818   debug_verify_symchain (symbol_rootP, symbol_lastP);
819 }
820 
821 /* Set the chain pointers of SYMBOL to null.  */
822 
823 void
symbol_clear_list_pointers(symbolS * symbolP)824 symbol_clear_list_pointers (symbolS *symbolP)
825 {
826   if (LOCAL_SYMBOL_CHECK (symbolP))
827     abort ();
828   symbolP->sy_next = NULL;
829   symbolP->sy_previous = NULL;
830 }
831 
832 /* Remove SYMBOLP from the list.  */
833 
834 void
symbol_remove(symbolS * symbolP,symbolS ** rootPP,symbolS ** lastPP)835 symbol_remove (symbolS *symbolP, symbolS **rootPP, symbolS **lastPP)
836 {
837   if (LOCAL_SYMBOL_CHECK (symbolP))
838     abort ();
839 
840   if (symbolP == *rootPP)
841     {
842       *rootPP = symbolP->sy_next;
843     }				/* if it was the root  */
844 
845   if (symbolP == *lastPP)
846     {
847       *lastPP = symbolP->sy_previous;
848     }				/* if it was the tail  */
849 
850   if (symbolP->sy_next != NULL)
851     {
852       symbolP->sy_next->sy_previous = symbolP->sy_previous;
853     }				/* if not last  */
854 
855   if (symbolP->sy_previous != NULL)
856     {
857       symbolP->sy_previous->sy_next = symbolP->sy_next;
858     }				/* if not first  */
859 
860   debug_verify_symchain (*rootPP, *lastPP);
861 }
862 
863 /* Link symbol ADDME before symbol TARGET in the chain.  */
864 
865 void
symbol_insert(symbolS * addme,symbolS * target,symbolS ** rootPP,symbolS ** lastPP ATTRIBUTE_UNUSED)866 symbol_insert (symbolS *addme, symbolS *target,
867 	       symbolS **rootPP, symbolS **lastPP ATTRIBUTE_UNUSED)
868 {
869   if (LOCAL_SYMBOL_CHECK (addme))
870     abort ();
871   if (LOCAL_SYMBOL_CHECK (target))
872     abort ();
873 
874   if (target->sy_previous != NULL)
875     {
876       target->sy_previous->sy_next = addme;
877     }
878   else
879     {
880       know (*rootPP == target);
881       *rootPP = addme;
882     }				/* if not first  */
883 
884   addme->sy_previous = target->sy_previous;
885   target->sy_previous = addme;
886   addme->sy_next = target;
887 
888   debug_verify_symchain (*rootPP, *lastPP);
889 }
890 
891 void
verify_symbol_chain(symbolS * rootP,symbolS * lastP)892 verify_symbol_chain (symbolS *rootP, symbolS *lastP)
893 {
894   symbolS *symbolP = rootP;
895 
896   if (symbolP == NULL)
897     return;
898 
899   for (; symbol_next (symbolP) != NULL; symbolP = symbol_next (symbolP))
900     {
901       gas_assert (symbolP->bsym != NULL);
902       gas_assert (symbolP->sy_flags.sy_local_symbol == 0);
903       gas_assert (symbolP->sy_next->sy_previous == symbolP);
904     }
905 
906   gas_assert (lastP == symbolP);
907 }
908 
909 #ifdef OBJ_COMPLEX_RELC
910 
911 static int
use_complex_relocs_for(symbolS * symp)912 use_complex_relocs_for (symbolS * symp)
913 {
914   switch (symp->sy_value.X_op)
915     {
916     case O_constant:
917       return 0;
918 
919     case O_symbol:
920     case O_symbol_rva:
921     case O_uminus:
922     case O_bit_not:
923     case O_logical_not:
924       if (  (S_IS_COMMON (symp->sy_value.X_add_symbol)
925 	   || S_IS_LOCAL (symp->sy_value.X_add_symbol))
926 	  &&
927 	      (S_IS_DEFINED (symp->sy_value.X_add_symbol)
928 	   && S_GET_SEGMENT (symp->sy_value.X_add_symbol) != expr_section))
929 	return 0;
930       break;
931 
932     case O_multiply:
933     case O_divide:
934     case O_modulus:
935     case O_left_shift:
936     case O_right_shift:
937     case O_bit_inclusive_or:
938     case O_bit_or_not:
939     case O_bit_exclusive_or:
940     case O_bit_and:
941     case O_add:
942     case O_subtract:
943     case O_eq:
944     case O_ne:
945     case O_lt:
946     case O_le:
947     case O_ge:
948     case O_gt:
949     case O_logical_and:
950     case O_logical_or:
951 
952       if (  (S_IS_COMMON (symp->sy_value.X_add_symbol)
953 	   || S_IS_LOCAL (symp->sy_value.X_add_symbol))
954 	  &&
955 	    (S_IS_COMMON (symp->sy_value.X_op_symbol)
956 	   || S_IS_LOCAL (symp->sy_value.X_op_symbol))
957 
958 	  && S_IS_DEFINED (symp->sy_value.X_add_symbol)
959 	  && S_IS_DEFINED (symp->sy_value.X_op_symbol)
960 	  && S_GET_SEGMENT (symp->sy_value.X_add_symbol) != expr_section
961 	  && S_GET_SEGMENT (symp->sy_value.X_op_symbol) != expr_section)
962 	return 0;
963       break;
964 
965     default:
966       break;
967     }
968   return 1;
969 }
970 #endif
971 
972 static void
report_op_error(symbolS * symp,symbolS * left,operatorT op,symbolS * right)973 report_op_error (symbolS *symp, symbolS *left, operatorT op, symbolS *right)
974 {
975   char *file;
976   unsigned int line;
977   segT seg_left = left ? S_GET_SEGMENT (left) : 0;
978   segT seg_right = S_GET_SEGMENT (right);
979   const char *opname;
980 
981   switch (op)
982     {
983     default:
984       abort ();
985       return;
986 
987     case O_uminus:		opname = "-"; break;
988     case O_bit_not:		opname = "~"; break;
989     case O_logical_not:		opname = "!"; break;
990     case O_multiply:		opname = "*"; break;
991     case O_divide:		opname = "/"; break;
992     case O_modulus:		opname = "%"; break;
993     case O_left_shift:		opname = "<<"; break;
994     case O_right_shift:		opname = ">>"; break;
995     case O_bit_inclusive_or:	opname = "|"; break;
996     case O_bit_or_not:		opname = "|~"; break;
997     case O_bit_exclusive_or:	opname = "^"; break;
998     case O_bit_and:		opname = "&"; break;
999     case O_add:			opname = "+"; break;
1000     case O_subtract:		opname = "-"; break;
1001     case O_eq:			opname = "=="; break;
1002     case O_ne:			opname = "!="; break;
1003     case O_lt:			opname = "<"; break;
1004     case O_le:			opname = "<="; break;
1005     case O_ge:			opname = ">="; break;
1006     case O_gt:			opname = ">"; break;
1007     case O_logical_and:		opname = "&&"; break;
1008     case O_logical_or:		opname = "||"; break;
1009     }
1010 
1011   if (expr_symbol_where (symp, &file, &line))
1012     {
1013       if (left)
1014 	as_bad_where (file, line,
1015 		      _("invalid operands (%s and %s sections) for `%s'"),
1016 		      seg_left->name, seg_right->name, opname);
1017       else
1018 	as_bad_where (file, line,
1019 		      _("invalid operand (%s section) for `%s'"),
1020 		      seg_right->name, opname);
1021     }
1022   else
1023     {
1024       const char *sname = S_GET_NAME (symp);
1025 
1026       if (left)
1027 	as_bad (_("invalid operands (%s and %s sections) for `%s' when setting `%s'"),
1028 		seg_left->name, seg_right->name, opname, sname);
1029       else
1030 	as_bad (_("invalid operand (%s section) for `%s' when setting `%s'"),
1031 		seg_right->name, opname, sname);
1032     }
1033 }
1034 
1035 /* Resolve the value of a symbol.  This is called during the final
1036    pass over the symbol table to resolve any symbols with complex
1037    values.  */
1038 
1039 valueT
resolve_symbol_value(symbolS * symp)1040 resolve_symbol_value (symbolS *symp)
1041 {
1042   int resolved;
1043   valueT final_val = 0;
1044   segT final_seg;
1045 
1046   if (LOCAL_SYMBOL_CHECK (symp))
1047     {
1048       struct local_symbol *locsym = (struct local_symbol *) symp;
1049 
1050       final_val = locsym->lsy_value;
1051       if (local_symbol_resolved_p (locsym))
1052 	return final_val;
1053 
1054       final_val += local_symbol_get_frag (locsym)->fr_address / OCTETS_PER_BYTE;
1055 
1056       if (finalize_syms)
1057 	{
1058 	  locsym->lsy_value = final_val;
1059 	  local_symbol_mark_resolved (locsym);
1060 	}
1061 
1062       return final_val;
1063     }
1064 
1065   if (symp->sy_flags.sy_resolved)
1066     {
1067       if (symp->sy_value.X_op == O_constant)
1068 	return (valueT) symp->sy_value.X_add_number;
1069       else
1070 	return 0;
1071     }
1072 
1073   resolved = 0;
1074   final_seg = S_GET_SEGMENT (symp);
1075 
1076   if (symp->sy_flags.sy_resolving)
1077     {
1078       if (finalize_syms)
1079 	as_bad (_("symbol definition loop encountered at `%s'"),
1080 		S_GET_NAME (symp));
1081       final_val = 0;
1082       resolved = 1;
1083     }
1084 #ifdef OBJ_COMPLEX_RELC
1085   else if (final_seg == expr_section
1086 	   && use_complex_relocs_for (symp))
1087     {
1088       symbolS * relc_symbol = NULL;
1089       char * relc_symbol_name = NULL;
1090 
1091       relc_symbol_name = symbol_relc_make_expr (& symp->sy_value);
1092 
1093       /* For debugging, print out conversion input & output.  */
1094 #ifdef DEBUG_SYMS
1095       print_expr (& symp->sy_value);
1096       if (relc_symbol_name)
1097 	fprintf (stderr, "-> relc symbol: %s\n", relc_symbol_name);
1098 #endif
1099 
1100       if (relc_symbol_name != NULL)
1101 	relc_symbol = symbol_new (relc_symbol_name, undefined_section,
1102 				  0, & zero_address_frag);
1103 
1104       if (relc_symbol == NULL)
1105 	{
1106 	  as_bad (_("cannot convert expression symbol %s to complex relocation"),
1107 		  S_GET_NAME (symp));
1108 	  resolved = 0;
1109 	}
1110       else
1111 	{
1112 	  symbol_table_insert (relc_symbol);
1113 
1114  	  /* S_CLEAR_EXTERNAL (relc_symbol); */
1115 	  if (symp->bsym->flags & BSF_SRELC)
1116 	    relc_symbol->bsym->flags |= BSF_SRELC;
1117 	  else
1118 	    relc_symbol->bsym->flags |= BSF_RELC;
1119 	  /* symp->bsym->flags |= BSF_RELC; */
1120 	  copy_symbol_attributes (symp, relc_symbol);
1121 	  symp->sy_value.X_op = O_symbol;
1122 	  symp->sy_value.X_add_symbol = relc_symbol;
1123 	  symp->sy_value.X_add_number = 0;
1124 	  resolved = 1;
1125 	}
1126 
1127       final_seg = undefined_section;
1128       goto exit_dont_set_value;
1129     }
1130 #endif
1131   else
1132     {
1133       symbolS *add_symbol, *op_symbol;
1134       offsetT left, right;
1135       segT seg_left, seg_right;
1136       operatorT op;
1137       int move_seg_ok;
1138 
1139       symp->sy_flags.sy_resolving = 1;
1140 
1141       /* Help out with CSE.  */
1142       add_symbol = symp->sy_value.X_add_symbol;
1143       op_symbol = symp->sy_value.X_op_symbol;
1144       final_val = symp->sy_value.X_add_number;
1145       op = symp->sy_value.X_op;
1146 
1147       switch (op)
1148 	{
1149 	default:
1150 	  BAD_CASE (op);
1151 	  break;
1152 
1153 	case O_absent:
1154 	  final_val = 0;
1155 	  /* Fall through.  */
1156 
1157 	case O_constant:
1158 	  final_val += symp->sy_frag->fr_address / OCTETS_PER_BYTE;
1159 	  if (final_seg == expr_section)
1160 	    final_seg = absolute_section;
1161 	  /* Fall through.  */
1162 
1163 	case O_register:
1164 	  resolved = 1;
1165 	  break;
1166 
1167 	case O_symbol:
1168 	case O_symbol_rva:
1169 	  left = resolve_symbol_value (add_symbol);
1170 	  seg_left = S_GET_SEGMENT (add_symbol);
1171 	  if (finalize_syms)
1172 	    symp->sy_value.X_op_symbol = NULL;
1173 
1174 	do_symbol:
1175 	  if (S_IS_WEAKREFR (symp))
1176 	    {
1177 	      gas_assert (final_val == 0);
1178 	      if (S_IS_WEAKREFR (add_symbol))
1179 		{
1180 		  gas_assert (add_symbol->sy_value.X_op == O_symbol
1181 			  && add_symbol->sy_value.X_add_number == 0);
1182 		  add_symbol = add_symbol->sy_value.X_add_symbol;
1183 		  gas_assert (! S_IS_WEAKREFR (add_symbol));
1184 		  symp->sy_value.X_add_symbol = add_symbol;
1185 		}
1186 	    }
1187 
1188 	  if (symp->sy_flags.sy_mri_common)
1189 	    {
1190 	      /* This is a symbol inside an MRI common section.  The
1191 		 relocation routines are going to handle it specially.
1192 		 Don't change the value.  */
1193 	      resolved = symbol_resolved_p (add_symbol);
1194 	      break;
1195 	    }
1196 
1197 	  if (finalize_syms && final_val == 0)
1198 	    {
1199 	      if (LOCAL_SYMBOL_CHECK (add_symbol))
1200 		add_symbol = local_symbol_convert ((struct local_symbol *)
1201 						   add_symbol);
1202 	      copy_symbol_attributes (symp, add_symbol);
1203 	    }
1204 
1205 	  /* If we have equated this symbol to an undefined or common
1206 	     symbol, keep X_op set to O_symbol, and don't change
1207 	     X_add_number.  This permits the routine which writes out
1208 	     relocation to detect this case, and convert the
1209 	     relocation to be against the symbol to which this symbol
1210 	     is equated.  */
1211 	  if (! S_IS_DEFINED (add_symbol)
1212 #if defined (OBJ_COFF) && defined (TE_PE)
1213 	      || S_IS_WEAK (add_symbol)
1214 #endif
1215 	      || S_IS_COMMON (add_symbol))
1216 	    {
1217 	      if (finalize_syms)
1218 		{
1219 		  symp->sy_value.X_op = O_symbol;
1220 		  symp->sy_value.X_add_symbol = add_symbol;
1221 		  symp->sy_value.X_add_number = final_val;
1222 		  /* Use X_op_symbol as a flag.  */
1223 		  symp->sy_value.X_op_symbol = add_symbol;
1224 		}
1225 	      final_seg = seg_left;
1226 	      final_val = 0;
1227 	      resolved = symbol_resolved_p (add_symbol);
1228 	      symp->sy_flags.sy_resolving = 0;
1229 	      goto exit_dont_set_value;
1230 	    }
1231 	  else if (finalize_syms
1232 		   && ((final_seg == expr_section && seg_left != expr_section)
1233 		       || symbol_shadow_p (symp)))
1234 	    {
1235 	      /* If the symbol is an expression symbol, do similarly
1236 		 as for undefined and common syms above.  Handles
1237 		 "sym +/- expr" where "expr" cannot be evaluated
1238 		 immediately, and we want relocations to be against
1239 		 "sym", eg. because it is weak.  */
1240 	      symp->sy_value.X_op = O_symbol;
1241 	      symp->sy_value.X_add_symbol = add_symbol;
1242 	      symp->sy_value.X_add_number = final_val;
1243 	      symp->sy_value.X_op_symbol = add_symbol;
1244 	      final_seg = seg_left;
1245 	      final_val += symp->sy_frag->fr_address + left;
1246 	      resolved = symbol_resolved_p (add_symbol);
1247 	      symp->sy_flags.sy_resolving = 0;
1248 	      goto exit_dont_set_value;
1249 	    }
1250 	  else
1251 	    {
1252 	      final_val += symp->sy_frag->fr_address + left;
1253 	      if (final_seg == expr_section || final_seg == undefined_section)
1254 		final_seg = seg_left;
1255 	    }
1256 
1257 	  resolved = symbol_resolved_p (add_symbol);
1258 	  if (S_IS_WEAKREFR (symp))
1259 	    goto exit_dont_set_value;
1260 	  break;
1261 
1262 	case O_uminus:
1263 	case O_bit_not:
1264 	case O_logical_not:
1265 	  left = resolve_symbol_value (add_symbol);
1266 	  seg_left = S_GET_SEGMENT (add_symbol);
1267 
1268 	  /* By reducing these to the relevant dyadic operator, we get
1269 	     	!S -> S == 0 	permitted on anything,
1270 		-S -> 0 - S 	only permitted on absolute
1271 		~S -> S ^ ~0 	only permitted on absolute  */
1272 	  if (op != O_logical_not && seg_left != absolute_section
1273 	      && finalize_syms)
1274 	    report_op_error (symp, NULL, op, add_symbol);
1275 
1276 	  if (final_seg == expr_section || final_seg == undefined_section)
1277 	    final_seg = absolute_section;
1278 
1279 	  if (op == O_uminus)
1280 	    left = -left;
1281 	  else if (op == O_logical_not)
1282 	    left = !left;
1283 	  else
1284 	    left = ~left;
1285 
1286 	  final_val += left + symp->sy_frag->fr_address;
1287 
1288 	  resolved = symbol_resolved_p (add_symbol);
1289 	  break;
1290 
1291 	case O_multiply:
1292 	case O_divide:
1293 	case O_modulus:
1294 	case O_left_shift:
1295 	case O_right_shift:
1296 	case O_bit_inclusive_or:
1297 	case O_bit_or_not:
1298 	case O_bit_exclusive_or:
1299 	case O_bit_and:
1300 	case O_add:
1301 	case O_subtract:
1302 	case O_eq:
1303 	case O_ne:
1304 	case O_lt:
1305 	case O_le:
1306 	case O_ge:
1307 	case O_gt:
1308 	case O_logical_and:
1309 	case O_logical_or:
1310 	  left = resolve_symbol_value (add_symbol);
1311 	  right = resolve_symbol_value (op_symbol);
1312 	  seg_left = S_GET_SEGMENT (add_symbol);
1313 	  seg_right = S_GET_SEGMENT (op_symbol);
1314 
1315 	  /* Simplify addition or subtraction of a constant by folding the
1316 	     constant into X_add_number.  */
1317 	  if (op == O_add)
1318 	    {
1319 	      if (seg_right == absolute_section)
1320 		{
1321 		  final_val += right;
1322 		  goto do_symbol;
1323 		}
1324 	      else if (seg_left == absolute_section)
1325 		{
1326 		  final_val += left;
1327 		  add_symbol = op_symbol;
1328 		  left = right;
1329 		  seg_left = seg_right;
1330 		  goto do_symbol;
1331 		}
1332 	    }
1333 	  else if (op == O_subtract)
1334 	    {
1335 	      if (seg_right == absolute_section)
1336 		{
1337 		  final_val -= right;
1338 		  goto do_symbol;
1339 		}
1340 	    }
1341 
1342 	  move_seg_ok = 1;
1343 	  /* Equality and non-equality tests are permitted on anything.
1344 	     Subtraction, and other comparison operators are permitted if
1345 	     both operands are in the same section.  Otherwise, both
1346 	     operands must be absolute.  We already handled the case of
1347 	     addition or subtraction of a constant above.  This will
1348 	     probably need to be changed for an object file format which
1349 	     supports arbitrary expressions, such as IEEE-695.  */
1350 	  if (!(seg_left == absolute_section
1351 		&& seg_right == absolute_section)
1352 	      && !(op == O_eq || op == O_ne)
1353 	      && !((op == O_subtract
1354 		    || op == O_lt || op == O_le || op == O_ge || op == O_gt)
1355 		   && seg_left == seg_right
1356 		   && (seg_left != undefined_section
1357 		       || add_symbol == op_symbol)))
1358 	    {
1359 	      /* Don't emit messages unless we're finalizing the symbol value,
1360 		 otherwise we may get the same message multiple times.  */
1361 	      if (finalize_syms)
1362 		report_op_error (symp, add_symbol, op, op_symbol);
1363 	      /* However do not move the symbol into the absolute section
1364 		 if it cannot currently be resolved - this would confuse
1365 		 other parts of the assembler into believing that the
1366 		 expression had been evaluated to zero.  */
1367 	      else
1368 		move_seg_ok = 0;
1369 	    }
1370 
1371 	  if (move_seg_ok
1372 	      && (final_seg == expr_section || final_seg == undefined_section))
1373 	    final_seg = absolute_section;
1374 
1375 	  /* Check for division by zero.  */
1376 	  if ((op == O_divide || op == O_modulus) && right == 0)
1377 	    {
1378 	      /* If seg_right is not absolute_section, then we've
1379 		 already issued a warning about using a bad symbol.  */
1380 	      if (seg_right == absolute_section && finalize_syms)
1381 		{
1382 		  char *file;
1383 		  unsigned int line;
1384 
1385 		  if (expr_symbol_where (symp, &file, &line))
1386 		    as_bad_where (file, line, _("division by zero"));
1387 		  else
1388 		    as_bad (_("division by zero when setting `%s'"),
1389 			    S_GET_NAME (symp));
1390 		}
1391 
1392 	      right = 1;
1393 	    }
1394 
1395 	  switch (symp->sy_value.X_op)
1396 	    {
1397 	    case O_multiply:		left *= right; break;
1398 	    case O_divide:		left /= right; break;
1399 	    case O_modulus:		left %= right; break;
1400 	    case O_left_shift:		left <<= right; break;
1401 	    case O_right_shift:		left >>= right; break;
1402 	    case O_bit_inclusive_or:	left |= right; break;
1403 	    case O_bit_or_not:		left |= ~right; break;
1404 	    case O_bit_exclusive_or:	left ^= right; break;
1405 	    case O_bit_and:		left &= right; break;
1406 	    case O_add:			left += right; break;
1407 	    case O_subtract:		left -= right; break;
1408 	    case O_eq:
1409 	    case O_ne:
1410 	      left = (left == right && seg_left == seg_right
1411 		      && (seg_left != undefined_section
1412 			  || add_symbol == op_symbol)
1413 		      ? ~ (offsetT) 0 : 0);
1414 	      if (symp->sy_value.X_op == O_ne)
1415 		left = ~left;
1416 	      break;
1417 	    case O_lt:	left = left <  right ? ~ (offsetT) 0 : 0; break;
1418 	    case O_le:	left = left <= right ? ~ (offsetT) 0 : 0; break;
1419 	    case O_ge:	left = left >= right ? ~ (offsetT) 0 : 0; break;
1420 	    case O_gt:	left = left >  right ? ~ (offsetT) 0 : 0; break;
1421 	    case O_logical_and:	left = left && right; break;
1422 	    case O_logical_or:	left = left || right; break;
1423 	    default:		abort ();
1424 	    }
1425 
1426 	  final_val += symp->sy_frag->fr_address + left;
1427 	  if (final_seg == expr_section || final_seg == undefined_section)
1428 	    {
1429 	      if (seg_left == undefined_section
1430 		  || seg_right == undefined_section)
1431 		final_seg = undefined_section;
1432 	      else if (seg_left == absolute_section)
1433 		final_seg = seg_right;
1434 	      else
1435 		final_seg = seg_left;
1436 	    }
1437 	  resolved = (symbol_resolved_p (add_symbol)
1438 		      && symbol_resolved_p (op_symbol));
1439 	  break;
1440 
1441 	case O_big:
1442 	case O_illegal:
1443 	  /* Give an error (below) if not in expr_section.  We don't
1444 	     want to worry about expr_section symbols, because they
1445 	     are fictional (they are created as part of expression
1446 	     resolution), and any problems may not actually mean
1447 	     anything.  */
1448 	  break;
1449 	}
1450 
1451       symp->sy_flags.sy_resolving = 0;
1452     }
1453 
1454   if (finalize_syms)
1455     S_SET_VALUE (symp, final_val);
1456 
1457 exit_dont_set_value:
1458   /* Always set the segment, even if not finalizing the value.
1459      The segment is used to determine whether a symbol is defined.  */
1460     S_SET_SEGMENT (symp, final_seg);
1461 
1462   /* Don't worry if we can't resolve an expr_section symbol.  */
1463   if (finalize_syms)
1464     {
1465       if (resolved)
1466 	symp->sy_flags.sy_resolved = 1;
1467       else if (S_GET_SEGMENT (symp) != expr_section)
1468 	{
1469 	  as_bad (_("can't resolve value for symbol `%s'"),
1470 		  S_GET_NAME (symp));
1471 	  symp->sy_flags.sy_resolved = 1;
1472 	}
1473     }
1474 
1475   return final_val;
1476 }
1477 
1478 static void resolve_local_symbol (const char *, void *);
1479 
1480 /* A static function passed to hash_traverse.  */
1481 
1482 static void
resolve_local_symbol(const char * key ATTRIBUTE_UNUSED,void * value)1483 resolve_local_symbol (const char *key ATTRIBUTE_UNUSED, void *value)
1484 {
1485   if (value != NULL)
1486     resolve_symbol_value ((symbolS *) value);
1487 }
1488 
1489 /* Resolve all local symbols.  */
1490 
1491 void
resolve_local_symbol_values(void)1492 resolve_local_symbol_values (void)
1493 {
1494   hash_traverse (local_hash, resolve_local_symbol);
1495 }
1496 
1497 /* Obtain the current value of a symbol without changing any
1498    sub-expressions used.  */
1499 
1500 int
snapshot_symbol(symbolS ** symbolPP,valueT * valueP,segT * segP,fragS ** fragPP)1501 snapshot_symbol (symbolS **symbolPP, valueT *valueP, segT *segP, fragS **fragPP)
1502 {
1503   symbolS *symbolP = *symbolPP;
1504 
1505   if (LOCAL_SYMBOL_CHECK (symbolP))
1506     {
1507       struct local_symbol *locsym = (struct local_symbol *) symbolP;
1508 
1509       *valueP = locsym->lsy_value;
1510       *segP = locsym->lsy_section;
1511       *fragPP = local_symbol_get_frag (locsym);
1512     }
1513   else
1514     {
1515       expressionS exp = symbolP->sy_value;
1516 
1517       if (!symbolP->sy_flags.sy_resolved && exp.X_op != O_illegal)
1518 	{
1519 	  int resolved;
1520 
1521 	  if (symbolP->sy_flags.sy_resolving)
1522 	    return 0;
1523 	  symbolP->sy_flags.sy_resolving = 1;
1524 	  resolved = resolve_expression (&exp);
1525 	  symbolP->sy_flags.sy_resolving = 0;
1526 	  if (!resolved)
1527 	    return 0;
1528 
1529 	  switch (exp.X_op)
1530 	    {
1531 	    case O_constant:
1532 	    case O_register:
1533 	      if (!symbol_equated_p (symbolP))
1534 		break;
1535 	      /* Fall thru.  */
1536 	    case O_symbol:
1537 	    case O_symbol_rva:
1538 	      symbolP = exp.X_add_symbol;
1539 	      break;
1540 	    default:
1541 	      return 0;
1542 	    }
1543 	}
1544 
1545       *symbolPP = symbolP;
1546       *valueP = exp.X_add_number;
1547       *segP = symbolP->bsym->section;
1548       *fragPP = symbolP->sy_frag;
1549 
1550       if (*segP == expr_section)
1551 	switch (exp.X_op)
1552 	  {
1553 	  case O_constant: *segP = absolute_section; break;
1554 	  case O_register: *segP = reg_section; break;
1555 	  default: break;
1556 	  }
1557     }
1558 
1559   return 1;
1560 }
1561 
1562 /* Dollar labels look like a number followed by a dollar sign.  Eg, "42$".
1563    They are *really* local.  That is, they go out of scope whenever we see a
1564    label that isn't local.  Also, like fb labels, there can be multiple
1565    instances of a dollar label.  Therefor, we name encode each instance with
1566    the instance number, keep a list of defined symbols separate from the real
1567    symbol table, and we treat these buggers as a sparse array.  */
1568 
1569 static long *dollar_labels;
1570 static long *dollar_label_instances;
1571 static char *dollar_label_defines;
1572 static unsigned long dollar_label_count;
1573 static unsigned long dollar_label_max;
1574 
1575 int
dollar_label_defined(long label)1576 dollar_label_defined (long label)
1577 {
1578   long *i;
1579 
1580   know ((dollar_labels != NULL) || (dollar_label_count == 0));
1581 
1582   for (i = dollar_labels; i < dollar_labels + dollar_label_count; ++i)
1583     if (*i == label)
1584       return dollar_label_defines[i - dollar_labels];
1585 
1586   /* If we get here, label isn't defined.  */
1587   return 0;
1588 }
1589 
1590 static long
dollar_label_instance(long label)1591 dollar_label_instance (long label)
1592 {
1593   long *i;
1594 
1595   know ((dollar_labels != NULL) || (dollar_label_count == 0));
1596 
1597   for (i = dollar_labels; i < dollar_labels + dollar_label_count; ++i)
1598     if (*i == label)
1599       return (dollar_label_instances[i - dollar_labels]);
1600 
1601   /* If we get here, we haven't seen the label before.
1602      Therefore its instance count is zero.  */
1603   return 0;
1604 }
1605 
1606 void
dollar_label_clear(void)1607 dollar_label_clear (void)
1608 {
1609   memset (dollar_label_defines, '\0', (unsigned int) dollar_label_count);
1610 }
1611 
1612 #define DOLLAR_LABEL_BUMP_BY 10
1613 
1614 void
define_dollar_label(long label)1615 define_dollar_label (long label)
1616 {
1617   long *i;
1618 
1619   for (i = dollar_labels; i < dollar_labels + dollar_label_count; ++i)
1620     if (*i == label)
1621       {
1622 	++dollar_label_instances[i - dollar_labels];
1623 	dollar_label_defines[i - dollar_labels] = 1;
1624 	return;
1625       }
1626 
1627   /* If we get to here, we don't have label listed yet.  */
1628 
1629   if (dollar_labels == NULL)
1630     {
1631       dollar_labels = (long *) xmalloc (DOLLAR_LABEL_BUMP_BY * sizeof (long));
1632       dollar_label_instances = (long *) xmalloc (DOLLAR_LABEL_BUMP_BY * sizeof (long));
1633       dollar_label_defines = (char *) xmalloc (DOLLAR_LABEL_BUMP_BY);
1634       dollar_label_max = DOLLAR_LABEL_BUMP_BY;
1635       dollar_label_count = 0;
1636     }
1637   else if (dollar_label_count == dollar_label_max)
1638     {
1639       dollar_label_max += DOLLAR_LABEL_BUMP_BY;
1640       dollar_labels = (long *) xrealloc ((char *) dollar_labels,
1641 					 dollar_label_max * sizeof (long));
1642       dollar_label_instances = (long *) xrealloc ((char *) dollar_label_instances,
1643 					  dollar_label_max * sizeof (long));
1644       dollar_label_defines = (char *) xrealloc (dollar_label_defines, dollar_label_max);
1645     }				/* if we needed to grow  */
1646 
1647   dollar_labels[dollar_label_count] = label;
1648   dollar_label_instances[dollar_label_count] = 1;
1649   dollar_label_defines[dollar_label_count] = 1;
1650   ++dollar_label_count;
1651 }
1652 
1653 /* Caller must copy returned name: we re-use the area for the next name.
1654 
1655    The mth occurence of label n: is turned into the symbol "Ln^Am"
1656    where n is the label number and m is the instance number. "L" makes
1657    it a label discarded unless debugging and "^A"('\1') ensures no
1658    ordinary symbol SHOULD get the same name as a local label
1659    symbol. The first "4:" is "L4^A1" - the m numbers begin at 1.
1660 
1661    fb labels get the same treatment, except that ^B is used in place
1662    of ^A.  */
1663 
1664 char *				/* Return local label name.  */
dollar_label_name(long n,int augend)1665 dollar_label_name (long n,	/* we just saw "n$:" : n a number.  */
1666 		   int augend	/* 0 for current instance, 1 for new instance.  */)
1667 {
1668   long i;
1669   /* Returned to caller, then copied.  Used for created names ("4f").  */
1670   static char symbol_name_build[24];
1671   char *p;
1672   char *q;
1673   char symbol_name_temporary[20];	/* Build up a number, BACKWARDS.  */
1674 
1675   know (n >= 0);
1676   know (augend == 0 || augend == 1);
1677   p = symbol_name_build;
1678 #ifdef LOCAL_LABEL_PREFIX
1679   *p++ = LOCAL_LABEL_PREFIX;
1680 #endif
1681   *p++ = 'L';
1682 
1683   /* Next code just does sprintf( {}, "%d", n);  */
1684   /* Label number.  */
1685   q = symbol_name_temporary;
1686   for (*q++ = 0, i = n; i; ++q)
1687     {
1688       *q = i % 10 + '0';
1689       i /= 10;
1690     }
1691   while ((*p = *--q) != '\0')
1692     ++p;
1693 
1694   *p++ = DOLLAR_LABEL_CHAR;		/* ^A  */
1695 
1696   /* Instance number.  */
1697   q = symbol_name_temporary;
1698   for (*q++ = 0, i = dollar_label_instance (n) + augend; i; ++q)
1699     {
1700       *q = i % 10 + '0';
1701       i /= 10;
1702     }
1703   while ((*p++ = *--q) != '\0');
1704 
1705   /* The label, as a '\0' ended string, starts at symbol_name_build.  */
1706   return symbol_name_build;
1707 }
1708 
1709 /* Somebody else's idea of local labels. They are made by "n:" where n
1710    is any decimal digit. Refer to them with
1711     "nb" for previous (backward) n:
1712    or "nf" for next (forward) n:.
1713 
1714    We do a little better and let n be any number, not just a single digit, but
1715    since the other guy's assembler only does ten, we treat the first ten
1716    specially.
1717 
1718    Like someone else's assembler, we have one set of local label counters for
1719    entire assembly, not one set per (sub)segment like in most assemblers. This
1720    implies that one can refer to a label in another segment, and indeed some
1721    crufty compilers have done just that.
1722 
1723    Since there could be a LOT of these things, treat them as a sparse
1724    array.  */
1725 
1726 #define FB_LABEL_SPECIAL (10)
1727 
1728 static long fb_low_counter[FB_LABEL_SPECIAL];
1729 static long *fb_labels;
1730 static long *fb_label_instances;
1731 static long fb_label_count;
1732 static long fb_label_max;
1733 
1734 /* This must be more than FB_LABEL_SPECIAL.  */
1735 #define FB_LABEL_BUMP_BY (FB_LABEL_SPECIAL + 6)
1736 
1737 static void
fb_label_init(void)1738 fb_label_init (void)
1739 {
1740   memset ((void *) fb_low_counter, '\0', sizeof (fb_low_counter));
1741 }
1742 
1743 /* Add one to the instance number of this fb label.  */
1744 
1745 void
fb_label_instance_inc(long label)1746 fb_label_instance_inc (long label)
1747 {
1748   long *i;
1749 
1750   if ((unsigned long) label < FB_LABEL_SPECIAL)
1751     {
1752       ++fb_low_counter[label];
1753       return;
1754     }
1755 
1756   if (fb_labels != NULL)
1757     {
1758       for (i = fb_labels + FB_LABEL_SPECIAL;
1759 	   i < fb_labels + fb_label_count; ++i)
1760 	{
1761 	  if (*i == label)
1762 	    {
1763 	      ++fb_label_instances[i - fb_labels];
1764 	      return;
1765 	    }			/* if we find it  */
1766 	}			/* for each existing label  */
1767     }
1768 
1769   /* If we get to here, we don't have label listed yet.  */
1770 
1771   if (fb_labels == NULL)
1772     {
1773       fb_labels = (long *) xmalloc (FB_LABEL_BUMP_BY * sizeof (long));
1774       fb_label_instances = (long *) xmalloc (FB_LABEL_BUMP_BY * sizeof (long));
1775       fb_label_max = FB_LABEL_BUMP_BY;
1776       fb_label_count = FB_LABEL_SPECIAL;
1777 
1778     }
1779   else if (fb_label_count == fb_label_max)
1780     {
1781       fb_label_max += FB_LABEL_BUMP_BY;
1782       fb_labels = (long *) xrealloc ((char *) fb_labels,
1783 				     fb_label_max * sizeof (long));
1784       fb_label_instances = (long *) xrealloc ((char *) fb_label_instances,
1785 					      fb_label_max * sizeof (long));
1786     }				/* if we needed to grow  */
1787 
1788   fb_labels[fb_label_count] = label;
1789   fb_label_instances[fb_label_count] = 1;
1790   ++fb_label_count;
1791 }
1792 
1793 static long
fb_label_instance(long label)1794 fb_label_instance (long label)
1795 {
1796   long *i;
1797 
1798   if ((unsigned long) label < FB_LABEL_SPECIAL)
1799     {
1800       return (fb_low_counter[label]);
1801     }
1802 
1803   if (fb_labels != NULL)
1804     {
1805       for (i = fb_labels + FB_LABEL_SPECIAL;
1806 	   i < fb_labels + fb_label_count; ++i)
1807 	{
1808 	  if (*i == label)
1809 	    {
1810 	      return (fb_label_instances[i - fb_labels]);
1811 	    }			/* if we find it  */
1812 	}			/* for each existing label  */
1813     }
1814 
1815   /* We didn't find the label, so this must be a reference to the
1816      first instance.  */
1817   return 0;
1818 }
1819 
1820 /* Caller must copy returned name: we re-use the area for the next name.
1821 
1822    The mth occurence of label n: is turned into the symbol "Ln^Bm"
1823    where n is the label number and m is the instance number. "L" makes
1824    it a label discarded unless debugging and "^B"('\2') ensures no
1825    ordinary symbol SHOULD get the same name as a local label
1826    symbol. The first "4:" is "L4^B1" - the m numbers begin at 1.
1827 
1828    dollar labels get the same treatment, except that ^A is used in
1829    place of ^B.  */
1830 
1831 char *				/* Return local label name.  */
fb_label_name(long n,long augend)1832 fb_label_name (long n,	/* We just saw "n:", "nf" or "nb" : n a number.  */
1833 	       long augend	/* 0 for nb, 1 for n:, nf.  */)
1834 {
1835   long i;
1836   /* Returned to caller, then copied.  Used for created names ("4f").  */
1837   static char symbol_name_build[24];
1838   char *p;
1839   char *q;
1840   char symbol_name_temporary[20];	/* Build up a number, BACKWARDS.  */
1841 
1842   know (n >= 0);
1843 #ifdef TC_MMIX
1844   know ((unsigned long) augend <= 2 /* See mmix_fb_label.  */);
1845 #else
1846   know ((unsigned long) augend <= 1);
1847 #endif
1848   p = symbol_name_build;
1849 #ifdef LOCAL_LABEL_PREFIX
1850   *p++ = LOCAL_LABEL_PREFIX;
1851 #endif
1852   *p++ = 'L';
1853 
1854   /* Next code just does sprintf( {}, "%d", n);  */
1855   /* Label number.  */
1856   q = symbol_name_temporary;
1857   for (*q++ = 0, i = n; i; ++q)
1858     {
1859       *q = i % 10 + '0';
1860       i /= 10;
1861     }
1862   while ((*p = *--q) != '\0')
1863     ++p;
1864 
1865   *p++ = LOCAL_LABEL_CHAR;		/* ^B  */
1866 
1867   /* Instance number.  */
1868   q = symbol_name_temporary;
1869   for (*q++ = 0, i = fb_label_instance (n) + augend; i; ++q)
1870     {
1871       *q = i % 10 + '0';
1872       i /= 10;
1873     }
1874   while ((*p++ = *--q) != '\0');
1875 
1876   /* The label, as a '\0' ended string, starts at symbol_name_build.  */
1877   return (symbol_name_build);
1878 }
1879 
1880 /* Decode name that may have been generated by foo_label_name() above.
1881    If the name wasn't generated by foo_label_name(), then return it
1882    unaltered.  This is used for error messages.  */
1883 
1884 char *
decode_local_label_name(char * s)1885 decode_local_label_name (char *s)
1886 {
1887   char *p;
1888   char *symbol_decode;
1889   int label_number;
1890   int instance_number;
1891   char *type;
1892   const char *message_format;
1893   int lindex = 0;
1894 
1895 #ifdef LOCAL_LABEL_PREFIX
1896   if (s[lindex] == LOCAL_LABEL_PREFIX)
1897     ++lindex;
1898 #endif
1899 
1900   if (s[lindex] != 'L')
1901     return s;
1902 
1903   for (label_number = 0, p = s + lindex + 1; ISDIGIT (*p); ++p)
1904     label_number = (10 * label_number) + *p - '0';
1905 
1906   if (*p == DOLLAR_LABEL_CHAR)
1907     type = "dollar";
1908   else if (*p == LOCAL_LABEL_CHAR)
1909     type = "fb";
1910   else
1911     return s;
1912 
1913   for (instance_number = 0, p++; ISDIGIT (*p); ++p)
1914     instance_number = (10 * instance_number) + *p - '0';
1915 
1916   message_format = _("\"%d\" (instance number %d of a %s label)");
1917   symbol_decode = (char *) obstack_alloc (&notes, strlen (message_format) + 30);
1918   sprintf (symbol_decode, message_format, label_number, instance_number, type);
1919 
1920   return symbol_decode;
1921 }
1922 
1923 /* Get the value of a symbol.  */
1924 
1925 valueT
S_GET_VALUE(symbolS * s)1926 S_GET_VALUE (symbolS *s)
1927 {
1928   if (LOCAL_SYMBOL_CHECK (s))
1929     return resolve_symbol_value (s);
1930 
1931   if (!s->sy_flags.sy_resolved)
1932     {
1933       valueT val = resolve_symbol_value (s);
1934       if (!finalize_syms)
1935 	return val;
1936     }
1937   if (S_IS_WEAKREFR (s))
1938     return S_GET_VALUE (s->sy_value.X_add_symbol);
1939 
1940   if (s->sy_value.X_op != O_constant)
1941     {
1942       if (! s->sy_flags.sy_resolved
1943 	  || s->sy_value.X_op != O_symbol
1944 	  || (S_IS_DEFINED (s) && ! S_IS_COMMON (s)))
1945 	as_bad (_("attempt to get value of unresolved symbol `%s'"),
1946 		S_GET_NAME (s));
1947     }
1948   return (valueT) s->sy_value.X_add_number;
1949 }
1950 
1951 /* Set the value of a symbol.  */
1952 
1953 void
S_SET_VALUE(symbolS * s,valueT val)1954 S_SET_VALUE (symbolS *s, valueT val)
1955 {
1956   if (LOCAL_SYMBOL_CHECK (s))
1957     {
1958       ((struct local_symbol *) s)->lsy_value = val;
1959       return;
1960     }
1961 
1962   s->sy_value.X_op = O_constant;
1963   s->sy_value.X_add_number = (offsetT) val;
1964   s->sy_value.X_unsigned = 0;
1965   S_CLEAR_WEAKREFR (s);
1966 }
1967 
1968 void
copy_symbol_attributes(symbolS * dest,symbolS * src)1969 copy_symbol_attributes (symbolS *dest, symbolS *src)
1970 {
1971   if (LOCAL_SYMBOL_CHECK (dest))
1972     dest = local_symbol_convert ((struct local_symbol *) dest);
1973   if (LOCAL_SYMBOL_CHECK (src))
1974     src = local_symbol_convert ((struct local_symbol *) src);
1975 
1976   /* In an expression, transfer the settings of these flags.
1977      The user can override later, of course.  */
1978 #define COPIED_SYMFLAGS	(BSF_FUNCTION | BSF_OBJECT \
1979 			 | BSF_GNU_INDIRECT_FUNCTION)
1980   dest->bsym->flags |= src->bsym->flags & COPIED_SYMFLAGS;
1981 
1982 #ifdef OBJ_COPY_SYMBOL_ATTRIBUTES
1983   OBJ_COPY_SYMBOL_ATTRIBUTES (dest, src);
1984 #endif
1985 
1986 #ifdef TC_COPY_SYMBOL_ATTRIBUTES
1987   TC_COPY_SYMBOL_ATTRIBUTES (dest, src);
1988 #endif
1989 }
1990 
1991 int
S_IS_FUNCTION(symbolS * s)1992 S_IS_FUNCTION (symbolS *s)
1993 {
1994   flagword flags;
1995 
1996   if (LOCAL_SYMBOL_CHECK (s))
1997     return 0;
1998 
1999   flags = s->bsym->flags;
2000 
2001   return (flags & BSF_FUNCTION) != 0;
2002 }
2003 
2004 int
S_IS_EXTERNAL(symbolS * s)2005 S_IS_EXTERNAL (symbolS *s)
2006 {
2007   flagword flags;
2008 
2009   if (LOCAL_SYMBOL_CHECK (s))
2010     return 0;
2011 
2012   flags = s->bsym->flags;
2013 
2014   /* Sanity check.  */
2015   if ((flags & BSF_LOCAL) && (flags & BSF_GLOBAL))
2016     abort ();
2017 
2018   return (flags & BSF_GLOBAL) != 0;
2019 }
2020 
2021 int
S_IS_WEAK(symbolS * s)2022 S_IS_WEAK (symbolS *s)
2023 {
2024   if (LOCAL_SYMBOL_CHECK (s))
2025     return 0;
2026   /* Conceptually, a weakrefr is weak if the referenced symbol is.  We
2027      could probably handle a WEAKREFR as always weak though.  E.g., if
2028      the referenced symbol has lost its weak status, there's no reason
2029      to keep handling the weakrefr as if it was weak.  */
2030   if (S_IS_WEAKREFR (s))
2031     return S_IS_WEAK (s->sy_value.X_add_symbol);
2032   return (s->bsym->flags & BSF_WEAK) != 0;
2033 }
2034 
2035 int
S_IS_WEAKREFR(symbolS * s)2036 S_IS_WEAKREFR (symbolS *s)
2037 {
2038   if (LOCAL_SYMBOL_CHECK (s))
2039     return 0;
2040   return s->sy_flags.sy_weakrefr != 0;
2041 }
2042 
2043 int
S_IS_WEAKREFD(symbolS * s)2044 S_IS_WEAKREFD (symbolS *s)
2045 {
2046   if (LOCAL_SYMBOL_CHECK (s))
2047     return 0;
2048   return s->sy_flags.sy_weakrefd != 0;
2049 }
2050 
2051 int
S_IS_COMMON(symbolS * s)2052 S_IS_COMMON (symbolS *s)
2053 {
2054   if (LOCAL_SYMBOL_CHECK (s))
2055     return 0;
2056   return bfd_is_com_section (s->bsym->section);
2057 }
2058 
2059 int
S_IS_DEFINED(symbolS * s)2060 S_IS_DEFINED (symbolS *s)
2061 {
2062   if (LOCAL_SYMBOL_CHECK (s))
2063     return ((struct local_symbol *) s)->lsy_section != undefined_section;
2064   return s->bsym->section != undefined_section;
2065 }
2066 
2067 
2068 #ifndef EXTERN_FORCE_RELOC
2069 #define EXTERN_FORCE_RELOC IS_ELF
2070 #endif
2071 
2072 /* Return true for symbols that should not be reduced to section
2073    symbols or eliminated from expressions, because they may be
2074    overridden by the linker.  */
2075 int
S_FORCE_RELOC(symbolS * s,int strict)2076 S_FORCE_RELOC (symbolS *s, int strict)
2077 {
2078   if (LOCAL_SYMBOL_CHECK (s))
2079     return ((struct local_symbol *) s)->lsy_section == undefined_section;
2080 
2081   return ((strict
2082 	   && ((s->bsym->flags & BSF_WEAK) != 0
2083 	       || (EXTERN_FORCE_RELOC
2084 		   && (s->bsym->flags & BSF_GLOBAL) != 0)))
2085 	  || (s->bsym->flags & BSF_GNU_INDIRECT_FUNCTION) != 0
2086 	  || s->bsym->section == undefined_section
2087 	  || bfd_is_com_section (s->bsym->section));
2088 }
2089 
2090 int
S_IS_DEBUG(symbolS * s)2091 S_IS_DEBUG (symbolS *s)
2092 {
2093   if (LOCAL_SYMBOL_CHECK (s))
2094     return 0;
2095   if (s->bsym->flags & BSF_DEBUGGING)
2096     return 1;
2097   return 0;
2098 }
2099 
2100 int
S_IS_LOCAL(symbolS * s)2101 S_IS_LOCAL (symbolS *s)
2102 {
2103   flagword flags;
2104   const char *name;
2105 
2106   if (LOCAL_SYMBOL_CHECK (s))
2107     return 1;
2108 
2109   flags = s->bsym->flags;
2110 
2111   /* Sanity check.  */
2112   if ((flags & BSF_LOCAL) && (flags & BSF_GLOBAL))
2113     abort ();
2114 
2115   if (bfd_get_section (s->bsym) == reg_section)
2116     return 1;
2117 
2118   if (flag_strip_local_absolute
2119       /* Keep BSF_FILE symbols in order to allow debuggers to identify
2120 	 the source file even when the object file is stripped.  */
2121       && (flags & (BSF_GLOBAL | BSF_FILE)) == 0
2122       && bfd_get_section (s->bsym) == absolute_section)
2123     return 1;
2124 
2125   name = S_GET_NAME (s);
2126   return (name != NULL
2127 	  && ! S_IS_DEBUG (s)
2128 	  && (strchr (name, DOLLAR_LABEL_CHAR)
2129 	      || strchr (name, LOCAL_LABEL_CHAR)
2130 	      || TC_LABEL_IS_LOCAL (name)
2131 	      || (! flag_keep_locals
2132 		  && (bfd_is_local_label (stdoutput, s->bsym)
2133 		      || (flag_mri
2134 			  && name[0] == '?'
2135 			  && name[1] == '?')))));
2136 }
2137 
2138 int
S_IS_STABD(symbolS * s)2139 S_IS_STABD (symbolS *s)
2140 {
2141   return S_GET_NAME (s) == 0;
2142 }
2143 
2144 int
S_CAN_BE_REDEFINED(const symbolS * s)2145 S_CAN_BE_REDEFINED (const symbolS *s)
2146 {
2147   if (LOCAL_SYMBOL_CHECK (s))
2148     return (local_symbol_get_frag ((struct local_symbol *) s)
2149 	    == &predefined_address_frag);
2150   /* Permit register names to be redefined.  */
2151   return s->bsym->section == reg_section;
2152 }
2153 
2154 int
S_IS_VOLATILE(const symbolS * s)2155 S_IS_VOLATILE (const symbolS *s)
2156 {
2157   if (LOCAL_SYMBOL_CHECK (s))
2158     return 0;
2159   return s->sy_flags.sy_volatile;
2160 }
2161 
2162 int
S_IS_FORWARD_REF(const symbolS * s)2163 S_IS_FORWARD_REF (const symbolS *s)
2164 {
2165   if (LOCAL_SYMBOL_CHECK (s))
2166     return 0;
2167   return s->sy_flags.sy_forward_ref;
2168 }
2169 
2170 const char *
S_GET_NAME(symbolS * s)2171 S_GET_NAME (symbolS *s)
2172 {
2173   if (LOCAL_SYMBOL_CHECK (s))
2174     return ((struct local_symbol *) s)->lsy_name;
2175   return s->bsym->name;
2176 }
2177 
2178 segT
S_GET_SEGMENT(symbolS * s)2179 S_GET_SEGMENT (symbolS *s)
2180 {
2181   if (LOCAL_SYMBOL_CHECK (s))
2182     return ((struct local_symbol *) s)->lsy_section;
2183   return s->bsym->section;
2184 }
2185 
2186 void
S_SET_SEGMENT(symbolS * s,segT seg)2187 S_SET_SEGMENT (symbolS *s, segT seg)
2188 {
2189   /* Don't reassign section symbols.  The direct reason is to prevent seg
2190      faults assigning back to const global symbols such as *ABS*, but it
2191      shouldn't happen anyway.  */
2192 
2193   if (LOCAL_SYMBOL_CHECK (s))
2194     {
2195       if (seg == reg_section)
2196 	s = local_symbol_convert ((struct local_symbol *) s);
2197       else
2198 	{
2199 	  ((struct local_symbol *) s)->lsy_section = seg;
2200 	  return;
2201 	}
2202     }
2203 
2204   if (s->bsym->flags & BSF_SECTION_SYM)
2205     {
2206       if (s->bsym->section != seg)
2207 	abort ();
2208     }
2209   else
2210     s->bsym->section = seg;
2211 }
2212 
2213 void
S_SET_EXTERNAL(symbolS * s)2214 S_SET_EXTERNAL (symbolS *s)
2215 {
2216   if (LOCAL_SYMBOL_CHECK (s))
2217     s = local_symbol_convert ((struct local_symbol *) s);
2218   if ((s->bsym->flags & BSF_WEAK) != 0)
2219     {
2220       /* Let .weak override .global.  */
2221       return;
2222     }
2223   if (s->bsym->flags & BSF_SECTION_SYM)
2224     {
2225       char * file;
2226       unsigned int line;
2227 
2228       /* Do not reassign section symbols.  */
2229       as_where (& file, & line);
2230       as_warn_where (file, line,
2231 		     _("section symbols are already global"));
2232       return;
2233     }
2234 #ifndef TC_GLOBAL_REGISTER_SYMBOL_OK
2235   if (S_GET_SEGMENT (s) == reg_section)
2236     {
2237       as_bad ("can't make register symbol `%s' global",
2238 	      S_GET_NAME (s));
2239       return;
2240     }
2241 #endif
2242   s->bsym->flags |= BSF_GLOBAL;
2243   s->bsym->flags &= ~(BSF_LOCAL | BSF_WEAK);
2244 
2245 #ifdef TE_PE
2246   if (! an_external_name && S_GET_NAME(s)[0] != '.')
2247     an_external_name = S_GET_NAME (s);
2248 #endif
2249 }
2250 
2251 void
S_CLEAR_EXTERNAL(symbolS * s)2252 S_CLEAR_EXTERNAL (symbolS *s)
2253 {
2254   if (LOCAL_SYMBOL_CHECK (s))
2255     return;
2256   if ((s->bsym->flags & BSF_WEAK) != 0)
2257     {
2258       /* Let .weak override.  */
2259       return;
2260     }
2261   s->bsym->flags |= BSF_LOCAL;
2262   s->bsym->flags &= ~(BSF_GLOBAL | BSF_WEAK);
2263 }
2264 
2265 void
S_SET_WEAK(symbolS * s)2266 S_SET_WEAK (symbolS *s)
2267 {
2268   if (LOCAL_SYMBOL_CHECK (s))
2269     s = local_symbol_convert ((struct local_symbol *) s);
2270 #ifdef obj_set_weak_hook
2271   obj_set_weak_hook (s);
2272 #endif
2273   s->bsym->flags |= BSF_WEAK;
2274   s->bsym->flags &= ~(BSF_GLOBAL | BSF_LOCAL);
2275 }
2276 
2277 void
S_SET_WEAKREFR(symbolS * s)2278 S_SET_WEAKREFR (symbolS *s)
2279 {
2280   if (LOCAL_SYMBOL_CHECK (s))
2281     s = local_symbol_convert ((struct local_symbol *) s);
2282   s->sy_flags.sy_weakrefr = 1;
2283   /* If the alias was already used, make sure we mark the target as
2284      used as well, otherwise it might be dropped from the symbol
2285      table.  This may have unintended side effects if the alias is
2286      later redirected to another symbol, such as keeping the unused
2287      previous target in the symbol table.  Since it will be weak, it's
2288      not a big deal.  */
2289   if (s->sy_flags.sy_used)
2290     symbol_mark_used (s->sy_value.X_add_symbol);
2291 }
2292 
2293 void
S_CLEAR_WEAKREFR(symbolS * s)2294 S_CLEAR_WEAKREFR (symbolS *s)
2295 {
2296   if (LOCAL_SYMBOL_CHECK (s))
2297     return;
2298   s->sy_flags.sy_weakrefr = 0;
2299 }
2300 
2301 void
S_SET_WEAKREFD(symbolS * s)2302 S_SET_WEAKREFD (symbolS *s)
2303 {
2304   if (LOCAL_SYMBOL_CHECK (s))
2305     s = local_symbol_convert ((struct local_symbol *) s);
2306   s->sy_flags.sy_weakrefd = 1;
2307   S_SET_WEAK (s);
2308 }
2309 
2310 void
S_CLEAR_WEAKREFD(symbolS * s)2311 S_CLEAR_WEAKREFD (symbolS *s)
2312 {
2313   if (LOCAL_SYMBOL_CHECK (s))
2314     return;
2315   if (s->sy_flags.sy_weakrefd)
2316     {
2317       s->sy_flags.sy_weakrefd = 0;
2318       /* If a weakref target symbol is weak, then it was never
2319 	 referenced directly before, not even in a .global directive,
2320 	 so decay it to local.  If it remains undefined, it will be
2321 	 later turned into a global, like any other undefined
2322 	 symbol.  */
2323       if (s->bsym->flags & BSF_WEAK)
2324 	{
2325 #ifdef obj_clear_weak_hook
2326 	  obj_clear_weak_hook (s);
2327 #endif
2328 	  s->bsym->flags &= ~BSF_WEAK;
2329 	  s->bsym->flags |= BSF_LOCAL;
2330 	}
2331     }
2332 }
2333 
2334 void
S_SET_THREAD_LOCAL(symbolS * s)2335 S_SET_THREAD_LOCAL (symbolS *s)
2336 {
2337   if (LOCAL_SYMBOL_CHECK (s))
2338     s = local_symbol_convert ((struct local_symbol *) s);
2339   if (bfd_is_com_section (s->bsym->section)
2340       && (s->bsym->flags & BSF_THREAD_LOCAL) != 0)
2341     return;
2342   s->bsym->flags |= BSF_THREAD_LOCAL;
2343   if ((s->bsym->flags & BSF_FUNCTION) != 0)
2344     as_bad (_("Accessing function `%s' as thread-local object"),
2345 	    S_GET_NAME (s));
2346   else if (! bfd_is_und_section (s->bsym->section)
2347 	   && (s->bsym->section->flags & SEC_THREAD_LOCAL) == 0)
2348     as_bad (_("Accessing `%s' as thread-local object"),
2349 	    S_GET_NAME (s));
2350 }
2351 
2352 void
S_SET_NAME(symbolS * s,const char * name)2353 S_SET_NAME (symbolS *s, const char *name)
2354 {
2355   if (LOCAL_SYMBOL_CHECK (s))
2356     {
2357       ((struct local_symbol *) s)->lsy_name = name;
2358       return;
2359     }
2360   s->bsym->name = name;
2361 }
2362 
2363 void
S_SET_VOLATILE(symbolS * s)2364 S_SET_VOLATILE (symbolS *s)
2365 {
2366   if (LOCAL_SYMBOL_CHECK (s))
2367     s = local_symbol_convert ((struct local_symbol *) s);
2368   s->sy_flags.sy_volatile = 1;
2369 }
2370 
2371 void
S_CLEAR_VOLATILE(symbolS * s)2372 S_CLEAR_VOLATILE (symbolS *s)
2373 {
2374   if (!LOCAL_SYMBOL_CHECK (s))
2375     s->sy_flags.sy_volatile = 0;
2376 }
2377 
2378 void
S_SET_FORWARD_REF(symbolS * s)2379 S_SET_FORWARD_REF (symbolS *s)
2380 {
2381   if (LOCAL_SYMBOL_CHECK (s))
2382     s = local_symbol_convert ((struct local_symbol *) s);
2383   s->sy_flags.sy_forward_ref = 1;
2384 }
2385 
2386 /* Return the previous symbol in a chain.  */
2387 
2388 symbolS *
symbol_previous(symbolS * s)2389 symbol_previous (symbolS *s)
2390 {
2391   if (LOCAL_SYMBOL_CHECK (s))
2392     abort ();
2393   return s->sy_previous;
2394 }
2395 
2396 /* Return the next symbol in a chain.  */
2397 
2398 symbolS *
symbol_next(symbolS * s)2399 symbol_next (symbolS *s)
2400 {
2401   if (LOCAL_SYMBOL_CHECK (s))
2402     abort ();
2403   return s->sy_next;
2404 }
2405 
2406 /* Return a pointer to the value of a symbol as an expression.  */
2407 
2408 expressionS *
symbol_get_value_expression(symbolS * s)2409 symbol_get_value_expression (symbolS *s)
2410 {
2411   if (LOCAL_SYMBOL_CHECK (s))
2412     s = local_symbol_convert ((struct local_symbol *) s);
2413   return &s->sy_value;
2414 }
2415 
2416 /* Set the value of a symbol to an expression.  */
2417 
2418 void
symbol_set_value_expression(symbolS * s,const expressionS * exp)2419 symbol_set_value_expression (symbolS *s, const expressionS *exp)
2420 {
2421   if (LOCAL_SYMBOL_CHECK (s))
2422     s = local_symbol_convert ((struct local_symbol *) s);
2423   s->sy_value = *exp;
2424   S_CLEAR_WEAKREFR (s);
2425 }
2426 
2427 /* Return whether 2 symbols are the same.  */
2428 
2429 int
symbol_same_p(symbolS * s1,symbolS * s2)2430 symbol_same_p (symbolS *s1, symbolS *s2)
2431 {
2432   if (s1->sy_flags.sy_local_symbol
2433       && local_symbol_converted_p ((struct local_symbol *) s1))
2434     s1 = local_symbol_get_real_symbol ((struct local_symbol *) s1);
2435   if (s2->sy_flags.sy_local_symbol
2436       && local_symbol_converted_p ((struct local_symbol *) s2))
2437     s2 = local_symbol_get_real_symbol ((struct local_symbol *) s2);
2438   return s1 == s2;
2439 }
2440 
2441 /* Return a pointer to the X_add_number component of a symbol.  */
2442 
2443 offsetT *
symbol_X_add_number(symbolS * s)2444 symbol_X_add_number (symbolS *s)
2445 {
2446   if (LOCAL_SYMBOL_CHECK (s))
2447     return (offsetT *) &((struct local_symbol *) s)->lsy_value;
2448 
2449   return &s->sy_value.X_add_number;
2450 }
2451 
2452 /* Set the value of SYM to the current position in the current segment.  */
2453 
2454 void
symbol_set_value_now(symbolS * sym)2455 symbol_set_value_now (symbolS *sym)
2456 {
2457   S_SET_SEGMENT (sym, now_seg);
2458   S_SET_VALUE (sym, frag_now_fix ());
2459   symbol_set_frag (sym, frag_now);
2460 }
2461 
2462 /* Set the frag of a symbol.  */
2463 
2464 void
symbol_set_frag(symbolS * s,fragS * f)2465 symbol_set_frag (symbolS *s, fragS *f)
2466 {
2467   if (LOCAL_SYMBOL_CHECK (s))
2468     {
2469       local_symbol_set_frag ((struct local_symbol *) s, f);
2470       return;
2471     }
2472   s->sy_frag = f;
2473   S_CLEAR_WEAKREFR (s);
2474 }
2475 
2476 /* Return the frag of a symbol.  */
2477 
2478 fragS *
symbol_get_frag(symbolS * s)2479 symbol_get_frag (symbolS *s)
2480 {
2481   if (LOCAL_SYMBOL_CHECK (s))
2482     return local_symbol_get_frag ((struct local_symbol *) s);
2483   return s->sy_frag;
2484 }
2485 
2486 /* Mark a symbol as having been used.  */
2487 
2488 void
symbol_mark_used(symbolS * s)2489 symbol_mark_used (symbolS *s)
2490 {
2491   if (LOCAL_SYMBOL_CHECK (s))
2492     return;
2493   s->sy_flags.sy_used = 1;
2494   if (S_IS_WEAKREFR (s))
2495     symbol_mark_used (s->sy_value.X_add_symbol);
2496 }
2497 
2498 /* Clear the mark of whether a symbol has been used.  */
2499 
2500 void
symbol_clear_used(symbolS * s)2501 symbol_clear_used (symbolS *s)
2502 {
2503   if (LOCAL_SYMBOL_CHECK (s))
2504     s = local_symbol_convert ((struct local_symbol *) s);
2505   s->sy_flags.sy_used = 0;
2506 }
2507 
2508 /* Return whether a symbol has been used.  */
2509 
2510 int
symbol_used_p(symbolS * s)2511 symbol_used_p (symbolS *s)
2512 {
2513   if (LOCAL_SYMBOL_CHECK (s))
2514     return 1;
2515   return s->sy_flags.sy_used;
2516 }
2517 
2518 /* Mark a symbol as having been used in a reloc.  */
2519 
2520 void
symbol_mark_used_in_reloc(symbolS * s)2521 symbol_mark_used_in_reloc (symbolS *s)
2522 {
2523   if (LOCAL_SYMBOL_CHECK (s))
2524     s = local_symbol_convert ((struct local_symbol *) s);
2525   s->sy_flags.sy_used_in_reloc = 1;
2526 }
2527 
2528 /* Clear the mark of whether a symbol has been used in a reloc.  */
2529 
2530 void
symbol_clear_used_in_reloc(symbolS * s)2531 symbol_clear_used_in_reloc (symbolS *s)
2532 {
2533   if (LOCAL_SYMBOL_CHECK (s))
2534     return;
2535   s->sy_flags.sy_used_in_reloc = 0;
2536 }
2537 
2538 /* Return whether a symbol has been used in a reloc.  */
2539 
2540 int
symbol_used_in_reloc_p(symbolS * s)2541 symbol_used_in_reloc_p (symbolS *s)
2542 {
2543   if (LOCAL_SYMBOL_CHECK (s))
2544     return 0;
2545   return s->sy_flags.sy_used_in_reloc;
2546 }
2547 
2548 /* Mark a symbol as an MRI common symbol.  */
2549 
2550 void
symbol_mark_mri_common(symbolS * s)2551 symbol_mark_mri_common (symbolS *s)
2552 {
2553   if (LOCAL_SYMBOL_CHECK (s))
2554     s = local_symbol_convert ((struct local_symbol *) s);
2555   s->sy_flags.sy_mri_common = 1;
2556 }
2557 
2558 /* Clear the mark of whether a symbol is an MRI common symbol.  */
2559 
2560 void
symbol_clear_mri_common(symbolS * s)2561 symbol_clear_mri_common (symbolS *s)
2562 {
2563   if (LOCAL_SYMBOL_CHECK (s))
2564     return;
2565   s->sy_flags.sy_mri_common = 0;
2566 }
2567 
2568 /* Return whether a symbol is an MRI common symbol.  */
2569 
2570 int
symbol_mri_common_p(symbolS * s)2571 symbol_mri_common_p (symbolS *s)
2572 {
2573   if (LOCAL_SYMBOL_CHECK (s))
2574     return 0;
2575   return s->sy_flags.sy_mri_common;
2576 }
2577 
2578 /* Mark a symbol as having been written.  */
2579 
2580 void
symbol_mark_written(symbolS * s)2581 symbol_mark_written (symbolS *s)
2582 {
2583   if (LOCAL_SYMBOL_CHECK (s))
2584     return;
2585   s->sy_flags.sy_written = 1;
2586 }
2587 
2588 /* Clear the mark of whether a symbol has been written.  */
2589 
2590 void
symbol_clear_written(symbolS * s)2591 symbol_clear_written (symbolS *s)
2592 {
2593   if (LOCAL_SYMBOL_CHECK (s))
2594     return;
2595   s->sy_flags.sy_written = 0;
2596 }
2597 
2598 /* Return whether a symbol has been written.  */
2599 
2600 int
symbol_written_p(symbolS * s)2601 symbol_written_p (symbolS *s)
2602 {
2603   if (LOCAL_SYMBOL_CHECK (s))
2604     return 0;
2605   return s->sy_flags.sy_written;
2606 }
2607 
2608 /* Mark a symbol has having been resolved.  */
2609 
2610 void
symbol_mark_resolved(symbolS * s)2611 symbol_mark_resolved (symbolS *s)
2612 {
2613   if (LOCAL_SYMBOL_CHECK (s))
2614     {
2615       local_symbol_mark_resolved ((struct local_symbol *) s);
2616       return;
2617     }
2618   s->sy_flags.sy_resolved = 1;
2619 }
2620 
2621 /* Return whether a symbol has been resolved.  */
2622 
2623 int
symbol_resolved_p(symbolS * s)2624 symbol_resolved_p (symbolS *s)
2625 {
2626   if (LOCAL_SYMBOL_CHECK (s))
2627     return local_symbol_resolved_p ((struct local_symbol *) s);
2628   return s->sy_flags.sy_resolved;
2629 }
2630 
2631 /* Return whether a symbol is a section symbol.  */
2632 
2633 int
symbol_section_p(symbolS * s ATTRIBUTE_UNUSED)2634 symbol_section_p (symbolS *s ATTRIBUTE_UNUSED)
2635 {
2636   if (LOCAL_SYMBOL_CHECK (s))
2637     return 0;
2638   return (s->bsym->flags & BSF_SECTION_SYM) != 0;
2639 }
2640 
2641 /* Return whether a symbol is equated to another symbol.  */
2642 
2643 int
symbol_equated_p(symbolS * s)2644 symbol_equated_p (symbolS *s)
2645 {
2646   if (LOCAL_SYMBOL_CHECK (s))
2647     return 0;
2648   return s->sy_value.X_op == O_symbol;
2649 }
2650 
2651 /* Return whether a symbol is equated to another symbol, and should be
2652    treated specially when writing out relocs.  */
2653 
2654 int
symbol_equated_reloc_p(symbolS * s)2655 symbol_equated_reloc_p (symbolS *s)
2656 {
2657   if (LOCAL_SYMBOL_CHECK (s))
2658     return 0;
2659   /* X_op_symbol, normally not used for O_symbol, is set by
2660      resolve_symbol_value to flag expression syms that have been
2661      equated.  */
2662   return (s->sy_value.X_op == O_symbol
2663 #if defined (OBJ_COFF) && defined (TE_PE)
2664 	  && ! S_IS_WEAK (s)
2665 #endif
2666 	  && ((s->sy_flags.sy_resolved && s->sy_value.X_op_symbol != NULL)
2667 	      || ! S_IS_DEFINED (s)
2668 	      || S_IS_COMMON (s)));
2669 }
2670 
2671 /* Return whether a symbol has a constant value.  */
2672 
2673 int
symbol_constant_p(symbolS * s)2674 symbol_constant_p (symbolS *s)
2675 {
2676   if (LOCAL_SYMBOL_CHECK (s))
2677     return 1;
2678   return s->sy_value.X_op == O_constant;
2679 }
2680 
2681 /* Return whether a symbol was cloned and thus removed from the global
2682    symbol list.  */
2683 
2684 int
symbol_shadow_p(symbolS * s)2685 symbol_shadow_p (symbolS *s)
2686 {
2687   if (LOCAL_SYMBOL_CHECK (s))
2688     return 0;
2689   return s->sy_next == s;
2690 }
2691 
2692 /* Return the BFD symbol for a symbol.  */
2693 
2694 asymbol *
symbol_get_bfdsym(symbolS * s)2695 symbol_get_bfdsym (symbolS *s)
2696 {
2697   if (LOCAL_SYMBOL_CHECK (s))
2698     s = local_symbol_convert ((struct local_symbol *) s);
2699   return s->bsym;
2700 }
2701 
2702 /* Set the BFD symbol for a symbol.  */
2703 
2704 void
symbol_set_bfdsym(symbolS * s,asymbol * bsym)2705 symbol_set_bfdsym (symbolS *s, asymbol *bsym)
2706 {
2707   if (LOCAL_SYMBOL_CHECK (s))
2708     s = local_symbol_convert ((struct local_symbol *) s);
2709   /* Usually, it is harmless to reset a symbol to a BFD section
2710      symbol. For example, obj_elf_change_section sets the BFD symbol
2711      of an old symbol with the newly created section symbol. But when
2712      we have multiple sections with the same name, the newly created
2713      section may have the same name as an old section. We check if the
2714      old symbol has been already marked as a section symbol before
2715      resetting it.  */
2716   if ((s->bsym->flags & BSF_SECTION_SYM) == 0)
2717     s->bsym = bsym;
2718   /* else XXX - What do we do now ?  */
2719 }
2720 
2721 #ifdef OBJ_SYMFIELD_TYPE
2722 
2723 /* Get a pointer to the object format information for a symbol.  */
2724 
2725 OBJ_SYMFIELD_TYPE *
symbol_get_obj(symbolS * s)2726 symbol_get_obj (symbolS *s)
2727 {
2728   if (LOCAL_SYMBOL_CHECK (s))
2729     s = local_symbol_convert ((struct local_symbol *) s);
2730   return &s->sy_obj;
2731 }
2732 
2733 /* Set the object format information for a symbol.  */
2734 
2735 void
symbol_set_obj(symbolS * s,OBJ_SYMFIELD_TYPE * o)2736 symbol_set_obj (symbolS *s, OBJ_SYMFIELD_TYPE *o)
2737 {
2738   if (LOCAL_SYMBOL_CHECK (s))
2739     s = local_symbol_convert ((struct local_symbol *) s);
2740   s->sy_obj = *o;
2741 }
2742 
2743 #endif /* OBJ_SYMFIELD_TYPE */
2744 
2745 #ifdef TC_SYMFIELD_TYPE
2746 
2747 /* Get a pointer to the processor information for a symbol.  */
2748 
2749 TC_SYMFIELD_TYPE *
symbol_get_tc(symbolS * s)2750 symbol_get_tc (symbolS *s)
2751 {
2752   if (LOCAL_SYMBOL_CHECK (s))
2753     s = local_symbol_convert ((struct local_symbol *) s);
2754   return &s->sy_tc;
2755 }
2756 
2757 /* Set the processor information for a symbol.  */
2758 
2759 void
symbol_set_tc(symbolS * s,TC_SYMFIELD_TYPE * o)2760 symbol_set_tc (symbolS *s, TC_SYMFIELD_TYPE *o)
2761 {
2762   if (LOCAL_SYMBOL_CHECK (s))
2763     s = local_symbol_convert ((struct local_symbol *) s);
2764   s->sy_tc = *o;
2765 }
2766 
2767 #endif /* TC_SYMFIELD_TYPE */
2768 
2769 void
symbol_begin(void)2770 symbol_begin (void)
2771 {
2772   symbol_lastP = NULL;
2773   symbol_rootP = NULL;		/* In case we have 0 symbols (!!)  */
2774   sy_hash = hash_new ();
2775   local_hash = hash_new ();
2776 
2777   memset ((char *) (&abs_symbol), '\0', sizeof (abs_symbol));
2778 #if defined (EMIT_SECTION_SYMBOLS) || !defined (RELOC_REQUIRES_SYMBOL)
2779   abs_symbol.bsym = bfd_abs_section_ptr->symbol;
2780 #endif
2781   abs_symbol.sy_value.X_op = O_constant;
2782   abs_symbol.sy_frag = &zero_address_frag;
2783 
2784   if (LOCAL_LABELS_FB)
2785     fb_label_init ();
2786 }
2787 
2788 void
dot_symbol_init(void)2789 dot_symbol_init (void)
2790 {
2791   dot_symbol.bsym = bfd_make_empty_symbol (stdoutput);
2792   if (dot_symbol.bsym == NULL)
2793     as_fatal ("bfd_make_empty_symbol: %s", bfd_errmsg (bfd_get_error ()));
2794   dot_symbol.bsym->name = ".";
2795   dot_symbol.sy_flags.sy_forward_ref = 1;
2796   dot_symbol.sy_value.X_op = O_constant;
2797 }
2798 
2799 int indent_level;
2800 
2801 /* Maximum indent level.
2802    Available for modification inside a gdb session.  */
2803 static int max_indent_level = 8;
2804 
2805 void
print_symbol_value_1(FILE * file,symbolS * sym)2806 print_symbol_value_1 (FILE *file, symbolS *sym)
2807 {
2808   const char *name = S_GET_NAME (sym);
2809   if (!name || !name[0])
2810     name = "(unnamed)";
2811   fprintf (file, "sym ");
2812   fprintf_vma (file, (bfd_vma) ((bfd_hostptr_t) sym));
2813   fprintf (file, " %s", name);
2814 
2815   if (LOCAL_SYMBOL_CHECK (sym))
2816     {
2817       struct local_symbol *locsym = (struct local_symbol *) sym;
2818 
2819       if (local_symbol_get_frag (locsym) != & zero_address_frag
2820 	  && local_symbol_get_frag (locsym) != NULL)
2821 	{
2822 	  fprintf (file, " frag ");
2823 	  fprintf_vma (file, (bfd_vma) ((bfd_hostptr_t) local_symbol_get_frag (locsym)));
2824         }
2825       if (local_symbol_resolved_p (locsym))
2826 	fprintf (file, " resolved");
2827       fprintf (file, " local");
2828     }
2829   else
2830     {
2831       if (sym->sy_frag != &zero_address_frag)
2832 	{
2833 	  fprintf (file, " frag ");
2834 	  fprintf_vma (file, (bfd_vma) ((bfd_hostptr_t) sym->sy_frag));
2835 	}
2836       if (sym->sy_flags.sy_written)
2837 	fprintf (file, " written");
2838       if (sym->sy_flags.sy_resolved)
2839 	fprintf (file, " resolved");
2840       else if (sym->sy_flags.sy_resolving)
2841 	fprintf (file, " resolving");
2842       if (sym->sy_flags.sy_used_in_reloc)
2843 	fprintf (file, " used-in-reloc");
2844       if (sym->sy_flags.sy_used)
2845 	fprintf (file, " used");
2846       if (S_IS_LOCAL (sym))
2847 	fprintf (file, " local");
2848       if (S_IS_EXTERNAL (sym))
2849 	fprintf (file, " extern");
2850       if (S_IS_WEAK (sym))
2851 	fprintf (file, " weak");
2852       if (S_IS_DEBUG (sym))
2853 	fprintf (file, " debug");
2854       if (S_IS_DEFINED (sym))
2855 	fprintf (file, " defined");
2856     }
2857   if (S_IS_WEAKREFR (sym))
2858     fprintf (file, " weakrefr");
2859   if (S_IS_WEAKREFD (sym))
2860     fprintf (file, " weakrefd");
2861   fprintf (file, " %s", segment_name (S_GET_SEGMENT (sym)));
2862   if (symbol_resolved_p (sym))
2863     {
2864       segT s = S_GET_SEGMENT (sym);
2865 
2866       if (s != undefined_section
2867 	  && s != expr_section)
2868 	fprintf (file, " %lx", (unsigned long) S_GET_VALUE (sym));
2869     }
2870   else if (indent_level < max_indent_level
2871 	   && S_GET_SEGMENT (sym) != undefined_section)
2872     {
2873       indent_level++;
2874       fprintf (file, "\n%*s<", indent_level * 4, "");
2875       if (LOCAL_SYMBOL_CHECK (sym))
2876 	fprintf (file, "constant %lx",
2877 		 (unsigned long) ((struct local_symbol *) sym)->lsy_value);
2878       else
2879 	print_expr_1 (file, &sym->sy_value);
2880       fprintf (file, ">");
2881       indent_level--;
2882     }
2883   fflush (file);
2884 }
2885 
2886 void
print_symbol_value(symbolS * sym)2887 print_symbol_value (symbolS *sym)
2888 {
2889   indent_level = 0;
2890   print_symbol_value_1 (stderr, sym);
2891   fprintf (stderr, "\n");
2892 }
2893 
2894 static void
print_binary(FILE * file,const char * name,expressionS * exp)2895 print_binary (FILE *file, const char *name, expressionS *exp)
2896 {
2897   indent_level++;
2898   fprintf (file, "%s\n%*s<", name, indent_level * 4, "");
2899   print_symbol_value_1 (file, exp->X_add_symbol);
2900   fprintf (file, ">\n%*s<", indent_level * 4, "");
2901   print_symbol_value_1 (file, exp->X_op_symbol);
2902   fprintf (file, ">");
2903   indent_level--;
2904 }
2905 
2906 void
print_expr_1(FILE * file,expressionS * exp)2907 print_expr_1 (FILE *file, expressionS *exp)
2908 {
2909   fprintf (file, "expr ");
2910   fprintf_vma (file, (bfd_vma) ((bfd_hostptr_t) exp));
2911   fprintf (file, " ");
2912   switch (exp->X_op)
2913     {
2914     case O_illegal:
2915       fprintf (file, "illegal");
2916       break;
2917     case O_absent:
2918       fprintf (file, "absent");
2919       break;
2920     case O_constant:
2921       fprintf (file, "constant %lx", (unsigned long) exp->X_add_number);
2922       break;
2923     case O_symbol:
2924       indent_level++;
2925       fprintf (file, "symbol\n%*s<", indent_level * 4, "");
2926       print_symbol_value_1 (file, exp->X_add_symbol);
2927       fprintf (file, ">");
2928     maybe_print_addnum:
2929       if (exp->X_add_number)
2930 	fprintf (file, "\n%*s%lx", indent_level * 4, "",
2931 		 (unsigned long) exp->X_add_number);
2932       indent_level--;
2933       break;
2934     case O_register:
2935       fprintf (file, "register #%d", (int) exp->X_add_number);
2936       break;
2937     case O_big:
2938       fprintf (file, "big");
2939       break;
2940     case O_uminus:
2941       fprintf (file, "uminus -<");
2942       indent_level++;
2943       print_symbol_value_1 (file, exp->X_add_symbol);
2944       fprintf (file, ">");
2945       goto maybe_print_addnum;
2946     case O_bit_not:
2947       fprintf (file, "bit_not");
2948       break;
2949     case O_multiply:
2950       print_binary (file, "multiply", exp);
2951       break;
2952     case O_divide:
2953       print_binary (file, "divide", exp);
2954       break;
2955     case O_modulus:
2956       print_binary (file, "modulus", exp);
2957       break;
2958     case O_left_shift:
2959       print_binary (file, "lshift", exp);
2960       break;
2961     case O_right_shift:
2962       print_binary (file, "rshift", exp);
2963       break;
2964     case O_bit_inclusive_or:
2965       print_binary (file, "bit_ior", exp);
2966       break;
2967     case O_bit_exclusive_or:
2968       print_binary (file, "bit_xor", exp);
2969       break;
2970     case O_bit_and:
2971       print_binary (file, "bit_and", exp);
2972       break;
2973     case O_eq:
2974       print_binary (file, "eq", exp);
2975       break;
2976     case O_ne:
2977       print_binary (file, "ne", exp);
2978       break;
2979     case O_lt:
2980       print_binary (file, "lt", exp);
2981       break;
2982     case O_le:
2983       print_binary (file, "le", exp);
2984       break;
2985     case O_ge:
2986       print_binary (file, "ge", exp);
2987       break;
2988     case O_gt:
2989       print_binary (file, "gt", exp);
2990       break;
2991     case O_logical_and:
2992       print_binary (file, "logical_and", exp);
2993       break;
2994     case O_logical_or:
2995       print_binary (file, "logical_or", exp);
2996       break;
2997     case O_add:
2998       indent_level++;
2999       fprintf (file, "add\n%*s<", indent_level * 4, "");
3000       print_symbol_value_1 (file, exp->X_add_symbol);
3001       fprintf (file, ">\n%*s<", indent_level * 4, "");
3002       print_symbol_value_1 (file, exp->X_op_symbol);
3003       fprintf (file, ">");
3004       goto maybe_print_addnum;
3005     case O_subtract:
3006       indent_level++;
3007       fprintf (file, "subtract\n%*s<", indent_level * 4, "");
3008       print_symbol_value_1 (file, exp->X_add_symbol);
3009       fprintf (file, ">\n%*s<", indent_level * 4, "");
3010       print_symbol_value_1 (file, exp->X_op_symbol);
3011       fprintf (file, ">");
3012       goto maybe_print_addnum;
3013     default:
3014       fprintf (file, "{unknown opcode %d}", (int) exp->X_op);
3015       break;
3016     }
3017   fflush (stdout);
3018 }
3019 
3020 void
print_expr(expressionS * exp)3021 print_expr (expressionS *exp)
3022 {
3023   print_expr_1 (stderr, exp);
3024   fprintf (stderr, "\n");
3025 }
3026 
3027 void
symbol_print_statistics(FILE * file)3028 symbol_print_statistics (FILE *file)
3029 {
3030   hash_print_statistics (file, "symbol table", sy_hash);
3031   hash_print_statistics (file, "mini local symbol table", local_hash);
3032   fprintf (file, "%lu mini local symbols created, %lu converted\n",
3033 	   local_symbol_count, local_symbol_conversion_count);
3034 }
3035 
3036 #ifdef OBJ_COMPLEX_RELC
3037 
3038 /* Convert given symbol to a new complex-relocation symbol name.  This
3039    may be a recursive function, since it might be called for non-leaf
3040    nodes (plain symbols) in the expression tree.  The caller owns the
3041    returning string, so should free it eventually.  Errors are
3042    indicated via as_bad and a NULL return value.  The given symbol
3043    is marked with sy_used_in_reloc.  */
3044 
3045 char *
symbol_relc_make_sym(symbolS * sym)3046 symbol_relc_make_sym (symbolS * sym)
3047 {
3048   char * terminal = NULL;
3049   const char * sname;
3050   char typetag;
3051   int sname_len;
3052 
3053   gas_assert (sym != NULL);
3054 
3055   /* Recurse to symbol_relc_make_expr if this symbol
3056      is defined as an expression or a plain value.  */
3057   if (   S_GET_SEGMENT (sym) == expr_section
3058       || S_GET_SEGMENT (sym) == absolute_section)
3059     return symbol_relc_make_expr (& sym->sy_value);
3060 
3061   /* This may be a "fake symbol" L0\001, referring to ".".
3062      Write out a special null symbol to refer to this position.  */
3063   if (! strcmp (S_GET_NAME (sym), FAKE_LABEL_NAME))
3064     return xstrdup (".");
3065 
3066   /* We hope this is a plain leaf symbol.  Construct the encoding
3067      as {S,s}II...:CCCCCCC....
3068      where 'S'/'s' means section symbol / plain symbol
3069      III is decimal for the symbol name length
3070      CCC is the symbol name itself.  */
3071   symbol_mark_used_in_reloc (sym);
3072 
3073   sname = S_GET_NAME (sym);
3074   sname_len = strlen (sname);
3075   typetag = symbol_section_p (sym) ? 'S' : 's';
3076 
3077   terminal = xmalloc (1 /* S or s */
3078 		      + 8 /* sname_len in decimal */
3079 		      + 1 /* _ spacer */
3080 		      + sname_len /* name itself */
3081 		      + 1 /* \0 */ );
3082 
3083   sprintf (terminal, "%c%d:%s", typetag, sname_len, sname);
3084   return terminal;
3085 }
3086 
3087 /* Convert given value to a new complex-relocation symbol name.  This
3088    is a non-recursive function, since it is be called for leaf nodes
3089    (plain values) in the expression tree.  The caller owns the
3090    returning string, so should free() it eventually.  No errors.  */
3091 
3092 char *
symbol_relc_make_value(offsetT val)3093 symbol_relc_make_value (offsetT val)
3094 {
3095   char * terminal = xmalloc (28);  /* Enough for long long.  */
3096 
3097   terminal[0] = '#';
3098   bfd_sprintf_vma (stdoutput, terminal + 1, val);
3099   return terminal;
3100 }
3101 
3102 /* Convert given expression to a new complex-relocation symbol name.
3103    This is a recursive function, since it traverses the entire given
3104    expression tree.  The caller owns the returning string, so should
3105    free() it eventually.  Errors are indicated via as_bad() and a NULL
3106    return value.  */
3107 
3108 char *
symbol_relc_make_expr(expressionS * exp)3109 symbol_relc_make_expr (expressionS * exp)
3110 {
3111   char * opstr = NULL; /* Operator prefix string.  */
3112   int    arity = 0;    /* Arity of this operator.  */
3113   char * operands[3];  /* Up to three operands.  */
3114   char * concat_string = NULL;
3115 
3116   operands[0] = operands[1] = operands[2] = NULL;
3117 
3118   gas_assert (exp != NULL);
3119 
3120   /* Match known operators -> fill in opstr, arity, operands[] and fall
3121      through to construct subexpression fragments; may instead return
3122      string directly for leaf nodes.  */
3123 
3124   /* See expr.h for the meaning of all these enums.  Many operators
3125      have an unnatural arity (X_add_number implicitly added).  The
3126      conversion logic expands them to explicit "+" subexpressions.   */
3127 
3128   switch (exp->X_op)
3129     {
3130     default:
3131       as_bad ("Unknown expression operator (enum %d)", exp->X_op);
3132       break;
3133 
3134       /* Leaf nodes.  */
3135     case O_constant:
3136       return symbol_relc_make_value (exp->X_add_number);
3137 
3138     case O_symbol:
3139       if (exp->X_add_number)
3140 	{
3141 	  arity = 2;
3142 	  opstr = "+";
3143 	  operands[0] = symbol_relc_make_sym (exp->X_add_symbol);
3144 	  operands[1] = symbol_relc_make_value (exp->X_add_number);
3145 	  break;
3146 	}
3147       else
3148 	return symbol_relc_make_sym (exp->X_add_symbol);
3149 
3150       /* Helper macros for nesting nodes.  */
3151 
3152 #define HANDLE_XADD_OPT1(str_) 						\
3153       if (exp->X_add_number)						\
3154         {								\
3155           arity = 2;							\
3156           opstr = "+:" str_;						\
3157           operands[0] = symbol_relc_make_sym (exp->X_add_symbol);	\
3158           operands[1] = symbol_relc_make_value (exp->X_add_number);	\
3159           break;							\
3160         }								\
3161       else								\
3162         {								\
3163           arity = 1;							\
3164           opstr = str_;							\
3165           operands[0] = symbol_relc_make_sym (exp->X_add_symbol);	\
3166         }								\
3167       break
3168 
3169 #define HANDLE_XADD_OPT2(str_) 						\
3170       if (exp->X_add_number)						\
3171         {								\
3172           arity = 3;							\
3173           opstr = "+:" str_;						\
3174           operands[0] = symbol_relc_make_sym (exp->X_add_symbol);	\
3175           operands[1] = symbol_relc_make_sym (exp->X_op_symbol);	\
3176           operands[2] = symbol_relc_make_value (exp->X_add_number);	\
3177         }								\
3178       else								\
3179         {								\
3180           arity = 2;							\
3181           opstr = str_;							\
3182           operands[0] = symbol_relc_make_sym (exp->X_add_symbol);	\
3183           operands[1] = symbol_relc_make_sym (exp->X_op_symbol);	\
3184         } 								\
3185       break
3186 
3187       /* Nesting nodes.  */
3188 
3189     case O_uminus:       	HANDLE_XADD_OPT1 ("0-");
3190     case O_bit_not:      	HANDLE_XADD_OPT1 ("~");
3191     case O_logical_not:  	HANDLE_XADD_OPT1 ("!");
3192     case O_multiply:     	HANDLE_XADD_OPT2 ("*");
3193     case O_divide:       	HANDLE_XADD_OPT2 ("/");
3194     case O_modulus:      	HANDLE_XADD_OPT2 ("%");
3195     case O_left_shift:   	HANDLE_XADD_OPT2 ("<<");
3196     case O_right_shift:  	HANDLE_XADD_OPT2 (">>");
3197     case O_bit_inclusive_or:	HANDLE_XADD_OPT2 ("|");
3198     case O_bit_exclusive_or:	HANDLE_XADD_OPT2 ("^");
3199     case O_bit_and:      	HANDLE_XADD_OPT2 ("&");
3200     case O_add:          	HANDLE_XADD_OPT2 ("+");
3201     case O_subtract:     	HANDLE_XADD_OPT2 ("-");
3202     case O_eq:           	HANDLE_XADD_OPT2 ("==");
3203     case O_ne:           	HANDLE_XADD_OPT2 ("!=");
3204     case O_lt:           	HANDLE_XADD_OPT2 ("<");
3205     case O_le:           	HANDLE_XADD_OPT2 ("<=");
3206     case O_ge:           	HANDLE_XADD_OPT2 (">=");
3207     case O_gt:           	HANDLE_XADD_OPT2 (">");
3208     case O_logical_and:  	HANDLE_XADD_OPT2 ("&&");
3209     case O_logical_or:   	HANDLE_XADD_OPT2 ("||");
3210     }
3211 
3212   /* Validate & reject early.  */
3213   if (arity >= 1 && ((operands[0] == NULL) || (strlen (operands[0]) == 0)))
3214     opstr = NULL;
3215   if (arity >= 2 && ((operands[1] == NULL) || (strlen (operands[1]) == 0)))
3216     opstr = NULL;
3217   if (arity >= 3 && ((operands[2] == NULL) || (strlen (operands[2]) == 0)))
3218     opstr = NULL;
3219 
3220   if (opstr == NULL)
3221     concat_string = NULL;
3222   else
3223     {
3224       /* Allocate new string; include inter-operand padding gaps etc.  */
3225       concat_string = xmalloc (strlen (opstr)
3226 			       + 1
3227 			       + (arity >= 1 ? (strlen (operands[0]) + 1 ) : 0)
3228 			       + (arity >= 2 ? (strlen (operands[1]) + 1 ) : 0)
3229 			       + (arity >= 3 ? (strlen (operands[2]) + 0 ) : 0)
3230 			       + 1);
3231       gas_assert (concat_string != NULL);
3232 
3233       /* Format the thing.  */
3234       sprintf (concat_string,
3235 	       (arity == 0 ? "%s" :
3236 		arity == 1 ? "%s:%s" :
3237 		arity == 2 ? "%s:%s:%s" :
3238 		/* arity == 3 */ "%s:%s:%s:%s"),
3239 	       opstr, operands[0], operands[1], operands[2]);
3240     }
3241 
3242   /* Free operand strings (not opstr).  */
3243   if (arity >= 1) xfree (operands[0]);
3244   if (arity >= 2) xfree (operands[1]);
3245   if (arity >= 3) xfree (operands[2]);
3246 
3247   return concat_string;
3248 }
3249 
3250 #endif
3251