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

Subversion Repositories open8_urisc

[/] [open8_urisc/] [trunk/] [gnu/] [binutils/] [gas/] [symbols.c] - Blame information for rev 147

Go to most recent revision | Details | Compare with Previous | View Log

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

powered by: WebSVN 2.1.0

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