OpenCores
URL https://opencores.org/ocsvn/scarts/scarts/trunk

Subversion Repositories scarts

[/] [scarts/] [trunk/] [toolchain/] [scarts-binutils/] [binutils-2.19.1/] [gas/] [symbols.c] - Blame information for rev 6

Details | Compare with Previous | View Log

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

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.