Subversion Repositories Kolibri OS

Rev

Rev 5222 | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
5222 serge 1
/* symbols.c -symbol table-
6324 serge 2
   Copyright (C) 1987-2015 Free Software Foundation, Inc.
5222 serge 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 *
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 *
105
save_symbol_name (const char *name)
106
{
6324 serge 107
  size_t name_length;
5222 serge 108
  char *ret;
109
 
110
  name_length = strlen (name) + 1;	/* +1 for \0.  */
111
  obstack_grow (¬es, name, name_length);
112
  ret = (char *) obstack_finish (¬es);
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 *
130
symbol_create (const char *name, /* It is copied, the caller can destroy/modify.  */
131
	       segT segment,	/* Segment identifier (SEG_).  */
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 (¬es, 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 *
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 (¬es, 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 *
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
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 ":".
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 *
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
{
6324 serge 268
  symbolS *symbolP;	/* Symbol we are working with.  */
5222 serge 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
483
symbol_table_insert (symbolS *symbolP)
484
{
6324 serge 485
  const char *error_string;
5222 serge 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 *
511
symbol_find_or_make (const char *name)
512
{
6324 serge 513
  symbolS *symbolP;
5222 serge 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 *
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 *
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 (¬es, 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 *
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 *
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 *
692
symbol_temp_new_now (void)
693
{
694
  return symbol_temp_new (now_seg, frag_now_fix (), frag_now);
695
}
696
 
697
symbolS *
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 *
709
symbol_find_exact (const char *name)
710
{
711
  return symbol_find_exact_noref (name, 0);
712
}
713
 
714
symbolS *
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 *
738
symbol_find (const char *name)
739
{
740
  return symbol_find_noref (name, 0);
741
}
742
 
743
symbolS *
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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.  */
6324 serge 1665
dollar_label_name (long n,	/* we just saw "n$:" : n a number.  */
1666
		   int augend	/* 0 for current instance, 1 for new instance.  */)
5222 serge 1667
{
1668
  long i;
1669
  /* Returned to caller, then copied.  Used for created names ("4f").  */
1670
  static char symbol_name_build[24];
6324 serge 1671
  char *p;
1672
  char *q;
5222 serge 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
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
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
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.  */
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];
6324 serge 1838
  char *p;
1839
  char *q;
5222 serge 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 *
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 (¬es, 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
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
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
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
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
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
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
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
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
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
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
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
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
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
2139
S_IS_STABD (symbolS *s)
2140
{
2141
  return S_GET_NAME (s) == 0;
2142
}
2143
 
2144
int
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
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
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 *
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
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
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
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
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
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
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
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
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
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
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
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
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
2372
S_CLEAR_VOLATILE (symbolS *s)
2373
{
2374
  if (!LOCAL_SYMBOL_CHECK (s))
2375
    s->sy_flags.sy_volatile = 0;
2376
}
2377
 
2378
void
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 *
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 *
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 *
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
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
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 *
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
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
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 *
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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 *
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
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 *
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
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 *
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
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
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
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
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
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
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
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
3021
print_expr (expressionS *exp)
3022
{
3023
  print_expr_1 (stderr, exp);
3024
  fprintf (stderr, "\n");
3025
}
3026
 
3027
void
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 *
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 *
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 *
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